diff --git a/tools/apicheck/src/com/android/apicheck/ClassInfo.java b/tools/apicheck/src/com/android/apicheck/ClassInfo.java
index 858ec8a..50f8a3c 100644
--- a/tools/apicheck/src/com/android/apicheck/ClassInfo.java
+++ b/tools/apicheck/src/com/android/apicheck/ClassInfo.java
@@ -174,14 +174,14 @@
               }
           } else {
               Errors.error(Errors.REMOVED_METHOD, mInfo.position(),
-                      "Removed public constructor " + mInfo.qualifiedName());
+                      "Removed public constructor " + mInfo.prettySignature());
               consistent = false;
           }
         }
         for (ConstructorInfo mInfo : cl.mConstructors.values()) {
             if (!mInfo.isInBoth()) {
                 Errors.error(Errors.ADDED_METHOD, mInfo.position(),
-                        "Added public constructor " + mInfo.qualifiedName());
+                        "Added public constructor " + mInfo.prettySignature());
                 consistent = false;
             }
         }
@@ -224,10 +224,16 @@
         }
      
         if (!mScope.equals(cl.mScope)) {
-              consistent = false;
-              Errors.error(Errors.CHANGED_SCOPE, cl.position(),
-                      "Class " + cl.qualifiedName() + " scope changed from "
-                      + mScope + " to " + cl.mScope);
+            consistent = false;
+            Errors.error(Errors.CHANGED_SCOPE, cl.position(),
+                    "Class " + cl.qualifiedName() + " scope changed from "
+                    + mScope + " to " + cl.mScope);
+        }
+        
+        if (!mDeprecated.equals(cl.mDeprecated)) {
+            consistent = false;
+            Errors.error(Errors.CHANGED_DEPRECATED, cl.position(),
+                    "Class " + cl.qualifiedName() + " has changed deprecation state");
         }
         
         if (mSuperClassName != null) {
diff --git a/tools/apicheck/src/com/android/apicheck/ConstructorInfo.java b/tools/apicheck/src/com/android/apicheck/ConstructorInfo.java
index 5593d21..57d7617 100644
--- a/tools/apicheck/src/com/android/apicheck/ConstructorInfo.java
+++ b/tools/apicheck/src/com/android/apicheck/ConstructorInfo.java
@@ -81,6 +81,17 @@
         return baseName + name();
     }
     
+    public String prettySignature() {
+        String params = "";
+        for (ParameterInfo pInfo : mParameters) {
+            if (params.length() > 0) {
+                params += ", ";
+            }
+            params += pInfo.getType();
+        }
+        return qualifiedName() + '(' + params + ')';
+    }
+    
     public boolean isConsistent(ConstructorInfo mInfo) {
       mInfo.mExistsInBoth = true;
       mExistsInBoth = true;
@@ -89,26 +100,32 @@
       if (mIsFinal != mInfo.mIsFinal) {
           consistent = false;
           Errors.error(Errors.CHANGED_FINAL, mInfo.position(),
-                  "Method " + mInfo.qualifiedName() + " has changed 'final' qualifier");
+                  "Constructor " + mInfo.qualifiedName() + " has changed 'final' qualifier");
       }
       
       if (mIsStatic != mInfo.mIsStatic) {
           consistent = false;
           Errors.error(Errors.CHANGED_FINAL, mInfo.position(),
-                  "Method " + mInfo.qualifiedName() + " has changed 'static' qualifier");
+                  "Constructor " + mInfo.qualifiedName() + " has changed 'static' qualifier");
       }
      
       if (!mScope.equals(mInfo.mScope)) {
           consistent = false;
           Errors.error(Errors.CHANGED_SCOPE, mInfo.position(),
-                  "Method " + mInfo.qualifiedName() + " changed scope from "
+                  "Constructor " + mInfo.qualifiedName() + " changed scope from "
                   + mScope + " to " + mInfo.mScope);
       }
       
