Code drop from //branches/cupcake/...@124589
diff --git a/tools/droiddoc/src/Android.mk b/tools/droiddoc/src/Android.mk
index c0c583d..abd2581 100644
--- a/tools/droiddoc/src/Android.mk
+++ b/tools/droiddoc/src/Android.mk
@@ -39,6 +39,7 @@
 	LiteralTagInfo.java \
 	MemberInfo.java \
 	MethodInfo.java \
+	NavTree.java \
 	PackageInfo.java \
 	ParamTagInfo.java \
 	ParameterInfo.java \
diff --git a/tools/droiddoc/src/DocFile.java b/tools/droiddoc/src/DocFile.java
index 38ac55c..f53a35c 100644
--- a/tools/droiddoc/src/DocFile.java
+++ b/tools/droiddoc/src/DocFile.java
@@ -116,21 +116,21 @@
 
         hdf.setValue("commentText", commentText);
         
-        if(outfile.indexOf("sdk/") != -1) {
-          hdf.setValue("sdk", "true");
-          if(outfile.indexOf("index.html") != -1) {
-            ClearPage.write(hdf, "sdkpage.cs", outfile);
-          }else{
+        if (outfile.indexOf("sdk/") != -1) {
+            hdf.setValue("sdk", "true");
+            if (outfile.indexOf("index.html") != -1) {
+                ClearPage.write(hdf, "sdkpage.cs", outfile);
+            } else {
+                ClearPage.write(hdf, "docpage.cs", outfile);
+            }
+        } else if (outfile.indexOf("guide/") != -1){
+            hdf.setValue("guide", "true");
             ClearPage.write(hdf, "docpage.cs", outfile);
-          }
-        }else if(outfile.indexOf("guide/") != -1){
-          hdf.setValue("guide", "true");
-          ClearPage.write(hdf, "docpage.cs", outfile);
-        }else if(outfile.indexOf("publish/") != -1){
-          hdf.setValue("publish", "true");
-          ClearPage.write(hdf, "docpage.cs", outfile);
-        }else{
-          ClearPage.write(hdf, "nosidenavpage.cs", outfile);
+        } else if (outfile.indexOf("publish/") != -1){
+            hdf.setValue("publish", "true");
+            ClearPage.write(hdf, "docpage.cs", outfile);
+        } else {
+            ClearPage.write(hdf, "nosidenavpage.cs", outfile);
         }
     }
 
diff --git a/tools/droiddoc/src/DroidDoc.java b/tools/droiddoc/src/DroidDoc.java
index b0412c9..23ff654 100644
--- a/tools/droiddoc/src/DroidDoc.java
+++ b/tools/droiddoc/src/DroidDoc.java
@@ -209,6 +209,9 @@
             writeHTMLPages();
         }
 
+        // Navigation tree
+        NavTree.writeNavTree(javadocDir);
+
         // Packages Pages
         writePackages(javadocDir
                         + (ClearPage.htmlDir!=null
@@ -475,7 +478,7 @@
                     classesToCheck = pkg.interfaces();
                     break;
                 default:
-                    System.out.println("Error reading package: " + pkg.name());
+                    System.err.println("Error reading package: " + pkg.name());
                     break;
                 }
                 for (ClassInfo cl : classesToCheck) {
@@ -516,24 +519,17 @@
                 if (len > 3 && ".cs".equals(templ.substring(len-3))) {
                     HDF data = makeHDF();
                     String filename = templ.substring(0,len-3) + htmlExtension;
-                    System.out.println("Writing CS:  " + filename);
                     ClearPage.write(data, templ, filename);
                 }
                 else if (len > 3 && ".jd".equals(templ.substring(len-3))) {
                     String filename = templ.substring(0,len-3) + htmlExtension;
-                    System.out.println("Writing JD:  " + filename);
                     DocFile.writePage(f.getAbsolutePath(), relative, filename);
                 }
                 else {
-//                    System.out.println("relative=" + relative
-//                            + " f.getAbsolutePath()=" + f.getAbsolutePath()
-//                            + " templ=" + templ);
-                    System.out.println("Copying:     " + templ);
                     ClearPage.copyFile(f, templ);
                 }
             }
             else if (f.isDirectory()) {
-                System.out.println("Writing dir: " + relative + f.getName() + "/");
                 writeDirectory(f, relative + f.getName() + "/");
             }
         }
@@ -543,7 +539,7 @@
     {
         File f = new File(ClearPage.htmlDir);
         if (!f.isDirectory()) {
-            System.out.println("htmlDir not a directory: " + ClearPage.htmlDir);
+            System.err.println("htmlDir not a directory: " + ClearPage.htmlDir);
         }
         writeDirectory(f, "");
     }
@@ -644,7 +640,7 @@
             }
         }
         catch (FileNotFoundException e) {
-            System.out.println("error writing file: " + filename);
+            System.err.println("error writing file: " + filename);
         }
         finally {
             if (stream != null) {
@@ -653,13 +649,13 @@
         }
     }
 
-    public static void writePackages(String filename)
-    {
-        System.out.println("Writing packages...");
-        HDF data = makePackageHDF();
+    private static PackageInfo[] sVisiblePackages = null;
+    public static PackageInfo[] choosePackages() {
+        if (sVisiblePackages != null) {
+            return sVisiblePackages;
+        }
 
         ClassInfo[] classes = Converter.rootClasses();
-
         SortedMap<String, PackageInfo> sorted = new TreeMap<String, PackageInfo>();
         for (ClassInfo cl: classes) {
             PackageInfo pkg = cl.containingPackage();
@@ -672,7 +668,8 @@
             sorted.put(name, pkg);
         }
 
-        int i = 0;
+        ArrayList<PackageInfo> result = new ArrayList();
+
         for (String s: sorted.keySet()) {
             PackageInfo pkg = sorted.get(s);
 
@@ -680,10 +677,13 @@
                 continue;
             }
             Boolean allHidden = true;
-            int pass = 1;
-            ClassInfo[] classesToCheck = pkg.ordinaryClasses();
+            int pass = 0;
+            ClassInfo[] classesToCheck = null;
             while (pass < 5 ) {
                 switch(pass) {
+                case 0:
+                    classesToCheck = pkg.ordinaryClasses();
+                    break;
                 case 1:
                     classesToCheck = pkg.enums();
                     break;
@@ -697,7 +697,7 @@
                     classesToCheck = pkg.interfaces();
                     break;
                 default:
-                    System.out.println("Error reading package: " + pkg.name());
+                    System.err.println("Error reading package: " + pkg.name());
                     break;
                 }
                 for (ClassInfo cl : classesToCheck) {
@@ -715,8 +715,26 @@
                 continue;
             }
 
+            result.add(pkg);
+        }
+
+        sVisiblePackages = result.toArray(new PackageInfo[result.size()]);
+        return sVisiblePackages;
+    }
+
+    public static void writePackages(String filename)
+    {
+        HDF data = makePackageHDF();
+
+        int i = 0;
+        for (PackageInfo pkg: choosePackages()) {
             writePackage(pkg);
 
+            data.setValue("docs.packages." + i + ".name", pkg.name());
+            data.setValue("docs.packages." + i + ".link", pkg.htmlPage());
+            TagInfo.makeHDF(data, "docs.packages." + i + ".shortDescr",
+                            pkg.firstSentenceTags());
+
             i++;
         }
 
@@ -739,7 +757,6 @@
         HDF data = makePackageHDF();
 
         String name = pkg.name();
-        System.out.println("Writing " + name);
 
         data.setValue("package.name", name);
         data.setValue("package.descr", "...description...");
@@ -762,8 +779,7 @@
         setPageTitle(data, name);
         ClearPage.write(data, "package.cs", filename);
 
-        filename = filename.substring(0, filename.lastIndexOf('/')+1)
-            + "package-descr" + htmlExtension;
+        filename = pkg.fullDescriptionHtmlPage();
         setPageTitle(data, name + " Details");
         ClearPage.write(data, "package-descr.cs", filename);
 
@@ -804,8 +820,6 @@
                             sorted[j].label = sorted[j].label + " (" + pkg.name() + ")";
                         }
                     }
-                } else {
-                    //System.out.println("not duplicate: " + sorted[i].label);
                 }
                 firstMatch = i;
                 lastName = s;
@@ -838,7 +852,7 @@
             cl.makeKeywordEntries(keywords);
         }
 
-        HDF data = makePackageHDF();
+        HDF data = makeHDF();
 
         Collections.sort(keywords);
         
@@ -884,7 +898,6 @@
     {
         cl.makeHDF(data);
 
-        System.out.println("Writing " + cl.name());
         setPageTitle(data, cl.name());
         ClearPage.write(data, "class.cs", cl.htmlPage());
 
diff --git a/tools/droiddoc/src/LinkReference.java b/tools/droiddoc/src/LinkReference.java
index fa821cf..bbcd4db 100644
--- a/tools/droiddoc/src/LinkReference.java
+++ b/tools/droiddoc/src/LinkReference.java
@@ -376,7 +376,8 @@
         if (result.href == null && !skipHref) {
             if (printOnErrors && (base == null || base.checkLevel())) {
                 Errors.error(Errors.UNRESOLVED_LINK, pos,
-                        "Unresolved link/see tag: " + text.trim());
+                        "Unresolved link/see tag \"" + text.trim()
+                        + "\" in " + ((base != null) ? base.qualifiedName() : "[null]"));
             }
             result.makeError();
         }
diff --git a/tools/droiddoc/src/MethodInfo.java b/tools/droiddoc/src/MethodInfo.java
index ed98378..ca30665 100644
--- a/tools/droiddoc/src/MethodInfo.java
+++ b/tools/droiddoc/src/MethodInfo.java
@@ -266,9 +266,12 @@
                         ClassInfo[] thrownExceptions, SourcePositionInfo position,
                         AnnotationInstanceInfo[] annotations)
     {
+        // Explicitly coerce 'final' state of Java6-compiled enum values() method, to match
+        // the Java5-emitted base API description.
         super(rawCommentText, name, signature, containingClass, realContainingClass,
                 isPublic, isProtected, isPackagePrivate, isPrivate,
-                isFinal, isStatic, isSynthetic, kind, position, annotations);
+                ((name.equals("values") && containingClass.isEnum()) ? true : isFinal),
+                isStatic, isSynthetic, kind, position, annotations);
 
         // The underlying MethodDoc for an interface's declared methods winds up being marked
         // non-abstract.  Correct that here by looking at the immediate-parent class, and marking
diff --git a/tools/droiddoc/src/NavTree.java b/tools/droiddoc/src/NavTree.java
new file mode 100644
index 0000000..9eef0ce
--- /dev/null
+++ b/tools/droiddoc/src/NavTree.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.clearsilver.HDF;
+
+import java.util.ArrayList;
+
+public class NavTree {
+
+    public static void writeNavTree(String dir) {
+        ArrayList<Node> children = new ArrayList();
+        for (PackageInfo pkg: DroidDoc.choosePackages()) {
+            children.add(makePackageNode(pkg));
+        }
+        Node node = new Node("Reference", dir + "packages.html", children);
+
+        StringBuilder buf = new StringBuilder();
+        if (false) {
+            // if you want a root node
+            buf.append("[");
+            node.render(buf);
+            buf.append("]");
+        } else {
+            // if you don't want a root node
+            node.renderChildren(buf);
+        }
+
+        HDF data = DroidDoc.makeHDF();
+        data.setValue("reference_tree", buf.toString());
+        ClearPage.write(data, "navtree_data.cs", "navtree_data.js");
+    }
+
+    private static Node makePackageNode(PackageInfo pkg) {
+        ArrayList<Node> children = new ArrayList();
+
+        children.add(new Node("Description", pkg.fullDescriptionHtmlPage(), null));
+
+        addClassNodes(children, "Interfaces", pkg.interfaces());
+        addClassNodes(children, "Classes", pkg.ordinaryClasses());
+        addClassNodes(children, "Enums", pkg.enums());
+        addClassNodes(children, "Exceptions", pkg.exceptions());
+        addClassNodes(children, "Errors", pkg.errors());
+
+        return new Node(pkg.name(), pkg.htmlPage(), children);
+    }
+
+    private static void addClassNodes(ArrayList<Node> parent, String label, ClassInfo[] classes) {
+        ArrayList<Node> children = new ArrayList();
+
+        for (ClassInfo cl: classes) {
+            if (cl.checkLevel()) {
+                children.add(new Node(cl.name(), cl.htmlPage(), null));
+            }
+        }
+
+        if (children.size() > 0) {
+            parent.add(new Node(label, null, children));
+        }
+    }
+
+    private static class Node {
+        private String mLabel;
+        private String mLink;
+        ArrayList<Node> mChildren;
+
+        Node(String label, String link, ArrayList<Node> children) {
+            mLabel = label;
+            mLink = link;
+            mChildren = children;
+        }
+
+        static void renderString(StringBuilder buf, String s) {
+            if (s == null) {
+                buf.append("null");
+            } else {
+                buf.append('"');
+                final int N = s.length();
+                for (int i=0; i<N; i++) {
+                    char c = s.charAt(i);
+                    if (c >= ' ' && c <= '~' && c != '"' && c != '\\') {
+                        buf.append(c);
+                    } else {
+                        buf.append("\\u");
+                        for (int j=0; i<4; i++) {
+                            char x = (char)(c & 0x000f);
+                            if (x > 10) {
+                                x = (char)(x - 10 + 'a');
+                            } else {
+                                x = (char)(x + '0');
+                            }
+                            buf.append(x);
+                            c >>= 4;
+                        }
+                    }
+                }
+                buf.append('"');
+            }
+        }
+
+        void renderChildren(StringBuilder buf) {
+            ArrayList<Node> list = mChildren;
+            if (list == null || list.size() == 0) {
+                // We output null for no children.  That way empty lists here can just
+                // be a byproduct of how we generate the lists.
+                buf.append("null");
+            } else {
+                buf.append("[ ");
+                final int N = list.size();
+                for (int i=0; i<N; i++) {
+                    list.get(i).render(buf);
+                    if (i != N-1) {
+                        buf.append(", ");
+                    }
+                }
+                buf.append(" ]\n");
+            }
+        }
+
+        void render(StringBuilder buf) {
+            buf.append("[ ");
+            renderString(buf, mLabel);
+            buf.append(", ");
+            renderString(buf, mLink);
+            buf.append(", ");
+            renderChildren(buf);
+            buf.append(" ]");
+        }
+    }
+}
diff --git a/tools/droiddoc/src/PackageInfo.java b/tools/droiddoc/src/PackageInfo.java
index c696112..09b73d4 100644
--- a/tools/droiddoc/src/PackageInfo.java
+++ b/tools/droiddoc/src/PackageInfo.java
@@ -49,11 +49,10 @@
         return s;
     }
 
-    public String htmlLinksPage()
-    {
+    public String fullDescriptionHtmlPage() {
         String s = mName;
         s = s.replace('.', '/');
-        s += "/package-links.html";
+        s += "/package-descr.html";
         s = DroidDoc.javadocDir + s;
         return s;
     }
diff --git a/tools/droiddoc/src/Stubs.java b/tools/droiddoc/src/Stubs.java
index a233d68..806498b 100644
--- a/tools/droiddoc/src/Stubs.java
+++ b/tools/droiddoc/src/Stubs.java
@@ -83,8 +83,9 @@
                         if (!t.isPrimitive()) {
                             if (t.asClassInfo().isHidden()) {
                                 Errors.error(Errors.UNAVAILABLE_SYMBOL,
-                                        p.position(), "Reference to unavailable class "
-                                        + t.fullName());
+                                        m.position(), "Parameter of hidden type "
+                                        + t.fullName() + " in "
+                                        + cl.qualifiedName() + "." + m.name() + "()");
                             }
                         }
                     }
