diff --git a/tools/droiddoc/templates-sdk/sdkpage.cs b/tools/droiddoc/templates-sdk/sdkpage.cs
index b425da0..a9a1e21 100644
--- a/tools/droiddoc/templates-sdk/sdkpage.cs
+++ b/tools/droiddoc/templates-sdk/sdkpage.cs
@@ -40,8 +40,8 @@
 
 <?cs if:sdk.not_latest_version ?>
   <div class="special">
-    <p><strong>This is NOT the current Android SDK release.</strong></p>
-    <p>Use the links under <strong>Current SDK Release</strong>, on the left, to be directed to the current SDK.</p>
+    <p><strong>This is NOT the latest version of the Android SDK</strong>.</p>
+    <p>Go to the <a href="<?cs var:toroot ?>sdk/index.html">SDK home page</a> to be directed to the latest version.</p>
   </div>
 <?cs /if ?>
   
diff --git a/tools/droiddoc/templates/assets/android-developer-core.css b/tools/droiddoc/templates/assets/android-developer-core.css
index eaa1176..5b31558 100644
--- a/tools/droiddoc/templates/assets/android-developer-core.css
+++ b/tools/droiddoc/templates/assets/android-developer-core.css
@@ -682,32 +682,6 @@
   height:1.8em;
 }
 
-/* search result tabs */
-
-#doc-content .gsc-control {
-  position:relative;
-}
-
-#doc-content .gsc-tabsArea {
-  position:relative;
-}
-
-#doc-content .gsc-tabHeader {
-  padding: 3px 6px;
-  position:relative;
-}
-
-#doc-content .gsc-tabHeader.gsc-tabhActive {
-  border-top: 2px solid #94B922;
-}
-
-#doc-content h2#searchTitle {
-  padding:0;
-}
-
-#doc-content .gsc-resultsbox-visible {
-  padding:1em 0 0 6px;
-}
 
 /* CAROUSEL */
 