+      if (!mDeprecated.equals(mInfo.mDeprecated)) {
+          consistent = false;
+          Errors.error(Errors.CHANGED_DEPRECATED, mInfo.position(),
+                  "Constructor " + mInfo.qualifiedName() + " has changed deprecation state");
+      }
+      
       for (String exec : mExceptions) {
           if (!mInfo.mExceptions.contains(exec)) {
               Errors.error(Errors.CHANGED_THROWS, mInfo.position(),
-                      "Method " + mInfo.qualifiedName() + " no longer throws exception "
+                      "Constructor " + mInfo.qualifiedName() + " no longer throws exception "
                       + exec);
               consistent = false;
           }
@@ -117,7 +134,7 @@
       for (String exec : mInfo.mExceptions) {
           if (!mExceptions.contains(exec)) {
               Errors.error(Errors.CHANGED_THROWS, mInfo.position(),
-                      "Method " + mInfo.qualifiedName() + " added thrown exception "
+                      "Constructor " + mInfo.qualifiedName() + " added thrown exception "
                       + exec);
             consistent = false;
           }
diff --git a/tools/apicheck/src/com/android/apicheck/Errors.java b/tools/apicheck/src/com/android/apicheck/Errors.java
index 84d9c17..cd4ba25 100644
--- a/tools/apicheck/src/com/android/apicheck/Errors.java
+++ b/tools/apicheck/src/com/android/apicheck/Errors.java
@@ -113,6 +113,7 @@
     public static Error CHANGED_THROWS = new Error(21, WARNING);
     public static Error CHANGED_NATIVE = new Error(22, HIDDEN);
     public static Error CHANGED_CLASS = new Error(23, WARNING);
+    public static Error CHANGED_DEPRECATED = new Error(24, WARNING);
     
     public static Error[] ERRORS = {
         PARSE_ERROR,
@@ -137,6 +138,8 @@
         CHANGED_ABSTRACT,
         CHANGED_THROWS,
         CHANGED_NATIVE,
+        CHANGED_CLASS,
+        CHANGED_DEPRECATED,
         };
 
     public static boolean setErrorLevel(int code, int level) {
diff --git a/tools/apicheck/src/com/android/apicheck/FieldInfo.java b/tools/apicheck/src/com/android/apicheck/FieldInfo.java
index 9b467af..d80d9f6 100644
--- a/tools/apicheck/src/com/android/apicheck/FieldInfo.java
+++ b/tools/apicheck/src/com/android/apicheck/FieldInfo.java
@@ -66,6 +66,40 @@
         return parentQName + name();
     }
     
+    // Check the declared value with a typed comparison, not a string comparison,
+    // to accommodate toolchains with different fp -> string conversions.
+    public boolean valueEquals(FieldInfo other) {
+        // Type mismatch means nonequal, as does a null/non-null mismatch
+        if (!mType.equals(other.mType)
+                || ((mValue == null) != (other.mValue == null))) {
+            return false;
+        }
+
+        // Null values are considered equal
+        if (mValue == null) {
+            return true;
+        }
+
+        // Floating point gets an implementation-type comparison; all others just use the string
+        // If float/double parse fails, fall back to string comparison -- it means that it's a
+        // canonical droiddoc-generated constant expression that represents a NaN.
+        try {
+            if (mType.equals("float")) {
+                float val = Float.parseFloat(mValue);
+                float otherVal = Float.parseFloat(other.mValue);
+                return (val == otherVal);
+            } else if (mType.equals("double")) {
+                double val = Double.parseDouble(mValue);
+                double otherVal = Double.parseDouble(other.mValue);
+                return (val == otherVal);
+            }
+        } catch (NumberFormatException e) {
+            // fall through
+        }
+        
+        return mValue.equals(other.mValue);
+    }
+
     public boolean isConsistent(FieldInfo fInfo) {
       fInfo.mExistsInBoth = true;
       mExistsInBoth = true;
@@ -75,8 +109,8 @@
                   "Field " + fInfo.qualifiedName() + " has changed type");
           consistent = false;
       }
-      if ((mValue != null && !mValue.equals(fInfo.mValue)) || 
-          (mValue == null && fInfo.mValue != null)) {
+
+      if (!this.valueEquals(fInfo)) {
           Errors.error(Errors.CHANGED_VALUE, fInfo.position(),
                   "Field " + fInfo.qualifiedName() + " has changed value from "
                   + mValue + " to " + fInfo.mValue);
@@ -114,6 +148,12 @@
           consistent = false;
       }
       
+      if (!mDeprecated.equals(fInfo.mDeprecated)) {
+          Errors.error(Errors.CHANGED_DEPRECATED, fInfo.position(),
+                  "Field " + fInfo.qualifiedName() + " has changed deprecation state");
+          consistent = false;
+      }
+      
       return consistent;
     }
 
diff --git a/tools/apicheck/src/com/android/apicheck/MethodInfo.java b/tools/apicheck/src/com/android/apicheck/MethodInfo.java
index 1f973dc..2994460 100644
--- a/tools/apicheck/src/com/android/apicheck/MethodInfo.java
+++ b/tools/apicheck/src/com/android/apicheck/MethodInfo.java
@@ -66,6 +66,17 @@
         return parentQName + name();
     }
     