@@ -255,10 +256,19 @@
                           if (pInfo.type().typeArguments() != null){
                               for (TypeInfo tInfoType : pInfo.type().typeArguments()){
                                   if (tInfoType.asClassInfo() != null){
-                                      cantStripThis(tInfoType.asClassInfo(), notStrippable, 
-                                                    "10:" +  
-                                                    mInfo.realContainingClass().qualifiedName() + ":" + 
-                                                    mInfo.name());
+                                      ClassInfo tcl = tInfoType.asClassInfo();
+                                      if (tcl.isHidden()) {
+                                          Errors.error(Errors.UNAVAILABLE_SYMBOL, mInfo.position(),
+                                                  "Parameter of hidden type "
+                                                  + tInfoType.fullName() + " in "
+                                                  + mInfo.containingClass().qualifiedName()
+                                                  + '.' + mInfo.name() + "()");
+                                      } else {
+                                          cantStripThis(tcl, notStrippable, 
+                                                  "10:" +  
+                                                  mInfo.realContainingClass().qualifiedName() + ":" + 
+                                                  mInfo.name());
+                                      }
                                   }
                               }
                           }
@@ -552,14 +562,8 @@
         int count = 1;
         int size = method.parameters().length;
         for (ParameterInfo param: method.parameters()) {
-            String fullTypeName = param.type().fullName(method.typeVariables());
-            if (count == size && method.isVarArgs()) {
-                // TODO: note that this does not attempt to handle hypothetical
-                // vararg methods whose last parameter is a list of arrays, e.g.
-                // "Object[]...".
-                fullTypeName = param.type().qualifiedTypeName() + "...";
-            }
-            stream.print(comma + fullTypeName + " " + param.name());
+            stream.print(comma + fullParameterTypeName(method, param.type(), count == size)
+                    + " " + param.name());
             comma = ", ";
             count++;
         }
@@ -852,6 +856,7 @@
     
     static void writeMethodXML(PrintStream xmlWriter, MethodInfo mi) {
         String scope = DroidDoc.scope(mi);
+
         String deprecatedString = "";
         if (mi.isDeprecated()) {
             deprecatedString = "deprecated";
@@ -860,7 +865,7 @@
         }
         xmlWriter.println("<method name=\"" + mi.name() + "\"\n" 
                 + ((mi.returnType() != null)
-                        ? " return=\"" + mi.returnType().qualifiedTypeName() + "\"\n"
+                        ? " return=\"" + makeXMLcompliant(fullParameterTypeName(mi, mi.returnType(), false)) + "\"\n"
                         : "") 
                 + " abstract=\"" + mi.isAbstract() + "\"\n"
                 + " native=\"" + mi.isNative() + "\"\n"
@@ -873,8 +878,11 @@
                 + ">");
 
         // write parameters in declaration order
+        int numParameters = mi.parameters().length;
+        int count = 0;
         for (ParameterInfo pi : mi.parameters()) {
-            writeParameterXML(xmlWriter, pi);
+            count++;
+            writeParameterXML(xmlWriter, mi, pi, count == numParameters);
         }
         
         // but write exceptions in canonicalized order
@@ -905,6 +913,13 @@
                 //+ " source=\"" + mi.position() + "\"\n"
                 + ">");
 
+        int numParameters = mi.parameters().length;
+        int count = 0;
+        for (ParameterInfo pi : mi.parameters()) {
+            count++;
+            writeParameterXML(xmlWriter, mi, pi, count == numParameters);
+        }
+        
         ClassInfo[] exceptions = mi.thrownExceptions();
         Arrays.sort(exceptions, ClassInfo.comparator);
         for (ClassInfo pi : exceptions) {
@@ -915,9 +930,10 @@
         xmlWriter.println("</constructor>");
   }
     
-    static void writeParameterXML(PrintStream xmlWriter, ParameterInfo pi) {
+    static void writeParameterXML(PrintStream xmlWriter, MethodInfo method,
+            ParameterInfo pi, boolean isLast) {
         xmlWriter.println("<parameter name=\"" + pi.name() + "\" type=\"" +
-                          pi.type().qualifiedTypeName() + "\">");
+                makeXMLcompliant(fullParameterTypeName(method, pi.type(), isLast)) + "\">");
         xmlWriter.println("</parameter>");
     }
     
@@ -931,8 +947,12 @@
         }
         //need to make sure value is valid XML
         String value  = makeXMLcompliant(fi.constantLiteralValue());
+
+        String fullTypeName = makeXMLcompliant(fi.type().qualifiedTypeName())
+                + fi.type().dimension();
+
         xmlWriter.println("<field name=\"" + fi.name() +"\"\n"
-                          + " type=\"" + fi.type().qualifiedTypeName() + "\"\n"
+                          + " type=\"" + fullTypeName + "\"\n"
                           + " transient=\"" + fi.isTransient() + "\"\n"
                           + " volatile=\"" + fi.isVolatile() + "\"\n"
                           + (fieldIsInitialized(fi) ? " value=\"" + value + "\"\n" : "") 
@@ -954,5 +974,16 @@
         returnString = returnString.replaceAll("'", "&pos;");
         return returnString;
     }
+    
+    static String fullParameterTypeName(MethodInfo method, TypeInfo type, boolean isLast) {
+        String fullTypeName = type.fullName(method.typeVariables());
+        if (isLast && method.isVarArgs()) {
+            // TODO: note that this does not attempt to handle hypothetical
+            // vararg methods whose last parameter is a list of arrays, e.g.
+            // "Object[]...".
+            fullTypeName = type.qualifiedTypeName() + "...";
+        }
+        return fullTypeName;
+    }
 }
 