diff --git a/tools/droiddoc/templates/assets/android-developer-docs.js b/tools/droiddoc/templates/assets/android-developer-docs.js
index a84d5a6..cd9c0b3 100644
--- a/tools/droiddoc/templates/assets/android-developer-docs.js
+++ b/tools/droiddoc/templates/assets/android-developer-docs.js
@@ -102,7 +102,7 @@
   var cookieHeight = getCookie(cookiePath+'height');
   if (cookieWidth) {
     restoreWidth(cookieWidth);
-  } else if ($(".side-nav-resizable").length) {
+  } else {
     resizeWidth();
   }
   if (cookieHeight) {
@@ -127,8 +127,7 @@
   var htmlPos = fullPageName.lastIndexOf(".html", fullPageName.length);
   var pathPageName = fullPageName.slice(firstSlashPos, htmlPos + 5);
   var link = $("#devdoc-nav a[href$='"+ pathPageName+"']");
-  if ((link.length == 0) && ((fullPageName.indexOf("/guide/") != -1) || (fullPageName.indexOf("/sdk/") != -1))) { 
-// if there's no match, then let's backstep through the directory until we find an index.html page that matches our ancestor directories (only for dev guide and sdk)
+  if ((link.length == 0) && (fullPageName.indexOf("/guide/") != -1)) { // if there's no match, then let's backstep through the directory until we find an index.html page that matches our ancestor directories (only for dev guide)
     lastBackstep = pathPageName.lastIndexOf("/");
     while (link.length == 0) {
       backstepDirectory = pathPageName.lastIndexOf("/", lastBackstep);
@@ -176,9 +175,7 @@
 
 function resizeAll() {
   resizeHeight();
-  if ($(".side-nav-resizable").length) {
-    resizeWidth();
-  }
+  resizeWidth();
 }
 
 function loadLast(cookiePath) {
diff --git a/tools/droiddoc/templates/assets/jquery-history.js b/tools/droiddoc/templates/assets/jquery-history.js
deleted file mode 100644
index ef96ec3..0000000
--- a/tools/droiddoc/templates/assets/jquery-history.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * jQuery history event v0.1
- * Copyright (c) 2008 Tom Rodenberg <tarodenberg gmail com>
- * Licensed under the GPL (http://www.gnu.org/licenses/gpl.html) license.
- */
-(function($) {
-    var currentHash, previousNav, timer, hashTrim = /^.*#/;
-
-    var msie = {
-        iframe: null,
-        getDoc: function() {
-            return msie.iframe.contentWindow.document;
-        },
-        getHash: function() {
-            return msie.getDoc().location.hash;
-        },
-        setHash: function(hash) {
-            var d = msie.getDoc();
-            d.open();
-            d.close();
-            d.location.hash = hash;
-        }
-    };
-
-    var historycheck = function() {
-        var hash = msie.iframe ? msie.getHash() : location.hash;
-        if (hash != currentHash) {
-            currentHash = hash;
-            if (msie.iframe) {
-                location.hash = currentHash;
-            }
-            var current = $.history.getCurrent();
-            $.event.trigger('history', [current, previousNav]);
-            previousNav = current;
-        }
-    };
-
-    $.history = {
-        add: function(hash) {
-            hash = '#' + hash.replace(hashTrim, '');
-            if (currentHash != hash) {
-                var previous = $.history.getCurrent();
-                location.hash = currentHash = hash;
-                if (msie.iframe) {
-                    msie.setHash(currentHash);
-                }
-                $.event.trigger('historyadd', [$.history.getCurrent(), previous]);
-            }
-            if (!timer) {
-                timer = setInterval(historycheck, 100);
-            }
-        },
-        getCurrent: function() {
-            if (currentHash) {
-              return currentHash.replace(hashTrim, '');
-            } else { 
-              return ""; 
-            }
-        }
-    };
-
-    $.fn.history = function(fn) {
-        $(this).bind('history', fn);
-    };
-
-    $.fn.historyadd = function(fn) {
-        $(this).bind('historyadd', fn);
-    };
-
-    $(function() {
-        currentHash = location.hash;
-        if ($.browser.msie) {
-            msie.iframe = $('<iframe style="display:none" src="javascript:false;"></iframe>').prependTo('body')[0];
-            msie.setHash(currentHash);
-            currentHash = msie.getHash();
-        }
-    });
-})(jQuery);
diff --git a/tools/droiddoc/templates/assets/search_autocomplete.js b/tools/droiddoc/templates/assets/search_autocomplete.js
index 2e12e0f..c9b6ff6 100644
--- a/tools/droiddoc/templates/assets/search_autocomplete.js
+++ b/tools/droiddoc/templates/assets/search_autocomplete.js
@@ -107,8 +107,7 @@
     var text = search.value;
 
     // 13 = enter
-    if (!kd && (e.keyCode == 13)) {
-        document.getElementById("search_filtered_div").className = "no-display";
+    if (kd && (e.keyCode == 13)) {
         if (gSelectedIndex >= 0) {
             window.location = toroot + gMatches[gSelectedIndex].link;
             return false;
@@ -146,7 +145,6 @@
             }
         }
         sync_selection_table(toroot);
-        return true; // allow the event to bubble up to the search api
     }
 }
 
diff --git a/tools/fileslist.py b/tools/fileslist.py
index ae1b4b6..ae105e6 100755
--- a/tools/fileslist.py
+++ b/tools/fileslist.py
@@ -17,10 +17,6 @@
 
 import os, sys
 
-def get_file_size(path):
-  st = os.lstat(path)
-  return st.st_size;
-
 def main(argv):
   output = []
   roots = argv[1:]
@@ -31,7 +27,7 @@
       for f in files:
         try:
           row = (
-              get_file_size(os.path.sep.join((dir, f))),
+              os.path.getsize(os.path.sep.join((dir, f))),
               os.path.sep.join((relative, f)),
             )
           output.append(row)