+    public String prettySignature() {
+        String params = "";
+        for (ParameterInfo pInfo : mParameters) {
+            if (params.length() > 0) {
+                params += ", ";
+            }
+            params += pInfo.getType();
+        }
+        return qualifiedName() + '(' + params + ')';
+    }
+    
     public SourcePositionInfo position() {
         return mSourcePosition;
     }
@@ -128,21 +139,33 @@
                     + mScope + " to " + mInfo.mScope);
         }
         
+        if (!mDeprecated.equals(mInfo.mDeprecated)) {
+            Errors.error(Errors.CHANGED_DEPRECATED, mInfo.position(),
+                    "Method " + mInfo.qualifiedName() + " has changed deprecation state");
+            consistent = false;
+        }
+        
         for (String exec : mExceptions) {
             if (!mInfo.mExceptions.contains(exec)) {
-                Errors.error(Errors.CHANGED_THROWS, mInfo.position(),
-                        "Method " + mInfo.qualifiedName() + " no longer throws exception "
-                        + exec);
-                consistent = false;
+                // exclude 'throws' changes to finalize() overrides with no arguments
+                if (!name().equals("finalize") || (mParameters.size() > 0)) {
+                    Errors.error(Errors.CHANGED_THROWS, mInfo.position(),
+                            "Method " + mInfo.qualifiedName() + " no longer throws exception "
+                            + exec);
+                    consistent = false;
+                }
             }
         }
         
         for (String exec : mInfo.mExceptions) {
+            // exclude 'throws' changes to finalize() overrides with no arguments
             if (!mExceptions.contains(exec)) {
-                Errors.error(Errors.CHANGED_THROWS, mInfo.position(),
-                        "Method " + mInfo.qualifiedName() + " added thrown exception "
-                        + exec);
-                consistent = false;
+                if (!name().equals("finalize") || (mParameters.size() > 0)) {
+                    Errors.error(Errors.CHANGED_THROWS, mInfo.position(),
+                            "Method " + mInfo.qualifiedName() + " added thrown exception "
+                            + exec);
+                    consistent = false;
+                }
             }
         }
         
diff --git a/tools/apriori/Android.mk b/tools/apriori/Android.mk
index 71e4f4a..79ecf7f 100644
--- a/tools/apriori/Android.mk
+++ b/tools/apriori/Android.mk
@@ -5,19 +5,22 @@
 
 LOCAL_PATH:= $(call my-dir)
 
-ifeq ($(TARGET_ARCH),arm)
+ifneq ($(TARGET_SIMULATOR),true)
 include $(CLEAR_VARS)
 
 LOCAL_LDLIBS += -ldl
 LOCAL_CFLAGS += -O2 -g
 LOCAL_CFLAGS += -fno-function-sections -fno-data-sections -fno-inline
 LOCAL_CFLAGS += -Wall -Wno-unused-function #-Werror
-LOCAL_CFLAGS += -DBIG_ENDIAN=1
-LOCAL_CFLAGS += -DARM_SPECIFIC_HACKS
 LOCAL_CFLAGS += -DSUPPORT_ANDROID_PRELINK_TAGS
 LOCAL_CFLAGS += -DDEBUG
 LOCAL_CFLAGS += -DADJUST_ELF=1
 
+ifeq ($(TARGET_ARCH),arm)
+LOCAL_CFLAGS += -DARM_SPECIFIC_HACKS
+LOCAL_CFLAGS += -DBIG_ENDIAN=1
+endif
+
 ifeq ($(HOST_OS),darwin)
 LOCAL_CFLAGS += -DFSCANF_IS_BROKEN
 endif
@@ -46,9 +49,13 @@
 	external/elfutils/libebl/ \
 	external/elfcopy/
 