diff --git a/tools/droiddoc/templates-codesite/assets-google/android-logo-sm.gif b/tools/droiddoc/templates-codesite/assets-google/android-logo-sm.gif
deleted file mode 100644
index 0a84d1b..0000000
--- a/tools/droiddoc/templates-codesite/assets-google/android-logo-sm.gif
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates-codesite/assets-google/android-logo.gif b/tools/droiddoc/templates-codesite/assets-google/android-logo.gif
deleted file mode 100644
index 55d3705..0000000
--- a/tools/droiddoc/templates-codesite/assets-google/android-logo.gif
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates-codesite/assets-google/google-logo-small.gif b/tools/droiddoc/templates-codesite/assets-google/google-logo-small.gif
deleted file mode 100644
index b5b2638..0000000
--- a/tools/droiddoc/templates-codesite/assets-google/google-logo-small.gif
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates-codesite/customization.cs b/tools/droiddoc/templates-codesite/customization.cs
deleted file mode 100644
index 5fe5077..0000000
--- a/tools/droiddoc/templates-codesite/customization.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-<?cs # appears above the blue bar at the top of every page ?>
-<?cs def:custom_masthead() ?>
-<?cs /def ?>
-
-<?cs # appears in the blue bar at the top of every page ?>
-<?cs def:custom_subhead() ?>
-    <?cs if:android.buglink ?>
-    <?cs /if ?>
-<?cs /def ?>
-
-<?cs # appears on the left side of the blue bar at the bottom of every page ?>
-<?cs def:custom_copyright() ?><?cs /def ?>
-
-<?cs def:devdoc_left_nav() ?>
-<?cs /def ?>
diff --git a/tools/droiddoc/templates-codesite/data.hdf b/tools/droiddoc/templates-codesite/data.hdf
deleted file mode 100644
index 4147999..0000000
--- a/tools/droiddoc/templates-codesite/data.hdf
+++ /dev/null
@@ -1,7 +0,0 @@
-template {
-    which = codesite
-    extension=.ezt
-    escape.0.key=[
-    escape.0.value=[[]
-}
-
diff --git a/tools/droiddoc/templates-codesite/footer.cs b/tools/droiddoc/templates-codesite/footer.cs
deleted file mode 100644
index 4cb0aee..0000000
--- a/tools/droiddoc/templates-codesite/footer.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-</div><!-- end gc-pagecontent -->
-</div><!-- end gooey wrapper -->
-[include "/html/_common_page_footer.ezt"]
-[include "/android/_build_id.ezt"]
-</body>
-
diff --git a/tools/droiddoc/templates-codesite/head_tag.cs b/tools/droiddoc/templates-codesite/head_tag.cs
deleted file mode 100644
index df5a521..0000000
--- a/tools/droiddoc/templates-codesite/head_tag.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-[include "/android/_local_variables.ezt"]
-[define page_title]<?cs var:page.title ?>[end]
-
-  <head>
-    [include "/html/apis/_common_head_elements.ezt"]
-    <script src="<?cs var:toroot ?>assets/search_autocomplete.js"></script>
-    <link rel="stylesheet" type="text/css" href="/css/semantic_headers.css" />
-    <link rel="stylesheet" type="text/css" href="<?cs var:toroot ?>assets/style.css" />
-    <script>
-    jQuery(document).ready(function() {
-            jQuery("pre").addClass("prettyprint");
-        });
-    </script>
-
-  </head>
diff --git a/tools/droiddoc/templates-codesite/header.cs b/tools/droiddoc/templates-codesite/header.cs
deleted file mode 100644
index c50ce21..0000000
--- a/tools/droiddoc/templates-codesite/header.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-[#]  <body class="gc-documentation">
-[#]
-[#]    [include "/html/_common_page_header.ezt"]
-[#]    <div class="g-section g-tpl-180">
-[#]
-[#]      <a name="gc-toc-anchor"></a>  
-[#]      <div class="g-unit g-first" id="gc-toc">
-[#]        [include toc_path]
-[#]      </div>
-[#]      
-[#]      <a name="gc-pagecontent-anchor"></a>   
-[#]      <div class="g-unit" id="gc-pagecontent">
-
-
diff --git a/tools/droiddoc/templates-gae/customization.cs b/tools/droiddoc/templates-gae/customization.cs
deleted file mode 100644
index a49389b..0000000
--- a/tools/droiddoc/templates-gae/customization.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-<?cs # appears above the blue bar at the top of every page ?>
-<?cs def:custom_masthead() ?>
-<?cs /def ?>
-
-
-<?cs # appears in the blue bar at the top of every page ?>
-<?cs def:custom_subhead() ?>SDK Documentation<?cs /def ?>
-
-<?cs # appears on the left side of the blue bar at the bottom of every page ?>
-<?cs def:custom_copyright() ?>Copyright 2007 XXX<?cs /def ?> 
-
-<?cs # appears on the right side of the blue bar at the bottom of every page ?>
-<?cs def:custom_buildinfo() ?>Built <?cs var:page.now ?><?cs /def ?>
-
-<?cs def:custom_left_nav() ?>
-<ul>
-    <li><a href="<?cs var:toroot ?>documentation.html">Main Page</a></li>
-    <li><a href="<?cs var:toroot ?>reference/packages.html">Package Index</a></li>
-    <li><a href="<?cs var:toroot ?>reference/classes.html">Class Index</a></li>
-    <li><a href="<?cs var:toroot ?>reference/hierarchy.html">Class Hierarchy</a></li>
-    <li><a href="<?cs var:toroot ?>reference/keywords.html">Index</a></li>
-</ul>
-<?cs /def ?>
-
-<?cs def:devdoc_left_nav() ?>
-  <div id="devdoc-nav">
-    <?cs include:"devdoc-nav.cs" ?>
-  </div>
-<?cs /def ?>
\ No newline at end of file
diff --git a/tools/droiddoc/templates-google/assets-google/android-logo-sm.gif b/tools/droiddoc/templates-google/assets-google/android-logo-sm.gif
deleted file mode 100644
index 0a84d1b..0000000
--- a/tools/droiddoc/templates-google/assets-google/android-logo-sm.gif
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates-google/assets-google/android-logo.gif b/tools/droiddoc/templates-google/assets-google/android-logo.gif
deleted file mode 100644
index e227045..0000000
--- a/tools/droiddoc/templates-google/assets-google/android-logo.gif
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates-google/assets-google/google-logo-small.gif b/tools/droiddoc/templates-google/assets-google/google-logo-small.gif
deleted file mode 100644
index b5b2638..0000000
--- a/tools/droiddoc/templates-google/assets-google/google-logo-small.gif
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates-google/customization.cs b/tools/droiddoc/templates-google/customization.cs
deleted file mode 100644
index ee2bc76..0000000
--- a/tools/droiddoc/templates-google/customization.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-<?cs # appears above the blue bar at the top of every page ?>
-
-<?cs def:custom_masthead() ?>
-</div>
-<?cs /def ?>
-
-
-<?cs # appears in the blue bar at the top of every page ?>
-<?cs def:custom_subhead() ?>
-    <?cs if:android.buglink ?>
-    <?cs /if ?>
-<?cs /def ?>
-
-<?cs # appears on the left side of the blue bar at the bottom of every page ?>
-<?cs def:custom_copyright() ?><?cs /def ?>
-
-<?cs # appears on the right side of the blue bar at the bottom of every page ?>
-<?cs def:custom_buildinfo() ?>Build <?cs var:page.build ?> - <?cs var:page.now ?><?cs /def ?>
-
-<?cs def:list(label, classes) ?>
-  <?cs if:subcount(classes) ?>
-    <h2><?cs var:label ?></h2>
-    <ul>
-    <?cs each:cl=classes ?>
-        <li><?cs call:type_link(cl) ?></li>
-    <?cs /each ?>
-    </ul>
-  <?cs /if ?>
-<?cs /def ?>
-
-<?cs def:custom_left_nav() ?>
-<?cs /def ?>
-
-
-<?cs def:devdoc_left_nav() ?>
-<?cs /def ?>
diff --git a/tools/droiddoc/templates-google/data.hdf b/tools/droiddoc/templates-google/data.hdf
deleted file mode 100644
index 9411b78..0000000
--- a/tools/droiddoc/templates-google/data.hdf
+++ /dev/null
@@ -1,4 +0,0 @@
-template {
-    which = normal
-}
-
diff --git a/tools/droiddoc/templates-sdk/assets-sdk/placeholder b/tools/droiddoc/templates-sdk/assets-sdk/placeholder
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/droiddoc/templates-sdk/assets-sdk/placeholder
diff --git a/tools/droiddoc/templates-sdk/customization.cs b/tools/droiddoc/templates-sdk/customization.cs
new file mode 100644
index 0000000..6a0f64c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk/customization.cs
@@ -0,0 +1,90 @@
+<?cs # This default template file is meant to be replaced. ?>
+<?cs # Use the -tempatedir arg to javadoc to set your own directory with a replacement for this file in it. ?>
+
+<?cs def:custom_masthead() ?>
+<div id="header">
+    <div id="headerLeft">
+        <a href="<?cs var:toroot ?>index.html" tabindex="-1"><img
+            src="<?cs var:toroot ?>assets/images/bg_logo.jpg" /></a>
+    </div>
+    <div id="headerRight">
+        <div id="headerLinks" align="right">
+            <img src="<?cs var:toroot ?>assets/images/icon_world.jpg"><span class="text">&nbsp;<a href="#">English</a> | <a href="http://www.android.com">Android.com</a></span>
+        </div>
+
+        <?cs call:default_search_box() ?>
+        <ul class="<?cs 
+                if:reference ?>reference<?cs
+                elif:guide ?>guide<?cs
+                elif:sdk ?>sdk<?cs
+                elif:home ?>home<?cs
+                elif:community ?>community<?cs
+                elif:publish ?>publish<?cs
+                elif:about ?>about<?cs /if ?>">		
+            <?cs if:android.whichdoc == "online" ?>
+            <li id="home-link"><a href="<?cs var:toroot ?>index.html"><span>Home</span></a></li>
+            <?cs /if ?>
+            <li id="sdk-link"><a href="<?cs var:toroot ?>sdk/index.html"><span>SDK</span></a></li>
+            <li id="guide-link"><a href="<?cs var:toroot ?>guide/index.html"
+                                onClick="return loadLast('guide')"><span>Dev Guide</span></a></li>
+            <li id="reference-link"><a href="<?cs var:toroot ?>reference/packages.html" 
+                                onClick="return loadLast('reference')"><span>Reference</span></a></li>
+            <li><a href="http://android-developers.blogspot.com"><span>Blog</span></a></li>
+            <li id="community-link"><a href="<?cs var:toroot ?>community/index.html"><span>Community</span></a></li>
+        </ul>
+
+    </div><!-- headerRight -->
+</div><!-- header -->
+
+<?cs /def ?><?cs # custom_masthead ?>
+
+<?cs def:sdk_nav() ?>
+<div class="g-section g-tpl-180" id="body-content">
+  <div class="g-unit g-first" id="side-nav">
+    <div id="devdoc-nav">
+      <?cs include:"../../../java/android/html/sdk/sdk_toc.cs" ?>
+    </div>
+  </div> <!-- end side-nav -->
+<?cs /def ?>
+
+<?cs def:guide_nav() ?>
+<div class="g-section g-tpl-240" id="body-content">
+  <div class="g-unit g-first side-nav-resizable" id="side-nav">
+    <div id="devdoc-nav">
+      <?cs include:"../../../java/android/html/guide/guide_toc.cs" ?>
+    </div>
+  </div> <!-- end side-nav -->
+  <script>
+    addLoadEvent(function() {
+      scrollIntoView("devdoc-nav");
+      });
+  </script>
+<?cs /def ?>
+
+<?cs def:publish_nav() ?>
+<div class="g-section g-tpl-180" id="body-content">
+  <div class="g-unit g-first" id="side-nav">
+    <div id="devdoc-nav">
+      <?cs include:"../../../java/android/html/publish/publish_toc.cs" ?>
+    </div>
+  </div> <!-- end side-nav -->
+<?cs /def ?>
+
+<?cs def:custom_left_nav() ?>
+  <?cs if:guide ?>
+    <?cs call:guide_nav() ?>
+  <?cs elif:publish ?>
+    <?cs call:publish_nav() ?> 
+  <?cs elif:sdk ?>
+    <?cs call:sdk_nav() ?>
+  <?cs else ?>
+    <?cs call:default_left_nav() ?> 
+  <?cs /if ?>
+<?cs /def ?>
+
+
+<?cs # appears on the left side of the blue bar at the bottom of every page ?>
+<?cs def:custom_copyright() ?>Copyright 2008 <a href="http://source.android.com/">The Android Open Source Project</a><?cs /def ?>
+
+<?cs # appears on the right side of the blue bar at the bottom of every page ?>
+<?cs def:custom_buildinfo() ?>Build <?cs var:page.build ?> - <?cs var:page.now ?><?cs /def ?>
diff --git a/tools/droiddoc/templates-gae/data.hdf b/tools/droiddoc/templates-sdk/data.hdf
similarity index 100%
rename from tools/droiddoc/templates-gae/data.hdf
rename to tools/droiddoc/templates-sdk/data.hdf
diff --git a/tools/droiddoc/templates/devdoc-nav.cs b/tools/droiddoc/templates-sdk/devdoc-nav.cs
similarity index 100%
rename from tools/droiddoc/templates/devdoc-nav.cs
rename to tools/droiddoc/templates-sdk/devdoc-nav.cs
diff --git a/tools/droiddoc/templates/sdkpage.cs b/tools/droiddoc/templates-sdk/sdkpage.cs
similarity index 78%
rename from tools/droiddoc/templates/sdkpage.cs
rename to tools/droiddoc/templates-sdk/sdkpage.cs
index 45b4d1f..e274237 100644
--- a/tools/droiddoc/templates/sdkpage.cs
+++ b/tools/droiddoc/templates-sdk/sdkpage.cs
@@ -10,7 +10,7 @@
 
 <div class="g-unit" id="doc-content" >
 
-<div id="jd-content" style="min-width:820px">
+<div id="jd-content" style="min-width:870px">
 
 <h1><?cs var:sdk.version ?></h1>
 <p><em>
@@ -18,20 +18,20 @@
 <a href="RELEASENOTES.html">Release Notes</a>
 </em></p>
 
-<div class="sidebox-wrapper" style="width:250px">
-<div class="sidebox-inner">
+<div id="qv-wrapper">
+<div id="qv">
 <h2>Get Started</h2>
-<p><a href="requirements.html">System and Sofware Requirements &rarr;</a></p>
-<p><a href="installing.html">Guide to Installing the SDK &rarr;</a></p>
+<p><a href="requirements.html">System and Sofware Requirements</a></p>
+<p><a href="installing.html">Guide to Installing the SDK</a></p>
 
 <h2>Upgrade</h2>
-<p><a href="upgrading.html">Upgrading the SDK &rarr;</a></p>
-<p><a href="">API changes overview &rarr;</a></p>
-<p><a href="">API differences report &rarr;</a></p>
+<p><a href="upgrading.html">Upgrading the SDK</a></p>
+<p><a href="migrating/changes-overview.html">API changes overview</a></p>
+<p><a href="migrating/changes.html">API differences report</a></p>
 
 <h2>Using Eclipse?</h2>
 <p>Android provides an Eclipse plugin to help make programming and debugging easier.</p>
-<p><a href="">Install Eclipse plugin &rarr;</a></p>
+<p><a href="<?cs var:toroot ?>guide/developing/tools/adt.html">Install Eclipse plugin</a></p>
 </div>
 </div>
 
diff --git a/tools/droiddoc/templates/assets/android-developer-core.css b/tools/droiddoc/templates/assets/android-developer-core.css
index 3fb6960..eeedc7f 100644
--- a/tools/droiddoc/templates/assets/android-developer-core.css
+++ b/tools/droiddoc/templates/assets/android-developer-core.css
@@ -4,12 +4,23 @@
    info: core developer styles (developer.android.com)
 */
 
-@import url("http://www.google.com/css/goog.css");
-@import url("http://www.google.com/css/inlay.css");
+
+/* RESET STYLES */
+
+html,body,div,h1,h2,h3,h4,h5,h6,p,img,
+dl,dt,dd,ol,ul,li,table,caption,tbody,
+tfoot,thead,tr,th,td,form,fieldset,
+embed,object,applet {
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
 
 /* BASICS */
 
 body {
+  font-family:arial,sans-serif;
+  color:#000;
   font-size:13px;
   color:#333;
   overflow:hidden;
@@ -19,17 +30,47 @@
   background-repeat:repeat-x;
 }
 
+a, a code { 
+  color:#00c;
+} 
+
+a:active,
+a:active code { 
+  color:#f00;
+} 
+
+a:visited,
+a:visited code { 
+  color:#551a8b;
+}
+
+input, select,
+textarea, option {
+  font-family:inherit;
+  font-size:inherit;
+}
+
+p {
+  padding:0;
+  margin:0 0 1em;
+}
+
 code, pre {
   color:#007000;
   font-family:monospace;
   line-height:1em;
 }
 
+var {
+  color:#007000;
+  font-style:italic;
+}
+
 pre {
-  border:1px solid #5B7957;
+  border:1px solid #ccc;
   background-color:#fafafa;
   padding:10px;
-  margin:0 0 1em;
+  margin:0 0 1em 1em;
   overflow:auto;
 }
 
@@ -43,55 +84,66 @@
 }
 
 ul,ol {
-  margin:0;
-  padding:0 0 1em 2em;
-}
-
-dl {
-  margin:0;
-  padding:0;
-}
-
-dt {  
-  font-weight:bold;
-  margin:0;
-  padding:0 0 .5em;
-}
-
-dd {
-  font-weight:normal;
-  margin:0;
-  padding:0 0 .5em 1em;
-}
-
-li p, li pre, li table, li img,
-dd p, dd pre, dd table, dd img {
-  margin:.5em 0 0;
+  margin:0 0 .8em;
+  padding:0 0 0 2em;
 }
 
 li {
   padding:0 0 .5em;
 }
 
+dl {
+  margin:0 0 1em 0;
+  padding:0;
+}
+
+dt {  
+  margin:0;
+  padding:0;
+}
+
+dd {
+  margin:0 0 1em;
+  padding:0 0 0 2em;
+}
+
+li p, dd p {
+  margin:1em 0 0;
+}
+
+li pre, li table, li img,
+dd pre, dd table, dd img {
+  margin:1em 0 0 1em;
+}
+
 li ul,
 li ol {
-  padding: .5em 0 0 2em;
+  margin:.5em 0 0 0;
+  padding: 0 0 0 2em;
 }
 
-dl dl {
-  padding:.5em 0 0;
+dl li {
+  padding:.5em 0 0 0;
 }
 
-li p {
+dl dl,
+ol dl,
+ul dl {
+  margin:0 0 1em;
   padding:0;
 }
 
 table {
+  font-size:1em;
   margin:0 0 1em;
+  padding:0;
+  border-collapse:collapse;
+  border-width:0;
+  empty-cells:show;
 }
 
 td,th {
-  border:1px solid #666;
+  border:1px solid #ccc;
   padding:6px 12px;
   text-align:left;
   vertical-align:top;
@@ -99,17 +151,7 @@
 }
 
 th {
-  background-color:#ccc;
-}
-
-a code {
-  color:#00c;
-} 
-a:active code {
-  color:#f00;
-} 
-a:visited code {
-  color:#551a8b;
+  background-color:#dee8f1;
 }
 
 hr.blue {
@@ -124,6 +166,7 @@
   margin:0;
   position:fixed;
   top:103px;
+  width:100%;
 }
 
 #header {
@@ -131,25 +174,21 @@
   height: 100px;
   position:relative;
   z-index:100;
-  min-width:730px;
-}
-
-#header img {
-  padding:0;
+  min-width:620px;
 }
 
 #headerLeft{
-  float:left;
+  position:absolute;
   border:none;
-  width:1px;
   margin:20px 0 0 10px;
   overflow:visible;
+  font-size: 36px;
 }
 
 #headerRight {
   float:right;
   border:none;
-  width:715px;
+  width:615px;
   height:100px;
 }
 
@@ -162,10 +201,11 @@
   height: 32px;
   position:absolute;
   bottom:0;
+  right:0;
 }
 
 #header li {
-  float: right;
+  float: left;
   margin: 0px 5px 0px 0px;
   padding:0;
 }
@@ -180,9 +220,8 @@
   font-weight: normal;
   width: 96px;
   height: 32px;
-  padding-top: 9px;
   text-align: center;
-  margin: 0px 0px 0px 0px;
+  margin: 0px;
 }
 
 #header li a:hover {
@@ -191,18 +230,34 @@
   color: #fff;
 }
 
+#header li a span {
+  position:relative;
+  top:9px;
+}
+
 /* TAB HIGHLIGHTING */
-.home #home-link,
-.publish #publish-link,
-.guide #guide-link,
-.reference #reference-link,
-.sdk #sdk-link,
-.community #community-link,
-.about #about-link {
+.home #home-link a,
+.publish #publish-link a,
+.guide #guide-link a,
+.reference #reference-link a,
+.sdk #sdk-link a,
+.community #community-link a,
+.about #about-link a {
   background-image: url(images/tab_selected.png);
   background-repeat: no-repeat;
   color: #fff;
   font-weight: bold;
+  cursor:default;
+}
+
+.home #home-link a:hover,
+.publish #publish-link a:hover,
+.guide #guide-link a:hover,
+.reference #reference-link a:hover,
+.sdk #sdk-link a:hover,
+.community #community-link a:hover,
+.about #about-link  a:hover {
+  background-image: url(images/tab_selected.png);
 }
 
 #headerLinks {
@@ -234,10 +289,9 @@
 /* main */
 
 #mainBodyFixed {
-  float: left;
-  margin: 20px;
+  margin: 20px auto;
   color: #333;
-  min-width:920px;
+  width:920px;
 }
 
 #mainBodyFixed h3 {
@@ -254,7 +308,14 @@
   padding-bottom:.5em;
 }
 
-#mainBodyFixed .green { 
+#mainBodyFixed h1 { 
+  color:#435A6E;
+  font-size:1.7em;
+  margin: 1em 0;
+}
+
+#mainBodyFixed .green,
+#jd-content .green { 
   color:#7BB026;
   background-color:none;
 }
@@ -322,7 +383,7 @@
     text-align:left;
 }
 
-#mainBodyRight td.blueBorderBox {
+#mainBodyRight .blueBorderBox {
   border:5px solid #ddf0f2;
     padding:18px 18px 18px 18px;
     text-align:left;
@@ -389,28 +450,25 @@
 }
 
 .groupTable {
-  width: 95%;
+  width: 100%;
 }
 
 .groupTable th {
-  padding: 10px 20px 10px 20px;
+  padding: 10px;
   color: #ffffff;
   background-color: #6D8293;
   border: 2px solid #fff;
 }
 
-.groupTable .oddRow td {  
-  padding: 20px 28px 20px 28px;
+.groupTable td {
+  padding: 10px;
   color: #333333;
   background-color: #d9d9d9;
   border: 2px solid #fff;
 }
 
 .groupTable .evenRow td {  
-  padding: 20px 28px 20px 28px;
-  color: #333333;
   background-color: #ededed;
-  border: 2px solid #fff;
 }
 
 span.BigBlue {
@@ -496,7 +554,7 @@
   color:#0000cc;
 }
 #search_filtered .jd-selected {
-  background-color: #7BB026;
+  background-color: #A4C639;
   cursor:pointer;
 }
 #search_filtered .jd-selected,
@@ -514,10 +572,10 @@
   padding-right: 6px;
   padding-top: 1px;
   padding-bottom: 1px;
-  font-size: 80%;
+  font-size: .8em;
   border: none;
   margin: 0;
-  line-height: 105%;
+  line-height: 1.05em;
 }
 
 .show-row {
@@ -608,7 +666,7 @@
   border:1px solid #BCCDF0;
   width:99%;
   padding-left:2px;
-  font-size:95%;
+  font-size:.95em;
 }
 
 td.gsc-search-button {
@@ -721,17 +779,19 @@
 #app-list img {  
   width:90px;
   height:70px;
-  padding:0;
+  margin:0;
 }
 
 #app-list a.selected, 
-.app-list a:active.selected, 
-.app-list a:hover.selected {
+#app-list a:active.selected, 
+#app-list a:hover.selected {
   background:#A4C639;
   color:#fff;
+  cursor:default;
+  text-decoration:none;
 }
 #app-list a:hover, 
-.app-list a:active {
+#app-list a:active {
   background:#ff9900;
   text-decoration:underline;
 }
@@ -751,7 +811,7 @@
 }
 
 #carouselMain img {
-  padding:0;
+  margin:0;
 }
 
 /*carousel bulletin layouts*/
@@ -792,3 +852,4 @@
 }
 
 
+
diff --git a/tools/droiddoc/templates/assets/android-developer-docs-devguide.css b/tools/droiddoc/templates/assets/android-developer-docs-devguide.css
new file mode 100644
index 0000000..d8bd3b3
--- /dev/null
+++ b/tools/droiddoc/templates/assets/android-developer-docs-devguide.css
@@ -0,0 +1,19 @@
+
+@import url("android-developer-docs.css");
+
+/* Page title */
+
+#jd-header h1 {
+  padding: 8px 0 0 0;
+}
+
+/* Page content container */
+
+#jd-header table {
+margin: 0 0 1em 1em;
+}
+
+#jd-content table table,
+#jd-content table img {
+  margin:1em 0;
+}
\ No newline at end of file
diff --git a/tools/droiddoc/templates/assets/android-developer-docs.css b/tools/droiddoc/templates/assets/android-developer-docs.css
old mode 100755
new mode 100644
index 5be4df0..cfbcc75
--- a/tools/droiddoc/templates/assets/android-developer-docs.css
+++ b/tools/droiddoc/templates/assets/android-developer-docs.css
@@ -15,7 +15,7 @@
   color:#336666;
   margin:0;
   padding: 5px 10px;
-  font-size: 100%;
+  font-size: 1em;
   line-height: 15px;
 }
 
@@ -26,29 +26,23 @@
   padding:0 0 0 15px;
 }
 
-#crumb {
-  font-size:95%;
-  padding:5px 20px;
-  float:right;
-  color:#336666;
-}
-
 /* SIDE NAVIGATION */
 
 #side-nav {
   padding:0 6px 0 0;
   background-color: #fff;
+  font-size:12px;
 }
 
 #resize-packages-nav {
 /* keeps the resize handle below the h-scroll handle */