-LOCAL_STATIC_LIBRARIES := libelfcopy libelf libebl libebl_arm #dl
+LOCAL_STATIC_LIBRARIES := libelfcopy libelf libebl #dl
+
+ifeq ($(TARGET_ARCH),arm)
+LOCAL_STATIC_LIBRARIES += libebl_arm
+endif
 
 LOCAL_MODULE := apriori
 
 include $(BUILD_HOST_EXECUTABLE)
-endif #TARGET_ARCH==arm
+endif # TARGET_SIMULATOR != true
diff --git a/tools/atree/atree.cpp b/tools/atree/atree.cpp
index 4d97d24..aee2b3c 100644
--- a/tools/atree/atree.cpp
+++ b/tools/atree/atree.cpp
@@ -5,12 +5,15 @@
 #include "files.h"
 #include "fs.h"
 #include <set>
+#include <iostream>
+#include <sstream>
 
 using namespace std;
 
 bool g_debug = false;
 vector<string> g_listFiles;
 vector<string> g_inputBases;
+map<string, string> g_variables;
 string g_outputBase;
 string g_dependency;
 bool g_useHardLinks = false;
@@ -29,6 +32,7 @@
 "  -l             Use hard links instead of copying the files.\n"
 "  -m DEPENDENCY  Output a make-formatted file containing the list.\n"
 "                 of files included.  It sets the variable ATREE_FILES.\n"
+"  -v VAR=VAL     Replaces ${VAR} by VAL when reading input files.\n"
 "\n"
 "FILELIST file format:\n"
 "  The FILELIST files contain the list of files that will end up\n"
@@ -53,13 +57,28 @@
     return 1;
 }
 
+static bool
+add_variable(const char* arg) {
+    const char* p = arg;
+    while (*p && *p != '=') p++;
+
+    if (*p == 0 || p == arg || p[1] == 0) {
+        return false;
+    }
+
+    ostringstream var;
+    var << "${" << string(arg, p-arg) << "}";
+    g_variables[var.str()] = string(p+1);
+    return true;
+}
+
 int
 main(int argc, char* const* argv)
 {
     int err;
     bool done = false;
     while (!done) {
-        int opt = getopt(argc, argv, "f:I:o:hlm:");
+        int opt = getopt(argc, argv, "f:I:o:hlm:v:");
         switch (opt)
         {
             case -1:
@@ -90,6 +109,14 @@
                 }
                 g_dependency = optarg;
                 break;
+            case 'v':
+                if (!add_variable(optarg)) {
+                    fprintf(stderr, "%s Invalid expression in '-v %s': "
+                            "expected format is '-v VAR=VALUE'.\n",
+                            argv[0], optarg);
+                    return usage();
+                }
+                break;
             default:
             case '?':
             case 'h':
@@ -143,7 +170,7 @@
     // read file lists
     for (vector<string>::iterator it=g_listFiles.begin();
                                 it!=g_listFiles.end(); it++) {
-        err = read_list_file(*it, &files, &excludes);
+        err = read_list_file(*it, g_variables, &files, &excludes);
         if (err != 0) {
             return err;
         }
diff --git a/tools/atree/files.cpp b/tools/atree/files.cpp
index 5842378..0f59521 100644
--- a/tools/atree/files.cpp
+++ b/tools/atree/files.cpp
@@ -100,9 +100,61 @@
     files->push_back(rec);
 }
 
+static string
+replace_variables(const string& input,
+                  const map<string, string>& variables,
+                  bool* error) {
+    if (variables.empty()) {
+        return input;
+    }
+
+    // Abort if the variable prefix is not found
+    if (input.find("${") == string::npos) {
+        return input;
+    }
+
+    string result = input;
+
+    // Note: rather than be fancy to detect recursive replacements,
+    // we simply iterate till a given threshold is met.
+
+    int retries = 1000;
+    bool did_replace;
+
+    do {
+        did_replace = false;
+        for (map<string, string>::const_iterator it = variables.begin();
+             it != variables.end(); ++it) {
+            string::size_type pos = 0;
+            while((pos = result.find(it->first, pos)) != string::npos) {
+                result = result.replace(pos, it->first.length(), it->second);
+                pos += it->second.length();
+                did_replace = true;
+            }
+        }
+        if (did_replace && --retries == 0) {
+            *error = true;
+            fprintf(stderr, "Recursive replacement detected during variables "
+                    "substitution. Full list of variables is: ");
+
+            for (map<string, string>::const_iterator it = variables.begin();
+                 it != variables.end(); ++it) {
+                fprintf(stderr, "  %s=%s\n",
+                        it->first.c_str(), it->second.c_str());
+            }
+
+            return result;
+        }
+    } while (did_replace);
+
+    return result;
+}
+
 int
-read_list_file(const string& filename, vector<FileRecord>* files,
-                    vector<string>* excludes)
+read_list_file(const string& filename,
+               const map<string, string>& variables,
+               vector<FileRecord>* files,
+               vector<string>* excludes)
 {
     int err = 0;
     FILE* f = NULL;
@@ -192,11 +244,27 @@
             
             if (words.size() == 1) {
                 // pattern: DEST
-                add_file(files, filename, i+1, words[0], words[0]);
+                bool error = false;
+                string w0 = replace_variables(words[0], variables, &error);
+                if (error) {
+                    err = 1;
+                    goto cleanup;
+                }
+                add_file(files, filename, i+1, w0, w0);
             }
             else if (words.size() == 2) {
                 // pattern: SRC DEST
-                add_file(files, filename, i+1, words[0], words[1]);
+                bool error = false;
+                string w0, w1;
+                w0 = replace_variables(words[0], variables, &error);
+                if (!error) {
+                    w1 = replace_variables(words[1], variables, &error);
+                }
+                if (error) {
+                    err = 1;
+                    goto cleanup;
+                }
+                add_file(files, filename, i+1, w0, w1);
             }
             else {
                 fprintf(stderr, "%s:%d: bad format: %s\n", filename.c_str(),
diff --git a/tools/atree/files.h b/tools/atree/files.h
index b8f0431..6480c98 100644
--- a/tools/atree/files.h
+++ b/tools/atree/files.h
@@ -1,6 +1,7 @@
 #ifndef FILES_H
 #define FILES_H
 
+#include <map>
 #include <string>
 #include <vector>
 #include <sys/types.h>
@@ -25,8 +26,10 @@
     unsigned int mode;
 };
 
-int read_list_file(const string& filename, vector<FileRecord>* files,
-                    vector<string>* excludes);
+int read_list_file(const string& filename,
+                   const map<string, string>& variables,
+                   vector<FileRecord>* files,
+                   vector<string>* excludes);
 int locate(FileRecord* rec, const vector<string>& search);
 void stat_out(const string& base, FileRecord* rec);
 string dir_part(const string& filename);
diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh
index 22e65df..5addfb6 100755
--- a/tools/buildinfo.sh
+++ b/tools/buildinfo.sh
@@ -16,14 +16,14 @@
 echo "ro.product.model=$PRODUCT_MODEL"
 echo "ro.product.brand=$PRODUCT_BRAND"
 echo "ro.product.name=$PRODUCT_NAME"
-echo "ro.product.device=$TARGET_PRODUCT"
+echo "ro.product.device=$TARGET_DEVICE"
 echo "ro.product.board=$TARGET_BOOTLOADER_BOARD_NAME"
 echo "ro.product.manufacturer=$PRODUCT_MANUFACTURER"
 echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
 echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
 
 echo "# ro.build.product is obsolete; use ro.product.device"
-echo "ro.build.product=$TARGET_PRODUCT"
+echo "ro.build.product=$TARGET_DEVICE"
 
 echo "# Do not try to parse ro.build.description or .fingerprint"
 echo "ro.build.description=$PRIVATE_BUILD_DESC"
diff --git a/tools/dexpreopt/Android.mk b/tools/dexpreopt/Android.mk
index 3988387..40aeee2 100644
--- a/tools/dexpreopt/Android.mk
+++ b/tools/dexpreopt/Android.mk
@@ -14,6 +14,7 @@
 # limitations under the License.
 #
 ifneq ($(TARGET_SIMULATOR),true)
+ifneq ($(DISABLE_DEXPREOPT),true)
 
 LOCAL_PATH := $(my-dir)
 include $(CLEAR_VARS)
@@ -33,4 +34,5 @@
 		$(LOCAL_PATH)/afar/Android.mk
 include $(subdir_makefiles)
 
+endif # !disable_dexpreopt
 endif # !sim
diff --git a/tools/dexpreopt/Config.mk b/tools/dexpreopt/Config.mk
index be9876f..58891fa 100644
--- a/tools/dexpreopt/Config.mk
+++ b/tools/dexpreopt/Config.mk
@@ -91,7 +91,7 @@
 	$(hide) \
 	    PATH=$(HOST_OUT_EXECUTABLES):$$PATH \
 	    $(DEXPREOPT) \
-		    --kernel prebuilt/android-arm/kernel-qemu \
+		    --kernel prebuilt/android-arm/kernel/kernel-qemu \
 		    --ramdisk $(BUILT_DEXPREOPT_RAMDISK) \
 		    --image $(BUILT_SYSTEMIMAGE_UNOPT) \
 		    --system $(PRODUCT_OUT) \
diff --git a/tools/dexpreopt/dexpreopt.py b/tools/dexpreopt/dexpreopt.py
index 74523b1..8a80e06 100755
--- a/tools/dexpreopt/dexpreopt.py
+++ b/tools/dexpreopt/dexpreopt.py
@@ -520,7 +520,11 @@
       buf.fromfile(ep.stdout, 4)
       (adler32,) = struct.unpack('>i', buf)  # adler32 wants a signed int ('i')
       data_adler32 = zlib.adler32(data)
-      if adler32 != data_adler32:
+      # Because of a difference in behavior of zlib.adler32 on 32-bit and 64-bit
+      # systems (one returns signed values, the other unsigned), we take the
+      # modulo 2**32 of the checksums, and compare those.
+      # See also http://bugs.python.org/issue1202
+      if (adler32 % (2**32)) != (data_adler32 % (2**32)):
         Trace('adler32 does not match: calculated 0x%08x != expected 0x%08x' %
               (data_adler32, adler32))
         return False
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">
diff --git a/tools/findleaves.sh b/tools/findleaves.sh
index e7900f7..7cc0fa7 100755
--- a/tools/findleaves.sh
+++ b/tools/findleaves.sh
@@ -93,7 +93,10 @@
 
 # Sort the output, so directories appear immediately before their contents.
 # If there are any duplicates, the awk script will implicitly ignore them.
-sort |
+# The LC_ALL=C forces sort(1) to use bytewise ordering instead of listening
+# to the locale, which may do case-insensitive and/or alphanumeric-only
+# sorting.
+LC_ALL=C sort |
 
 # Always print the first line, which can't possibly be covered by a
 # parent directory match. After that, only print lines where the last
diff --git a/tools/fs_get_stats/Android.mk b/tools/fs_get_stats/Android.mk
new file mode 100644
index 0000000..c9b4a05
--- /dev/null
+++ b/tools/fs_get_stats/Android.mk
@@ -0,0 +1,9 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := fs_get_stats.c
+
+LOCAL_MODULE := fs_get_stats
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/fs_get_stats/fs_get_stats.c b/tools/fs_get_stats/fs_get_stats.c
new file mode 100644
index 0000000..356f6f9
--- /dev/null
+++ b/tools/fs_get_stats/fs_get_stats.c
@@ -0,0 +1,64 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <private/android_filesystem_config.h>
+
+#define DO_DEBUG 1
+
+#define ERROR(fmt,args...) \
+	do { \
+		fprintf(stderr, "%s:%d: ERROR: " fmt,  \
+		        __FILE__, __LINE__, ##args);    \
+	} while (0)
+
+#if DO_DEBUG
+#define DEBUG(fmt,args...) \
+	do { fprintf(stderr, "DEBUG: " fmt, ##args); } while(0)
+#else
+#define DEBUG(x...)               do {} while(0)
+#endif
+
+void
+print_help(void)
+{
+	fprintf(stderr, "fs_get_stats: retrieve the target file stats "
+	        "for the specified file\n");
+	fprintf(stderr, "usage: fs_get_stats cur_perms is_dir filename\n");
+	fprintf(stderr, "\tcur_perms - The current permissions of "
+	        "the file\n");
+	fprintf(stderr, "\tis_dir    - Is filename is a dir, 1. Otherwise, 0.\n");
+	fprintf(stderr, "\tfilename  - The filename to lookup\n");
+	fprintf(stderr, "\n");
+}
+
+int
+main(int argc, const char *argv[])
+{
+	char *endptr;
+	char is_dir = 0;
+	unsigned perms = 0;
+	unsigned uid = (unsigned)-1;
+	unsigned gid = (unsigned)-1;
+
+	if (argc < 4) {
+		ERROR("Invalid arguments\n");
+		print_help();
+		exit(-1);
+	}
+
+	perms = (unsigned)strtoul(argv[1], &endptr, 0);
+	if (!endptr || (endptr == argv[1]) || (*endptr != '\0')) {
+		ERROR("current permissions must be a number. Got '%s'.\n", argv[1]);
+		exit(-1);
+	}
+
+	if (!strcmp(argv[2], "1"))
+		is_dir = 1;
+
+	fs_config(argv[3], is_dir, &uid, &gid, &perms);
+	fprintf(stdout, "%d %d 0%o\n", uid, gid, perms);
+
+	return 0;
+}
diff --git a/tools/mktarball.sh b/tools/mktarball.sh
new file mode 100755
index 0000000..ea1a8ed
--- /dev/null
+++ b/tools/mktarball.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+# $1: path to fs_get_stats program
+# $2: start dir
+# $3: subdir to tar up (from $2)
+# $4: target tar name
+# $5: target tarball name (usually $(3).bz2)
+
+if [ $# -ne 5 ]; then
+    echo "Error: wrong number of arguments in cmd: $0 $* "
+    exit 1
+fi
+
+fs_get_stats=`readlink -f $1`
+start_dir=`readlink -f $2`
+dir_to_tar=$3
+target_tar=`readlink -f $4`
+target_tarball=`readlink -f $5`
+
+cd $2
+
+#tar --no-recursion -cvf ${target_tar} ${dir_to_tar}
+rm ${target_tar} > /dev/null 2>&1
+
+# do dirs first
+subdirs=`find ${dir_to_tar} -type d -print`
+files=`find ${dir_to_tar} \! -type d -print`
+for f in ${subdirs} ${files} ; do
+    curr_perms=`stat -c 0%a $f`
+    [ -d "$f" ] && is_dir=1 || is_dir=0
+    new_info=`${fs_get_stats} ${curr_perms} ${is_dir} ${f}`
+    new_uid=`echo ${new_info} | awk '{print $1;}'`
+    new_gid=`echo ${new_info} | awk '{print $2;}'`
+    new_perms=`echo ${new_info} | awk '{print $3;}'`
+#    echo "$f: dir: $is_dir curr: $curr_perms uid: $new_uid gid: $new_gid "\
+#         "perms: $new_perms"
+    tar --no-recursion --numeric-owner --owner $new_uid \
+        --group $new_gid --mode $new_perms -p -rf ${target_tar} ${f}
+done
+
+if [ $? -eq 0 ] ; then
+    bzip2 -c ${target_tar} > ${target_tarball}
+    success=$?
+    [ $success -eq 0 ] || rm -f ${target_tarball}
+    rm -f ${target_tar}
+    exit $success
+fi
+
+rm -f ${target_tar}
+exit 1
diff --git a/tools/signapk/Android.mk b/tools/signapk/Android.mk
index 117fe62..ccc76fd 100644
--- a/tools/signapk/Android.mk
+++ b/tools/signapk/Android.mk
@@ -24,4 +24,4 @@
 include $(BUILD_HOST_JAVA_LIBRARY)
 
 # The post-build signing tools need signapk.jar.
-$(call dist-for-goals,user userdebug droid,$(LOCAL_INSTALLED_MODULE))
+$(call dist-for-goals,droid,$(LOCAL_INSTALLED_MODULE))
diff --git a/tools/signapk/SignApk.java b/tools/signapk/SignApk.java
index afa6650..340a9f5 100644
--- a/tools/signapk/SignApk.java
+++ b/tools/signapk/SignApk.java
@@ -38,6 +38,7 @@
 import java.security.AlgorithmParameters;
 import java.security.DigestOutputStream;
 import java.security.GeneralSecurityException;
+import java.security.Key;
 import java.security.KeyFactory;
 import java.security.MessageDigest;
 import java.security.PrivateKey;
@@ -46,12 +47,16 @@
 import java.security.cert.Certificate;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
-import java.security.Key;
 import java.security.spec.InvalidKeySpecException;
 import java.security.spec.KeySpec;
 import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 import java.util.jar.Attributes;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
@@ -67,6 +72,9 @@
  * a way compatible with the mincrypt verifier, using SHA1 and RSA keys.
  */
 class SignApk {
+    private static final String CERT_SF_NAME = "META-INF/CERT.SF";
+    private static final String CERT_RSA_NAME = "META-INF/CERT.RSA";
+
     private static X509Certificate readPublicKey(File file)
             throws IOException, GeneralSecurityException {
         FileInputStream input = new FileInputStream(file);
@@ -104,7 +112,7 @@
      * @param encryptedPrivateKey The raw data of the private key
      * @param keyFile The file containing the private key
      */
-    private static KeySpec decryptPrivateKey(byte[] encryptedPrivateKey, File keyFile) 
+    private static KeySpec decryptPrivateKey(byte[] encryptedPrivateKey, File keyFile)
             throws GeneralSecurityException {
         EncryptedPrivateKeyInfo epkInfo;
         try {
@@ -171,10 +179,21 @@
         byte[] buffer = new byte[4096];
         int num;
 
+        // We sort the input entries by name, and add them to the
+        // output manifest in sorted order.  We expect that the output
+        // map will be deterministic.
+
+        TreeMap<String, JarEntry> byName = new TreeMap<String, JarEntry>();
+
         for (Enumeration<JarEntry> e = jar.entries(); e.hasMoreElements(); ) {
             JarEntry entry = e.nextElement();
+            byName.put(entry.getName(), entry);
+        }
+
+        for (JarEntry entry: byName.values()) {
             String name = entry.getName();
-            if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME)) {
+            if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&
+                !name.equals(CERT_SF_NAME) && !name.equals(CERT_RSA_NAME)) {
                 InputStream data = jar.getInputStream(entry);
                 while ((num = data.read(buffer)) > 0) {
                     md.update(buffer, 0, num);
@@ -285,14 +304,18 @@
         int num;
 
         Map<String, Attributes> entries = manifest.getEntries();
-        for (String name : entries.keySet()) {
+        List<String> names = new ArrayList(entries.keySet());
+        Collections.sort(names);
+        for (String name : names) {
             JarEntry inEntry = in.getJarEntry(name);
             if (inEntry.getMethod() == JarEntry.STORED) {
                 // Preserve the STORED method of the input entry.
                 out.putNextEntry(new JarEntry(inEntry));
             } else {
                 // Create a new entry so that the compressed len is recomputed.
-                out.putNextEntry(new JarEntry(name));
+                JarEntry je = new JarEntry(name);
+                je.setTime(inEntry.getTime());
+                out.putNextEntry(je);
             }
 
             InputStream data = in.getInputStream(inEntry);
@@ -316,27 +339,37 @@
 
         try {
             X509Certificate publicKey = readPublicKey(new File(args[0]));
+
+            // Assume the certificate is valid for at least an hour.
+            long timestamp = publicKey.getNotBefore().getTime() + 3600L * 1000;
+
             PrivateKey privateKey = readPrivateKey(new File(args[1]));
             inputJar = new JarFile(new File(args[2]), false);  // Don't verify.
             outputJar = new JarOutputStream(new FileOutputStream(args[3]));
             outputJar.setLevel(9);
 
+            JarEntry je;
+
             // MANIFEST.MF
             Manifest manifest = addDigestsToManifest(inputJar);
-            manifest.getEntries().remove("META-INF/CERT.SF");
-            manifest.getEntries().remove("META-INF/CERT.RSA");
-            outputJar.putNextEntry(new JarEntry(JarFile.MANIFEST_NAME));
+            je = new JarEntry(JarFile.MANIFEST_NAME);
+            je.setTime(timestamp);
+            outputJar.putNextEntry(je);
             manifest.write(outputJar);
 
             // CERT.SF
             Signature signature = Signature.getInstance("SHA1withRSA");
             signature.initSign(privateKey);
-            outputJar.putNextEntry(new JarEntry("META-INF/CERT.SF"));
+            je = new JarEntry(CERT_SF_NAME);
+            je.setTime(timestamp);
+            outputJar.putNextEntry(je);
             writeSignatureFile(manifest,
                     new SignatureOutputStream(outputJar, signature));
 
             // CERT.RSA
-            outputJar.putNextEntry(new JarEntry("META-INF/CERT.RSA"));
+            je = new JarEntry(CERT_RSA_NAME);
+            je.setTime(timestamp);
+            outputJar.putNextEntry(je);
             writeSignatureBlock(signature, publicKey, outputJar);
 
             // Everything else