-  height:200px;
+  height:270px;
   overflow:hidden;
   max-height:100%;
 }
 
 #packages-nav {
-  height:200px;
+  height:270px;
   max-height:inherit;
   position:relative;
   overflow:auto;
@@ -57,6 +51,7 @@
 #classes-nav,
 #devdoc-nav {
   overflow:auto;
+  position:relative;
 }
 
 #side-nav ul {
@@ -66,25 +61,30 @@
 }
 
 #side-nav ul ul {
-  margin: 0;
+  margin: .35em 0 0 0;
   padding: 0;
 }
 
 #side-nav li {
-  padding: 1px 0 2px 0;
-  line-height:1.1em;
+  padding:0;
+  line-height:16px;
   white-space:nowrap;
 }
 
 #side-nav li h2 {
-  font-size: 100%;
+  font-size:12px;
   font-weight: bold;
-  margin: 0;
-  padding: 8px 0 0 10px;
+  margin:.5em 0 0 0;
+  padding: 3px 0 1px 9px;
 }
 
 #side-nav li a {
-  padding: 0 0 0 11px;
+  text-decoration:none;
+  padding: 0 0 0 18px;
+}
+
+#side-nav li a:hover {
+  text-decoration:underline;
 }
 
 #side-nav li a+a {
@@ -93,23 +93,55 @@
 
 #side-nav li li li a { 
 /*sdk lists*/
-  padding: 0 0 0 25px;
+  padding: 0 0 0 28px;
 } 
 
 #side-nav .selected {
-  background-color: #97a2ac;
+  background-color: #435a6e;
   color: #fff;
   font-weight:bold;
 }
 
 #side-nav .selected a {
   color: #fff;
+  text-decoration:none;
 }
 
 #side-nav strong {
   display:block;
 }
 
+#side-nav .toggle-img {
+  margin:0;
+  padding:0;
+  position:absolute;
+  top:0;
+  left:0;
+  height:16px;
+  width:15px;
+  outline-style:none;
+}
+
+#side-nav .closed .toggle-img {
+  background:url('images/triangle-closed-small.png') 7px 4px no-repeat;
+}
+#side-nav .open .toggle-img {
+  background:url('images/triangle-opened-small.png') 7px 4px no-repeat;
+}
+
+#side-nav .toggle-list {
+  position:relative;
+}
+
+#side-nav .toggle-list ul {
+  margin:0;
+  display:none;
+}
+
+#side-nav .toggle-list div {
+  display:block;
+}
+
 #index-links .selected {
   background-color: #fff;
   color: #000;
@@ -121,6 +153,53 @@
   padding:7px 0 4px 10px;
 }
 
+/* nav tree */
+
+#nav-tree ul {
+  padding:5px 0 1.5em;
+}
+
+#side-nav #nav-tree ul li a,
+#side-nav #nav-tree ul li span.no-children {
+  padding: 0 0 0 0;
+  margin: 0;
+}
+
+#nav-tree .plus {
+  margin: 0 3px 0 0;
+}
+
+#nav-tree ul ul {
+  list-style: none;
+  margin: 0;
+  padding: 0 0 0 0;
+}
+
+#nav-tree ul li {
+  margin: 0;
+  padding: 0 0 0 0;
+  white-space: nowrap;
+}
+
+#nav-tree .children_ul {
+  margin:0;
+}
+
+#nav-tree a.nolink {
+  color: black;
+  text-decoration: none;
+}
+
+#nav-tree span.label {
+  width: 100%;
+}
+
+#nav-tree {
+  overflow-x: auto;
+  overflow-y: scroll;
+}
+
+
 /* DOCUMENT BODY */
 
 #doc-content {
@@ -128,13 +207,29 @@
 }
 	
 #jd-header {
-  background-color: #9bb0c3;
-  padding: 10px 20px;
+  background-color: #E9E9E9;
+  padding: 7px 20px;
 }
 
 #jd-header h1 {
   margin: 0 0 10px;
-  font-size:160%;
+  font-size:1.7em;
+}
+
+#jd-header .crumb {
+  font-size:.9em;
+  line-height:1em;
+  color:#777;
+}
+
+#jd-header .crumb a,
+#jd-header .crumb a:visited {
+  text-decoration:none;
+  color:#777;
+}
+
+#jd-header .crumb a:hover {
+  text-decoration:underline;
 }
 
 #jd-header table {
@@ -148,13 +243,22 @@
   vertical-align:top;
 }
 
+#jd-header.guide-header {
+  background-color:#fff;
+  color:#435a6e;
+  height:50px;
+}
+
+#jd-descr {
+  position:relative;
+}
 
 /* inheritance table */
 .jd-inheritance-table {
   border-spacing:0;
   margin:0;
   padding:0;
-  font-size:90%;
+  font-size:.9em;
 }
 .jd-inheritance-table td {
   border: none;
@@ -170,7 +274,7 @@
 }
 
 #jd-content {
-  padding: 12px 20px;
+  padding: 18px 20px;
 }
 
 hr {
@@ -181,51 +285,60 @@
 
 #jd-content h1 {
 /*sdk page*/
-  font-size:160%;
+  font-size:1.6em;
   color:#336666;
   margin:0 0 .5em;
 }
 
 #jd-content h2 {
-  font-size:140%;
-  background-color: #97a2ac;
-  border-right:20px solid #97a2ac;
-  position:relative;
-  left:-20px;
-  width:100%;
-  padding: 8px 0 8px 20px;
-  z-index:-1;
+  font-size:1.45em;
+  color:#111;
+  border-top:2px solid #ccc;
+  padding: .5em 0 0;
+  margin: 1.75em 0 1em 0;
+  max-width:968px;
 }
 
 #jd-content h3 {
-  font-size:130%;
-  border-top: 3px solid #97a2ac;
-  padding:3px 0 5px;
+  font-size:1.2em;
+  color:#222;
+  padding: .75em 0 .65em 0;
+  margin:0;
 }
 
 #jd-content h4 {
-  font-size:110%;
+  font-size:1.1em;
   margin-bottom:.5em;
+  color:#222;
 }
 
-img {
-  padding:0 0 1em 0;
+#jd-content .small-header {
+  font-size:1em;
+  color:#000;
+  font-weight:bold;
+  border:none;
+  padding:0;
+  margin:1em 0 .5em;
+  position:inherit;
+}
+
+#jd-content img {
+  margin: 0 0 1em 1em;
 }
 
 #jd-content li img,
 #jd-content dd img {
-  margin:.5em 0 0;
-  padding:0;
+  margin:.5em 0 0 1em;
 }
 
 .nolist {
   list-style:none;
-  padding:0 0 1em;
-  margin:0 0 0 1em;
+  padding:0;
+  margin:0 0 1em 1em;
 }
 
 h4 .normal {
-  font-size:90%;
+  font-size:.9em;
   font-weight:normal;
 }
 
@@ -244,7 +357,7 @@
 }
 
 h4.jd-details-title {
-  font-size:115%;
+  font-size:1.15em;
   background-color: #d6d6d6;
   margin:0 0 .6em;
   padding:3px;
@@ -275,43 +388,9 @@
   font-style:italic;
 }
 
-.sidebox-wrapper {
-  float: right;
-  width:300px;
-  background-color:#fff;
-  padding-left:15px;
-}
-
-.sidebox-inner {
-  border-left:2px solid #7BB026;
-  padding:0 5px 0 15px;
-}
-
-.sidebox {
-  float: right;
-  width:300px;
-  background-color:#fff;
-  border-left:2px solid #7BB026;
-  margin-left:15px;
-  padding:0 5px 0 15px;
-}
-
-#jd-content .sidebox h2,
-#jd-content .sidebox h3,
-#jd-content .sidebox-inner h2,
-#jd-content .sidebox-inner h3 {
-  background-color:#fff;
-  border:none;
-  font-size:110%;
-  margin:0;
-  padding:0 0 10px;
-  left:0;
-  z-index:0;
-}
-
 #jd-content table h2 {
   background-color: #d6d6d6;
-  font-size: 110%;
+  font-size: 1.1em;
   margin:0 0 10px;
   padding:5px;
   left:0;
@@ -319,25 +398,46 @@
 }
 
 div.special {
-  padding: 10px 25px 0;
+  padding: 15px 20px 3px;
   margin: 0 0 1em;
   background-color: #ddf0f2;
 }
 
+div.special p {
+  margin: .25em 0;
+}
+
+div.special ol {
+  margin: 0;
+}
+
+div.special ol li {
+  margin: 0;
+  padding: 0;
+}
+
+#jd-content div.special h2,
 #jd-content div.special h3 {
   color:#669999;
-  font-size:120%;
+  font-size:1.2em;
   border:none;
   margin:0 0 .5em;
+  padding:0;
 }
   
-p.note, p.caution, p.warning {
+/* old p.note, p.caution, p.warning {
   margin:0 0 1em;
   padding: 4px 10px;
   background-color: #efefef;
   border-top: 1px solid;  
   border-bottom: 1px solid;
 }
+*/
+p.note, p.caution, p.warning {
+  margin: 1em;
+  padding: 0 0 0 .5em;
+  border-left: 4px solid;
+}
 
 p.special-note {
   background-color:#EBF3DB;
@@ -346,7 +446,7 @@
 }
 
 p.note {
-  border-color: #3366CC;
+ border-color: #99aacc;
 }
     
 p.caution {
@@ -369,37 +469,208 @@
 
 dl.xml dt {
   font-variant:small-caps;
+  font-size:1.2em;
+}
+
+dl.xml dl {
+  padding:0;
+}
+
+dl.xml dl dt {
+  font-variant:normal;
+  font-size:1em;
+}
+
+.listhead li {
+  font-weight: bold;
+}
+  
+.listhead li *, /*ie*/.listhead li li {
+  font-weight: normal;
+}
+
+ol.no-style,
+ul.no-style {
+  list-style:none;
+  padding-left:1em;
 }
 
 .new {
-  font-size: 78%;
+  font-size: .78em;
   font-weight: bold;
   color: red;
   text-decoration: none;
 }
 
+pre.classic {
+  background-color:transparent;
+  border:none;
+  padding:0;
+}
+
+
+/* BEGIN quickview sidebar element styles */
+
+#qv-wrapper {
+  float: right;
+  position:relative;
+  width:315px;
+  background-color:#fff;
+  padding:4px 30px 15px 20px;
+  top:-55px;
+  left:20px;
+}
+
+#qv {
+  background-color:#fff;
+  border:4px solid #dee8f1;
+  margin:0 0 0 15px;
+  padding:0 6px 6px;
+  margin-top:0px;
+  width:295;
+  float:right;
+}
+
+#qv ol {
+  list-style:none;
+  padding: 0;
+}
+
+#qv ol ol{
+  list-style:none;
+  padding: 0 0 3px 12px;
+  margin:0;
+}
+
+#qv ul {
+  padding: 0 10px 0 2em;
+}
+
+#qv li {
+  padding: 0 10px;
+  margin: 2 0 0;
+  line-height: 1.2em;
+}
+
+#qv ul li {
+  padding: 0 10px 0 0;
+}
+
+#qv li.selected a {
+  color:#555;
+  text-decoration:none;
+}
+
+#qv a {
+  color:#cc6600;
+}
+
+#qv p {
+  margin:8px 0 0;
+  padding:0 10px;
+}
+
+#qv-extra #rule {
+  padding: 0 10px;
+  margin: 0;
+}
+
+#qv-sub-rule {
+  padding: 6px 20px;
+  margin: 0;
+}
+
+#qv-sub-rule p {
+  margin: 0;
+}
+
+#jd-content #qv h2 {
+  font-size:1.05em;
+  font-weight:bold;
+  margin:12px 0 .25em 0;
+  padding:0 10px;
+  background-color:transparent;
+  color:#7BB026;
+  border:none;
+  left:0;
+  z-index:1;
+}
+
+/* END quickview sidebar element styles */
+
+/* Begin sidebox sidebar element styles */
+
+.sidebox-wrapper {
+  float: right;
+  width:300px;
+  background-color:#fff;
+  margin: 0 0 0 15px;
+  padding: 5px 0 5px 15px;
+}
+
+.sidebox-inner {
+  border-left:1px solid #dee8f1;
+  background-color:#ffffee;
+  padding:0 5px 0 15px;
+}
+
+.sidebox {
+  float: right;
+  width:285px;
+  background-color:#ffffee;
+  border-left:1px solid #dee8f1;
+  margin: 0 0 0 15px;
+  padding:5px 8px 0 12px;
+}	
+
+
+#jd-content .sidebox h2,
+#jd-content .sidebox h3,
+#jd-content .sidebox-inner h2,
+#jd-content .sidebox-inner h3 {
+  border:none;
+  font-size:1em;
+  margin:0;
+  padding:4px 0 4px;
+  left:0;
+  z-index:0;
+}
+
+.sidebox hr,
+.sidebox-inner hr {
+  background-color:#ccc;
+  border:none;
+}
+
+/* End sidebox sidebar element styles */
+
 /* table of contents */
 
 ol.toc {
-  margin: 1em 0 0 0;
+  margin: 0 0 1em 0;
   padding: 0;
   list-style: none;
+  font-size:95%;
 }
 
 ol.toc li {
   font-weight: bold;
-  margin: .5em 0 0 1.5em;
+  margin: 0 0 .5em 1em;
   padding: 0;
 }
 
+ol.toc li p {
+  font-weight: normal;
+}
+
 ol.toc li ol {
   margin: 0;
   padding: 0;
 }
   
-ol.toc li ol li {
+ol.toc li li {
   padding: 0;
-  margin: .1em 0 0 1em;
+  margin: 0 0 0 1em;
   font-weight: normal;
   list-style: none;
 }
@@ -458,8 +729,8 @@
 }
 
 /* expando trigger */
-.jd-expando-trigger {
-  padding:0;
+#jd-content .jd-expando-trigger {
+  margin:0;
 }
 
 /* jd-expando */
@@ -487,7 +758,7 @@
   color:#fff;
 }
 
-/* INLAY 240PX EXTENSION */
+/* INLAY 180 COPY and 240PX EXTENSION */
 /* modified to 43px so that all browsers eliminate the package panel h-scroll */
 .g-tpl-240 .g-unit, 
 .g-unit .g-tpl-240 .g-unit, 
@@ -523,10 +794,45 @@
   float: right;
 }
 
+/* 180px */
+.g-tpl-180 .g-unit, 
+.g-unit .g-tpl-180 .g-unit, 
+.g-unit .g-unit .g-tpl-180 .g-unit {
+  display: block;
+  margin: 0 0 0 180px;
+  width: auto;
+  float: none;
+}
+.g-unit .g-unit .g-tpl-180 .g-first,
+.g-unit .g-tpl-180 .g-first,
+.g-tpl-180 .g-first {
+  display: block;
+  margin: 0;
+  width: 180px;
+  float: left;
+}
+/* 180px alt */
+.g-tpl-180-alt .g-unit, 
+.g-unit .g-tpl-180-alt .g-unit, 
+.g-unit .g-unit .g-tpl-180-alt .g-unit {
+  display: block;
+  margin: 0 180px 0 0;
+  width: auto;
+  float: none;
+}
+.g-unit .g-unit .g-tpl-180-alt .g-first,
+.g-unit .g-tpl-180-alt .g-first,
+.g-tpl-180-alt .g-first {
+  display: block;
+  margin: 0;
+  width: 180px;
+  float: right;
+}
+
   
 /* JQUERY RESIZABLE STYLES */
 .ui-resizable { position: relative; }
-.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; }
+.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; }
 .ui-resizable .ui-resizable-handle { display: block; }
 body .ui-resizable-disabled .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
 body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
@@ -538,24 +844,50 @@
   body {
     overflow:visible;
   }
+
+  #header {
+    height:60px;
+  }
+
+  #headerLeft {
+    margin:0;
+  }
   
+  #headerRight {
+    display:none;
+  }
+
+  #body-content {
+    position:inherit;
+  }
+
   #side-nav {
     display:none;
   }
   
   #doc-content {
-    margin-left:0;
-    height:auto;
-    width:auto;
+    margin-left:0 !important;
+    height:auto !important;
+    width:auto !important;
+    overflow:inherit;
+    display:inline;
   }
 
   #jd-header {
-    border-bottom:3px solid #9bb0c3;
+    padding:10px 0;
   }
 
-  #jd-content h2 {
-    border-top:2px solid #97a2ac;
-    border-bottom:2px solid #97a2ac;
+  #jd-content {
+    padding:15px 0 0;
+  }
+
+  #footer {
+    float:none;
+    margin:2em 0 0;
+  }
+
+  h4.jd-details-title {
+    border-bottom:1px solid #666;
   }
 
   pre {
@@ -577,4 +909,9 @@
     page-break-inside: avoid;
   }
 
+  #qv,
+  #qv-wrapper {
+    display:none;
+  }
+
 }
\ No newline at end of file
diff --git a/tools/droiddoc/templates/assets/android-developer-docs.js b/tools/droiddoc/templates/assets/android-developer-docs.js
index 58da116..f2276ee 100644
--- a/tools/droiddoc/templates/assets/android-developer-docs.js
+++ b/tools/droiddoc/templates/assets/android-developer-docs.js
@@ -4,7 +4,12 @@
 var sidenav;
 var content;
 var HEADER_HEIGHT = 103;
-var cookie_style = 'android_dev_docs';
+var cookie_style = 'android_developer';
+var NAV_PREF_TREE = "tree";
+var NAV_PREF_PANELS = "panels";
+var nav_pref;
+var toRoot;
+
 
 function addLoadEvent(newfun) {
   var current = window.onload;
@@ -21,6 +26,10 @@
 addLoadEvent(prepare);
 window.onresize = resizeAll;
 
+function setToRoot(root) {
+  toRoot = root;
+}
+
 function restoreWidth(navWidth) {
   var windowWidth = $(window).width() + "px";
   content.css({marginLeft:navWidth, width:parseInt(windowWidth) - parseInt(navWidth) + "px"});
@@ -32,12 +41,15 @@
 
 function restoreHeight(packageHeight) {
   var windowHeight = ($(window).height() - HEADER_HEIGHT);
+  var swapperHeight = windowHeight - 13;
+  $("#swapper").css({height:swapperHeight + "px"});
   sidenav.css({height:windowHeight + "px"});
   content.css({height:windowHeight + "px"});
-  resizePackagesNav.css({maxHeight:windowHeight + "px", height:packageHeight});
-  classesNav.css({height:windowHeight - parseInt(packageHeight) + "px"});
+  resizePackagesNav.css({maxHeight:swapperHeight + "px", height:packageHeight});
+  classesNav.css({height:swapperHeight - parseInt(packageHeight) + "px"});
   $("#packages-nav").css({height:parseInt(packageHeight) - 6 + "px"}); //move 6px to give space for the resize handle
   devdocNav.css({height:sidenav.css("height")});
+  $("#nav-tree").css({height:swapperHeight + "px"});
 }
 
 function getCookie(cookie) {
@@ -47,6 +59,9 @@
     if (index != -1) {
       var valStart = index + myCookie.length;
       var valEnd = document.cookie.indexOf(";", valStart);
+      if (valEnd == -1) {
+        valEnd = document.cookie.length;
+      }
       var val = document.cookie.substring(valStart, valEnd);
       return val;
     }
@@ -54,9 +69,14 @@
   return 0;
 }
 
-function writeCookie(cookie, val) {
-  if (location.href.indexOf("reference") != -1) {
-    document.cookie = cookie_style+'_'+cookie+'='+val+'; path=/gae/reference';
+function writeCookie(cookie, val, path, expiration) {
+  if (!val) return;
+  if (location.href.indexOf("/reference/") != -1) {
+    document.cookie = cookie_style+'_reference_'+cookie+'='+ val+'; path=' + toRoot + path +
+                                                           ((expiration) ? '; expires=' + expiration : '');
+  } else if (location.href.indexOf("/guide/") != -1) {
+    document.cookie = cookie_style+'_guide_'+cookie+'='+val+'; path=' + toRoot + path +
+                                                           ((expiration) ? '; expires=' + expiration : '');
   }
 } 
 
@@ -68,8 +88,14 @@
   sidenav = $("#side-nav");
   devdocNav = $("#devdoc-nav");
 
-  var cookieWidth = getCookie('width');
-  var cookieHeight = getCookie('height');
+
+  if (location.href.indexOf("/reference/") != -1) {
+    var cookiePath = "reference_";
+  } else if (location.href.indexOf("/guide/") != -1) {
+    var cookiePath = "guide_";
+  }
+  var cookieWidth = getCookie(cookiePath+'width');
+  var cookieHeight = getCookie(cookiePath+'height');
   if (cookieWidth) {
     restoreWidth(cookieWidth);
   } else {
@@ -89,30 +115,43 @@
 function highlightNav(fullPageName) {
   var lastSlashPos = fullPageName.lastIndexOf("/");
   var firstSlashPos = fullPageName.indexOf("/",8); // first slash after http://
-  if (lastSlashPos == (fullPageName.length - 1)) { // if the url ends in slash (index.html)
+  if (lastSlashPos == (fullPageName.length - 1)) { // if the url ends in slash (add 'index.html')
     fullPageName = fullPageName + "index.html";
   }
   var htmlPos = fullPageName.lastIndexOf(".html", fullPageName.length);
-  var pageName = fullPageName.slice(firstSlashPos, htmlPos + 5);
-  var link = $("#devdoc-nav a[href$='"+pageName+"']");
-  if (link.length == 0) { // if there's no match, maybe the nav url ends in a slash, also
-    link = $("#devdoc-nav a[href$='"+pageName.slice(0,pageName.indexOf("index.html"))+"']");
+  var pathPageName = fullPageName.slice(firstSlashPos, htmlPos + 5);
+  var link = $("#devdoc-nav a[href$='"+ pathPageName+"']");
+  if (link.length == 0) { // if there's no match, then the nav url must be the parent dir (ie, this doc isn't listed, so highlight the parent
+    link = $("#devdoc-nav a[href$='"+ pathPageName.slice(0, pathPageName.lastIndexOf("/") + 1)+"']");
   }
   link.parent().addClass('selected');
+  if (link.parent().parent().is(':hidden')) {
+    toggle(link.parent().parent().parent(), false);
+  } else if (link.parent().parent().hasClass('toggle-list')) {
+    toggle(link.parent().parent(), false);
+  }
 }
 
 function resizeHeight() {
   var windowHeight = ($(window).height() - HEADER_HEIGHT);
+  var swapperHeight = windowHeight - 13;
+  $("#swapper").css({height:swapperHeight + "px"});
   sidenav.css({height:windowHeight + "px"});
   content.css({height:windowHeight + "px"});
-  resizePackagesNav.css({maxHeight:windowHeight + "px"});
-  classesNav.css({height:windowHeight - parseInt(resizePackagesNav.css("height")) + "px"});
+  resizePackagesNav.css({maxHeight:swapperHeight + "px"});
+  classesNav.css({height:swapperHeight - parseInt(resizePackagesNav.css("height")) + "px"});
   $("#packages-nav").css({height:parseInt(resizePackagesNav.css("height")) - 6 + "px"}); //move 6px for handle
   devdocNav.css({height:sidenav.css("height")});
-  writeCookie("height", resizePackagesNav.css("height"));
+  $("#nav-tree").css({height:swapperHeight + "px"});
+  writeCookie("height", resizePackagesNav.css("height"), "reference/", null);
 }
 
 function resizeWidth() {
+  if (location.href.indexOf("/reference/") != -1) {
+    var path = "reference/";
+  } else if (location.href.indexOf("/guide/") != -1) {
+    var path = "guide/";
+  }
   var windowWidth = $(window).width() + "px";
   if (sidenav.length) {
     var sidenavWidth = sidenav.css("width");
@@ -123,7 +162,7 @@
   resizePackagesNav.css({width:sidenavWidth});
   classesNav.css({width:sidenavWidth});
   $("#packages-nav").css({width:sidenavWidth});
-  writeCookie("width", sidenavWidth);
+  writeCookie("width", sidenavWidth, path, null);
 }
 
 function resizeAll() {
@@ -131,14 +170,116 @@
   resizeWidth();
 }
 
-//added to onload when the bottom-left panel is empty
-function maxPackageHeight() { 
-  var windowHeight = resizePackagesNav.css("maxHeight");
-  resizePackagesNav.css({height:windowHeight}); 
-  $("#packages-nav").css({height:windowHeight}); 
+function loadLast(cookiePath) {
+  var lastPage = getCookie(cookiePath + "_lastpage");
+  if (lastPage) {
+    window.location = lastPage;
+    return false;
+  }
+  return true;
 }
 
 $(document).ready(function(){
   $("#resize-packages-nav").resizable({handles: "s", resize: function(e, ui) { resizeHeight(); } });
   $(".side-nav-resizable").resizable({handles: "e", resize: function(e, ui) { resizeWidth(); } });
-});
\ No newline at end of file
+});
+
+$(window).unload(function(){
+  var href = location.href;
+  if (href.indexOf("/reference/") != -1) {
+    writeCookie("lastpage", href, "", null);
+  } else if (href.indexOf("/guide/") != -1) {
+    writeCookie("lastpage", href, "", null);
+  }
+});
+
+
+
+
+function toggle(obj, slide) {
+  var ul = $("ul", obj);
+  var li = ul.parent();
+  if (li.hasClass("closed")) {
+    if (slide) {
+      ul.slideDown("fast");
+    } else {
+      ul.show();
+    }
+    li.removeClass("closed");
+    li.addClass("open");
+    $(".toggle-img", li).attr("title", "hide pages");
+  } else {
+    ul.slideUp("fast");
+    li.removeClass("open");
+    li.addClass("closed");
+    $(".toggle-img", li).attr("title", "show pages");
+  }
+}
+
+
+
+function buildToggleLists() {
+  $(".toggle-list").each(
+    function(i) {
+      $("div", this).append("<a class='toggle-img' href='#' title='show pages' onClick='toggle(this.parentNode.parentNode, true); return false;'></a>");
+      $(this).addClass("closed");
+    });
+}
+
+function getNavPref() {
+  var v = getCookie('reference_nav');
+  if (v != NAV_PREF_TREE) {
+    v = NAV_PREF_PANELS;
+  }
+  return v;
+}
+
+function chooseDefaultNav() {
+  nav_pref = getNavPref();
+  if (nav_pref == NAV_PREF_TREE) {
+    $("#nav-panels").toggle();
+    $("#panel-link").toggle();
+    $("#nav-tree").toggle();
+    $("#tree-link").toggle();
+  }
+}
+
+function swapNav() {
+  if (nav_pref == NAV_PREF_TREE) {
+    nav_pref = NAV_PREF_PANELS;
+  } else {
+    nav_pref = NAV_PREF_TREE;
+    init_navtree("nav-tree", toRoot, NAVTREE_DATA);
+  }
+  var date = new Date();
+  date.setTime(date.getTime()+(10*365*24*60*60*1000)); // keep this for 10 years
+  writeCookie("nav", nav_pref, "reference/", date.toGMTString());
+
+  $("#nav-panels").toggle();
+  $("#panel-link").toggle();
+  $("#nav-tree").toggle();
+  $("#tree-link").toggle();
+
+  if ($("#nav-tree").is(':visible')) scrollIntoView("nav-tree");
+  else {
+    scrollIntoView("packages-nav");
+    scrollIntoView("classes-nav");
+  }
+}
+
+function scrollIntoView(nav) {
+  var navObj = $("#"+nav);
+  if (navObj.is(':visible')) {
+    var selected = $(".selected", navObj);
+    if (selected.length == 0) return;
+
+    var scrolling = document.getElementById(nav);
+    var navHeight = navObj.height();
+    var offset = selected.position();
+    if(offset.top > navHeight - 92) {
+      scrolling.scrollTop = offset.top - navHeight + 92;
+    }
+  }
+}
+
+
diff --git a/tools/droiddoc/templates/assets/carousel.js b/tools/droiddoc/templates/assets/carousel.js
old mode 100755
new mode 100644
index 9aecad7..dee3130
--- a/tools/droiddoc/templates/assets/carousel.js
+++ b/tools/droiddoc/templates/assets/carousel.js
@@ -1,291 +1,293 @@
-/* file: carousel.js

-   date: oct 2008

-   author: jeremydw,smain

-   info: operates the carousel widget for announcements on 

-         the android developers home page. modified from the

-         original market.js from jeremydw. */

-

-/* -- video switcher -- */

-

-var oldVid = "multi"; // set the default video

-var nowPlayingString = "Now playing:";

-var assetsRoot = "/gae/assets/";

-

-

-/* -- app thumbnail switcher -- */

-

-var currentDroid;

-var oldDroid;

-

-// shows a random application

-function randomDroid(){

-

-	// count the total number of apps

-	var droidListLength = 0;

-	for (var k in droidList)

-		droidListLength++;

-		

-	// pick a random app and show it

-  var j = 0;

-  var i = Math.floor(droidListLength*Math.random());

-  for (var x in droidList) {

-    if(j++ == i){

-    	currentDroid = x;

-    	showPreview(x);

-    	centerSlide(x);

-    }

-  }

-

-}

-

-// shows a bulletin, swaps the carousel highlighting

-function droid(appName){

-

-  oldDroid = $("#droidlink-"+currentDroid);

-  currentDroid = appName;

-

-  var droid = droidList[appName];

-  var layout = droid.layout;

-  var imgDiv = document.getElementById("bulletinImg");

-  var descDiv = document.getElementById("bulletinDesc");

-

-  if (layout == "imgLeft") {

-    imgDiv.className = "img-left";

-    descDiv.className = "desc-right";

-  } else if (layout == "imgTop") {

-    imgDiv.className = "img-top";

-    descDiv.className = "desc-bottom";

-  } else if (layout == "imgRight") {

-    imgDiv.className = "img-right";

-    descDiv.className = "desc-left";

-  }

-

-  imgDiv.innerHTML = "<img src='" + assetsRoot + "images/home/" + droid.img + "'>";

-  descDiv.innerHTML = (droid.title != "") ? "<h3>" + droid.title + "</h3>" + droid.desc : droid.desc;

-

-  if(oldDroid)

-    oldDroid.removeClass("selected");

-

-  $("#droidlink-"+appName).addClass("selected");

-}

-

-

-// -- * build the carousel based on the droidList * -- //

-function buildCarousel() {

-  var appList = document.getElementById("app-list");

-  for (var x in droidList) {

-    var droid = droidList[x];

-    var icon = droid.icon;

-    var name = droid.name;

-    var a = document.createElement("a");

-    var img = document.createElement("img");

-    var br = document.createElement("br");

-    var text = document.createTextNode(droid.name);

-

-    a.setAttribute("id", "droidlink-" + x);

-    a.className = x;

-    a.setAttribute("href", "#");

-    a.onclick = function() { showPreview(this.className); return false; }

-    img.setAttribute("src", assetsRoot + "images/home/" + droid.icon);

-    img.setAttribute("alt", "");

-

-    a.appendChild(img);

-    a.appendChild(br);

-    a.appendChild(text);

-    appList.appendChild(a);

-  }

-}

-

-// -- * slider * -- //

-

-// -- dependencies:

-//    (1) div containing slides, (2) a "clip" div to hide the scroller

-//    (3) control arrows

-

-// -- * config below * -- //

-

-var slideCode = droidList; // the dictionary of slides

-var slideList = 'app-list'; // the div containing the slides

-var arrowRight = 'arrow-right'; // the right control arrow

-var arrowLeft = 'arrow-left'; // the left control arrow

-

-

-function showPreview(slideName) {

-//  centerSlide(slideName);

-  droid(slideName); // do this function when slide is clicked

-

-}

-

-var thumblist = document.getElementById(slideList);// the div containing the slides

-

-var slideWidth = 144; // width of a slide including all margins, etc.

-var slidesAtOnce = 3; // no. of slides to appear at once (requires odd number to have a centered slide)

-

-// -- * no editing should be needed below * -- //

-

-var originPosition = {};

-var is_animating = 0;

-var currentStripPosition = 0;

-var centeringPoint = 0;

-var rightScrollLimit = 0;

-

-// makeSlideStrip()

-// - figures out how many slides there are

-// - determines the centering point of the slide strip

-function makeSlideStrip() {

-  var slideTotal = 0;

-  centeringPoint = Math.ceil(slidesAtOnce/2);

-  for (var x in slideCode) {

-    slideTotal++;

-  }

-  var i = 0;

-  for (var code in slideCode) {

-    if (i <= centeringPoint-1) {

-      originPosition[code] = 0;

-    } else {

-      if (i >= slideTotal-centeringPoint+1)  {

-        originPosition[code] = (slideTotal-slidesAtOnce)*slideWidth;

-      } else {

-        originPosition[code] = (i-centeringPoint+1)*slideWidth;

-      }

-    }

-    i++;

-  }

-  rightScrollLimit = -1*(slideTotal-slidesAtOnce)*slideWidth;

-}

-

-// slides with acceleration

-function slide(goal, id, go_left, cp) {

-  var div = document.getElementById(id);

-  var animation = {};

-  animation.time = 0.5;  // in seconds

-  animation.fps = 60;

-  animation.goal = goal;

-  origin = 0.0;

-  animation.origin = Math.abs(origin);  

-  animation.frames = (animation.time * animation.fps) - 1.0;

-  var current_frame = 0;

-  var motions = Math.abs(animation.goal - animation.origin);

-  function animate() {

-    var ease_right = function (t) { return (1 - Math.cos(t * Math.PI))/2.0; };

-    var ease = ease_right;

-    if (go_left == 1) {

-      ease = function(t) { return 1.0 - ease_right(t); };

-    }

-    var left = (ease(current_frame/animation.frames) * Math.abs(animation.goal - animation.origin)) - cp; 

-    if(left < 0) {

-      left = 0;

-    }

-    if(!isNaN(left)) {

-      div.style.left = '-' + Math.round(left) + 'px';

-    }

-    current_frame += 1;

-    if (current_frame == animation.frames) {

-      is_animating = 0;

-      window.clearInterval(timeoutId)

-    }

-  }

-  var timeoutId = window.setInterval(animate, animation.time/animation.fps * 1000);

-}

-

-//Get style property

-function getStyle(element, cssProperty){

-  var elem = document.getElementById(element);

-  if(elem.currentStyle){

-    return elem.currentStyle[cssProperty]; //IE

-  } else{

-    var style =  document.defaultView.getComputedStyle(elem, null); //firefox, Opera

-    return style.getPropertyValue(cssProperty);

-  }

-}

-

-// Left and right arrows

-function page_left() {

-  var amount = slideWidth;

-  animateSlide(amount, 'left');

-}

-

-function page_right() { 

-  var amount = slideWidth;

-  animateSlide(amount, 'right');

-}

-

-

-// animates the strip

-// - sets arrows to on or off

-function animateSlide(amount,dir) {

-  var currentStripPosition = parseInt(getStyle(slideList,'left'));

-  var motionDistance;

-  if (amount == slideWidth ) {

-    motionDistance = slideWidth;

-  } else {

-    motionDistance = amount;

-  }

-  

-  var rightarrow = document.getElementById(arrowRight);

-  var leftarrow = document.getElementById(arrowLeft);

-  

-  function aToggle(state,aDir) {

-    if (state == 'on') {

-      if (aDir =='right') {

-        rightarrow.className = 'arrow-right-on';

-        rightarrow.href = "javascript:page_right()";

-      } else {

-        leftarrow.className = 'arrow-left-on';

-        leftarrow.href = "javascript:page_left()";

-      }

-    } else {

-      if (aDir =='right') {

-        rightarrow.href = "javascript:{}";

-        rightarrow.className = 'arrow-right-off'; 

-      } else {

-        leftarrow.href = "javascript:{}";

-        leftarrow.className = 'arrow-left-off';

-      }

-    }

-  }

-  

-  function arrowChange(rP) {

-    if (rP >= rightScrollLimit) {

-      aToggle('on','right');

-    }

-    if (rP <= rightScrollLimit) {

-      aToggle('off','right');

-    }

-    if (rP <= slideWidth) {

-      aToggle('on','left');

-    }

-    if (rP >= 0) {

-      aToggle('off','left');

-    }

-  }

-

-  if (dir == 'right' && is_animating == 0) {

-    arrowChange(currentStripPosition-motionDistance);

-    is_animating = 1;

-    slide(motionDistance, slideList, 0, currentStripPosition);

-  } else if (dir == 'left' && is_animating == 0) {

-    arrowChange(currentStripPosition+motionDistance);

-    is_animating = 1;

-    rightStripPosition = currentStripPosition + motionDistance;

-    slide(motionDistance, slideList, 1, rightStripPosition);

-  }

-}

-

-function centerSlide(slideName) {

-  var currentStripPosition = parseInt(getStyle(slideList,'left'));

-  var dir = 'left';

-  var originpoint = Math.abs(currentStripPosition);

-  if (originpoint <= originPosition[slideName]) {

-    dir = 'right';

-  }

-  var motionValue = Math.abs(originPosition[slideName]-originpoint);

-  animateSlide(motionValue,dir);

-}

-

-

-function initCarousel(def) {

-  buildCarousel();

-  showPreview(def);

-  makeSlideStrip();

-}
\ No newline at end of file
+/* file: carousel.js
+   date: oct 2008
+   author: jeremydw,smain
+   info: operates the carousel widget for announcements on 
+         the android developers home page. modified from the
+         original market.js from jeremydw. */
+
+/* -- video switcher -- */
+
+var oldVid = "multi"; // set the default video
+var nowPlayingString = "Now playing:";
+var assetsRoot = "/assets/";
+
+
+/* -- app thumbnail switcher -- */
+
+var currentDroid;
+var oldDroid;
+
+// shows a random application
+function randomDroid(){
+
+	// count the total number of apps
+	var droidListLength = 0;
+	for (var k in droidList)
+		droidListLength++;
+		
+	// pick a random app and show it
+  var j = 0;
+  var i = Math.floor(droidListLength*Math.random());
+  for (var x in droidList) {
+    if(j++ == i){
+    	currentDroid = x;
+    	showPreview(x);
+    	centerSlide(x);
+    }
+  }
+
+}
+
+// shows a bulletin, swaps the carousel highlighting
+function droid(appName){
+
+  oldDroid = $("#droidlink-"+currentDroid);
+  currentDroid = appName;
+
+  var droid = droidList[appName];
+  var layout = droid.layout;
+  var imgDiv = document.getElementById("bulletinImg");
+  var descDiv = document.getElementById("bulletinDesc");
+
+  if (layout == "imgLeft") {
+    imgDiv.className = "img-left";
+    descDiv.className = "desc-right";
+  } else if (layout == "imgTop") {
+    imgDiv.className = "img-top";
+    descDiv.className = "desc-bottom";
+  } else if (layout == "imgRight") {
+    imgDiv.className = "img-right";
+    descDiv.className = "desc-left";
+  }
+
+  imgDiv.innerHTML = "<img src='" + assetsRoot + "images/home/" + droid.img + "'>";
+  descDiv.innerHTML = (droid.title != "") ? "<h3>" + droid.title + "</h3>" + droid.desc : droid.desc;
+
+  if(oldDroid)
+    oldDroid.removeClass("selected");
+
+  $("#droidlink-"+appName).addClass("selected");
+}
+
+
+// -- * build the carousel based on the droidList * -- //
+function buildCarousel() {
+  var appList = document.getElementById("app-list");
+  for (var x in droidList) {
+    var droid = droidList[x];
+    var icon = droid.icon;
+    var name = droid.name;
+    var a = document.createElement("a");
+    var img = document.createElement("img");
+    var br = document.createElement("br");
+    var text = document.createTextNode(droid.name);
+
+    a.setAttribute("id", "droidlink-" + x);
+    a.className = x;
+    a.setAttribute("href", "#");
+    a.onclick = function() { showPreview(this.className); return false; }
+    img.setAttribute("src", assetsRoot + "images/home/" + droid.icon);
+    img.setAttribute("alt", "");
+
+    a.appendChild(img);
+    a.appendChild(br);
+    a.appendChild(text);
+    appList.appendChild(a);
+  }
+}
+
+// -- * slider * -- //
+
+// -- dependencies:
+//    (1) div containing slides, (2) a "clip" div to hide the scroller
+//    (3) control arrows
+
+// -- * config below * -- //
+
+var slideCode = droidList; // the dictionary of slides
+var slideList = 'app-list'; // the div containing the slides
+var arrowRight = 'arrow-right'; // the right control arrow
+var arrowLeft = 'arrow-left'; // the left control arrow
+
+
+function showPreview(slideName) {
+//  centerSlide(slideName);
+  if (slideName.indexOf('selected') != -1) {
+    return false;
+  }
+  droid(slideName); // do this function when slide is clicked
+}
+
+var thumblist = document.getElementById(slideList);// the div containing the slides
+
+var slideWidth = 144; // width of a slide including all margins, etc.
+var slidesAtOnce = 3; // no. of slides to appear at once (requires odd number to have a centered slide)
+
+// -- * no editing should be needed below * -- //
+
+var originPosition = {};
+var is_animating = 0;
+var currentStripPosition = 0;
+var centeringPoint = 0;
+var rightScrollLimit = 0;
+
+// makeSlideStrip()
+// - figures out how many slides there are
+// - determines the centering point of the slide strip
+function makeSlideStrip() {
+  var slideTotal = 0;
+  centeringPoint = Math.ceil(slidesAtOnce/2);
+  for (var x in slideCode) {
+    slideTotal++;
+  }
+  var i = 0;
+  for (var code in slideCode) {
+    if (i <= centeringPoint-1) {
+      originPosition[code] = 0;
+    } else {
+      if (i >= slideTotal-centeringPoint+1)  {
+        originPosition[code] = (slideTotal-slidesAtOnce)*slideWidth;
+      } else {
+        originPosition[code] = (i-centeringPoint+1)*slideWidth;
+      }
+    }
+    i++;
+  }
+  rightScrollLimit = -1*(slideTotal-slidesAtOnce)*slideWidth;
+}
+
+// slides with acceleration
+function slide(goal, id, go_left, cp) {
+  var div = document.getElementById(id);
+  var animation = {};
+  animation.time = 0.5;  // in seconds
+  animation.fps = 60;
+  animation.goal = goal;
+  origin = 0.0;
+  animation.origin = Math.abs(origin);  
+  animation.frames = (animation.time * animation.fps) - 1.0;
+  var current_frame = 0;
+  var motions = Math.abs(animation.goal - animation.origin);
+  function animate() {
+    var ease_right = function (t) { return (1 - Math.cos(t * Math.PI))/2.0; };
+    var ease = ease_right;
+    if (go_left == 1) {
+      ease = function(t) { return 1.0 - ease_right(t); };
+    }
+    var left = (ease(current_frame/animation.frames) * Math.abs(animation.goal - animation.origin)) - cp; 
+    if(left < 0) {
+      left = 0;
+    }
+    if(!isNaN(left)) {
+      div.style.left = '-' + Math.round(left) + 'px';
+    }
+    current_frame += 1;
+    if (current_frame == animation.frames) {
+      is_animating = 0;
+      window.clearInterval(timeoutId)
+    }
+  }
+  var timeoutId = window.setInterval(animate, animation.time/animation.fps * 1000);
+}
+
+//Get style property
+function getStyle(element, cssProperty){
+  var elem = document.getElementById(element);
+  if(elem.currentStyle){
+    return elem.currentStyle[cssProperty]; //IE
+  } else{
+    var style =  document.defaultView.getComputedStyle(elem, null); //firefox, Opera
+    return style.getPropertyValue(cssProperty);
+  }
+}
+
+// Left and right arrows
+function page_left() {
+  var amount = slideWidth;
+  animateSlide(amount, 'left');
+}
+
+function page_right() { 
+  var amount = slideWidth;
+  animateSlide(amount, 'right');
+}
+
+
+// animates the strip
+// - sets arrows to on or off
+function animateSlide(amount,dir) {
+  var currentStripPosition = parseInt(getStyle(slideList,'left'));
+  var motionDistance;
+  if (amount == slideWidth ) {
+    motionDistance = slideWidth;
+  } else {
+    motionDistance = amount;
+  }
+  
+  var rightarrow = document.getElementById(arrowRight);
+  var leftarrow = document.getElementById(arrowLeft);
+  
+  function aToggle(state,aDir) {
+    if (state == 'on') {
+      if (aDir =='right') {
+        rightarrow.className = 'arrow-right-on';
+        rightarrow.href = "javascript:page_right()";
+      } else {
+        leftarrow.className = 'arrow-left-on';
+        leftarrow.href = "javascript:page_left()";
+      }
+    } else {
+      if (aDir =='right') {
+        rightarrow.href = "javascript:{}";
+        rightarrow.className = 'arrow-right-off'; 
+      } else {
+        leftarrow.href = "javascript:{}";
+        leftarrow.className = 'arrow-left-off';
+      }
+    }
+  }
+  
+  function arrowChange(rP) {
+    if (rP >= rightScrollLimit) {
+      aToggle('on','right');
+    }
+    if (rP <= rightScrollLimit) {
+      aToggle('off','right');
+    }
+    if (rP <= slideWidth) {
+      aToggle('on','left');
+    }
+    if (rP >= 0) {
+      aToggle('off','left');
+    }
+  }
+
+  if (dir == 'right' && is_animating == 0) {
+    arrowChange(currentStripPosition-motionDistance);
+    is_animating = 1;
+    slide(motionDistance, slideList, 0, currentStripPosition);
+  } else if (dir == 'left' && is_animating == 0) {
+    arrowChange(currentStripPosition+motionDistance);
+    is_animating = 1;
+    rightStripPosition = currentStripPosition + motionDistance;
+    slide(motionDistance, slideList, 1, rightStripPosition);
+  }
+}
+
+function centerSlide(slideName) {
+  var currentStripPosition = parseInt(getStyle(slideList,'left'));
+  var dir = 'left';
+  var originpoint = Math.abs(currentStripPosition);
+  if (originpoint <= originPosition[slideName]) {
+    dir = 'right';
+  }
+  var motionValue = Math.abs(originPosition[slideName]-originpoint);
+  animateSlide(motionValue,dir);
+}
+
+
+function initCarousel(def) {
+  buildCarousel();
+  showPreview(def);
+  makeSlideStrip();
+}
diff --git a/tools/droiddoc/templates/assets/images/android_wrench.png b/tools/droiddoc/templates/assets/images/android_wrench.png
new file mode 100644
index 0000000..6390a2d
--- /dev/null
+++ b/tools/droiddoc/templates/assets/images/android_wrench.png
Binary files differ
diff --git a/tools/droiddoc/templates/assets/images/grad-rule-qv.png b/tools/droiddoc/templates/assets/images/grad-rule-qv.png
new file mode 100644
index 0000000..bae2d18
--- /dev/null
+++ b/tools/droiddoc/templates/assets/images/grad-rule-qv.png
Binary files differ
diff --git a/tools/droiddoc/templates/assets/images/home/market-large.png b/tools/droiddoc/templates/assets/images/home/market-large.png
index fecc22b..55ab924 100644
--- a/tools/droiddoc/templates/assets/images/home/market-large.png
+++ b/tools/droiddoc/templates/assets/images/home/market-large.png
Binary files differ
diff --git a/tools/droiddoc/templates/assets/images/home/market-small.png b/tools/droiddoc/templates/assets/images/home/market-small.png
index 7799475..fa1201c 100644
--- a/tools/droiddoc/templates/assets/images/home/market-small.png
+++ b/tools/droiddoc/templates/assets/images/home/market-small.png
Binary files differ
diff --git a/tools/droiddoc/templates/assets/images/home/sdk-small.png b/tools/droiddoc/templates/assets/images/home/sdk-small.png
index 62cbb30..f90fdda 100644
--- a/tools/droiddoc/templates/assets/images/home/sdk-small.png
+++ b/tools/droiddoc/templates/assets/images/home/sdk-small.png
Binary files differ
diff --git a/tools/droiddoc/templates/assets/images/triangle-closed-small.png b/tools/droiddoc/templates/assets/images/triangle-closed-small.png
new file mode 100644
index 0000000..dc75915
--- /dev/null
+++ b/tools/droiddoc/templates/assets/images/triangle-closed-small.png
Binary files differ
diff --git a/tools/droiddoc/templates/assets/images/triangle-closed.png b/tools/droiddoc/templates/assets/images/triangle-closed.png
new file mode 100644
index 0000000..a34a055
--- /dev/null
+++ b/tools/droiddoc/templates/assets/images/triangle-closed.png
Binary files differ
diff --git a/tools/droiddoc/templates/assets/images/triangle-opened-small.png b/tools/droiddoc/templates/assets/images/triangle-opened-small.png
new file mode 100644
index 0000000..184031d
--- /dev/null
+++ b/tools/droiddoc/templates/assets/images/triangle-opened-small.png
Binary files differ
diff --git a/tools/droiddoc/templates/assets/images/triangle-opened.png b/tools/droiddoc/templates/assets/images/triangle-opened.png
new file mode 100644
index 0000000..a709604
--- /dev/null
+++ b/tools/droiddoc/templates/assets/images/triangle-opened.png
Binary files differ
diff --git a/tools/droiddoc/templates/assets/navtree.js b/tools/droiddoc/templates/assets/navtree.js
new file mode 100644
index 0000000..f48e1dc
--- /dev/null
+++ b/tools/droiddoc/templates/assets/navtree.js
@@ -0,0 +1,179 @@
+
+function new_node(me, mom, text, link, children_data)
+{
+  var node = new Object();
+  node.children = Array();
+  node.children_data = children_data;
+  node.depth = mom.depth + 1;
+
+  node.li = document.createElement("li");
+  mom.get_children_ul().appendChild(node.li);
+
+  node.label_div = document.createElement("div");
+  node.li.appendChild(node.label_div);
+  node.label_div.style.paddingLeft = 10*node.depth + "px";
+  node.label_div.className = "label";
+
+  if (children_data == null) {
+    // 12 is the width of the triangle and padding extra space
+    node.label_div.style.paddingLeft = ((10*node.depth)+12) + "px";
+  } else {
+    node.label_div.style.paddingLeft = 10*node.depth + "px";
+    node.expand_toggle = document.createElement("a");
+    node.expand_toggle.href = "javascript:void(0)";
+    node.expand_toggle.onclick = function() {
+          if (node.expanded) {
+            $(node.get_children_ul()).slideUp("fast");
+            node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
+            node.expanded = false;
+          } else {
+            expand_node(me, node);
+          }
+       };
+    node.label_div.appendChild(node.expand_toggle);
+
+    node.plus_img = document.createElement("img");
+    node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
+    node.plus_img.className = "plus";
+    node.plus_img.border = "0";
+    node.expand_toggle.appendChild(node.plus_img);
+
+    node.expanded = false;
+  }
+
+  var a = document.createElement("a");
+  node.label_div.appendChild(a);
+  node.label = document.createTextNode(text);
+  a.appendChild(node.label);
+  if (link) {
+    a.href = me.toroot + link;
+  } else {
+    if (children_data != null) {
+      a.className = "nolink";
+      a.href = "javascript:void(0)";
+      a.onclick = node.expand_toggle.onclick;
+      // This next line shouldn't be necessary.  I'll buy a beer for the first
+      // person who figures out how to remove this line and have the link
+      // toggle shut on the first try. --joeo@android.com
+      node.expanded = false;
+    }
+  }
+  
+
+  node.children_ul = null;
+  node.get_children_ul = function() {
+      if (!node.children_ul) {
+        node.children_ul = document.createElement("ul");
+        node.children_ul.className = "children_ul";
+        node.children_ul.style.display = "none";
+        node.li.appendChild(node.children_ul);
+      }
+      return node.children_ul;
+    };
+
+  return node;
+}
+
+function expand_node(me, node)
+{
+  if (node.children_data && !node.expanded) {
+    if (node.children_visited) {
+      $(node.get_children_ul()).slideDown("fast");
+    } else {
+      get_node(me, node);
+      $(node.get_children_ul()).slideDown("fast");
+    }
+    node.plus_img.src = me.toroot + "assets/images/triangle-opened-small.png";
+    node.expanded = true;
+  }
+}
+
+function get_node(me, mom)
+{
+  mom.children_visited = true;
+  for (var i in mom.children_data) {
+    var node_data = mom.children_data[i];
+    mom.children[i] = new_node(me, mom, node_data[0], node_data[1],
+        node_data[2]);
+  }
+}
+
+function this_page_relative(toroot)
+{
+  var full = document.location.pathname;
+  var file = "";
+  if (toroot.substr(0, 1) == "/") {
+    if (full.substr(0, toroot.length) == toroot) {
+      return full.substr(toroot.length);
+    } else {
+      // the file isn't under toroot.  Fail.
+      return null;
+    }
+  } else {
+    if (toroot != "./") {
+      toroot = "./" + toroot;
+    }
+    do {
+      if (toroot.substr(toroot.length-3, 3) == "../" || toroot == "./") {
+        var pos = full.lastIndexOf("/");
+        file = full.substr(pos) + file;
+        full = full.substr(0, pos);
+        toroot = toroot.substr(0, toroot.length-3);
+      }
+    } while (toroot != "" && toroot != "/");
+    return file.substr(1);
+  }
+}
+
+function find_page(url, data)
+{
+  var nodes = data;
+  var result = null;
+  for (var i in nodes) {
+    var d = nodes[i];
+    if (d[1] == url) {
+      return new Array(i);
+    }
+    else if (d[2] != null) {
+      result = find_page(url, d[2]);
+      if (result != null) {
+        return (new Array(i).concat(result));
+      }
+    }
+  }
+  return null;
+}
+
+function init_navtree(navtree_id, toroot, root_nodes)
+{
+  var me = new Object();
+  me.toroot = toroot;
+  me.node = new Object();
+
+  me.node.li = document.getElementById(navtree_id);
+  me.node.children_data = root_nodes;
+  me.node.children = new Array();
+  me.node.children_ul = document.createElement("ul");
+  me.node.get_children_ul = function() { return me.node.children_ul; };
+  //me.node.children_ul.className = "children_ul";
+  me.node.li.appendChild(me.node.children_ul);
+  me.node.depth = 0;
+
+  get_node(me, me.node);
+
+  me.this_page = this_page_relative(toroot);
+  me.breadcrumbs = find_page(me.this_page, root_nodes);
+  if (me.breadcrumbs != null && me.breadcrumbs.length != 0) {
+    var mom = me.node;
+    for (var i in me.breadcrumbs) {
+      var j = me.breadcrumbs[i];
+      mom = mom.children[j];
+      expand_node(me, mom);
+    }
+    mom.label_div.className = mom.label_div.className + " selected";
+    addLoadEvent(function() {
+      scrollIntoView("nav-tree");
+      });
+  }
+}
+
diff --git a/tools/droiddoc/templates/assets/search_autocomplete.js b/tools/droiddoc/templates/assets/search_autocomplete.js
index b5d26ea..392aa46 100644
--- a/tools/droiddoc/templates/assets/search_autocomplete.js
+++ b/tools/droiddoc/templates/assets/search_autocomplete.js
@@ -136,7 +136,7 @@
         gSelectedIndex = -1;
         for (i=0; i<DATA.length; i++) {
             var s = DATA[i];
-            if (text.length != 0 && s.label.toLowerCase().indexOf(text.toLowerCase()) != -1) {
+            if (text.length != 0 && s.label.indexOf(text) != -1) {
                 gMatches[matchedCount] = s;
                 if (gSelectedID == s.id) {
                     gSelectedIndex = matchedCount;
@@ -156,8 +156,10 @@
             obj.style.color="#000000";
         }
     } else {
-        obj.value = DEFAULT_TEXT;
-        obj.style.color="#aaaaaa";
+        if(obj.value == ""){
+          obj.value = DEFAULT_TEXT;
+          obj.style.color="#aaaaaa";
+        }
         document.getElementById("search_filtered").className = "no-display";
     }
 }
diff --git a/tools/droiddoc/templates/assets/style.css b/tools/droiddoc/templates/assets/style.css
index 37f66d4..5ad1118 100644
--- a/tools/droiddoc/templates/assets/style.css
+++ b/tools/droiddoc/templates/assets/style.css
@@ -313,3 +313,4 @@
         margin-top: 0px;
     }
 }
+
diff --git a/tools/droiddoc/templates/assets/triangle-close.png b/tools/droiddoc/templates/assets/triangle-close.png
deleted file mode 100644
index 5595adf..0000000
--- a/tools/droiddoc/templates/assets/triangle-close.png
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates/assets/triangle-none.gif b/tools/droiddoc/templates/assets/triangle-none.gif
new file mode 100644
index 0000000..0c7b469
--- /dev/null
+++ b/tools/droiddoc/templates/assets/triangle-none.gif
Binary files differ
diff --git a/tools/droiddoc/templates/assets/triangle-open.png b/tools/droiddoc/templates/assets/triangle-open.png
deleted file mode 100644
index 116ce91..0000000
--- a/tools/droiddoc/templates/assets/triangle-open.png
+++ /dev/null
Binary files differ
diff --git a/tools/droiddoc/templates/class.cs b/tools/droiddoc/templates/class.cs
index 19df5fb..1fd4369 100644
--- a/tools/droiddoc/templates/class.cs
+++ b/tools/droiddoc/templates/class.cs
@@ -10,14 +10,15 @@
     if (list.style.display == "none") {
         list.style.display = "block";
         summary.style.display = "none";
-        trigger.src = "<?cs var:toroot ?>assets/triangle-open.png";
+        trigger.src = "<?cs var:toroot ?>assets/images/triangle-closed.png";
     } else {
         list.style.display = "none";
         summary.style.display = "block";
-        trigger.src = "<?cs var:toroot ?>assets/triangle-close.png";
+        trigger.src = "<?cs var:toroot ?>assets/images/triangle-opened.png";
     }
 }
 </script>
+
 <?cs include:"header.cs" ?>
 
 <div class="g-unit" id="doc-content">
@@ -80,17 +81,17 @@
 <?cs # this next line must be exactly like this to be parsed by eclipse ?>
 <!-- ======== NESTED CLASS SUMMARY ======== -->
 <?cs if:subcount(class.inners) ?>
-<h4><?cs call:expando_trigger("nested-classes", "close") ?>Nested Classes</h4>
+<h4><?cs call:expando_trigger("nested-classes", "opened") ?>Nested Classes</h4>
 <?cs call:expandable_class_list("nested-classes", class.inners, "summary") ?>
 <?cs /if ?>
 
 <?cs if:subcount(class.subclasses.direct) ?>
-<h4><?cs call:expando_trigger("subclasses-direct", "open") ?>Known Direct Subclasses</h4>
+<h4><?cs call:expando_trigger("subclasses-direct", "closed") ?>Known Direct Subclasses</h4>
 <?cs call:expandable_class_list("subclasses-direct", class.subclasses.direct, "list") ?>
 <?cs /if ?>
 
 <?cs if:subcount(class.subclasses.indirect) ?>
-<h4><?cs call:expando_trigger("subclasses-indirect", "open") ?>Known Indirect Subclasses</h4>
+<h4><?cs call:expando_trigger("subclasses-indirect", "closed") ?>Known Indirect Subclasses</h4>
 <?cs call:expandable_class_list("subclasses-indirect", class.subclasses.indirect, "list") ?>
 <?cs /if ?>
 
@@ -195,7 +196,7 @@
 
 <?cs each:cl=class.inherited ?>
 <?cs if:subcount(cl.attrs) ?>
-<h4><?cs call:expando_trigger("inherited-attrs-"+cl.qualified, "open") ?>XML Attributes inherited
+<h4><?cs call:expando_trigger("inherited-attrs-"+cl.qualified, "closed") ?>XML Attributes inherited
     from <?cs var:cl.kind ?>
     <a href="<?cs var:toroot ?><?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
 </h4>
@@ -239,7 +240,7 @@
 
 <?cs each:cl=class.inherited ?>
 <?cs if:subcount(cl.constants) ?>
-<h4><?cs call:expando_trigger("inherited-constants-"+cl.qualified, "open") ?>Constants inherited
+<h4><?cs call:expando_trigger("inherited-constants-"+cl.qualified, "closed") ?>Constants inherited
     from <?cs var:cl.kind ?>
     <a href="<?cs var:toroot ?><?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
 </h4>
@@ -266,7 +267,7 @@
 
 <?cs each:cl=class.inherited ?>
 <?cs if:subcount(cl.fields) ?>
-<h4><?cs call:expando_trigger("inherited-fields-"+cl.qualified, "open") ?>Fields inherited
+<h4><?cs call:expando_trigger("inherited-fields-"+cl.qualified, "closed") ?>Fields inherited
     from <?cs var:cl.kind ?>
     <a href="<?cs var:toroot ?><?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
 </h4>
@@ -314,7 +315,7 @@
 
 <?cs each:cl=class.inherited ?>
 <?cs if:subcount(cl.methods) ?>
-<h4><?cs call:expando_trigger("inherited-methods-"+cl.qualified, "open") ?>Methods inherited
+<h4><?cs call:expando_trigger("inherited-methods-"+cl.qualified, "closed") ?>Methods inherited
     from <?cs var:cl.kind ?>
     <a href="<?cs var:toroot ?><?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
 </h4>
diff --git a/tools/droiddoc/templates/customization.cs b/tools/droiddoc/templates/customization.cs
index 4ff861c..c5420bb 100644
--- a/tools/droiddoc/templates/customization.cs
+++ b/tools/droiddoc/templates/customization.cs
@@ -1,151 +1,24 @@
-<?cs # This default template file is meant to be replaced. ?>
-<?cs # Use the -tempatedir arg to javadoc to set your own directory with a replacement for this file in it. ?>
-<?cs # As of OCT '08, there's no need to replace this... framework and gae are identical. ?>
+<?cs # This default template file is meant to be replaced.                      ?>
+<?cs # Use the -templatedir arg to javadoc to set your own directory with a     ?>
+<?cs # replacement for this file in it. ?>
 
 <?cs def:custom_masthead() ?>
-        <div id="header">
-		<div id="headerLeft">
-			<a href="<?cs var:toroot ?>"><img src="<?cs var:toroot ?>assets/images/bg_logo.jpg" /></a>
-		</div>
-		<div id="headerRight">
-			<div id="headerLinks" align="right">
-				<img src="<?cs var:toroot ?>assets/images/icon_world.jpg"><span class="text">&nbsp;<a href="#">English</a> | <a href="http://www.android.com">Android.com</a></span>
-			</div>
-
-
-
-			<div id="search" align="right">
-				<div id="searchForm">
-<form accept-charset="utf-8" class="gsc-search-box" onsubmit="document.location='<?cs var:toroot ?>search.html?' + document.getElementById('search_autocomplete').value; return false;">
-  <table class="gsc-search-box" cellpadding="0" cellspacing="0"><tbody>
-      <tr>
-        <td class="gsc-input">
-          <input id="search_autocomplete" class="gsc-input" type="text" size="33" autocomplete="off" tabindex="1"
-            value="search developer docs" 
-            onFocus="search_focus_changed(this, true)" 
-            onBlur="search_focus_changed(this, false)" 
-            onkeydown="return search_changed(event, true, '<?cs var:toroot?>')" 
-            onkeyup="search_changed(event, false, '<?cs var:toroot?>')" />
-        <br/>
-        <div id="search_filtered_div">
-            <table id="search_filtered" class="no-display" cellspacing=0>
-            </table>
-        </div>
-        </td>
-        <td class="gsc-search-button">
-          <input type="button" value="Search" title="search" id="search-button" class="gsc-search-button" onclick="document.location='<?cs var:toroot ?>search.html?' + document.getElementById('search_autocomplete').value;"/>
-        </td>
-        <td class="gsc-clear-button">
-          <div title="clear results" class="gsc-clear-button">&nbsp;</div>
-        </td>
-      </tr></tbody>
-    </table>
-</form>
-</div>
-			</div>
-			<ul class="<?cs 
-        if:reference ?>reference<?cs
-        elif:guide ?>guide<?cs
-        elif:sdk ?>sdk<?cs
-        elif:home ?>home<?cs
-        elif:community ?>community<?cs
-        elif:publish ?>publish<?cs
-        elif:about ?>about<?cs /if ?>">	
-				<li><a href="<?cs var:toroot ?>community/" id="community-link">Community</a></li>
-				<li><a href="http://android-developers.blogspot.com">Blog</a></li>
-				//<li><a href="<?cs var:toroot ?>publish/" id="publish-link">Publish</a></li>
-				<li><a href="<?cs var:toroot ?>reference/packages.html" id="reference-link">Reference</a></li>
-				<li><a href="<?cs var:toroot ?>guide/" id="guide-link">Dev Guide</a></li>
-				<li><a href="<?cs var:toroot ?>sdk/" id="sdk-link">SDK</a></li>	
-				<li><a href="<?cs var:toroot ?>" id="home-link">Home</a></li>
-			</ul>
-		</div>
-	</div>
-
-<?cs /def ?>
-
-
-<?cs # appears in the blue bar at the top of every page ?>
-<?cs def:custom_subhead() ?>
-    <?cs if:android.buglink ?>
-        <a href="http://b/createIssue?component=27745&owner=jcohen&cc=android-bugs&issue.summary=javadoc+bug%3A+<?cs var:filename ?>&issue.type=BUG&issue.priority=P2&issue.severity=S2&"><font color="red">See a bug? Report it here.</font></a> &nbsp;&nbsp;
-        
-    <?cs /if ?>
-<?cs /def ?>
-
-
-<?cs def:custom_left_nav() ?>
-<div class="g-section g-tpl-240" id="body-content">
-  <div class="g-unit g-first side-nav-resizable" id="side-nav">
-    <div id="resize-packages-nav">
-      <div id="packages-nav">
-        <div id="index-links"><nobr>
-          <a href="<?cs var:toroot ?>reference/packages.html" <?cs if:(page.title == "Package Index") ?>class="selected"<?cs /if ?> >Package Index</a> | 
-          <a href="<?cs var:toroot ?>reference/classes.html" <?cs if:(page.title == "Class Index") ?>class="selected"<?cs /if ?>>Class Index</a></nobr>
-        </div>
-        <ul>
-        <?cs each:pkg=docs.packages ?>
-          <li <?cs if:(class.package.name == pkg.name) || (package.name == pkg.name)?>class="selected"<?cs /if ?>><?cs call:package_link(pkg) ?></li>
-        <?cs /each ?>
-        </ul><br/>
-      </div> <!-- end packages -->
-    </div> <!-- end resize-packages -->
-    <div id="classes-nav">
-      <?cs if:subcount(class.package) ?>
-      <ul>
-        <?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>
-        <?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 else ?>
-        <script>
-          /*addLoadEvent(maxPackageHeight);*/
-        </script>
-        <p style="padding:10px">Select a package to view its members</p>
-      <?cs /if ?><br/>
-    </div><!-- end classes -->
-  </div> <!-- end side-nav -->
-<?cs /def ?>
-
-<?cs def:sdk_nav() ?>
-<div class="g-section g-tpl-180" id="body-content">
-  <div class="g-unit g-first" id="side-nav">
-    <div id="devdoc-nav">
-      <?cs include:"../../../java/android/html/sdk/sdk_toc.cs" ?>
+<div id="header">
+    <div id="headerLeft">
+        <a href="<?cs var:toroot ?>index.html" tabindex="-1"><?cs var:page.title ?></a>
     </div>
-  </div> <!-- end side-nav -->
-<?cs /def ?>
+    <div id="headerRight">
+        <?cs call:default_search_box() ?>
+    </div><!-- headerRight -->
+</div><!-- header -->
 
-<?cs def:guide_nav() ?>
-<div class="g-section g-tpl-240 side-nav-resizable" id="body-content">
-  <div class="g-unit g-first" id="side-nav">
-    <div id="devdoc-nav">
-      <?cs include:"../../../java/android/html/guide/guide_toc.cs" ?>
-    </div>
-  </div> <!-- end side-nav -->
-<?cs /def ?>
+<?cs /def ?><?cs # custom_masthead ?>
 
-<?cs def:publish_nav() ?>
-<div class="g-section g-tpl-180" id="body-content">
-  <div class="g-unit g-first" id="side-nav">
-    <div id="devdoc-nav">
-      <?cs include:"../../../java/android/html/publish/publish_toc.cs" ?>
-    </div>
-  </div> <!-- end side-nav -->
-<?cs /def ?>
 
 <?cs # appears on the left side of the blue bar at the bottom of every page ?>
-<?cs def:custom_copyright() ?>Copyright 2008 <a href="http://open.android.com/">The Android Open Source Project</a><?cs /def ?>
+<?cs def:custom_copyright() ?><?cs /def ?>
 
 <?cs # appears on the right side of the blue bar at the bottom of every page ?>
-<?cs def:custom_buildinfo() ?>Build <?cs var:page.build ?> - <?cs var:page.now ?><?cs /def ?>
\ No newline at end of file
+<?cs def:custom_buildinfo() ?>Build <?cs var:page.build ?> - <?cs var:page.now ?><?cs /def ?>
+
+<?cs def:custom_left_nav() ?><?cs call:default_left_nav() ?><?cs /def ?>
diff --git a/tools/droiddoc/templates/docpage.cs b/tools/droiddoc/templates/docpage.cs
index 26f231c..bd4d551 100644
--- a/tools/droiddoc/templates/docpage.cs
+++ b/tools/droiddoc/templates/docpage.cs
@@ -4,19 +4,31 @@
 <body class="gc-documentation">
 <?cs include:"header.cs" ?>
 
-<div class="g-unit" id="doc-content">
+<div class="g-unit" id="doc-content"><a name="top"></a>
 
-<div id="jd-header">
+<div id="jd-header" class="guide-header">
+  <span class="crumb">
+    <?cs if:parent.link ?>
+      <a href="<?cs var:parent.link ?>"><?cs var:parent.title ?></a> >
+    <?cs else ?>&nbsp;
+    <?cs /if ?>
+  </span>
 <h1><?cs var:page.title ?></h1>
 </div>
 
   <div id="jd-content">
 
+
     <div class="jd-descr">
     <?cs call:tag_list(root.descr) ?>
     </div>
 
+  <a href="#top" style="float:right">&uarr; Go to top</a>
+  <?cs if:parent.link ?>
+    <p><a href="<?cs var:parent.link ?>">&larr; Back to <?cs var:parent.title ?></a></p>
+  <?cs /if ?>
   </div>
+
 <?cs include:"footer.cs" ?>
 </div><!-- end doc-content -->
 </div><!-- end body-content -->
diff --git a/tools/droiddoc/templates/head_tag.cs b/tools/droiddoc/templates/head_tag.cs
index 7ae2281..acca358 100644
--- a/tools/droiddoc/templates/head_tag.cs
+++ b/tools/droiddoc/templates/head_tag.cs
@@ -6,11 +6,23 @@
         elif:sdk ?>SDK | <?cs 
         elif:sample ?>Samples | <?cs 
         /if ?>Android Developers</title>
-<link href="<?cs var:toroot ?>assets/android-developer-docs.css" rel="stylesheet" type="text/css" media="screen">
+
+<?cs if:guide ?>
+<link href="<?cs var:toroot ?>assets/android-developer-docs-devguide.css" rel="stylesheet" type="text/css" />
+<?cs else ?>
+<link href="<?cs var:toroot ?>assets/android-developer-docs.css" rel="stylesheet" type="text/css" />
+<?cs /if ?>
 <script src="<?cs var:toroot ?>assets/search_autocomplete.js"></script>
 <script src="<?cs var:toroot ?>reference/lists.js"></script>
 <script src="<?cs var:toroot ?>assets/jquery-resizable.min.js"></script>
 <script src="<?cs var:toroot ?>assets/android-developer-docs.js"></script>
+<script>
+  setToRoot("<?cs var:toroot ?>");
+</script>
+
+<script src="<?cs var:toroot ?>navtree_data.js"></script>
+<script src="<?cs var:toroot ?>assets/navtree.js"></script>
+
 
 <noscript>
   <style>
@@ -18,7 +30,8 @@
     #body-content{position:relative; top:0;}
     #doc-content{overflow:visible;border-left:3px solid #666;}
     #side-nav{padding:0;}
+    #side-nav .toggle-list ul {display:block;}
     #resize-packages-nav{border-bottom:3px solid #666;}
   </style>
 </noscript>
-</head>
\ No newline at end of file
+</head>
diff --git a/tools/droiddoc/templates/header.cs b/tools/droiddoc/templates/header.cs
index b5984c8..e8301be 100644
--- a/tools/droiddoc/templates/header.cs
+++ b/tools/droiddoc/templates/header.cs
@@ -1,12 +1,3 @@
-<a name="top"></a>
 <?cs call:custom_masthead() ?>
+<?cs call:custom_left_nav() ?>
 
-<?cs if:guide ?>
-  <?cs call:guide_nav() ?>
-<?cs elif:publish ?>
-  <?cs call:publish_nav() ?> 
-<?cs elif:sdk ?>
-  <?cs call:sdk_nav() ?>
-<?cs else ?>
-  <?cs call:custom_left_nav() ?> 
-<?cs /if ?>
diff --git a/tools/droiddoc/templates/macros.cs b/tools/droiddoc/templates/macros.cs
index 42ee9bb..1325496 100644
--- a/tools/droiddoc/templates/macros.cs
+++ b/tools/droiddoc/templates/macros.cs
@@ -225,7 +225,7 @@
 <?cs def:expando_trigger(id, default) ?>
 <a href="javascript:toggle_inherited('<?cs var:id ?>')" class="jd-expando-trigger"
         ><img id="<?cs var:id ?>-trigger"
-        src="<?cs var:toroot ?>assets/triangle-<?cs var:default ?>.png"
+        src="<?cs var:toroot ?>assets/images/triangle-<?cs var:default ?>.png"
         class="jd-expando-trigger" /></a>
 <?cs /def ?>
 
@@ -250,5 +250,108 @@
 <?cs /def ?>
 
 
+<?cs def:default_left_nav() ?>
+<div class="g-section g-tpl-240" id="body-content">
+  <div class="g-unit g-first side-nav-resizable" id="side-nav">
+    <div id="swapper">
+      <div id="nav-panels">
+        <div id="resize-packages-nav">
+          <div id="packages-nav">
+            <div id="index-links"><nobr>
+              <a href="<?cs var:toroot ?>reference/packages.html" <?cs if:(page.title == "Package Index") ?>class="selected"<?cs /if ?> >Package Index</a> | 
+              <a href="<?cs var:toroot ?>reference/classes.html" <?cs if:(page.title == "Class Index") ?>class="selected"<?cs /if ?>>Class Index</a></nobr>
+            </div>
+            <ul>
+            <?cs each:pkg=docs.packages ?>
+              <li <?cs if:(class.package.name == pkg.name) || (package.name == pkg.name)?>class="selected"<?cs /if ?>><?cs call:package_link(pkg) ?></li>
+            <?cs /each ?>
+            </ul><br/>
+          </div> <!-- end packages -->
+        </div> <!-- end resize-packages -->
+        <div id="classes-nav">
+          <?cs if:subcount(class.package) ?>
+          <ul>
+            <?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>
+            <?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 else ?>
+            <script>
+              /*addLoadEvent(maxPackageHeight);*/
+            </script>
+            <p style="padding:10px">Select a package to view its members</p>
+          <?cs /if ?><br/>
+        </div><!-- end classes -->
+      </div><!-- end nav-panels -->
+      <div id="nav-tree" style="display:none">
+        <div id="index-links"><nobr>
+          <a href="<?cs var:toroot ?>reference/packages.html" <?cs if:(page.title == "Package Index") ?>class="selected"<?cs /if ?> >Package Index</a> | 
+          <a href="<?cs var:toroot ?>reference/classes.html" <?cs if:(page.title == "Class Index") ?>class="selected"<?cs /if ?>>Class Index</a></nobr>
+        </div>
+      </div><!-- end nav-tree -->
+    </div><!-- end swapper -->
+  </div> <!-- end side-nav -->
+
+  <script>
+    $("<a href='#' id='nav-swap' onclick='swapNav();return false;' style='font-size:10px;line-height:9px;margin-left:1em;text-decoration:none;'><span id='tree-link'>Use Tree Navigation</span><span id='panel-link' style='display:none'>Use Panel Navigation</span></a>").appendTo("#side-nav");
+    chooseDefaultNav();
+    if ($("#nav-tree").is(':visible')) init_navtree("nav-tree", "<?cs var:toroot ?>", NAVTREE_DATA);
+    else {
+      addLoadEvent(function() {
+        scrollIntoView("packages-nav");
+        scrollIntoView("classes-nav");
+      });
+    }
+    $("#swapper").css({borderBottom:"2px solid #aaa"});
+  </script>
+
+<?cs /def ?>
+
+<?cs def:default_search_box() ?>
+<div id="search" align="right">
+    <div id="searchForm">
+        <form accept-charset="utf-8" class="gsc-search-box"
+                onsubmit="document.location='<?cs var:toroot ?>search.html?' + document.getElementById('search_autocomplete').value; return false;">
+          <table class="gsc-search-box" cellpadding="0" cellspacing="0"><tbody>
+              <tr>
+                <td class="gsc-input">
+                  <input id="search_autocomplete" class="gsc-input" type="text" size="33" autocomplete="off" 
+                    tabindex="1" title="search developer docs"
+                    value="search developer docs" 
+                    onFocus="search_focus_changed(this, true)" 
+                    onBlur="search_focus_changed(this, false)" 
+                    onkeydown="return search_changed(event, true, '<?cs var:toroot?>')" 
+                    onkeyup="search_changed(event, false, '<?cs var:toroot?>')" />
+                <br/>
+                <div id="search_filtered_div">
+                    <table id="search_filtered" class="no-display" cellspacing=0>
+                    </table>
+                </div>
+                </td>
+                <td class="gsc-search-button">
+                  <input type="button" value="Search" title="search" id="search-button" class="gsc-search-button" onclick="document.location='<?cs var:toroot ?>search.html?' + document.getElementById('search_autocomplete').value;" tabindex="2"/>
+                </td>
+                <td class="gsc-clear-button">
+                  <div title="clear results" class="gsc-clear-button">&nbsp;</div>
+                </td>
+              </tr></tbody>
+            </table>
+        </form>
+    </div><!-- searchForm -->
+</div><!-- search -->
+<?cs /def ?>
+
+
+
 <?cs include:"customization.cs" ?>
 
diff --git a/tools/droiddoc/templates/navtree_data.cs b/tools/droiddoc/templates/navtree_data.cs
new file mode 100644
index 0000000..c707232
--- /dev/null
+++ b/tools/droiddoc/templates/navtree_data.cs
@@ -0,0 +1,4 @@
+var NAVTREE_DATA =
+<?cs var:reference_tree ?>
+;
+
diff --git a/tools/droiddoc/templates/packages.cs b/tools/droiddoc/templates/packages.cs
index a214dcf..14f7246 100644
--- a/tools/droiddoc/templates/packages.cs
+++ b/tools/droiddoc/templates/packages.cs
@@ -1,6 +1,7 @@
 <?cs include:"macros.cs" ?>
 <html>
 <?cs include:"head_tag.cs" ?>
+<body class="gc-documentation">
 <?cs include:"header.cs" ?>
 
 <div class="g-unit" id="doc-content">