Merge change 21977 into donut

* changes:
  docs only. add reference information for new <path-permission> element
diff --git a/api/current.xml b/api/current.xml
index ffbe6e2..fc54859 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -109309,6 +109309,17 @@
  visibility="public"
 >
 </field>
+<field name="ACTION_TTS_DATA_INSTALLED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.speech.tts.engine.TTS_DATA_INSTALLED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="CHECK_VOICE_DATA_BAD_DATA"
  type="int"
  transient="false"
@@ -109375,6 +109386,17 @@
  visibility="public"
 >
 </field>
+<field name="EXTRA_TTS_DATA_INSTALLED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;dataInstalled&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="EXTRA_VOICE_DATA_FILES"
  type="java.lang.String"
  transient="false"
@@ -178497,6 +178519,211 @@
 </parameter>
 </method>
 </class>
+<class name="ZoomButtonsController"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<implements name="android.view.View.OnTouchListener">
+</implements>
+<constructor name="ZoomButtonsController"
+ type="android.widget.ZoomButtonsController"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="ownerView" type="android.view.View">
+</parameter>
+</constructor>
+<method name="getContainer"
+ return="android.view.ViewGroup"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getZoomControls"
+ return="android.view.View"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isAutoDismissed"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isVisible"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="onTouch"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="v" type="android.view.View">
+</parameter>
+<parameter name="event" type="android.view.MotionEvent">
+</parameter>
+</method>
+<method name="setAutoDismissed"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="autoDismiss" type="boolean">
+</parameter>
+</method>
+<method name="setFocusable"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="focusable" type="boolean">
+</parameter>
+</method>
+<method name="setOnZoomListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.widget.ZoomButtonsController.OnZoomListener">
+</parameter>
+</method>
+<method name="setVisible"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="visible" type="boolean">
+</parameter>
+</method>
+<method name="setZoomInEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="enabled" type="boolean">
+</parameter>
+</method>
+<method name="setZoomOutEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="enabled" type="boolean">
+</parameter>
+</method>
+<method name="setZoomSpeed"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="speed" type="long">
+</parameter>
+</method>
+</class>
+<interface name="ZoomButtonsController.OnZoomListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onVisibilityChanged"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="visible" type="boolean">
+</parameter>
+</method>
+<method name="onZoom"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="zoomIn" type="boolean">
+</parameter>
+</method>
+</interface>
 <class name="ZoomControls"
  extends="android.widget.LinearLayout"
  abstract="false"
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 4ac3b9e..f2905a7 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2521,7 +2521,7 @@
      * no extra data is required.
      * @param globalSearch If false, this will only launch the search that has been specifically
      * defined by the application (which is usually defined as a local search).  If no default 
-     * search is defined in the current application or activity, no search will be launched.
+     * search is defined in the current application or activity, global search will be launched.
      * If true, this will always launch a platform-global (e.g. web-based) search instead.
      * 
      * @see android.app.SearchManager
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 97d46f8..d2a3a1d 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -1683,7 +1683,7 @@
      * no extra data is required.
      * @param globalSearch If false, this will only launch the search that has been specifically
      * defined by the application (which is usually defined as a local search).  If no default 
-     * search is defined in the current application or activity, no search will be launched.
+     * search is defined in the current application or activity, global search will be launched.
      * If true, this will always launch a platform-global (e.g. web-based) search instead.
      * 
      * @see android.app.Activity#onSearchRequested
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 9a9ddc9..4a4d2de 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2973,6 +2973,18 @@
                 "vending_pd_resend_frequency_ms";
 
         /**
+         * Size of buffer in bytes for Vending to use when reading cache files.
+         */
+        public static final String VENDING_DISK_INPUT_BUFFER_BYTES =
+                "vending_disk_input_buffer_bytes";
+
+        /**
+         * Size of buffer in bytes for Vending to use when writing cache files.
+         */
+        public static final String VENDING_DISK_OUTPUT_BUFFER_BYTES =
+                "vending_disk_output_buffer_bytes";
+
+        /**
          * Frequency in milliseconds at which we should cycle through the promoted applications
          * on the home screen or the categories page.
          */
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 4405a53..a6d76d6 100755
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -61,7 +61,7 @@
 
 
     /**
-     * Denotes the language is available exactly as specified by the locale
+     * Denotes the language is available exactly as specified by the locale.
      */
     public static final int LANG_COUNTRY_VAR_AVAILABLE = 2;
 
@@ -176,7 +176,7 @@
 
         // intents to ask engine to install data or check its data
         /**
-         * Broadcast Action: Triggers the platform Text-To-Speech engine to
+         * Activity Action: Triggers the platform Text-To-Speech engine to
          * start the activity that installs the resource files on the device
          * that are required for TTS to be operational. Since the installation
          * of the data can be interrupted or declined by the user, the application
@@ -184,18 +184,20 @@
          * and if need be, should check installation status with
          * {@link #ACTION_CHECK_TTS_DATA}.
          */
-        @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+        @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
         public static final String ACTION_INSTALL_TTS_DATA =
                 "android.speech.tts.engine.INSTALL_TTS_DATA";
 
         /**
-         * {@hide}
+         * Broadcast Action: broadcast to signal the completion of the installation of
+         * the data files used by the synthesis engine. Success or failure is indicated in the
+         * {@link #EXTRA_TTS_DATA_INSTALLED} extra.
          */
         @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
         public static final String ACTION_TTS_DATA_INSTALLED =
                 "android.speech.tts.engine.TTS_DATA_INSTALLED";
         /**
-         * Broadcast Action: Starts the activity from the platform Text-To-Speech
+         * Activity Action: Starts the activity from the platform Text-To-Speech
          * engine to verify the proper installation and availability of the
          * resource files on the system. Upon completion, the activity will
          * return one of the following codes:
@@ -217,7 +219,7 @@
          *       and YYY is the 3-letter ISO country code.</li>
          * </ul>
          */
-        @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+        @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
         public static final String ACTION_CHECK_TTS_DATA =
                 "android.speech.tts.engine.CHECK_TTS_DATA";
 
@@ -241,11 +243,11 @@
 
         // extras for a TTS engine's data installation
         /**
-         * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent
-         * which indicates whether the TTS data installation requested with
-         * {@link #ACTION_INSTALL_TTS_DATA} completed successfully or not. The value is
-         * {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}.
-         * {@hide}
+         * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent.
+         * It indicates whether the data files for the synthesis engine were successfully
+         * installed. The installation was initiated with the  {@link #ACTION_INSTALL_TTS_DATA}
+         * intent. The possible values for this extra are
+         * {@link TextToSpeech#SUCCESS} and {@link TextToSpeech#ERROR}.
          */
         public static final String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
 
diff --git a/core/java/android/widget/ZoomButtonsController.java b/core/java/android/widget/ZoomButtonsController.java
index bae4dad..a41e2e3 100644
--- a/core/java/android/widget/ZoomButtonsController.java
+++ b/core/java/android/widget/ZoomButtonsController.java
@@ -69,7 +69,6 @@
  * {@link #setVisible(boolean) setVisible(false)} from the
  * {@link View#onDetachedFromWindow}.
  *
- * @hide
  */
 public class ZoomButtonsController implements View.OnTouchListener {
 
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 4558660..cf2184c 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -49,7 +49,6 @@
     <protected-broadcast android:name="android.intent.action.ACTION_SHUTDOWN" />
     <protected-broadcast android:name="android.intent.action.DEVICE_STORAGE_LOW" />
     <protected-broadcast android:name="android.intent.action.DEVICE_STORAGE_OK" />
-    <protected-broadcast android:name="android.intent.action.AIRPLANE_MODE" />
     <protected-broadcast android:name="android.intent.action.NEW_OUTGOING_CALL" />
     <protected-broadcast android:name="android.intent.action.REBOOT" />
     
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index ad52251..d858a79 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -168,7 +168,7 @@
     <string name="permdesc_receiveSms" msgid="6298292335965966117">"Umožňuje aplikaci přijímat a zpracovávat zprávy SMS. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny."</string>
     <string name="permlab_receiveMms" msgid="8894700916188083287">"příjem zpráv MMS"</string>
     <string name="permdesc_receiveMms" msgid="4563346832000174373">"Umožňuje aplikaci přijímat a zpracovávat zprávy MMS. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny."</string>
-    <string name="permlab_sendSms" msgid="5600830612147671529">"odesílat zprávy SMS"</string>
+    <string name="permlab_sendSms" msgid="5600830612147671529">"odesílaní zpráv SMS"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Umožňuje aplikaci odesílat zprávy SMS. Škodlivé aplikace mohou bez vašeho potvrzení odesílat zpoplatněné zprávy."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"čtení zpráv SMS a MMS"</string>
     <string name="permdesc_readSms" msgid="3002170087197294591">"Umožňuje aplikaci číst zprávy SMS uložené ve vašem telefonu nebo na kartě SIM. Škodlivé aplikace mohou načíst vaše soukromé zprávy."</string>
@@ -182,7 +182,7 @@
     <string name="permdesc_reorderTasks" msgid="126252774270522835">"Umožňuje aplikaci přesouvat úlohy do popředí či pozadí. Škodlivé aplikace mohou vynutit své přesunutí do popředí bez vašeho přičinění."</string>
     <string name="permlab_setDebugApp" msgid="4339730312925176742">"povolit ladění aplikací"</string>
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Umožňuje aplikaci povolit ladění jiné aplikace. Škodlivé aplikace mohou pomocí tohoto nastavení ukončit jiné aplikace."</string>
-    <string name="permlab_changeConfiguration" msgid="8214475779521218295">"změny vašeho nastavení uživatelského rozhraní"</string>
+    <string name="permlab_changeConfiguration" msgid="8214475779521218295">"změna vašeho nastavení uživatelského rozhraní"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Umožňuje aplikaci změnit aktuální konfiguraci, např. národní prostředí či obecnou velikost písma."</string>
     <string name="permlab_restartPackages" msgid="2386396847203622628">"restartování ostatních aplikací"</string>
     <string name="permdesc_restartPackages" msgid="1076364837492936814">"Umožňuje aplikaci vynutit restartování jiných aplikací."</string>
@@ -190,9 +190,9 @@
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Umožňuje aplikaci vynutit zavření a přesunutí libovolné činnosti v popředí na pozadí. Běžné aplikace by toto nastavení neměly nikdy využívat."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"načtení interního stavu systému"</string>
     <string name="permdesc_dump" msgid="2198776174276275220">"Umožňuje aplikaci načíst interní stav systému. Škodlivé aplikace mohou načíst řádu soukromých a zabezpečených informací, které by nikdy neměly potřebovat."</string>
-    <string name="permlab_shutdown" msgid="7185747824038909016">"Částečné vypnutí"</string>
+    <string name="permlab_shutdown" msgid="7185747824038909016">"částečné vypnutí"</string>
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Uvede správce činností do vypnutého stavu. Nedojde však k úplnému vypnutí."</string>
-    <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"Zabránit přepínání aplikací"</string>
+    <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"zabránění přepínání aplikací"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Zabrání uživateli přepnout na jinou aplikaci."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"sledování a řízení spouštění všech aplikací"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="3228701938345388092">"Umožňuje aplikaci sledovat a řídit spouštění činností systémem. Škodlivé aplikace mohou zcela ovládnout systém. Toto oprávnění je zapotřebí pouze pro účely vývoje, nikdy pro běžné použití telefonu."</string>
@@ -208,13 +208,13 @@
     <string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"Umožňuje aplikaci ovládat, zda jsou činnosti vždy dokončeny po přesunutí do pozadí. Běžné aplikace toto nastavení nikdy nevyužívají."</string>
     <string name="permlab_batteryStats" msgid="7863923071360031652">"změna statistických údajů o baterii"</string>
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Umožňuje změnu shromážděných statistických údajů o baterii. Není určeno pro běžné aplikace."</string>
-    <string name="permlab_backup" msgid="470013022865453920">"Ovládat zálohování a obnovu systému"</string>
+    <string name="permlab_backup" msgid="470013022865453920">"ovládání zálohování a obnovy systému"</string>
     <string name="permdesc_backup" msgid="2305432853944929371">"Umožňuje aplikaci ovládat mechanizmus zálohování a obnovy systému. Není určeno k použití v běžných aplikacích."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"zobrazení nepovolených oken"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Umožňuje vytvoření oken, která mají být použita interním systémem uživatelského rozhraní. Běžné aplikace toto nastavení nepoužívají."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"zobrazení upozornění systémové úrovně"</string>
     <string name="permdesc_systemAlertWindow" msgid="5109622689323490558">"Umožňuje aplikaci zobrazit okna s výstrahami systému. Škodlivé aplikace mohou převzít kontrolu nad celou obrazovkou telefonu."</string>
-    <string name="permlab_setAnimationScale" msgid="2805103241153907174">"globální změny rychlosti animace"</string>
+    <string name="permlab_setAnimationScale" msgid="2805103241153907174">"změna globální rychlosti animace"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Umožňuje aplikaci kdykoli globálně změnit rychlost animace (rychlejší či pomalejší animace)."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"správa tokenů aplikací"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Umožňuje aplikaci vytvořit a spravovat své vlastní tokeny a obejít jejich obvyklé řazení typu Z. Toto nastavení by nikdy nemělo být potřeba pro běžné aplikace."</string>
@@ -250,11 +250,11 @@
     <string name="permdesc_changeComponentState" msgid="4569107043246700630">"Umožňuje aplikaci změnit, zda je komponenta jiné aplikace povolena nebo ne. Škodlivé aplikace mohou pomocí tohoto nastavení vypnout důležité funkce telefonu. Je třeba postupovat opatrně, protože je možné způsobit nepoužitelnost, nekonzistenci či nestabilitu komponent aplikací."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"nastavení upřednostňovaných aplikací"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Umožňuje aplikaci změnit vaše upřednostňované aplikace. Toto nastavení může škodlivým aplikacím umožnit nepozorovaně změnit spouštěné aplikace a oklamat vaše existující aplikace tak, aby shromažďovaly vaše soukromá data."</string>
-    <string name="permlab_writeSettings" msgid="1365523497395143704">"změny globálních nastavení systému"</string>
+    <string name="permlab_writeSettings" msgid="1365523497395143704">"změna globálních nastavení systému"</string>
     <string name="permdesc_writeSettings" msgid="838789419871034696">"Umožňuje aplikaci upravit data nastavení systému. Škodlivé aplikace mohou poškodit konfiguraci vašeho systému."</string>
     <string name="permlab_writeSecureSettings" msgid="204676251876718288">"změny zabezpečených nastavení systému"</string>
     <string name="permdesc_writeSecureSettings" msgid="4116616249170428132">"Umožňuje aplikaci změnit data zabezpečených nastavení systému. Běžné aplikace toto nastavení nevyužívají."</string>
-    <string name="permlab_writeGservices" msgid="2149426664226152185">"změny mapy služeb Google"</string>
+    <string name="permlab_writeGservices" msgid="2149426664226152185">"změna mapy služeb Google"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Umožňuje aplikaci změnit mapu služeb Google. Běžné aplikace toto nastavení nevyužívají."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"automatické spuštění při startu"</string>
     <string name="permdesc_receiveBootCompleted" msgid="698336728415008796">"Umožňuje aplikaci spuštění ihned po spuštění systému. Toto nastavení může zpomalit spuštění telefonu a umožnit aplikaci celkově zpomalit telefon, protože bude neustále spuštěna."</string>
@@ -276,7 +276,7 @@
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Vytváří simulované zdroje polohy pro účely testování. Škodlivé aplikace mohou pomocí tohoto nastavení změnit polohu či stav vrácený zdroji skutečné polohy, jako je např. jednotka GPS či poskytovatelé sítě."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"přístup k dalším příkazům poskytovatele polohy"</string>
     <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"Umožňuje získat přístup k dalším příkazům poskytovatele polohy. Škodlivé aplikace mohou pomocí tohoto nastavení narušit funkci GPS či jiných zdrojů polohy."</string>
-    <string name="permlab_installLocationProvider" msgid="6578101199825193873">"Oprávnění k instalaci poskytovatele polohy"</string>
+    <string name="permlab_installLocationProvider" msgid="6578101199825193873">"oprávnění k instalaci poskytovatele polohy"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Vytvořit simulace zdrojů polohy pro účely testování. Škodlivé aplikace mohou toto nastavení využít k přepsání polohy nebo stavu vráceného zdroji skutečné polohy, například systémem GPS nebo poskytovateli sítí. Mohou také monitorovat polohu a ohlásit ji externímu zdroji."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"upřesnění polohy (GPS)"</string>
     <string name="permdesc_accessFineLocation" msgid="7411213317434337331">"Umožňuje aplikaci přístup ke zdrojům přesné polohy v telefonu, jako je například systém GPS, je-li k dispozici. Škodlivé aplikace mohou pomocí tohoto nastavení zjistit vaši polohu a mohou zvýšit spotřebu baterie."</string>
@@ -316,7 +316,7 @@
     <string name="permdesc_checkinProperties" msgid="7150307006141883832">"Umožňuje čtení i zápis vlastností nahraných službou Checkin. Běžné aplikace toto nastavení obvykle nevyužívají."</string>
     <string name="permlab_bindGadget" msgid="776905339015863471">"zvolit widgety"</string>
     <string name="permdesc_bindGadget" msgid="2098697834497452046">"Umožňuje aplikaci sdělit systému, které aplikace mohou používat které widgety. Aplikace s tímto oprávněním mohou zpřístupnit osobní údaje jiným aplikacím. Není určeno pro běžné aplikace."</string>
-    <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"změny stavu telefonu"</string>
+    <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"změna stavu telefonu"</string>
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Umožňuje aplikaci ovládat telefonní funkce zařízení. Aplikace s tímto oprávněním může přepínat sítě nebo zapnout či vypnout bezdrátové připojení telefonu bez vašeho svolení."</string>
     <!-- no translation found for permlab_readPhoneState (2326172951448691631) -->
     <skip />
@@ -342,7 +342,7 @@
     <string name="permdesc_accessNetworkState" msgid="558721128707712766">"Umožňuje aplikaci zobrazit stav všech sítí."</string>
     <string name="permlab_createNetworkSockets" msgid="9121633680349549585">"plný přístup k Internetu"</string>
     <string name="permdesc_createNetworkSockets" msgid="4593339106921772192">"Umožňuje aplikaci vytvořit síťové sokety."</string>
-    <string name="permlab_writeApnSettings" msgid="7823599210086622545">"zápis nastavení pro název přístupového bodu (APN)"</string>
+    <string name="permlab_writeApnSettings" msgid="7823599210086622545">"zápis nastavení názvu přístupového bodu (APN)"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Umožňuje aplikaci změnit nastavení APN, jako je například proxy či port APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"změna připojení k síti"</string>
     <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Umožňuje aplikaci změnit stav připojení k síti."</string>
@@ -350,9 +350,9 @@
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Umožňuje aplikaci změnit nastavení použití dat na pozadí."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"zobrazení stavu WiFi"</string>
     <string name="permdesc_accessWifiState" msgid="485796529139236346">"Umožňuje aplikaci zobrazit informace o stavu připojení WiFi."</string>
-    <string name="permlab_changeWifiState" msgid="7280632711057112137">"Změnit stav WiFi"</string>
+    <string name="permlab_changeWifiState" msgid="7280632711057112137">"změna stavu WiFi"</string>
     <string name="permdesc_changeWifiState" msgid="2950383153656873267">"Umožňuje aplikaci připojit se k přístupovým bodům WiFi či se od nich odpojit a provádět změny nakonfigurovaných sítí WiFi."</string>
-    <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Povolit příjem Wi-Fi Multicast"</string>
+    <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"povolení příjmu Wi-Fi Multicast"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Povoluje aplikaci přijímat pakety, které nebyly adresovány přímo vašemu zařízení. Pomocí této možnosti můžete objevit služby nabízené ve vaší blízkosti. Spotřeba energie je vyšší než u režimu bez vícesměrového vysílání (multicast)."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"správa rozhraní Bluetooth"</string>
     <string name="permdesc_bluetoothAdmin" msgid="7256289774667054555">"Umožňuje aplikaci konfigurovat místní telefon s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení."</string>
@@ -370,11 +370,11 @@
     <string name="permdesc_subscribedFeedsRead" msgid="3622200625634207660">"Umožňuje aplikaci získat podrobnosti o aktuálně synchronizovaných zdrojích."</string>
     <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"zápis odebíraných zdrojů"</string>
     <string name="permdesc_subscribedFeedsWrite" msgid="8121607099326533878">"Umožňuje aplikaci upravit vaše aktuálně synchronizované zdroje. To může škodlivým aplikacím umožnit změnu vašich synchronizovaných zdrojů."</string>
-    <string name="permlab_readDictionary" msgid="432535716804748781">"číst slovník definovaný uživatelem"</string>
+    <string name="permlab_readDictionary" msgid="432535716804748781">"člení slovníku definovaného uživatelem"</string>
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Umožní aplikaci číst soukromá slova, jména a fráze, která uživatel mohl uložit do svého slovníku."</string>
-    <string name="permlab_writeDictionary" msgid="6703109511836343341">"zapisovat do slovníku definovaného uživatelem"</string>
+    <string name="permlab_writeDictionary" msgid="6703109511836343341">"zápis do slovníku definovaného uživatelem"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Umožní aplikaci zapisovat nová slova do uživatelského slovníku."</string>
-    <string name="permlab_sdcardWrite" msgid="8079403759001777291">"Změnit/smazat obsah karty SD"</string>
+    <string name="permlab_sdcardWrite" msgid="8079403759001777291">"změna/smazání obsah karty SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Umožní aplikaci zápis na kartu SD."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Domů"</item>
@@ -473,10 +473,10 @@
     <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Chcete opustit tuto stránku?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Vyberte OK, chcete-li pokračovat, nebo Zrušit, chcete-li na stránce zůstat."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Potvrdit"</string>
-    <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"Čtení historie a záložek prohlížeče"</string>
-    <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Umožňuje aplikaci číst všechny navštívené adresy URL a záložky prohlížeče."</string>
-    <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"Zapisovat historii a záložky prohlížeče"</string>
-    <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Umožní aplikaci změnit historii či záložky prohlížeče uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit data prohlížeče."</string>
+    <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"čtení historie a záložek Prohlížeče"</string>
+    <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Umožňuje aplikaci číst všechny navštívené adresy URL a záložky Prohlížeče."</string>
+    <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"zápis do historie a záložek Prohlížeče"</string>
+    <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Umožní aplikaci změnit historii či záložky prohlížeče uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit data Prohlížeče."</string>
     <string name="save_password_message" msgid="767344687139195790">"Chcete, aby si prohlížeč zapamatoval toto heslo?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Nyní ne"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Zapamatovat"</string>
@@ -630,7 +630,7 @@
     <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Přehrávání pomocí rozhraní Bluetooth"</string>
     <string name="volume_call" msgid="3941680041282788711">"Hlasitost hovoru"</string>
     <string name="volume_bluetooth_call" msgid="2002891926351151534">"Hlasitost příchozích hovorů při připojení Bluetooth"</string>
-    <string name="volume_alarm" msgid="1985191616042689100">"Hlasitost upozornění a budíku"</string>
+    <string name="volume_alarm" msgid="1985191616042689100">"Hlasitost budíku"</string>
     <string name="volume_notification" msgid="2422265656744276715">"Hlasitost oznámení"</string>
     <string name="volume_unknown" msgid="1400219669770445902">"Hlasitost"</string>
     <string name="ringtone_default" msgid="3789758980357696936">"Výchozí vyzváněcí tón"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index b8bfdf6..29e3818 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -455,7 +455,7 @@
     <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ユーザー名またはパスワードが正しくありません。"</string>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button" msgid="7774721344716731603">"クリア"</string>
+    <string name="status_bar_clear_all_button" msgid="7774721344716731603">"通知を消去"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"通知なし"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"実行中"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index d0126ab..fd677ce 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -426,7 +426,7 @@
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"緊急電話號碼"</string>
     <string name="lockscreen_carrier_default" msgid="8812714795156374435">"(沒有服務)"</string>
     <string name="lockscreen_screen_locked" msgid="7288443074806832904">"螢幕已鎖定。"</string>
-    <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"按下 [選單] 解鎖或撥打緊急電話。"</string>
+    <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"按下 [Menu] 解鎖或撥打緊急電話。"</string>
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"按下 Menu 鍵解鎖。"</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"畫出解鎖圖形"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"緊急電話"</string>
@@ -484,7 +484,7 @@
     <string name="open_permission_deny" msgid="5661861460947222274">"您沒有開啟此頁的權限。"</string>
     <string name="text_copied" msgid="4985729524670131385">"文字已複製到剪貼簿。"</string>
     <string name="more_item_label" msgid="4650918923083320495">"更多"</string>
-    <string name="prepend_shortcut_label" msgid="2572214461676015642">"[選單] +"</string>
+    <string name="prepend_shortcut_label" msgid="2572214461676015642">"[Menu] +"</string>
     <string name="menu_space_shortcut_label" msgid="2410328639272162537">"空白鍵"</string>
     <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"輸入"</string>
     <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"刪除"</string>
diff --git a/keystore/MODULE_LICENSE_APACHE2 b/keystore/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/keystore/MODULE_LICENSE_APACHE2
diff --git a/keystore/NOTICE b/keystore/NOTICE
new file mode 100644
index 0000000..64aaa8d
--- /dev/null
+++ b/keystore/NOTICE
@@ -0,0 +1,190 @@
+
+   Copyright (c) 2009, 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.
+
+   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.
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
diff --git a/packages/TtsService/jni/android_tts_SynthProxy.cpp b/packages/TtsService/jni/android_tts_SynthProxy.cpp
index 99d7723..1bab717 100644
--- a/packages/TtsService/jni/android_tts_SynthProxy.cpp
+++ b/packages/TtsService/jni/android_tts_SynthProxy.cpp
@@ -26,16 +26,25 @@
 #include <android_runtime/AndroidRuntime.h>
 #include <tts/TtsEngine.h>
 #include <media/AudioTrack.h>
+#include <math.h>
 
 #include <dlfcn.h>
 
 #define DEFAULT_TTS_RATE        16000
 #define DEFAULT_TTS_FORMAT      AudioSystem::PCM_16_BIT
 #define DEFAULT_TTS_NB_CHANNELS 1
-#define DEFAULT_TTS_BUFFERSIZE  1024
+#define DEFAULT_TTS_BUFFERSIZE  2048
 // TODO use the TTS stream type when available
 #define DEFAULT_TTS_STREAM_TYPE AudioSystem::MUSIC
 
+// EQ + BOOST parameters
+#define FILTER_LOWSHELF_ATTENUATION -18.0f // in dB
+#define FILTER_TRANSITION_FREQ 1100.0f     // in Hz
+#define FILTER_SHELF_SLOPE 1.0f            // Q
+#define FILTER_GAIN 6.0f // linear gain
+// such a huge gain is justified by how much energy in the low frequencies is "wasted" at the output
+// of the synthesis. The low shelving filter removes it, leaving room for amplification.
+
 #define USAGEMODE_PLAY_IMMEDIATELY 0
 #define USAGEMODE_WRITE_TO_FILE    1
 
@@ -57,6 +66,79 @@
 };
 
 // ----------------------------------------------------------------------------
+// EQ data
+double amp;
+double w;
+double sinw;
+double cosw;
+double beta;
+double a0, a1, a2, b0, b1, b2;
+double m_fa, m_fb, m_fc, m_fd, m_fe;
+double x0;  // x[n]
+double x1;  // x[n-1]
+double x2;  // x[n-2]
+double out0;// y[n]
+double out1;// y[n-1]
+double out2;// y[n-2]
+
+void initializeEQ() {
+
+    amp = float(pow(10.0, FILTER_LOWSHELF_ATTENUATION / 40.0));
+    w = 2.0 * M_PI * (FILTER_TRANSITION_FREQ / DEFAULT_TTS_RATE);
+    sinw = float(sin(w));
+    cosw = float(cos(w));
+    beta = float(sqrt(amp)/FILTER_SHELF_SLOPE);
+
+    // initialize low-shelf parameters
+    b0 = amp * ((amp+1.0F) - ((amp-1.0F)*cosw) + (beta*sinw));
+    b1 = 2.0F * amp * ((amp-1.0F) - ((amp+1.0F)*cosw));
+    b2 = amp * ((amp+1.0F) - ((amp-1.0F)*cosw) - (beta*sinw));
+    a0 = (amp+1.0F) + ((amp-1.0F)*cosw) + (beta*sinw);
+    a1 = 2.0F * ((amp-1.0F) + ((amp+1.0F)*cosw));
+    a2 = -((amp+1.0F) + ((amp-1.0F)*cosw) - (beta*sinw));
+
+    m_fa = FILTER_GAIN * b0/a0;
+    m_fb = FILTER_GAIN * b1/a0;
+    m_fc = FILTER_GAIN * b2/a0;
+    m_fd = a1/a0;
+    m_fe = a2/a0;
+}
+
+void initializeFilter() {
+    x0 = 0.0f;
+    x1 = 0.0f;
+    x2 = 0.0f;
+    out0 = 0.0f;
+    out1 = 0.0f;
+    out2 = 0.0f;
+}
+
+void applyFilter(int16_t* buffer, size_t sampleCount) {
+
+    for (size_t i=0 ; i<sampleCount ; i++) {
+
+        x0 = (double) buffer[i];
+
+        out0 = (m_fa*x0) + (m_fb*x1) + (m_fc*x2) + (m_fd*out1) + (m_fe*out2);
+
+        x2 = x1;
+        x1 = x0;
+
+        out2 = out1;
+        out1 = out0;
+
+        if (out0 > 32767.0f) {
+            buffer[i] = 32767;
+        } else if (out0 < -32768.0f) {
+            buffer[i] = -32768;
+        } else {
+            buffer[i] = (int16_t) out0;
+        }
+    }
+}
+
+
+// ----------------------------------------------------------------------------
 static fields_t javaTTSFields;
 
 // TODO move to synth member once we have multiple simultaneous engines running
@@ -198,12 +280,13 @@
 
         if (wav == NULL) {
             delete pForAfter;
-            LOGI("Null: speech has completed");
+            LOGV("Null: speech has completed");
         }
 
         if (bufferSize > 0) {
             prepAudioTrack(pJniData, pForAfter->streamType, rate, format, channel);
             if (pJniData->mAudioOut) {
+                applyFilter((int16_t*)wav, bufferSize/2);
                 pJniData->mAudioOut->write(wav, bufferSize);
                 memset(wav, 0, bufferSize);
                 //LOGV("AudioTrack wrote: %d bytes", bufferSize);
@@ -212,13 +295,14 @@
             }
         }
     } else  if (pForAfter->usageMode == USAGEMODE_WRITE_TO_FILE) {
-        LOGV("Save to file");
+        //LOGV("Save to file");
         if (wav == NULL) {
             delete pForAfter;
             LOGV("Null: speech has completed");
             return TTS_CALLBACK_HALT;
         }
         if (bufferSize > 0){
+            applyFilter((int16_t*)wav, bufferSize/2);
             fwrite(wav, 1, bufferSize, pForAfter->outputFile);
             memset(wav, 0, bufferSize);
         }
@@ -289,6 +373,8 @@
     env->SetIntField(thiz, javaTTSFields.synthProxyFieldJniData,
             (int)pJniStorage);
 
+    initializeEQ();
+
     env->ReleaseStringUTFChars(nativeSoLib, nativeSoLibNativeString);
 }
 
@@ -479,6 +565,8 @@
         return result;
     }
 
+    initializeFilter();
+
     Mutex::Autolock l(engineMutex);
 
     // Retrieve audio parameters before writing the file header
@@ -583,6 +671,8 @@
         return result;
     }
 
+    initializeFilter();
+
     Mutex::Autolock l(engineMutex);
 
     SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
diff --git a/preloaded-classes b/preloaded-classes
index 7d1f960..69c596c 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -1,119 +1,66 @@
 # Classes which are preloaded by com.android.internal.os.ZygoteInit.
-# Automatically generated by /frameworks/base/tools/preload.
-# percent=75, weight=500, bucket_size=5
+# Automatically generated by frameworks/base/tools/preload/WritePreloadedClassFile.java.
+# MIN_LOAD_TIME_MICROS=1250
 SQLite.Blob
 SQLite.Database
 SQLite.FunctionContext
 SQLite.Stmt
 SQLite.Vm
 android.R$styleable
-android.accounts.AccountMonitor
-android.accounts.AccountMonitor$AccountUpdater
-android.accounts.AccountMonitorListener
-android.accounts.AccountsServiceConstants
-android.accounts.IAccountsService
 android.accounts.IAccountsService$Stub
 android.app.Activity
-android.app.Activity$ManagedCursor
 android.app.ActivityGroup
+android.app.ActivityManager
+android.app.ActivityManager$MemoryInfo
 android.app.ActivityManagerNative
 android.app.ActivityManagerProxy
 android.app.ActivityThread
-android.app.ActivityThread$ActivityRecord
-android.app.ActivityThread$AppBindData
 android.app.ActivityThread$ApplicationThread
-android.app.ActivityThread$BindServiceData
-android.app.ActivityThread$ContextCleanupInfo
-android.app.ActivityThread$CreateServiceData
-android.app.ActivityThread$GcIdler
 android.app.ActivityThread$H
-android.app.ActivityThread$Idler
-android.app.ActivityThread$NewIntentData
-android.app.ActivityThread$PackageInfo
-android.app.ActivityThread$PackageInfo$ReceiverDispatcher
-android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args
-android.app.ActivityThread$PackageInfo$ReceiverDispatcher$InnerReceiver
-android.app.ActivityThread$PackageInfo$ServiceDispatcher
-android.app.ActivityThread$PackageInfo$ServiceDispatcher$ConnectionInfo
-android.app.ActivityThread$PackageInfo$ServiceDispatcher$DeathMonitor
-android.app.ActivityThread$PackageInfo$ServiceDispatcher$InnerConnection
-android.app.ActivityThread$PackageInfo$ServiceDispatcher$RunConnection
-android.app.ActivityThread$ProviderRecord
-android.app.ActivityThread$ProviderRefCount
-android.app.ActivityThread$ReceiverData
-android.app.ActivityThread$ResourcesKey
-android.app.ActivityThread$ResultData
-android.app.ActivityThread$ServiceArgsData
-android.app.ActivityThread$StopInfo
 android.app.AlertDialog
-android.app.AlertDialog$Builder
 android.app.Application
 android.app.ApplicationContext
 android.app.ApplicationContext$ApplicationContentResolver
 android.app.ApplicationContext$ApplicationPackageManager
-android.app.ApplicationContext$ApplicationPackageManager$PackageRemovedReceiver
-android.app.ApplicationContext$ApplicationPackageManager$ResourceName
-android.app.ApplicationContext$SharedPreferencesImpl
-android.app.ApplicationContext$SharedPreferencesImpl$EditorImpl
-android.app.ApplicationLoaders
+android.app.ApplicationContext$WallpaperCallback
 android.app.ApplicationThreadNative
+android.app.DatePickerDialog
 android.app.Dialog
-android.app.Dialog$1
-android.app.Dialog$ListenersHandler
 android.app.ExpandableListActivity
 android.app.IActivityManager
 android.app.IActivityManager$ContentProviderHolder
-android.app.IActivityManager$ContentProviderHolder$1
-android.app.IAlarmManager
 android.app.IAlarmManager$Stub
-android.app.IAlarmManager$Stub$Proxy
-android.app.IApplicationThread
-android.app.IInstrumentationWatcher
-android.app.IInstrumentationWatcher$Stub
-android.app.INotificationManager
 android.app.INotificationManager$Stub
-android.app.INotificationManager$Stub$Proxy
-android.app.ISearchManager
 android.app.ISearchManager$Stub
-android.app.ISearchManager$Stub$Proxy
-android.app.ISearchManagerCallback
 android.app.ISearchManagerCallback$Stub
-android.app.IServiceConnection
-android.app.IServiceConnection$Stub
-android.app.ITransientNotification
+android.app.IStatusBar$Stub
 android.app.ITransientNotification$Stub
+android.app.IWallpaperService$Stub
+android.app.IWallpaperServiceCallback$Stub
 android.app.Instrumentation
-android.app.IntentReceiverLeaked
+android.app.IntentService
 android.app.ListActivity
-android.app.ListActivity$1
-android.app.ListActivity$2
 android.app.LocalActivityManager
-android.app.LocalActivityManager$LocalActivityRecord
 android.app.Notification
-android.app.Notification$1
-android.app.NotificationManager
 android.app.PendingIntent
-android.app.PendingIntent$1
 android.app.ProgressDialog
-android.app.ReceiverRestrictedContext
 android.app.ResultInfo
-android.app.ResultInfo$1
 android.app.SearchManager$SearchManagerCallback
-android.app.SearchManager$SearchManagerCallback$1
-android.app.SearchManager$SearchManagerCallback$2
 android.app.Service
-android.app.ServiceConnectionLeaked
+android.app.StatusBarManager
 android.app.TabActivity
+android.app.TimePickerDialog
+android.appwidget.AppWidgetHost
 android.appwidget.AppWidgetHostView
 android.appwidget.AppWidgetManager
 android.appwidget.AppWidgetProvider
+android.appwidget.AppWidgetProviderInfo
 android.backup.BackupDataInput
 android.backup.BackupDataInput$EntityHeader
 android.backup.BackupDataOutput
 android.backup.BackupHelperDispatcher
 android.backup.BackupHelperDispatcher$Header
 android.backup.FileBackupHelperBase
-android.bluetooth.BluetoothA2dp
 android.bluetooth.BluetoothAudioGateway
 android.bluetooth.BluetoothDevice
 android.bluetooth.Database
@@ -125,89 +72,44 @@
 android.bluetooth.IBluetoothDevice$Stub$Proxy
 android.bluetooth.RfcommSocket
 android.bluetooth.ScoSocket
-android.content.AsyncQueryHandler
-android.content.AsyncQueryHandler$WorkerArgs
-android.content.AsyncQueryHandler$WorkerHandler
-android.content.BroadcastReceiver
-android.content.ComponentCallbacks
+android.content.AbstractSyncableContentProvider
+android.content.AbstractTableMerger
 android.content.ComponentName
-android.content.ComponentName$1
-android.content.ContentProvider
 android.content.ContentProvider$Transport
-android.content.ContentProviderNative
-android.content.ContentProviderProxy
-android.content.ContentQueryMap
-android.content.ContentQueryMap$1
 android.content.ContentResolver
 android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$ParcelFileDescriptorInner
-android.content.ContentUris
 android.content.ContentValues
-android.content.ContentValues$1
 android.content.Context
 android.content.ContextWrapper
-android.content.DialogInterface
-android.content.DialogInterface$OnCancelListener
-android.content.DialogInterface$OnClickListener
-android.content.DialogInterface$OnDismissListener
-android.content.DialogInterface$OnKeyListener
 android.content.DialogInterface$OnMultiChoiceClickListener
-android.content.IContentProvider
-android.content.IContentService
 android.content.IContentService$Stub
-android.content.IContentService$Stub$Proxy
-android.content.IIntentReceiver
-android.content.IIntentReceiver$Stub
-android.content.IIntentSender
-android.content.IIntentSender$Stub
-android.content.IIntentSender$Stub$Proxy
-android.content.ISyncAdapter
 android.content.ISyncAdapter$Stub
 android.content.Intent
-android.content.Intent$1
+android.content.Intent$ShortcutIconResource
 android.content.IntentFilter
-android.content.IntentFilter$1
-android.content.SearchRecentSuggestionsProvider
-android.content.SearchRecentSuggestionsProvider$DatabaseHelper
-android.content.ServiceConnection
-android.content.SharedPreferences
-android.content.SharedPreferences$Editor
-android.content.SharedPreferences$OnSharedPreferenceChangeListener
-android.content.SyncAdapter
 android.content.SyncAdapter$Transport
-android.content.SyncContext
 android.content.SyncResult
+android.content.SyncStateContentProviderHelper
 android.content.SyncStats
+android.content.SyncableContentProvider
+android.content.TempProviderSyncAdapter
 android.content.UriMatcher
 android.content.pm.ActivityInfo
-android.content.pm.ActivityInfo$1
 android.content.pm.ApplicationInfo
-android.content.pm.ApplicationInfo$1
-android.content.pm.ComponentInfo
 android.content.pm.ConfigurationInfo
-android.content.pm.ConfigurationInfo$1
+android.content.pm.IPackageDataObserver$Stub
 android.content.pm.IPackageDeleteObserver$Stub
-android.content.pm.IPackageManager
 android.content.pm.IPackageManager$Stub
 android.content.pm.IPackageManager$Stub$Proxy
+android.content.pm.IPackageStatsObserver$Stub
 android.content.pm.InstrumentationInfo
-android.content.pm.InstrumentationInfo$1
 android.content.pm.PackageInfo
-android.content.pm.PackageInfo$1
-android.content.pm.PackageItemInfo
 android.content.pm.PackageManager
+android.content.pm.PackageStats
 android.content.pm.PathPermission
-android.content.pm.PathPermission$1
 android.content.pm.PermissionInfo
-android.content.pm.PermissionInfo$1
-android.content.pm.ProviderInfo
-android.content.pm.ProviderInfo$1
 android.content.pm.ResolveInfo
-android.content.pm.ResolveInfo$1
-android.content.pm.ServiceInfo
-android.content.pm.ServiceInfo$1
 android.content.pm.Signature
-android.content.pm.Signature$1
 android.content.res.AssetFileDescriptor
 android.content.res.AssetFileDescriptor$1
 android.content.res.AssetManager
@@ -216,65 +118,38 @@
 android.content.res.ColorStateList$1
 android.content.res.CompatibilityInfo
 android.content.res.CompatibilityInfo$1
-android.content.res.CompatibilityInfo$Translator
 android.content.res.Configuration
 android.content.res.Configuration$1
-android.content.res.PluralRules
-android.content.res.PluralRules$en
 android.content.res.Resources
 android.content.res.Resources$1
-android.content.res.Resources$Theme
 android.content.res.StringBlock
-android.content.res.StringBlock$StyleIDs
 android.content.res.TypedArray
 android.content.res.XmlBlock
 android.content.res.XmlBlock$Parser
 android.content.res.XmlResourceParser
 android.database.AbstractCursor
-android.database.AbstractCursor$SelfContentObserver
 android.database.AbstractWindowedCursor
-android.database.BulkCursorNative
-android.database.BulkCursorProxy
 android.database.BulkCursorToCursorAdaptor
 android.database.CharArrayBuffer
-android.database.ContentObservable
-android.database.ContentObserver
-android.database.ContentObserver$NotificationRunnable
-android.database.ContentObserver$Transport
-android.database.CrossProcessCursor
-android.database.Cursor
+android.database.CursorJoiner$Result
 android.database.CursorToBulkCursorAdaptor
-android.database.CursorToBulkCursorAdaptor$ContentObserverProxy
 android.database.CursorWindow
 android.database.CursorWindow$1
 android.database.CursorWrapper
-android.database.DataSetObservable
-android.database.DataSetObserver
 android.database.DatabaseUtils
-android.database.DatabaseUtils$InsertHelper
-android.database.IBulkCursor
-android.database.IContentObserver
-android.database.IContentObserver$Stub
-android.database.IContentObserver$Stub$Proxy
 android.database.MatrixCursor
-android.database.Observable
-android.database.SQLException
+android.database.MergeCursor
 android.database.sqlite.SQLiteClosable
 android.database.sqlite.SQLiteCursor
-android.database.sqlite.SQLiteCursorDriver
 android.database.sqlite.SQLiteDatabase
-android.database.sqlite.SQLiteDatabase$CursorFactory
+android.database.sqlite.SQLiteDatabase$ConflictAlgorithm
 android.database.sqlite.SQLiteDebug
 android.database.sqlite.SQLiteDebug$PagerStats
 android.database.sqlite.SQLiteDirectCursorDriver
-android.database.sqlite.SQLiteException
-android.database.sqlite.SQLiteOpenHelper
 android.database.sqlite.SQLiteProgram
 android.database.sqlite.SQLiteQuery
 android.database.sqlite.SQLiteQueryBuilder
 android.database.sqlite.SQLiteStatement
-android.ddm.DdmHandleAppName
-android.ddm.DdmHandleExit
 android.ddm.DdmHandleHeap
 android.ddm.DdmHandleHello
 android.ddm.DdmHandleNativeHeap
@@ -294,7 +169,6 @@
 android.graphics.BlurMaskFilter
 android.graphics.Camera
 android.graphics.Canvas
-android.graphics.Canvas$EdgeType
 android.graphics.Color
 android.graphics.ColorFilter
 android.graphics.ColorMatrixColorFilter
@@ -311,7 +185,6 @@
 android.graphics.LinearGradient
 android.graphics.MaskFilter
 android.graphics.Matrix
-android.graphics.Matrix$ScaleToFit
 android.graphics.Movie
 android.graphics.NinePatch
 android.graphics.Paint
@@ -323,7 +196,6 @@
 android.graphics.Paint$Style
 android.graphics.PaintFlagsDrawFilter
 android.graphics.Path
-android.graphics.Path$Direction
 android.graphics.Path$FillType
 android.graphics.PathDashPathEffect
 android.graphics.PathEffect
@@ -350,7 +222,6 @@
 android.graphics.Shader$TileMode
 android.graphics.SumPathEffect
 android.graphics.SweepGradient
-android.graphics.TemporaryBuffer
 android.graphics.Typeface
 android.graphics.Xfermode
 android.graphics.drawable.Animatable
@@ -370,7 +241,6 @@
 android.graphics.drawable.DrawableContainer
 android.graphics.drawable.DrawableContainer$DrawableContainerState
 android.graphics.drawable.GradientDrawable
-android.graphics.drawable.GradientDrawable$1
 android.graphics.drawable.GradientDrawable$GradientState
 android.graphics.drawable.GradientDrawable$Orientation
 android.graphics.drawable.LayerDrawable
@@ -379,55 +249,38 @@
 android.graphics.drawable.NinePatchDrawable
 android.graphics.drawable.NinePatchDrawable$NinePatchState
 android.graphics.drawable.PaintDrawable
+android.graphics.drawable.RotateDrawable
 android.graphics.drawable.ShapeDrawable
-android.graphics.drawable.ShapeDrawable$ShapeState
 android.graphics.drawable.StateListDrawable
 android.graphics.drawable.StateListDrawable$StateListState
 android.graphics.drawable.TransitionDrawable
 android.graphics.drawable.TransitionDrawable$TransitionState
-android.graphics.drawable.shapes.RectShape
 android.graphics.drawable.shapes.RoundRectShape
-android.graphics.drawable.shapes.Shape
 android.hardware.Camera
-android.hardware.ISensorService
 android.hardware.ISensorService$Stub
-android.hardware.ISensorService$Stub$Proxy
-android.hardware.Sensor
-android.hardware.SensorEvent
-android.hardware.SensorEventListener
-android.hardware.SensorListener
 android.hardware.SensorManager
-android.hardware.SensorManager$1
-android.hardware.SensorManager$LegacyListener
-android.hardware.SensorManager$ListenerDelegate
-android.hardware.SensorManager$ListenerDelegate$1
-android.hardware.SensorManager$LmsFilter
-android.hardware.SensorManager$SensorThread
-android.hardware.SensorManager$SensorThread$SensorThreadRunnable
+android.inputmethodservice.AbstractInputMethodService
+android.inputmethodservice.AbstractInputMethodService$AbstractInputMethodSessionImpl
+android.inputmethodservice.ExtractButton
 android.inputmethodservice.ExtractEditText
+android.inputmethodservice.IInputMethodSessionWrapper
+android.inputmethodservice.IInputMethodSessionWrapper$InputMethodEventCallbackWrapper
+android.inputmethodservice.IInputMethodWrapper
 android.inputmethodservice.InputMethodService
+android.inputmethodservice.Keyboard
+android.inputmethodservice.Keyboard$Key
 android.inputmethodservice.KeyboardView
+android.inputmethodservice.KeyboardView$2
 android.location.Address
-android.location.Address$1
-android.location.Geocoder
-android.location.GpsSatellite
-android.location.GpsStatus
-android.location.GpsStatus$1
-android.location.ILocationListener
-android.location.ILocationListener$Stub
-android.location.ILocationManager
+android.location.Criteria
 android.location.ILocationManager$Stub
 android.location.ILocationManager$Stub$Proxy
 android.location.ILocationProvider
 android.location.ILocationProvider$Stub
 android.location.Location
-android.location.Location$1
-android.location.LocationListener
 android.location.LocationManager
 android.location.LocationManager$ListenerTransport
-android.location.LocationManager$ListenerTransport$1
-android.location.LocationProvider
-android.media.AmrInputStream
+android.location.LocationManager$LpPowerComparator
 android.media.AudioFormat
 android.media.AudioManager
 android.media.AudioRecord
@@ -435,70 +288,56 @@
 android.media.AudioTrack
 android.media.ExifInterface
 android.media.FaceDetector
-android.media.IAudioService
+android.media.FaceDetector$Face
 android.media.IAudioService$Stub
 android.media.IAudioService$Stub$Proxy
 android.media.JetPlayer
 android.media.MediaMetadataRetriever
 android.media.MediaPlayer
-android.media.MediaPlayer$EventHandler
-android.media.MediaPlayer$OnBufferingUpdateListener
-android.media.MediaPlayer$OnCompletionListener
-android.media.MediaPlayer$OnErrorListener
-android.media.MediaPlayer$OnPreparedListener
 android.media.MediaRecorder
 android.media.MediaScanner
-android.media.ResampleInputStream
+android.media.MediaScanner$MyMediaScannerClient
+android.media.Ringtone
 android.media.RingtoneManager
 android.media.ToneGenerator
 android.net.ConnectivityManager
 android.net.Credentials
 android.net.DhcpInfo
 android.net.DhcpInfo$1
-android.net.IConnectivityManager
 android.net.IConnectivityManager$Stub
-android.net.IConnectivityManager$Stub$Proxy
 android.net.LocalServerSocket
 android.net.LocalSocket
+android.net.LocalSocketAddress$Namespace
 android.net.LocalSocketImpl
 android.net.LocalSocketImpl$SocketInputStream
 android.net.LocalSocketImpl$SocketOutputStream
 android.net.NetworkConnectivityListener
-android.net.NetworkConnectivityListener$ConnectivityBroadcastReceiver
-android.net.NetworkConnectivityListener$State
 android.net.NetworkInfo
-android.net.NetworkInfo$1
 android.net.NetworkInfo$DetailedState
-android.net.NetworkInfo$State
 android.net.NetworkUtils
 android.net.Uri
-android.net.Uri$1
-android.net.Uri$AbstractHierarchicalUri
-android.net.Uri$AbstractPart
-android.net.Uri$Builder
 android.net.Uri$HierarchicalUri
 android.net.Uri$OpaqueUri
 android.net.Uri$Part
-android.net.Uri$Part$EmptyPart
-android.net.Uri$PathPart
-android.net.Uri$PathSegments
-android.net.Uri$PathSegmentsBuilder
 android.net.Uri$StringUri
 android.net.WebAddress
 android.net.http.AndroidHttpClient
-android.net.http.AndroidHttpClient$1
 android.net.http.AndroidHttpClient$2
-android.net.http.AndroidHttpClient$CurlLogger
-android.net.http.AndroidHttpClient$LoggingConfiguration
 android.net.http.CertificateChainValidator
+android.net.http.Connection
+android.net.http.DomainNameChecker
 android.net.http.EventHandler
 android.net.http.Headers
-android.net.http.Headers$HeaderCallback
 android.net.http.HttpsConnection
+android.net.http.Request
+android.net.http.RequestQueue
+android.net.http.SslCertificate
 android.net.vpn.IVpnService$Stub
+android.net.vpn.PptpProfile
 android.net.vpn.VpnManager
+android.net.vpn.VpnProfile
+android.net.vpn.VpnState
 android.net.vpn.VpnType
-android.net.wifi.IWifiManager
 android.net.wifi.IWifiManager$Stub
 android.net.wifi.IWifiManager$Stub$Proxy
 android.net.wifi.WifiManager
@@ -507,6 +346,7 @@
 android.opengl.GLES10Ext
 android.opengl.GLES11
 android.opengl.GLES11Ext
+android.opengl.GLU
 android.opengl.GLUtils
 android.opengl.Matrix
 android.opengl.Visibility
@@ -516,7 +356,7 @@
 android.os.Build
 android.os.Build$VERSION
 android.os.Bundle
-android.os.Bundle$1
+android.os.DeadObjectException
 android.os.Debug
 android.os.Debug$MemoryInfo
 android.os.Environment
@@ -525,126 +365,111 @@
 android.os.FileUtils
 android.os.FileUtils$FileStatus
 android.os.Handler
-android.os.HandlerThread
 android.os.Hardware
 android.os.IBinder
-android.os.IBinder$DeathRecipient
-android.os.ICheckinService
 android.os.ICheckinService$Stub
-android.os.ICheckinService$Stub$Proxy
-android.os.IHardwareService
 android.os.IHardwareService$Stub
-android.os.IHardwareService$Stub$Proxy
 android.os.IInterface
-android.os.IMessenger
-android.os.IPowerManager
+android.os.IMountService$Stub
+android.os.IParentalControlCallback$Stub
 android.os.IPowerManager$Stub
-android.os.IPowerManager$Stub$Proxy
-android.os.IServiceManager
 android.os.Looper
 android.os.MemoryFile
 android.os.Message
-android.os.Message$1
-android.os.MessageQueue
-android.os.MessageQueue$IdleHandler
 android.os.NetStat
 android.os.Parcel
 android.os.Parcel$1
 android.os.ParcelFileDescriptor
 android.os.ParcelFileDescriptor$1
-android.os.ParcelFileDescriptor$AutoCloseInputStream
 android.os.Parcelable
 android.os.Parcelable$Creator
 android.os.PatternMatcher
-android.os.PatternMatcher$1
 android.os.Power
-android.os.PowerManager
-android.os.PowerManager$WakeLock
-android.os.PowerManager$WakeLock$1
 android.os.Process
-android.os.RemoteException
-android.os.ServiceManager
-android.os.ServiceManagerNative
-android.os.ServiceManagerProxy
+android.os.ResultReceiver
 android.os.StatFs
 android.os.SystemClock
 android.os.SystemProperties
 android.os.UEventObserver
-android.os.Vibrator
 android.pim.EventRecurrence
 android.preference.CheckBoxPreference
+android.preference.CheckBoxPreference$SavedState
 android.preference.DialogPreference
 android.preference.EditTextPreference
-android.preference.GenericInflater
-android.preference.GenericInflater$Parent
 android.preference.ListPreference
-android.preference.ListPreference$1
-android.preference.OnDependencyChangeListener
+android.preference.ListPreference$SavedState
 android.preference.Preference
-android.preference.Preference$BaseSavedState
-android.preference.Preference$BaseSavedState$1
-android.preference.Preference$OnPreferenceChangeInternalListener
-android.preference.Preference$OnPreferenceChangeListener
-android.preference.Preference$OnPreferenceClickListener
 android.preference.PreferenceActivity
-android.preference.PreferenceActivity$1
-android.preference.PreferenceCategory
 android.preference.PreferenceGroup
 android.preference.PreferenceGroupAdapter
-android.preference.PreferenceGroupAdapter$1
 android.preference.PreferenceInflater
 android.preference.PreferenceManager
-android.preference.PreferenceManager$OnActivityDestroyListener
-android.preference.PreferenceManager$OnActivityResultListener
-android.preference.PreferenceManager$OnPreferenceTreeClickListener
 android.preference.PreferenceScreen
 android.preference.RingtonePreference
-android.provider.BaseColumns
+android.preference.VolumePreference
+android.preference.VolumePreference$SeekBarVolumizer
 android.provider.Browser
-android.provider.Checkin
+android.provider.Calendar$Attendees
+android.provider.Calendar$BusyBits
+android.provider.Calendar$CalendarAlerts
+android.provider.Calendar$Calendars
+android.provider.Calendar$Events
+android.provider.Calendar$Instances
+android.provider.CallLog$Calls
 android.provider.Checkin$Events$Tag
+android.provider.Checkin$Properties
 android.provider.Checkin$Properties$Tag
-android.provider.Checkin$Stats
 android.provider.Checkin$Stats$Tag
+android.provider.Contacts
 android.provider.Contacts$ContactMethods
-android.provider.Contacts$ContactMethodsColumns
 android.provider.Contacts$People
-android.provider.Contacts$PeopleColumns
 android.provider.Contacts$Phones
-android.provider.Contacts$PhonesColumns
-android.provider.Contacts$PresenceColumns
+android.provider.Contacts$Presence
+android.provider.Contacts$Settings
 android.provider.Downloads
 android.provider.Gmail
+android.provider.Gmail$AttachmentOrigin
+android.provider.Gmail$AttachmentRendition
+android.provider.Gmail$ConversationCursor
+android.provider.Gmail$CursorStatus
 android.provider.Gmail$LabelMap
+android.provider.Gmail$MessageCursor
 android.provider.Gmail$PersonalLevel
 android.provider.Gmail$Settings
-android.provider.Im$CommonPresenceColumns
+android.provider.Im$Account
+android.provider.Im$Avatars
+android.provider.Im$Chats
+android.provider.Im$Contacts
+android.provider.Im$LastRmqId
+android.provider.Im$Messages
+android.provider.Im$OutgoingRmq
+android.provider.Im$Presence
 android.provider.Im$Provider
-android.provider.MediaStore$Audio$AudioColumns
+android.provider.Im$ProviderSettings
+android.provider.MediaStore
+android.provider.MediaStore$Audio$Albums
+android.provider.MediaStore$Audio$Artists
+android.provider.MediaStore$Audio$Artists$Albums
 android.provider.MediaStore$Audio$Media
+android.provider.MediaStore$Audio$Playlists
 android.provider.MediaStore$Images$Media
-android.provider.MediaStore$MediaColumns
+android.provider.MediaStore$Images$Thumbnails
 android.provider.SearchRecentSuggestions
 android.provider.Settings$Gservices
-android.provider.Settings$NameValueCache
-android.provider.Settings$NameValueTable
 android.provider.Settings$Secure
 android.provider.Settings$System
-android.provider.SubscribedFeeds$FeedColumns
 android.provider.SubscribedFeeds$Feeds
-android.provider.SyncConstValue
+android.provider.Telephony$Carriers
 android.provider.Telephony$Mms
 android.provider.Telephony$MmsSms
 android.provider.Telephony$MmsSms$PendingMessages
+android.provider.Telephony$Sms
+android.provider.Telephony$Sms$Conversations
 android.provider.Telephony$Threads
+android.provider.UserDictionary
 android.provider.UserDictionary$Words
-android.sax.Children
-android.sax.Children$Child
-android.sax.Element
-android.sax.EndTextElementListener
 android.sax.RootElement
 android.sax.RootElement$Handler
-android.sax.StartElementListener
 android.security.Keystore
 android.security.Keystore$FileKeystore
 android.security.Md5MessageDigest
@@ -656,681 +481,324 @@
 android.server.BluetoothEventLoop
 android.server.data.BuildData
 android.server.data.CrashData
-android.server.data.StackTraceElementData
 android.server.data.ThrowableData
 android.server.search.SearchableInfo
-android.server.search.SearchableInfo$1
+android.server.search.Searchables
+android.speech.IRecognitionListener$Stub
 android.speech.IRecognitionService$Stub
+android.speech.RecognitionResult
+android.speech.RecognitionServiceUtil
+android.speech.srec.MicrophoneInputStream
 android.speech.srec.Recognizer
 android.speech.tts.ITts$Stub
 android.speech.tts.ITts$Stub$Proxy
 android.speech.tts.TextToSpeech
-android.telephony.CellLocation
 android.telephony.PhoneNumberUtils
-android.telephony.PhoneStateListener
 android.telephony.PhoneStateListener$1
-android.telephony.PhoneStateListener$2
 android.telephony.ServiceState
-android.telephony.ServiceState$1
 android.telephony.SignalStrength
+android.telephony.SmsMessage
 android.telephony.TelephonyManager
-android.telephony.gsm.GsmCellLocation
 android.text.AndroidCharacter
 android.text.Annotation
 android.text.AutoText
 android.text.BoringLayout
-android.text.BoringLayout$Metrics
 android.text.DynamicLayout
-android.text.DynamicLayout$ChangeWatcher
-android.text.Editable
-android.text.Editable$Factory
-android.text.GetChars
-android.text.GraphicsOperations
+android.text.Html
 android.text.Html$HtmlParser
+android.text.HtmlToSpannedConverter
 android.text.IClipboard$Stub
-android.text.InputFilter
-android.text.InputType
 android.text.Layout
-android.text.Layout$Alignment
-android.text.Layout$Directions
-android.text.Layout$Ellipsizer
-android.text.NoCopySpan
-android.text.NoCopySpan$Concrete
-android.text.PackedIntVector
-android.text.PackedObjectVector
-android.text.ParcelableSpan
 android.text.Selection
-android.text.Selection$END
-android.text.Selection$START
-android.text.SpanWatcher
-android.text.Spannable
-android.text.Spannable$Factory
-android.text.SpannableString
 android.text.SpannableStringBuilder
-android.text.SpannableStringInternal
-android.text.Spanned
 android.text.SpannedString
 android.text.StaticLayout
-android.text.Styled
-android.text.TextPaint
 android.text.TextUtils
-android.text.TextUtils$1
-android.text.TextUtils$EllipsizeCallback
-android.text.TextUtils$SimpleStringSplitter
-android.text.TextUtils$StringSplitter
-android.text.TextUtils$TruncateAt
-android.text.TextWatcher
-android.text.format.DateFormat
 android.text.format.DateUtils
 android.text.format.Formatter
 android.text.format.Time
 android.text.method.ArrowKeyMovementMethod
 android.text.method.BaseKeyListener
-android.text.method.KeyListener
+android.text.method.DialerKeyListener
+android.text.method.DigitsKeyListener
+android.text.method.LinkMovementMethod
 android.text.method.MetaKeyKeyListener
-android.text.method.MovementMethod
-android.text.method.NumberKeyListener
-android.text.method.PasswordTransformationMethod
-android.text.method.PasswordTransformationMethod$PasswordCharSequence
-android.text.method.PasswordTransformationMethod$ViewReference
-android.text.method.PasswordTransformationMethod$Visible
 android.text.method.QwertyKeyListener
-android.text.method.QwertyKeyListener$Replaced
-android.text.method.ReplacementTransformationMethod
-android.text.method.ReplacementTransformationMethod$ReplacementCharSequence
 android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence
 android.text.method.SingleLineTransformationMethod
 android.text.method.TextKeyListener
-android.text.method.TextKeyListener$Capitalize
-android.text.method.TextKeyListener$SettingsObserver
-android.text.method.Touch
-android.text.method.Touch$DragState
-android.text.method.TransformationMethod
-android.text.style.AlignmentSpan
-android.text.style.CharacterStyle
-android.text.style.ClickableSpan
-android.text.style.ForegroundColorSpan
-android.text.style.LeadingMarginSpan
-android.text.style.LineBackgroundSpan
-android.text.style.LineHeightSpan
+android.text.style.BulletSpan
+android.text.style.ImageSpan
 android.text.style.MetricAffectingSpan
-android.text.style.ParagraphStyle
-android.text.style.ReplacementSpan
 android.text.style.StyleSpan
+android.text.style.TextAppearanceSpan
 android.text.style.URLSpan
-android.text.style.UnderlineSpan
-android.text.style.UpdateAppearance
-android.text.style.UpdateLayout
-android.text.style.WrapTogetherSpan
 android.text.util.Linkify
-android.text.util.Linkify$1
-android.text.util.Linkify$2
-android.text.util.Linkify$3
-android.text.util.Linkify$4
-android.text.util.Linkify$MatchFilter
-android.text.util.Linkify$TransformFilter
 android.text.util.Regex
 android.text.util.Rfc822Validator
-android.util.AndroidException
-android.util.AndroidRuntimeException
 android.util.AttributeSet
 android.util.DisplayMetrics
 android.util.EventLog
 android.util.EventLog$Event
 android.util.EventLog$List
-android.util.FinitePool
 android.util.FloatMath
 android.util.Log
 android.util.LongSparseArray
-android.util.Pool
-android.util.Poolable
-android.util.PoolableManager
-android.util.Pools
-android.util.Printer
 android.util.SparseArray
-android.util.SparseBooleanArray
-android.util.SparseIntArray
 android.util.StateSet
-android.util.SynchronizedPool
 android.util.TypedValue
 android.util.Xml
+android.util.Xml$Encoding
 android.view.AbsSavedState
-android.view.AbsSavedState$1
-android.view.AbsSavedState$2
-android.view.ContextMenu
-android.view.ContextMenu$ContextMenuInfo
 android.view.ContextThemeWrapper
 android.view.Display
-android.view.Display$CompatibleDisplay
 android.view.FocusFinder
-android.view.FocusFinder$1
 android.view.GestureDetector
-android.view.GestureDetector$GestureHandler
-android.view.GestureDetector$OnDoubleTapListener
-android.view.GestureDetector$OnGestureListener
 android.view.GestureDetector$SimpleOnGestureListener
-android.view.Gravity
-android.view.IRotationWatcher
 android.view.IRotationWatcher$Stub
-android.view.IWindow
-android.view.IWindow$Stub
-android.view.IWindowManager
 android.view.IWindowManager$Stub
 android.view.IWindowManager$Stub$Proxy
-android.view.IWindowSession
 android.view.IWindowSession$Stub
-android.view.IWindowSession$Stub$Proxy
 android.view.KeyCharacterMap
 android.view.KeyCharacterMap$KeyData
 android.view.KeyEvent
-android.view.KeyEvent$1
-android.view.KeyEvent$Callback
 android.view.LayoutInflater
-android.view.LayoutInflater$Factory
-android.view.LayoutInflater$Filter
-android.view.Menu
-android.view.MenuInflater
 android.view.MenuInflater$MenuState
-android.view.MenuItem
 android.view.MotionEvent
-android.view.MotionEvent$1
 android.view.Surface
 android.view.Surface$1
-android.view.Surface$CompatibleCanvas
-android.view.SurfaceHolder
-android.view.SurfaceHolder$Callback
 android.view.SurfaceSession
 android.view.SurfaceView
-android.view.SurfaceView$1
-android.view.SurfaceView$2
-android.view.SurfaceView$MyWindow
-android.view.TouchDelegate
 android.view.VelocityTracker
-android.view.VelocityTracker$1
 android.view.View
-android.view.View$AttachInfo
 android.view.View$AttachInfo$Callbacks
+android.view.View$AttachInfo$InvalidateInfo
 android.view.View$BaseSavedState
-android.view.View$BaseSavedState$1
-android.view.View$CheckForLongPress
-android.view.View$MeasureSpec
-android.view.View$OnClickListener
-android.view.View$OnCreateContextMenuListener
-android.view.View$OnFocusChangeListener
-android.view.View$OnKeyListener
-android.view.View$OnLongClickListener
-android.view.View$OnTouchListener
-android.view.View$ScrollabilityCache
-android.view.View$UnsetPressedState
-android.view.ViewConfiguration
 android.view.ViewGroup
-android.view.ViewGroup$LayoutParams
-android.view.ViewGroup$MarginLayoutParams
-android.view.ViewGroup$OnHierarchyChangeListener
-android.view.ViewManager
 android.view.ViewParent
 android.view.ViewRoot
-android.view.ViewRoot$1
-android.view.ViewRoot$InputMethodCallback
-android.view.ViewRoot$RunQueue
-android.view.ViewRoot$RunQueue$HandlerAction
-android.view.ViewRoot$TrackballAxis
-android.view.ViewRoot$W
-android.view.ViewTreeObserver
-android.view.ViewTreeObserver$InternalInsetsInfo
-android.view.ViewTreeObserver$OnGlobalFocusChangeListener
-android.view.ViewTreeObserver$OnGlobalLayoutListener
-android.view.ViewTreeObserver$OnPreDrawListener
-android.view.ViewTreeObserver$OnScrollChangedListener
-android.view.ViewTreeObserver$OnTouchModeChangeListener
+android.view.ViewStub
 android.view.Window
-android.view.Window$Callback
-android.view.Window$LocalWindowManager
-android.view.WindowLeaked
-android.view.WindowManager
 android.view.WindowManager$LayoutParams
-android.view.WindowManager$LayoutParams$1
 android.view.WindowManagerImpl
 android.view.accessibility.AccessibilityEvent
 android.view.accessibility.AccessibilityEvent$1
-android.view.accessibility.AccessibilityEventSource
-android.view.accessibility.AccessibilityManager
-android.view.accessibility.AccessibilityManager$1
-android.view.accessibility.AccessibilityManager$MyHandler
-android.view.accessibility.IAccessibilityManager
-android.view.accessibility.IAccessibilityManager$Stub
-android.view.accessibility.IAccessibilityManager$Stub$Proxy
-android.view.accessibility.IAccessibilityManagerClient
-android.view.accessibility.IAccessibilityManagerClient$Stub
-android.view.animation.AccelerateDecelerateInterpolator
-android.view.animation.AccelerateInterpolator
-android.view.animation.AlphaAnimation
 android.view.animation.Animation
-android.view.animation.Animation$AnimationListener
-android.view.animation.Animation$Description
 android.view.animation.AnimationSet
-android.view.animation.AnimationUtils
-android.view.animation.Interpolator
-android.view.animation.LayoutAnimationController
-android.view.animation.ScaleAnimation
-android.view.animation.Transformation
-android.view.animation.TranslateAnimation
 android.view.inputmethod.BaseInputConnection
 android.view.inputmethod.CompletionInfo
-android.view.inputmethod.CompletionInfo$1
-android.view.inputmethod.ComposingText
 android.view.inputmethod.EditorInfo
-android.view.inputmethod.EditorInfo$1
 android.view.inputmethod.ExtractedText
-android.view.inputmethod.ExtractedText$1
-android.view.inputmethod.ExtractedTextRequest
-android.view.inputmethod.ExtractedTextRequest$1
-android.view.inputmethod.InputConnection
-android.view.inputmethod.InputConnectionWrapper
+android.view.inputmethod.InputMethodInfo
 android.view.inputmethod.InputMethodManager
 android.view.inputmethod.InputMethodManager$1
-android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
-android.view.inputmethod.InputMethodManager$H
 android.webkit.BrowserFrame
-android.webkit.ByteArrayBuilder
-android.webkit.ByteArrayBuilder$Chunk
+android.webkit.CacheLoader
 android.webkit.CacheManager
 android.webkit.CallbackProxy
+android.webkit.CallbackProxy$ResultTransport
 android.webkit.CookieManager
 android.webkit.CookieSyncManager
 android.webkit.DataLoader
-android.webkit.FrameLoader
-android.webkit.HttpAuthHandler
+android.webkit.GearsPermissionsManager
 android.webkit.HttpDateTime
 android.webkit.JWebCoreJavaBridge
 android.webkit.LoadListener
-android.webkit.LoadListener$1
 android.webkit.MimeTypeMap
-android.webkit.PerfChecker
-android.webkit.SslErrorHandler
-android.webkit.StreamLoader
 android.webkit.TextDialog
 android.webkit.URLUtil
-android.webkit.WebBackForwardList
-android.webkit.WebHistoryItem
-android.webkit.WebIconDatabase
-android.webkit.WebIconDatabase$EventHandler
-android.webkit.WebIconDatabase$EventHandler$1
+android.webkit.WebIconDatabase$IconListener
 android.webkit.WebSettings
-android.webkit.WebSettings$EventHandler
-android.webkit.WebSettings$EventHandler$1
-android.webkit.WebSettings$LayoutAlgorithm
-android.webkit.WebSettings$RenderPriority
 android.webkit.WebSettings$TextSize
-android.webkit.WebSettings$ZoomDensity
-android.webkit.WebSyncManager
-android.webkit.WebSyncManager$SyncHandler
 android.webkit.WebView
-android.webkit.WebView$1
-android.webkit.WebView$2
-android.webkit.WebView$FocusNode
 android.webkit.WebView$HitTestResult
-android.webkit.WebView$PrivateHandler
 android.webkit.WebViewCore
-android.webkit.WebViewCore$DrawData
-android.webkit.WebViewCore$EventHub
-android.webkit.WebViewCore$EventHub$1
-android.webkit.WebViewCore$FocusData
-android.webkit.WebViewCore$WebCoreThread
-android.webkit.WebViewCore$WebCoreThread$1
 android.webkit.WebViewDatabase
+android.webkit.gears.ApacheHttpRequestAndroid
+android.webkit.gears.ApacheHttpRequestAndroid$Buffer
+android.webkit.gears.NativeDialog
 android.widget.AbsListView
-android.widget.AbsListView$1
-android.widget.AbsListView$2
 android.widget.AbsListView$3
-android.widget.AbsListView$CheckForLongPress
-android.widget.AbsListView$CheckForTap
-android.widget.AbsListView$FlingRunnable
-android.widget.AbsListView$LayoutParams
-android.widget.AbsListView$OnScrollListener
 android.widget.AbsListView$PerformClick
-android.widget.AbsListView$RecycleBin
-android.widget.AbsListView$RecyclerListener
 android.widget.AbsListView$SavedState
-android.widget.AbsListView$SavedState$1
-android.widget.AbsListView$WindowRunnnable
 android.widget.AbsSeekBar
 android.widget.AbsSpinner
-android.widget.AbsSpinner$RecycleBin
 android.widget.AbsSpinner$SavedState
-android.widget.AbsSpinner$SavedState$1
 android.widget.AbsoluteLayout
-android.widget.Adapter
 android.widget.AdapterView
-android.widget.AdapterView$AdapterDataSetObserver
-android.widget.AdapterView$OnItemClickListener
-android.widget.AdapterView$OnItemLongClickListener
-android.widget.AdapterView$OnItemSelectedListener
 android.widget.AnalogClock
 android.widget.AppSecurityPermissions
+android.widget.AppSecurityPermissions$State
 android.widget.ArrayAdapter
 android.widget.AutoCompleteTextView
-android.widget.AutoCompleteTextView$1
-android.widget.AutoCompleteTextView$2
-android.widget.AutoCompleteTextView$DropDownItemClickListener
 android.widget.AutoCompleteTextView$DropDownListView
-android.widget.AutoCompleteTextView$ListSelectorHider
-android.widget.AutoCompleteTextView$MyWatcher
-android.widget.AutoCompleteTextView$PassThroughClickListener
-android.widget.AutoCompleteTextView$PopupTouchIntercepter
-android.widget.AutoCompleteTextView$Validator
 android.widget.BaseAdapter
-android.widget.Button
+android.widget.BaseExpandableListAdapter
 android.widget.CheckBox
-android.widget.Checkable
 android.widget.CheckedTextView
 android.widget.Chronometer
 android.widget.CompoundButton
-android.widget.CompoundButton$OnCheckedChangeListener
 android.widget.CompoundButton$SavedState
-android.widget.CompoundButton$SavedState$1
 android.widget.CursorAdapter
-android.widget.CursorAdapter$ChangeObserver
-android.widget.CursorAdapter$MyDataSetObserver
-android.widget.CursorFilter
-android.widget.CursorFilter$CursorFilterClient
 android.widget.CursorTreeAdapter
 android.widget.DatePicker
 android.widget.EditText
 android.widget.ExpandableListConnector
+android.widget.ExpandableListConnector$GroupMetadata
 android.widget.ExpandableListView
 android.widget.FastScroller
-android.widget.Filter
-android.widget.Filter$FilterListener
-android.widget.Filter$FilterResults
-android.widget.Filter$RequestArguments
-android.widget.Filter$RequestHandler
-android.widget.Filter$ResultsHandler
-android.widget.FilterQueryProvider
-android.widget.Filterable
 android.widget.FrameLayout
-android.widget.FrameLayout$LayoutParams
 android.widget.Gallery
 android.widget.GridView
 android.widget.HeaderViewListAdapter
-android.widget.ImageButton
 android.widget.ImageView
 android.widget.ImageView$ScaleType
 android.widget.LinearLayout
-android.widget.LinearLayout$LayoutParams
-android.widget.ListAdapter
 android.widget.ListView
-android.widget.ListView$ArrowScrollFocusResult
-android.widget.ListView$FixedViewInfo
 android.widget.ListView$SavedState
-android.widget.ListView$SavedState$1
 android.widget.MediaController
 android.widget.MultiAutoCompleteTextView
 android.widget.PopupWindow
-android.widget.PopupWindow$1
 android.widget.PopupWindow$PopupViewContainer
 android.widget.ProgressBar
 android.widget.ProgressBar$SavedState
-android.widget.ProgressBar$SavedState$1
+android.widget.RadioButton
 android.widget.RadioGroup
 android.widget.RatingBar
 android.widget.RelativeLayout
-android.widget.RelativeLayout$DependencyGraph
 android.widget.RelativeLayout$DependencyGraph$Node
-android.widget.RelativeLayout$DependencyGraph$Node$1
-android.widget.RelativeLayout$LayoutParams
 android.widget.RemoteViews
-android.widget.RemoteViews$1
-android.widget.RemoteViews$Action
-android.widget.RemoteViews$ReflectionAction
-android.widget.RemoteViews$SetOnClickPendingIntent
 android.widget.ResourceCursorAdapter
+android.widget.ResourceCursorTreeAdapter
 android.widget.ScrollBarDrawable
 android.widget.ScrollView
-android.widget.Scroller
 android.widget.SeekBar
-android.widget.SeekBar$OnSeekBarChangeListener
+android.widget.SimpleAdapter
 android.widget.SimpleCursorAdapter
+android.widget.SimpleCursorTreeAdapter
 android.widget.SlidingDrawer
 android.widget.Spinner
-android.widget.SpinnerAdapter
+android.widget.Spinner$DropDownAdapter
 android.widget.TabHost
-android.widget.TabHost$1
-android.widget.TabHost$2
-android.widget.TabHost$ContentStrategy
-android.widget.TabHost$IndicatorStrategy
-android.widget.TabHost$IntentContentStrategy
-android.widget.TabHost$LabelAndIconIndicatorStrategy
-android.widget.TabHost$OnTabChangeListener
-android.widget.TabHost$TabSpec
-android.widget.TabHost$ViewIndicatorStrategy
 android.widget.TabWidget
-android.widget.TabWidget$OnTabSelectionChanged
-android.widget.TabWidget$TabClickListener
 android.widget.TableLayout
-android.widget.TableLayout$LayoutParams
-android.widget.TableLayout$PassThroughHierarchyChangeListener
 android.widget.TableRow
-android.widget.TableRow$ChildrenTracker
-android.widget.TableRow$LayoutParams
 android.widget.TextView
-android.widget.TextView$2
-android.widget.TextView$3
-android.widget.TextView$Blink
 android.widget.TextView$BufferType
-android.widget.TextView$ChangeWatcher
-android.widget.TextView$CharWrapper
-android.widget.TextView$Drawables
-android.widget.TextView$InputContentType
-android.widget.TextView$InputMethodState
-android.widget.TextView$OnEditorActionListener
+android.widget.TextView$CommitSelectionReceiver
 android.widget.TextView$SavedState
-android.widget.TextView$SavedState$1
 android.widget.TimePicker
+android.widget.TimePicker$SavedState
 android.widget.Toast
 android.widget.Toast$TN
-android.widget.Toast$TN$1
-android.widget.Toast$TN$2
+android.widget.TwoLineListItem
 android.widget.VideoView
 android.widget.ViewAnimator
 android.widget.ViewSwitcher
-android.widget.WrapperListAdapter
 android.widget.ZoomButton
-android.widget.ZoomButton$1
 android.widget.ZoomButtonsController
-android.widget.ZoomButtonsController$1
-android.widget.ZoomButtonsController$2
-android.widget.ZoomButtonsController$3
-android.widget.ZoomButtonsController$4
-android.widget.ZoomButtonsController$Container
-android.widget.ZoomButtonsController$OnZoomListener
 android.widget.ZoomControls
 com.android.internal.R$drawable
 com.android.internal.R$styleable
 com.android.internal.app.AlertActivity
 com.android.internal.app.AlertController
-com.android.internal.app.AlertController$1
 com.android.internal.app.AlertController$AlertParams
-com.android.internal.app.AlertController$AlertParams$3
-com.android.internal.app.AlertController$ButtonHandler
+com.android.internal.app.AlertController$AlertParams$1
 com.android.internal.app.AlertController$RecycleListView
 com.android.internal.app.ChooserActivity
 com.android.internal.app.ResolverActivity
+com.android.internal.app.ResolverActivity$ResolveListAdapter
 com.android.internal.app.RingtonePickerActivity
-com.android.internal.appwidget.IAppWidgetService
+com.android.internal.appwidget.IAppWidgetHost$Stub
 com.android.internal.appwidget.IAppWidgetService$Stub
-com.android.internal.appwidget.IAppWidgetService$Stub$Proxy
+com.android.internal.database.ArrayListCursor
 com.android.internal.database.SortCursor
+com.android.internal.database.SortCursor$1
 com.android.internal.graphics.NativeUtils
 com.android.internal.location.DummyLocationProvider
 com.android.internal.location.GpsLocationProvider
-com.android.internal.logging.AndroidConfig
 com.android.internal.logging.AndroidHandler
-com.android.internal.logging.AndroidHandler$1
 com.android.internal.os.AndroidPrintStream
 com.android.internal.os.BinderInternal
 com.android.internal.os.BinderInternal$GcWatcher
 com.android.internal.os.LoggingPrintStream
-com.android.internal.os.LoggingPrintStream$1
 com.android.internal.os.RuntimeInit
 com.android.internal.os.RuntimeInit$1
-com.android.internal.os.RuntimeInit$UncaughtHandler
 com.android.internal.os.ZygoteConnection
 com.android.internal.os.ZygoteConnection$Arguments
 com.android.internal.os.ZygoteInit
-com.android.internal.os.ZygoteInit$MethodAndArgsCaller
-com.android.internal.policy.IPolicy
 com.android.internal.policy.PolicyManager
 com.android.internal.policy.impl.PhoneLayoutInflater
 com.android.internal.policy.impl.PhoneWindow
-com.android.internal.policy.impl.PhoneWindow$1
-com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback
 com.android.internal.policy.impl.PhoneWindow$DecorView
-com.android.internal.policy.impl.PhoneWindow$DrawableFeatureState
-com.android.internal.policy.impl.PhoneWindow$PanelFeatureState
 com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState
-com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState$1
 com.android.internal.policy.impl.PhoneWindowManager
 com.android.internal.policy.impl.Policy
-com.android.internal.telephony.BaseCommands
-com.android.internal.telephony.Connection$DisconnectCause
 com.android.internal.telephony.GsmAlphabet
-com.android.internal.telephony.IPhoneStateListener
 com.android.internal.telephony.IPhoneStateListener$Stub
-com.android.internal.telephony.IPhoneSubInfo
 com.android.internal.telephony.IPhoneSubInfo$Stub
-com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy
-com.android.internal.telephony.ITelephony
 com.android.internal.telephony.ITelephony$Stub
 com.android.internal.telephony.ITelephony$Stub$Proxy
-com.android.internal.telephony.ITelephonyRegistry
 com.android.internal.telephony.ITelephonyRegistry$Stub
-com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
-com.android.internal.telephony.IccCardApplication$PersoSubState
-com.android.internal.telephony.IccProvider
+com.android.internal.telephony.IccCard$State
 com.android.internal.telephony.Phone$State
-com.android.internal.telephony.PhoneBase
-com.android.internal.telephony.PhoneProxy
 com.android.internal.telephony.PhoneStateIntentReceiver
-com.android.internal.telephony.RIL
 com.android.internal.telephony.SmsMessageBase
-com.android.internal.telephony.gsm.GSMPhone
-com.android.internal.telephony.gsm.GsmDataConnectionTracker
-com.android.internal.telephony.gsm.GsmMmiCode
-com.android.internal.telephony.gsm.MccTable
+com.android.internal.telephony.gsm.GsmSmsAddress
 com.android.internal.telephony.gsm.SmsMessage
-com.android.internal.telephony.gsm.stk.CommandDetails
-com.android.internal.telephony.gsm.stk.ResultCode
+com.android.internal.telephony.gsm.SmsMessage$SubmitPdu
 com.android.internal.util.ArrayUtils
 com.android.internal.util.FastXmlSerializer
-com.android.internal.util.XmlUtils
 com.android.internal.view.IInputConnectionWrapper
-com.android.internal.view.IInputConnectionWrapper$MyHandler
-com.android.internal.view.IInputConnectionWrapper$SomeArgs
-com.android.internal.view.IInputContext
 com.android.internal.view.IInputContext$Stub
-com.android.internal.view.IInputContextCallback
-com.android.internal.view.IInputContextCallback$Stub
-com.android.internal.view.IInputContextCallback$Stub$Proxy
-com.android.internal.view.IInputMethodCallback
-com.android.internal.view.IInputMethodCallback$Stub
-com.android.internal.view.IInputMethodClient
-com.android.internal.view.IInputMethodClient$Stub
-com.android.internal.view.IInputMethodManager
+com.android.internal.view.IInputMethod$Stub
 com.android.internal.view.IInputMethodManager$Stub
-com.android.internal.view.IInputMethodManager$Stub$Proxy
-com.android.internal.view.IInputMethodSession
-com.android.internal.view.IInputMethodSession$Stub
-com.android.internal.view.IInputMethodSession$Stub$Proxy
-com.android.internal.view.InputBindResult
-com.android.internal.view.InputBindResult$1
+com.android.internal.view.InputConnectionWrapper$InputContextCallback
 com.android.internal.view.menu.ExpandedMenuView
 com.android.internal.view.menu.IconMenuItemView
 com.android.internal.view.menu.IconMenuView
-com.android.internal.view.menu.IconMenuView$1
-com.android.internal.view.menu.IconMenuView$LayoutParams
 com.android.internal.view.menu.IconMenuView$SavedState
-com.android.internal.view.menu.IconMenuView$SavedState$1
 com.android.internal.view.menu.ListMenuItemView
 com.android.internal.view.menu.MenuBuilder
-com.android.internal.view.menu.MenuBuilder$Callback
-com.android.internal.view.menu.MenuBuilder$ItemInvoker
-com.android.internal.view.menu.MenuBuilder$MenuAdapter
-com.android.internal.view.menu.MenuBuilder$MenuType
 com.android.internal.view.menu.MenuItemImpl
-com.android.internal.view.menu.MenuView
-com.android.internal.view.menu.MenuView$ItemView
 com.android.internal.view.menu.SubMenuBuilder
-com.android.internal.widget.DialogTitle
-com.android.internal.widget.EditableInputConnection
 com.android.internal.widget.LockPatternUtils
 com.android.internal.widget.NumberPicker
-com.google.android.collect.Lists
-com.google.android.collect.Maps
-com.google.android.collect.Sets
+com.android.internal.widget.NumberPickerButton
+com.android.internal.widget.Smileys
 com.google.android.gdata.client.AndroidGDataClient
+com.google.android.gdata.client.AndroidXmlParserFactory
 com.google.android.gles_jni.EGLImpl
 com.google.android.gles_jni.GLImpl
 com.google.android.mms.pdu.PduPersister
 com.google.android.mms.util.PduCache
 com.google.android.net.GoogleHttpClient
-com.google.android.net.GoogleHttpClient$WrappedLayeredSocketFactory
-com.google.android.net.GoogleHttpClient$WrappedSocketFactory
 com.google.android.net.NetworkStatsEntity
-com.google.android.net.SSLClientSessionCacheFactory
 com.google.android.net.UrlRules
 com.google.android.net.UrlRules$Rule
-com.google.common.Clock
 com.google.common.Config
-com.google.common.GenericClock
-com.google.common.I18n
 com.google.common.Log
-com.google.common.StaticUtil
-com.google.common.android.AndroidClock
 com.google.common.android.AndroidConfig
-com.google.common.android.AndroidConfig$1
-com.google.common.graphics.FontFactory
-com.google.common.graphics.ImageFactory
-com.google.common.graphics.InterpolatedFontFactory
-com.google.common.graphics.android.AndroidFontFactory
-com.google.common.graphics.android.AndroidImageFactory
-com.google.common.io.BaseConnectionFactory
+com.google.common.async.AsyncHttpRequestFactory$AsyncHttpRequestImpl
+com.google.common.graphics.android.AndroidGraphics
 com.google.common.io.BaseHttpConnectionFactory
-com.google.common.io.BasePersistentStore
-com.google.common.io.BaseTcpConnectionFactory
-com.google.common.io.ConnectionFactory
-com.google.common.io.GoogleHttpConnection
-com.google.common.io.Gunzipper
-com.google.common.io.Gunzipper$GunzipInterface
-com.google.common.io.HttpConnectionFactory
-com.google.common.io.InMemoryPersistentStore
-com.google.common.io.PersistentStore
-com.google.common.io.PersistentStore$PersistentStoreException
-com.google.common.io.PreferenceStore
-com.google.common.io.TcpConnectionFactory
-com.google.common.io.android.AndroidFixedPersistentStore
+com.google.common.io.IoUtil
 com.google.common.io.android.AndroidHttpClient
-com.google.common.io.android.AndroidHttpClient$1
-com.google.common.io.android.AndroidHttpClient$2
-com.google.common.io.android.AndroidHttpClient$CurlLogger
-com.google.common.io.android.AndroidHttpClient$LoggingConfiguration
 com.google.common.io.android.AndroidHttpConnectionFactory
-com.google.common.io.android.AndroidHttpConnectionFactory$1
-com.google.common.io.android.AndroidHttpConnectionFactory$AndroidGoogleHttpConnection
 com.google.common.io.android.AndroidPersistentStore
-com.google.common.io.android.AndroidTcpConnectionFactory
-com.google.common.io.android.CountingByteChannel$Counter
-com.google.common.io.android.GoogleHttpClient
-com.google.common.io.android.J2SeTcpConnectionFactory
 com.google.common.io.protocol.ProtoBuf
 com.google.common.io.protocol.ProtoBufType
 com.google.common.util.text.TextUtil
-com.google.debug.DebugUtil
+com.google.masf.BlockingByteQueue
 com.google.masf.MobileServiceMux
+com.google.masf.protocol.PlainRequest
+com.google.masf.services.EventLogService
 com.google.masf.services.LogserviceMessageTypes
 com.google.masf.services.resume.WindowResumeService
 com.google.wireless.gdata.calendar.client.CalendarClient
+com.google.wireless.gdata.client.GDataServiceClient
 com.google.wireless.gdata.contacts.client.ContactsClient
+com.google.wireless.gdata.contacts.parser.xml.XmlContactsGDataParserFactory
 com.ibm.icu4jni.charset.CharsetDecoderICU
 com.ibm.icu4jni.charset.CharsetEncoderICU
 com.ibm.icu4jni.charset.CharsetICU
@@ -1339,23 +807,14 @@
 com.ibm.icu4jni.common.ErrorCode
 com.ibm.icu4jni.lang.UCharacter
 com.ibm.icu4jni.regex.NativeRegEx
-com.ibm.icu4jni.text.CollationAttribute
-com.ibm.icu4jni.text.Collator
 com.ibm.icu4jni.text.DecimalFormat
-com.ibm.icu4jni.text.DecimalFormatSymbols
-com.ibm.icu4jni.text.DecimalFormatSymbols$1
 com.ibm.icu4jni.text.NativeBreakIterator
 com.ibm.icu4jni.text.NativeCollation
 com.ibm.icu4jni.text.NativeDecimalFormat
 com.ibm.icu4jni.text.NativeDecimalFormat$UNumberFormatAttribute
 com.ibm.icu4jni.text.NativeDecimalFormat$UNumberFormatSymbol
-com.ibm.icu4jni.text.RuleBasedCollator
 com.ibm.icu4jni.text.RuleBasedNumberFormat
 com.ibm.icu4jni.util.Resources
-com.ibm.icu4jni.util.Resources$ISO4Currencies
-com.ibm.icu4jni.util.Resources$ISO4CurrenciesToDigits
-com.ibm.icu4jni.util.Resources$Locale
-dalvik.system.DexFile
 dalvik.system.NativeStart
 dalvik.system.PathClassLoader
 dalvik.system.TouchDex
@@ -1364,53 +823,39 @@
 dalvik.system.VMStack
 dalvik.system.Zygote
 java.beans.PropertyChangeEvent
-java.beans.PropertyChangeListener
 java.beans.PropertyChangeSupport
 java.io.BufferedInputStream
-java.io.BufferedOutputStream
 java.io.BufferedReader
-java.io.ByteArrayInputStream
-java.io.ByteArrayOutputStream
 java.io.Closeable
 java.io.DataInput
-java.io.DataInputStream
 java.io.DataOutput
 java.io.DataOutputStream
-java.io.Externalizable
+java.io.EmulatedFieldsForDumping
+java.io.EmulatedFieldsForLoading
 java.io.File
 java.io.FileDescriptor
 java.io.FileInputStream
 java.io.FileInputStream$RepositioningLock
-java.io.FileNotFoundException
 java.io.FileOutputStream
-java.io.FilterInputStream
 java.io.FilterOutputStream
 java.io.Flushable
-java.io.IOException
 java.io.InputStream
 java.io.InputStreamReader
-java.io.InterruptedIOException
 java.io.ObjectInput
 java.io.ObjectInputStream
 java.io.ObjectOutput
 java.io.ObjectOutputStream
 java.io.ObjectStreamClass
 java.io.ObjectStreamConstants
-java.io.ObjectStreamException
 java.io.ObjectStreamField
-java.io.ObjectStreamField$1
 java.io.OutputStream
 java.io.PrintStream
 java.io.PrintWriter
+java.io.PushbackReader
 java.io.RandomAccessFile
-java.io.RandomAccessFile$RepositionLock
 java.io.Reader
 java.io.Serializable
-java.io.StreamCorruptedException
-java.io.StringReader
 java.io.StringWriter
-java.io.UnsupportedEncodingException
-java.io.Writer
 java.lang.AbstractStringBuilder
 java.lang.Appendable
 java.lang.ArrayIndexOutOfBoundsException
@@ -1423,23 +868,16 @@
 java.lang.Class
 java.lang.ClassCache
 java.lang.ClassCache$EnumComparator
-java.lang.ClassCastException
 java.lang.ClassLoader
 java.lang.ClassLoader$SystemClassLoader
-java.lang.ClassNotFoundException
-java.lang.CloneNotSupportedException
 java.lang.Cloneable
 java.lang.Comparable
 java.lang.Double
 java.lang.Enum
 java.lang.Error
 java.lang.Exception
-java.lang.ExceptionInInitializerError
 java.lang.Float
 java.lang.IllegalArgumentException
-java.lang.IllegalStateException
-java.lang.IncompatibleClassChangeError
-java.lang.IndexOutOfBoundsException
 java.lang.Integer
 java.lang.Integer$valueOfCache
 java.lang.InternalError
@@ -1451,9 +889,6 @@
 java.lang.Long$valueOfCache
 java.lang.Math
 java.lang.NoClassDefFoundError
-java.lang.NoSuchFieldException
-java.lang.NoSuchMethodException
-java.lang.NullPointerException
 java.lang.Number
 java.lang.NumberFormatException
 java.lang.Object
@@ -1481,8 +916,6 @@
 java.lang.ThreadGroup
 java.lang.ThreadGroup$ChildrenGroupsLock
 java.lang.ThreadGroup$ChildrenThreadsLock
-java.lang.ThreadLocal
-java.lang.ThreadLocal$Values
 java.lang.Throwable
 java.lang.UnsatisfiedLinkError
 java.lang.UnsupportedOperationException
@@ -1510,45 +943,26 @@
 java.lang.reflect.Type
 java.math.BigDecimal
 java.math.BigInt
-java.math.BigInt$Context
 java.math.BigInteger
 java.math.Multiplication
-java.net.ContentHandler
 java.net.DatagramPacket
 java.net.HttpURLConnection
 java.net.Inet4Address
-java.net.Inet6Address
 java.net.InetAddress
-java.net.InetAddress$Cache
-java.net.InetAddress$CacheElement
 java.net.InetAddress$WaitReachable
 java.net.InetSocketAddress
 java.net.JarURLConnection
-java.net.NegativeCache
-java.net.NetPermission
 java.net.NetworkInterface
 java.net.Proxy
-java.net.Proxy$Type
 java.net.ProxySelector
 java.net.ProxySelectorImpl
-java.net.ProxySelectorImpl$1
-java.net.ResponseCache
 java.net.ServerSocket
 java.net.Socket
-java.net.Socket$ConnectLock
-java.net.SocketAddress
 java.net.SocketImpl
 java.net.SocketOptions
-java.net.SocketTimeoutException
 java.net.URI
-java.net.URI$Helper
-java.net.URIEncoderDecoder
-java.net.URISyntaxException
 java.net.URL
 java.net.URLConnection
-java.net.URLConnection$DefaultContentHandler
-java.net.URLEncoder
-java.net.URLStreamHandler
 java.nio.BaseByteBuffer
 java.nio.Buffer
 java.nio.BufferFactory
@@ -1557,13 +971,18 @@
 java.nio.CharArrayBuffer
 java.nio.CharBuffer
 java.nio.CharSequenceAdapter
+java.nio.CharToByteBufferAdapter
 java.nio.DirectByteBuffer
+java.nio.FloatBuffer
+java.nio.FloatToByteBufferAdapter
 java.nio.HeapByteBuffer
 java.nio.IntToByteBufferAdapter
 java.nio.NIOAccess
 java.nio.ReadWriteCharArrayBuffer
 java.nio.ReadWriteDirectByteBuffer
 java.nio.ReadWriteHeapByteBuffer
+java.nio.ReadWriteIntArrayBuffer
+java.nio.ShortToByteBufferAdapter
 java.nio.channels.ByteChannel
 java.nio.channels.Channel
 java.nio.channels.FileChannel
@@ -1581,248 +1000,127 @@
 java.nio.charset.CoderResult
 java.nio.charset.CodingErrorAction
 java.nio.charset.spi.CharsetProvider
-java.security.AccessControlContext
 java.security.AccessController
 java.security.BasicPermission
-java.security.GeneralSecurityException
 java.security.Guard
-java.security.Key
-java.security.KeyFactory
-java.security.KeyFactorySpi
 java.security.KeyStore
-java.security.KeyStore$1
-java.security.KeyStoreSpi
 java.security.MessageDigest
-java.security.MessageDigestSpi
 java.security.Permission
-java.security.Principal
 java.security.PrivilegedAction
 java.security.PrivilegedExceptionAction
-java.security.ProtectionDomain
 java.security.Provider
-java.security.Provider$Service
-java.security.Provider$Service$1
-java.security.PublicKey
 java.security.SecureRandom
-java.security.SecureRandomSpi
 java.security.Security
-java.security.Security$1
-java.security.Security$SecurityDoor
-java.security.cert.CertPath
-java.security.cert.CertPathParameters
-java.security.cert.CertPathValidator
-java.security.cert.CertPathValidatorResult
-java.security.cert.CertPathValidatorSpi
-java.security.cert.CertSelector
-java.security.cert.Certificate
-java.security.cert.CertificateFactory
-java.security.cert.CertificateFactorySpi
-java.security.cert.PKIXCertPathValidatorResult
+java.security.cert.CertificateParsingException
 java.security.cert.PKIXParameters
-java.security.cert.PolicyNode
-java.security.cert.TrustAnchor
 java.security.cert.X509CertSelector
 java.security.cert.X509Certificate
-java.security.cert.X509Extension
-java.security.interfaces.RSAKey
-java.security.interfaces.RSAPublicKey
-java.security.spec.EncodedKeySpec
-java.security.spec.KeySpec
-java.security.spec.X509EncodedKeySpec
-java.text.AttributedCharacterIterator$Attribute
 java.text.Collator
 java.text.DateFormat
 java.text.DateFormat$Field
-java.text.DateFormatSymbols
 java.text.DecimalFormat
-java.text.DecimalFormat$2
 java.text.DecimalFormatSymbols
-java.text.FieldPosition
 java.text.Format
-java.text.Format$1
-java.text.Format$Field
 java.text.NumberFormat
-java.text.RuleBasedCollator
 java.text.SimpleDateFormat
 java.util.AbstractCollection
 java.util.AbstractList
-java.util.AbstractList$FullListIterator
-java.util.AbstractList$SimpleListIterator
 java.util.AbstractMap
-java.util.AbstractQueue
-java.util.AbstractSequentialList
 java.util.AbstractSet
 java.util.ArrayList
 java.util.Arrays
-java.util.Arrays$ArrayList
+java.util.BitSet
 java.util.Calendar
 java.util.Collection
 java.util.Collections
 java.util.Collections$EmptyList
 java.util.Collections$EmptyMap
 java.util.Collections$EmptySet
-java.util.Collections$SynchronizedCollection
-java.util.Collections$SynchronizedSet
+java.util.Collections$SynchronizedList
+java.util.Collections$SynchronizedRandomAccessList
 java.util.Collections$UnmodifiableCollection
 java.util.Collections$UnmodifiableCollection$1
 java.util.Collections$UnmodifiableList
-java.util.Collections$UnmodifiableMap
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$1
 java.util.Collections$UnmodifiableRandomAccessList
 java.util.Collections$UnmodifiableSet
-java.util.ComparableTimSort
 java.util.Comparator
-java.util.Currency
 java.util.Date
 java.util.Dictionary
 java.util.EnumMap
 java.util.EnumSet
 java.util.Enumeration
-java.util.EventListener
-java.util.EventObject
-java.util.Formattable
 java.util.Formatter
-java.util.Formatter$FloatUtil
-java.util.Formatter$FormatToken
-java.util.Formatter$ParserStateMachine
-java.util.Formatter$Transformer
 java.util.GregorianCalendar
 java.util.HashMap
 java.util.HashMap$1
 java.util.HashMap$1$1
-java.util.HashMap$2
-java.util.HashMap$2$1
 java.util.HashMap$Entry
-java.util.HashMap$HashMapEntrySet
-java.util.HashMap$HashMapEntrySet$1
 java.util.HashMap$HashMapIterator
 java.util.HashSet
 java.util.Hashtable
 java.util.Hashtable$1
-java.util.Hashtable$2
-java.util.Hashtable$2$1
-java.util.Hashtable$4
-java.util.Hashtable$4$1
 java.util.Hashtable$Entry
-java.util.Hashtable$HashEnumerator
-java.util.Hashtable$HashIterator
 java.util.IdentityHashMap
 java.util.Iterator
-java.util.LinkedHashMap
-java.util.LinkedHashMap$1
-java.util.LinkedHashMap$1$1
-java.util.LinkedHashMap$LinkedHashIterator
-java.util.LinkedHashMap$LinkedHashMapEntry
-java.util.LinkedHashMap$LinkedHashMapEntrySet
-java.util.LinkedHashMap$LinkedHashMapEntrySet$1
 java.util.LinkedList
-java.util.LinkedList$Link
-java.util.LinkedList$LinkIterator
 java.util.List
-java.util.ListIterator
-java.util.ListResourceBundle
 java.util.Locale
-java.util.Locale$1
 java.util.Map
 java.util.Map$Entry
 java.util.MapEntry
 java.util.MapEntry$Type
-java.util.Observable
-java.util.Observer
 java.util.PriorityQueue
 java.util.Properties
 java.util.PropertyPermission
-java.util.PropertyResourceBundle
-java.util.Queue
-java.util.Random
 java.util.RandomAccess
 java.util.ResourceBundle
-java.util.ResourceBundle$1
-java.util.ResourceBundle$MissingBundle
 java.util.Scanner
 java.util.Set
 java.util.SimpleTimeZone
 java.util.SortedMap
 java.util.SortedSet
+java.util.SpecialAccess
 java.util.Stack
 java.util.StringTokenizer
-java.util.TimSort
 java.util.TimeZone
 java.util.Timer
 java.util.TreeMap
-java.util.TreeMap$2
-java.util.TreeMap$AbstractMapIterator
-java.util.TreeMap$Entry
-java.util.TreeMap$UnboundedKeyIterator
 java.util.TreeSet
 java.util.Vector
+java.util.Vector$1
 java.util.WeakHashMap
-java.util.WeakHashMap$1
-java.util.WeakHashMap$1$1
-java.util.WeakHashMap$2
-java.util.WeakHashMap$2$1
 java.util.WeakHashMap$Entry
-java.util.WeakHashMap$Entry$Type
-java.util.WeakHashMap$HashIterator
 java.util.concurrent.AbstractExecutorService
-java.util.concurrent.BlockingQueue
-java.util.concurrent.Callable
+java.util.concurrent.ArrayBlockingQueue
 java.util.concurrent.ConcurrentHashMap
+java.util.concurrent.ConcurrentHashMap$Segment
 java.util.concurrent.CopyOnWriteArrayList
-java.util.concurrent.CopyOnWriteArrayList$ListIteratorImpl
-java.util.concurrent.Executor
-java.util.concurrent.ExecutorService
-java.util.concurrent.Executors
-java.util.concurrent.Executors$DefaultThreadFactory
-java.util.concurrent.Future
-java.util.concurrent.FutureTask
-java.util.concurrent.FutureTask$Sync
+java.util.concurrent.DelayQueue
+java.util.concurrent.Executors$DelegatedExecutorService
+java.util.concurrent.Executors$DelegatedScheduledExecutorService
 java.util.concurrent.LinkedBlockingQueue
-java.util.concurrent.LinkedBlockingQueue$Node
-java.util.concurrent.RejectedExecutionHandler
 java.util.concurrent.ScheduledThreadPoolExecutor
+java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
+java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
+java.util.concurrent.Semaphore
 java.util.concurrent.SynchronousQueue
-java.util.concurrent.ThreadFactory
+java.util.concurrent.SynchronousQueue$Node
 java.util.concurrent.ThreadPoolExecutor
-java.util.concurrent.ThreadPoolExecutor$AbortPolicy
-java.util.concurrent.ThreadPoolExecutor$Worker
 java.util.concurrent.TimeUnit
 java.util.concurrent.atomic.AtomicInteger
 java.util.concurrent.atomic.AtomicLong
+java.util.concurrent.atomic.AtomicReference
 java.util.concurrent.atomic.UnsafeAccess
 java.util.concurrent.locks.AbstractQueuedSynchronizer
-java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
-java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
-java.util.concurrent.locks.Condition
-java.util.concurrent.locks.Lock
-java.util.concurrent.locks.LockSupport
 java.util.concurrent.locks.ReentrantLock
-java.util.concurrent.locks.ReentrantLock$FairSync
-java.util.concurrent.locks.ReentrantLock$NonfairSync
 java.util.concurrent.locks.ReentrantLock$Sync
-java.util.concurrent.locks.UnsafeAccess
-java.util.jar.Attributes
 java.util.jar.Attributes$Name
-java.util.jar.InitManifest
-java.util.jar.JarEntry
 java.util.jar.JarFile
-java.util.jar.JarFile$1JarFileEnumerator
-java.util.jar.JarFile$JarFileInputStream
-java.util.jar.JarVerifier
 java.util.jar.Manifest
-java.util.logging.ErrorManager
-java.util.logging.Formatter
-java.util.logging.Handler
 java.util.logging.Level
 java.util.logging.LogManager
-java.util.logging.LogManager$1
-java.util.logging.LogManager$2
-java.util.logging.LogManager$2$1
-java.util.logging.LogManager$3
 java.util.logging.LogRecord
 java.util.logging.Logger
-java.util.logging.LoggingPermission
 java.util.regex.MatchResult
 java.util.regex.Matcher
 java.util.regex.Pattern
@@ -1831,102 +1129,47 @@
 java.util.zip.Checksum
 java.util.zip.Deflater
 java.util.zip.DeflaterOutputStream
-java.util.zip.GZIPInputStream
-java.util.zip.GZIPOutputStream
 java.util.zip.Inflater
-java.util.zip.InflaterInputStream
-java.util.zip.ZipConstants
-java.util.zip.ZipEntry
-java.util.zip.ZipEntry$LittleEndianReader
 java.util.zip.ZipFile
-java.util.zip.ZipFile$2
-java.util.zip.ZipFile$RAFStream
+javax.crypto.Cipher
+javax.crypto.spec.SecretKeySpec
 javax.microedition.khronos.egl.EGL
 javax.microedition.khronos.egl.EGL10
+javax.microedition.khronos.egl.EGLContext
 javax.microedition.khronos.opengles.GL
 javax.microedition.khronos.opengles.GL10
 javax.microedition.khronos.opengles.GL10Ext
 javax.microedition.khronos.opengles.GL11
 javax.microedition.khronos.opengles.GL11Ext
 javax.microedition.khronos.opengles.GL11ExtensionPack
-javax.net.SocketFactory
 javax.net.ssl.DefaultHostnameVerifier
-javax.net.ssl.HostnameVerifier
 javax.net.ssl.HttpsURLConnection
-javax.net.ssl.KeyManager
-javax.net.ssl.KeyManagerFactory
-javax.net.ssl.KeyManagerFactory$1
-javax.net.ssl.KeyManagerFactorySpi
-javax.net.ssl.SSLContextSpi
+javax.net.ssl.SSLContext
+javax.net.ssl.SSLHandshakeException
 javax.net.ssl.SSLServerSocket
 javax.net.ssl.SSLSession
-javax.net.ssl.SSLSessionContext
 javax.net.ssl.SSLSocket
-javax.net.ssl.SSLSocketFactory
-javax.net.ssl.SSLSocketFactory$1
-javax.net.ssl.TrustManager
-javax.net.ssl.TrustManagerFactory
-javax.net.ssl.TrustManagerFactory$1
-javax.net.ssl.TrustManagerFactorySpi
-javax.net.ssl.X509ExtendedKeyManager
-javax.net.ssl.X509KeyManager
-javax.net.ssl.X509TrustManager
-javax.security.auth.x500.X500Principal
-javax.security.cert.Certificate
 javax.security.cert.X509Certificate
-javax.security.cert.X509Certificate$1
-javax.security.cert.X509Certificate$2
-javax.xml.parsers.DocumentBuilder
-javax.xml.parsers.DocumentBuilderFactory
 junit.framework.Assert
-org.apache.commons.codec.BinaryDecoder
-org.apache.commons.codec.BinaryEncoder
-org.apache.commons.codec.Decoder
-org.apache.commons.codec.Encoder
 org.apache.commons.codec.binary.Base64
 org.apache.commons.codec.binary.Hex
-org.apache.commons.logging.Log
 org.apache.commons.logging.LogFactory
 org.apache.commons.logging.impl.Jdk14Logger
-org.apache.commons.logging.impl.WeakHashtable
-org.apache.harmony.archive.util.Util
 org.apache.harmony.dalvik.NativeTestTarget
-org.apache.harmony.dalvik.ddmc.Chunk
 org.apache.harmony.dalvik.ddmc.ChunkHandler
 org.apache.harmony.dalvik.ddmc.DdmServer
 org.apache.harmony.kernel.vm.LangAccess
 org.apache.harmony.kernel.vm.ReflectionAccess
 org.apache.harmony.lang.annotation.AnnotationFactory
 org.apache.harmony.lang.annotation.AnnotationMember
-org.apache.harmony.luni.internal.net.www.protocol.file.FileURLConnection
-org.apache.harmony.luni.internal.net.www.protocol.file.Handler
-org.apache.harmony.luni.internal.net.www.protocol.http.Handler
-org.apache.harmony.luni.internal.net.www.protocol.http.Header
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConfiguration
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager$ConnectionPool
+org.apache.harmony.lang.annotation.AnnotationMember$DefaultValues
 org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection$1
-org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection$LimitedInputStream
 org.apache.harmony.luni.internal.net.www.protocol.https.Handler
 org.apache.harmony.luni.internal.net.www.protocol.jar.Handler
 org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnection
-org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnection$1
-org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnection$CacheEntry
-org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnection$JarURLConnectionInputStream
-org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnection$LRUComparator
-org.apache.harmony.luni.internal.util.TimezoneGetter
-org.apache.harmony.luni.internal.util.ZoneInfo
 org.apache.harmony.luni.internal.util.ZoneInfoDB
 org.apache.harmony.luni.net.GenericIPMreq
-org.apache.harmony.luni.net.NetUtil
-org.apache.harmony.luni.net.NetUtil$Action
 org.apache.harmony.luni.net.PlainSocketImpl
-org.apache.harmony.luni.net.PlainSocketImpl2
-org.apache.harmony.luni.net.SocketImplProvider
-org.apache.harmony.luni.net.SocketInputStream
-org.apache.harmony.luni.net.SocketOutputStream
 org.apache.harmony.luni.platform.AdapterManager
 org.apache.harmony.luni.platform.Endianness
 org.apache.harmony.luni.platform.IAdaptable
@@ -1944,19 +1187,9 @@
 org.apache.harmony.luni.platform.Platform
 org.apache.harmony.luni.platform.PlatformAddress
 org.apache.harmony.luni.platform.PlatformAddressFactory
-org.apache.harmony.luni.util.Base64
 org.apache.harmony.luni.util.FloatingPointParser
-org.apache.harmony.luni.util.FloatingPointParser$StringExponentPair
-org.apache.harmony.luni.util.Inet6Util
-org.apache.harmony.luni.util.MsgHelp
-org.apache.harmony.luni.util.MsgHelp$1
 org.apache.harmony.luni.util.NumberConverter
 org.apache.harmony.luni.util.PriviAction
-org.apache.harmony.luni.util.TwoKeyHashMap
-org.apache.harmony.luni.util.TwoKeyHashMap$Entry
-org.apache.harmony.luni.util.TwoKeyHashMap$EntryIteratorImpl
-org.apache.harmony.luni.util.TwoKeyHashMap$ValueIteratorImpl
-org.apache.harmony.luni.util.TwoKeyHashMap$ValuesCollectionImpl
 org.apache.harmony.luni.util.Util
 org.apache.harmony.nio.AddressUtil
 org.apache.harmony.nio.FileChannelFactory
@@ -1966,508 +1199,160 @@
 org.apache.harmony.nio.internal.LockManager
 org.apache.harmony.nio.internal.LockManager$1
 org.apache.harmony.nio.internal.WriteOnlyFileChannel
-org.apache.harmony.security.asn1.ASN1Any
-org.apache.harmony.security.asn1.ASN1BitString
-org.apache.harmony.security.asn1.ASN1BitString$ASN1NamedBitList
-org.apache.harmony.security.asn1.ASN1Boolean
-org.apache.harmony.security.asn1.ASN1Choice
-org.apache.harmony.security.asn1.ASN1Constants
-org.apache.harmony.security.asn1.ASN1Constructured
-org.apache.harmony.security.asn1.ASN1Explicit
 org.apache.harmony.security.asn1.ASN1GeneralizedTime
-org.apache.harmony.security.asn1.ASN1Implicit
 org.apache.harmony.security.asn1.ASN1Integer
-org.apache.harmony.security.asn1.ASN1OctetString
 org.apache.harmony.security.asn1.ASN1Oid
-org.apache.harmony.security.asn1.ASN1Oid$1
-org.apache.harmony.security.asn1.ASN1Primitive
 org.apache.harmony.security.asn1.ASN1Sequence
-org.apache.harmony.security.asn1.ASN1SequenceOf
-org.apache.harmony.security.asn1.ASN1SetOf
 org.apache.harmony.security.asn1.ASN1StringType
-org.apache.harmony.security.asn1.ASN1StringType$1
-org.apache.harmony.security.asn1.ASN1StringType$2
-org.apache.harmony.security.asn1.ASN1StringType$3
-org.apache.harmony.security.asn1.ASN1StringType$4
-org.apache.harmony.security.asn1.ASN1StringType$5
-org.apache.harmony.security.asn1.ASN1StringType$6
-org.apache.harmony.security.asn1.ASN1StringType$7
-org.apache.harmony.security.asn1.ASN1Time
-org.apache.harmony.security.asn1.ASN1Type
-org.apache.harmony.security.asn1.ASN1TypeCollection
-org.apache.harmony.security.asn1.ASN1UTCTime
-org.apache.harmony.security.asn1.ASN1ValueCollection
-org.apache.harmony.security.asn1.BerInputStream
-org.apache.harmony.security.asn1.BerOutputStream
-org.apache.harmony.security.asn1.BitString
 org.apache.harmony.security.asn1.DerInputStream
 org.apache.harmony.security.asn1.DerOutputStream
-org.apache.harmony.security.asn1.ObjectIdentifier
-org.apache.harmony.security.fortress.Engine
-org.apache.harmony.security.fortress.SecurityAccess
-org.apache.harmony.security.fortress.SecurityUtils
 org.apache.harmony.security.fortress.Services
-org.apache.harmony.security.fortress.Services$1
-org.apache.harmony.security.internal.nls.Messages
 org.apache.harmony.security.pkcs7.ContentInfo
-org.apache.harmony.security.pkcs7.ContentInfo$1
-org.apache.harmony.security.provider.cert.Cache
 org.apache.harmony.security.provider.cert.DRLCertFactory
-org.apache.harmony.security.provider.cert.DRLCertFactory$1
 org.apache.harmony.security.provider.cert.X509CertFactoryImpl
 org.apache.harmony.security.provider.cert.X509CertImpl
 org.apache.harmony.security.provider.cert.X509CertPathImpl
-org.apache.harmony.security.provider.cert.X509CertPathImpl$1
-org.apache.harmony.security.provider.cert.X509CertPathImpl$2
-org.apache.harmony.security.provider.cert.X509CertPathImpl$3
-org.apache.harmony.security.provider.crypto.CryptoProvider
-org.apache.harmony.security.provider.crypto.CryptoProvider$1
 org.apache.harmony.security.provider.crypto.RandomBitsSupplier
-org.apache.harmony.security.provider.crypto.RandomBitsSupplier$1
-org.apache.harmony.security.provider.crypto.SHA1Impl
 org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl
-org.apache.harmony.security.provider.crypto.SHA1_Data
+org.apache.harmony.security.provider.crypto.SHA1_MessageDigestImpl
 org.apache.harmony.security.utils.AlgNameMapper
-org.apache.harmony.security.utils.ObjectIdentifier
 org.apache.harmony.security.x501.AttributeTypeAndValue
-org.apache.harmony.security.x501.AttributeTypeAndValue$1
-org.apache.harmony.security.x501.AttributeTypeAndValue$2
-org.apache.harmony.security.x501.AttributeTypeAndValueComparator
-org.apache.harmony.security.x501.AttributeValue
 org.apache.harmony.security.x501.DirectoryString
-org.apache.harmony.security.x501.DirectoryString$1
 org.apache.harmony.security.x501.Name
-org.apache.harmony.security.x501.Name$1
 org.apache.harmony.security.x509.AlgorithmIdentifier
-org.apache.harmony.security.x509.AlgorithmIdentifier$1
 org.apache.harmony.security.x509.BasicConstraints
-org.apache.harmony.security.x509.BasicConstraints$1
 org.apache.harmony.security.x509.Certificate
-org.apache.harmony.security.x509.Certificate$1
-org.apache.harmony.security.x509.DNParser
 org.apache.harmony.security.x509.EDIPartyName
-org.apache.harmony.security.x509.EDIPartyName$1
 org.apache.harmony.security.x509.Extension
-org.apache.harmony.security.x509.Extension$1
-org.apache.harmony.security.x509.Extension$2
-org.apache.harmony.security.x509.ExtensionValue
 org.apache.harmony.security.x509.Extensions
-org.apache.harmony.security.x509.Extensions$1
 org.apache.harmony.security.x509.GeneralName
-org.apache.harmony.security.x509.GeneralName$1
 org.apache.harmony.security.x509.GeneralNames
-org.apache.harmony.security.x509.GeneralNames$1
 org.apache.harmony.security.x509.KeyUsage
 org.apache.harmony.security.x509.ORAddress
-org.apache.harmony.security.x509.ORAddress$1
-org.apache.harmony.security.x509.ORAddress$2
 org.apache.harmony.security.x509.OtherName
-org.apache.harmony.security.x509.OtherName$1
+org.apache.harmony.security.x509.PolicyQualifierInfo
 org.apache.harmony.security.x509.SubjectPublicKeyInfo
-org.apache.harmony.security.x509.SubjectPublicKeyInfo$1
 org.apache.harmony.security.x509.TBSCertificate
-org.apache.harmony.security.x509.TBSCertificate$1
 org.apache.harmony.security.x509.Time
-org.apache.harmony.security.x509.Time$1
-org.apache.harmony.security.x509.Utils
 org.apache.harmony.security.x509.Validity
-org.apache.harmony.security.x509.Validity$1
 org.apache.harmony.text.BidiWrapper
 org.apache.harmony.xml.ExpatAttributes
 org.apache.harmony.xml.ExpatParser
-org.apache.harmony.xml.ExpatParser$ClonedAttributes
-org.apache.harmony.xml.ExpatParser$CurrentAttributes
-org.apache.harmony.xml.ExpatParser$ExpatLocator
 org.apache.harmony.xml.ExpatPullParser
 org.apache.harmony.xml.ExpatPullParser$ByteDocument
-org.apache.harmony.xml.ExpatPullParser$Document
-org.apache.harmony.xml.ExpatPullParser$Document$SaxHandler
-org.apache.harmony.xml.ExpatPullParser$EndTagEvent
-org.apache.harmony.xml.ExpatPullParser$Event
-org.apache.harmony.xml.ExpatPullParser$NamespaceStack
-org.apache.harmony.xml.ExpatPullParser$NamespaceStack$Builder
-org.apache.harmony.xml.ExpatPullParser$StartDocumentEvent
-org.apache.harmony.xml.ExpatPullParser$StartTagEvent
-org.apache.harmony.xml.ExpatPullParser$TextEvent
 org.apache.harmony.xml.ExpatReader
-org.apache.harmony.xml.dom.DOMImplementationImpl
+org.apache.harmony.xml.dom.AttrImpl
+org.apache.harmony.xml.dom.CharacterDataImpl
+org.apache.harmony.xml.dom.CommentImpl
 org.apache.harmony.xml.dom.DocumentImpl
+org.apache.harmony.xml.dom.ElementImpl
+org.apache.harmony.xml.dom.InnerNodeImpl
+org.apache.harmony.xml.dom.NodeImpl
+org.apache.harmony.xml.dom.TextImpl
 org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl
 org.apache.harmony.xml.parsers.DocumentBuilderImpl
+org.apache.harmony.xml.parsers.SAXParserFactoryImpl
 org.apache.harmony.xnet.provider.jsse.AbstractSessionContext
-org.apache.harmony.xnet.provider.jsse.ClientSessionContext
-org.apache.harmony.xnet.provider.jsse.ClientSessionContext$1
-org.apache.harmony.xnet.provider.jsse.ClientSessionContext$HostAndPort
 org.apache.harmony.xnet.provider.jsse.FileClientSessionCache
-org.apache.harmony.xnet.provider.jsse.FileClientSessionCache$Impl
-org.apache.harmony.xnet.provider.jsse.JSSEProvider
-org.apache.harmony.xnet.provider.jsse.JSSEProvider$1
-org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl
-org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl$1
-org.apache.harmony.xnet.provider.jsse.KeyManagerImpl
 org.apache.harmony.xnet.provider.jsse.NativeCrypto
-org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigest
 org.apache.harmony.xnet.provider.jsse.OpenSSLServerSocketImpl
 org.apache.harmony.xnet.provider.jsse.OpenSSLSessionImpl
 org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl
 org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl
 org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$Finalizer
 org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$LoggerHolder
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream
-org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream
 org.apache.harmony.xnet.provider.jsse.ProtocolVersion
-org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache
 org.apache.harmony.xnet.provider.jsse.SSLContextImpl
 org.apache.harmony.xnet.provider.jsse.SSLParameters
 org.apache.harmony.xnet.provider.jsse.ServerSessionContext
-org.apache.harmony.xnet.provider.jsse.ServerSessionContext$1
-org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl
-org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl$1
-org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl$2
-org.apache.harmony.xnet.provider.jsse.TrustManagerImpl
-org.apache.http.ConnectionReuseStrategy
-org.apache.http.FormattedHeader
-org.apache.http.Header
-org.apache.http.HeaderElement
-org.apache.http.HeaderElementIterator
-org.apache.http.HeaderIterator
-org.apache.http.HttpClientConnection
-org.apache.http.HttpConnection
-org.apache.http.HttpConnectionMetrics
-org.apache.http.HttpEntity
-org.apache.http.HttpEntityEnclosingRequest
-org.apache.http.HttpException
-org.apache.http.HttpHost
-org.apache.http.HttpInetConnection
-org.apache.http.HttpMessage
-org.apache.http.HttpRequest
-org.apache.http.HttpRequestInterceptor
-org.apache.http.HttpResponse
-org.apache.http.HttpResponseFactory
-org.apache.http.HttpResponseInterceptor
 org.apache.http.HttpVersion
-org.apache.http.NameValuePair
+org.apache.http.NoHttpResponseException
 org.apache.http.ProtocolException
-org.apache.http.ProtocolVersion
-org.apache.http.ReasonPhraseCatalog
-org.apache.http.RequestLine
-org.apache.http.StatusLine
-org.apache.http.TokenIterator
-org.apache.http.auth.AuthSchemeFactory
-org.apache.http.auth.AuthSchemeRegistry
-org.apache.http.auth.AuthState
-org.apache.http.client.AuthenticationHandler
-org.apache.http.client.ClientProtocolException
-org.apache.http.client.CookieStore
-org.apache.http.client.CredentialsProvider
 org.apache.http.client.HttpClient
-org.apache.http.client.HttpRequestRetryHandler
-org.apache.http.client.RedirectHandler
-org.apache.http.client.RequestDirector
-org.apache.http.client.ResponseHandler
-org.apache.http.client.UserTokenHandler
-org.apache.http.client.methods.AbortableHttpRequest
 org.apache.http.client.methods.HttpEntityEnclosingRequestBase
 org.apache.http.client.methods.HttpGet
 org.apache.http.client.methods.HttpPost
 org.apache.http.client.methods.HttpRequestBase
-org.apache.http.client.methods.HttpUriRequest
-org.apache.http.client.params.HttpClientParams
-org.apache.http.client.protocol.RequestAddCookies
-org.apache.http.client.protocol.RequestDefaultHeaders
-org.apache.http.client.protocol.RequestProxyAuthentication
-org.apache.http.client.protocol.RequestTargetAuthentication
-org.apache.http.client.protocol.ResponseProcessCookies
-org.apache.http.client.utils.URIUtils
 org.apache.http.conn.BasicManagedEntity
-org.apache.http.conn.ClientConnectionManager
-org.apache.http.conn.ClientConnectionOperator
-org.apache.http.conn.ClientConnectionRequest
-org.apache.http.conn.ConnectionKeepAliveStrategy
-org.apache.http.conn.ConnectionReleaseTrigger
-org.apache.http.conn.EofSensorInputStream
-org.apache.http.conn.EofSensorWatcher
-org.apache.http.conn.ManagedClientConnection
-org.apache.http.conn.OperatedClientConnection
-org.apache.http.conn.params.ConnManagerPNames
 org.apache.http.conn.params.ConnManagerParams
-org.apache.http.conn.params.ConnManagerParams$1
-org.apache.http.conn.params.ConnPerRoute
-org.apache.http.conn.params.ConnPerRouteBean
-org.apache.http.conn.params.ConnRoutePNames
 org.apache.http.conn.params.ConnRouteParams
-org.apache.http.conn.routing.BasicRouteDirector
 org.apache.http.conn.routing.HttpRoute
-org.apache.http.conn.routing.HttpRouteDirector
-org.apache.http.conn.routing.HttpRoutePlanner
-org.apache.http.conn.routing.RouteInfo
-org.apache.http.conn.routing.RouteInfo$LayerType
-org.apache.http.conn.routing.RouteInfo$TunnelType
-org.apache.http.conn.routing.RouteTracker
-org.apache.http.conn.scheme.LayeredSocketFactory
 org.apache.http.conn.scheme.PlainSocketFactory
-org.apache.http.conn.scheme.Scheme
-org.apache.http.conn.scheme.SchemeRegistry
-org.apache.http.conn.scheme.SocketFactory
 org.apache.http.conn.ssl.AbstractVerifier
-org.apache.http.conn.ssl.AllowAllHostnameVerifier
-org.apache.http.conn.ssl.BrowserCompatHostnameVerifier
 org.apache.http.conn.ssl.SSLSocketFactory
-org.apache.http.conn.ssl.StrictHostnameVerifier
-org.apache.http.conn.ssl.X509HostnameVerifier
-org.apache.http.cookie.ClientCookie
-org.apache.http.cookie.Cookie
-org.apache.http.cookie.CookieAttributeHandler
-org.apache.http.cookie.CookieIdentityComparator
-org.apache.http.cookie.CookieOrigin
-org.apache.http.cookie.CookiePathComparator
-org.apache.http.cookie.CookieSpec
-org.apache.http.cookie.CookieSpecFactory
-org.apache.http.cookie.CookieSpecRegistry
-org.apache.http.cookie.SetCookie
-org.apache.http.entity.AbstractHttpEntity
+org.apache.http.conn.util.InetAddressUtils
 org.apache.http.entity.BasicHttpEntity
-org.apache.http.entity.ByteArrayEntity
-org.apache.http.entity.ContentLengthStrategy
-org.apache.http.entity.HttpEntityWrapper
+org.apache.http.entity.InputStreamEntity
 org.apache.http.entity.StringEntity
 org.apache.http.impl.AbstractHttpClientConnection
-org.apache.http.impl.DefaultConnectionReuseStrategy
-org.apache.http.impl.DefaultHttpResponseFactory
 org.apache.http.impl.EnglishReasonPhraseCatalog
 org.apache.http.impl.HttpConnectionMetricsImpl
 org.apache.http.impl.SocketHttpClientConnection
-org.apache.http.impl.auth.BasicSchemeFactory
-org.apache.http.impl.auth.DigestSchemeFactory
 org.apache.http.impl.client.AbstractAuthenticationHandler
 org.apache.http.impl.client.AbstractHttpClient
-org.apache.http.impl.client.BasicCookieStore
-org.apache.http.impl.client.BasicCredentialsProvider
-org.apache.http.impl.client.ClientParamsStack
-org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy
 org.apache.http.impl.client.DefaultHttpClient
-org.apache.http.impl.client.DefaultHttpRequestRetryHandler
-org.apache.http.impl.client.DefaultProxyAuthenticationHandler
-org.apache.http.impl.client.DefaultRedirectHandler
-org.apache.http.impl.client.DefaultRequestDirector
-org.apache.http.impl.client.DefaultTargetAuthenticationHandler
-org.apache.http.impl.client.DefaultUserTokenHandler
 org.apache.http.impl.client.EntityEnclosingRequestWrapper
-org.apache.http.impl.client.RequestWrapper
-org.apache.http.impl.client.RoutedRequest
 org.apache.http.impl.conn.AbstractClientConnAdapter
-org.apache.http.impl.conn.AbstractPoolEntry
 org.apache.http.impl.conn.AbstractPooledConnAdapter
 org.apache.http.impl.conn.DefaultClientConnection
-org.apache.http.impl.conn.DefaultClientConnectionOperator
-org.apache.http.impl.conn.DefaultHttpRoutePlanner
-org.apache.http.impl.conn.DefaultResponseParser
-org.apache.http.impl.conn.IdleConnectionHandler
-org.apache.http.impl.conn.IdleConnectionHandler$TimeValues
 org.apache.http.impl.conn.SingleClientConnManager
-org.apache.http.impl.conn.SingleClientConnManager$1
-org.apache.http.impl.conn.SingleClientConnManager$ConnAdapter
-org.apache.http.impl.conn.SingleClientConnManager$PoolEntry
-org.apache.http.impl.conn.tsccm.AbstractConnPool
-org.apache.http.impl.conn.tsccm.BasicPoolEntry
-org.apache.http.impl.conn.tsccm.BasicPoolEntryRef
-org.apache.http.impl.conn.tsccm.BasicPooledConnAdapter
 org.apache.http.impl.conn.tsccm.ConnPoolByRoute
-org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1
-org.apache.http.impl.conn.tsccm.PoolEntryRequest
-org.apache.http.impl.conn.tsccm.RefQueueHandler
-org.apache.http.impl.conn.tsccm.RefQueueWorker
-org.apache.http.impl.conn.tsccm.RouteSpecificPool
 org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
-org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1
-org.apache.http.impl.conn.tsccm.WaitingThreadAborter
-org.apache.http.impl.cookie.AbstractCookieAttributeHandler
-org.apache.http.impl.cookie.AbstractCookieSpec
 org.apache.http.impl.cookie.BasicClientCookie
-org.apache.http.impl.cookie.BasicCommentHandler
-org.apache.http.impl.cookie.BasicDomainHandler
-org.apache.http.impl.cookie.BasicExpiresHandler
-org.apache.http.impl.cookie.BasicMaxAgeHandler
-org.apache.http.impl.cookie.BasicPathHandler
-org.apache.http.impl.cookie.BasicSecureHandler
-org.apache.http.impl.cookie.BestMatchSpec
-org.apache.http.impl.cookie.BestMatchSpecFactory
 org.apache.http.impl.cookie.BrowserCompatSpec
-org.apache.http.impl.cookie.BrowserCompatSpecFactory
-org.apache.http.impl.cookie.CookieSpecBase
 org.apache.http.impl.cookie.DateUtils
-org.apache.http.impl.cookie.NetscapeDraftSpecFactory
-org.apache.http.impl.cookie.RFC2109DomainHandler
 org.apache.http.impl.cookie.RFC2109Spec
-org.apache.http.impl.cookie.RFC2109SpecFactory
-org.apache.http.impl.cookie.RFC2109VersionHandler
-org.apache.http.impl.cookie.RFC2965CommentUrlAttributeHandler
-org.apache.http.impl.cookie.RFC2965DiscardAttributeHandler
-org.apache.http.impl.cookie.RFC2965DomainAttributeHandler
-org.apache.http.impl.cookie.RFC2965PortAttributeHandler
 org.apache.http.impl.cookie.RFC2965Spec
-org.apache.http.impl.cookie.RFC2965SpecFactory
-org.apache.http.impl.cookie.RFC2965VersionAttributeHandler
-org.apache.http.impl.entity.EntityDeserializer
-org.apache.http.impl.entity.EntitySerializer
-org.apache.http.impl.entity.LaxContentLengthStrategy
-org.apache.http.impl.entity.StrictContentLengthStrategy
-org.apache.http.impl.io.AbstractMessageParser
-org.apache.http.impl.io.AbstractMessageWriter
 org.apache.http.impl.io.AbstractSessionInputBuffer
-org.apache.http.impl.io.AbstractSessionOutputBuffer
-org.apache.http.impl.io.ChunkedInputStream
-org.apache.http.impl.io.ContentLengthInputStream
-org.apache.http.impl.io.ContentLengthOutputStream
-org.apache.http.impl.io.HttpRequestWriter
-org.apache.http.impl.io.HttpTransportMetricsImpl
 org.apache.http.impl.io.SocketInputBuffer
-org.apache.http.impl.io.SocketOutputBuffer
-org.apache.http.io.HttpMessageParser
-org.apache.http.io.HttpMessageWriter
-org.apache.http.io.HttpTransportMetrics
-org.apache.http.io.SessionInputBuffer
-org.apache.http.io.SessionOutputBuffer
 org.apache.http.message.AbstractHttpMessage
-org.apache.http.message.BasicHeader
 org.apache.http.message.BasicHeaderElement
-org.apache.http.message.BasicHeaderElementIterator
-org.apache.http.message.BasicHeaderValueParser
+org.apache.http.message.BasicHttpEntityEnclosingRequest
+org.apache.http.message.BasicHttpRequest
 org.apache.http.message.BasicHttpResponse
 org.apache.http.message.BasicLineFormatter
 org.apache.http.message.BasicLineParser
-org.apache.http.message.BasicListHeaderIterator
-org.apache.http.message.BasicNameValuePair
-org.apache.http.message.BasicRequestLine
-org.apache.http.message.BasicStatusLine
 org.apache.http.message.BasicTokenIterator
-org.apache.http.message.BufferedHeader
-org.apache.http.message.HeaderGroup
-org.apache.http.message.HeaderValueParser
-org.apache.http.message.LineFormatter
-org.apache.http.message.LineParser
-org.apache.http.message.ParserCursor
 org.apache.http.params.AbstractHttpParams
 org.apache.http.params.BasicHttpParams
-org.apache.http.params.CoreConnectionPNames
-org.apache.http.params.CoreProtocolPNames
-org.apache.http.params.HttpConnectionParams
-org.apache.http.params.HttpParams
-org.apache.http.params.HttpProtocolParams
-org.apache.http.protocol.BasicHttpContext
 org.apache.http.protocol.BasicHttpProcessor
 org.apache.http.protocol.HTTP
-org.apache.http.protocol.HttpContext
-org.apache.http.protocol.HttpProcessor
-org.apache.http.protocol.HttpRequestExecutor
-org.apache.http.protocol.HttpRequestInterceptorList
-org.apache.http.protocol.HttpResponseInterceptorList
-org.apache.http.protocol.RequestConnControl
-org.apache.http.protocol.RequestContent
-org.apache.http.protocol.RequestExpectContinue
-org.apache.http.protocol.RequestTargetHost
-org.apache.http.protocol.RequestUserAgent
-org.apache.http.util.ByteArrayBuffer
-org.apache.http.util.CharArrayBuffer
-org.apache.http.util.EntityUtils
-org.apache.http.util.LangUtils
-org.apache.http.util.VersionInfo
-org.bouncycastle.asn1.ASN1Choice
-org.bouncycastle.asn1.ASN1Collection
-org.bouncycastle.asn1.ASN1Collection$ASN1CollectionEnumeration
-org.bouncycastle.asn1.ASN1Encodable
-org.bouncycastle.asn1.ASN1EncodableVector
-org.bouncycastle.asn1.ASN1InputStream
-org.bouncycastle.asn1.ASN1InputStream$1
-org.bouncycastle.asn1.ASN1Null
-org.bouncycastle.asn1.ASN1OctetString
-org.bouncycastle.asn1.ASN1OutputStream
-org.bouncycastle.asn1.ASN1Sequence
-org.bouncycastle.asn1.ASN1Set
-org.bouncycastle.asn1.ASN1TaggedObject
-org.bouncycastle.asn1.DERBitString
-org.bouncycastle.asn1.DERBoolean
-org.bouncycastle.asn1.DEREncodable
-org.bouncycastle.asn1.DEREncodableVector
-org.bouncycastle.asn1.DERIA5String
-org.bouncycastle.asn1.DERInteger
 org.bouncycastle.asn1.DERNull
 org.bouncycastle.asn1.DERObject
 org.bouncycastle.asn1.DERObjectIdentifier
-org.bouncycastle.asn1.DEROctetString
-org.bouncycastle.asn1.DEROutputStream
-org.bouncycastle.asn1.DERPrintableString
-org.bouncycastle.asn1.DERSequence
-org.bouncycastle.asn1.DERSet
-org.bouncycastle.asn1.DERString
-org.bouncycastle.asn1.DERTaggedObject
-org.bouncycastle.asn1.DERTags
-org.bouncycastle.asn1.DERUTCTime
-org.bouncycastle.asn1.DERUTF8String
-org.bouncycastle.asn1.OIDTokenizer
-org.bouncycastle.asn1.OrderedTable
 org.bouncycastle.asn1.iana.IANAObjectIdentifiers
 org.bouncycastle.asn1.nist.NISTObjectIdentifiers
 org.bouncycastle.asn1.oiw.OIWObjectIdentifiers
 org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
-org.bouncycastle.asn1.x509.AlgorithmIdentifier
-org.bouncycastle.asn1.x509.BasicConstraints
-org.bouncycastle.asn1.x509.RSAPublicKeyStructure
-org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
-org.bouncycastle.asn1.x509.TBSCertificateStructure
-org.bouncycastle.asn1.x509.Time
-org.bouncycastle.asn1.x509.X509CertificateStructure
-org.bouncycastle.asn1.x509.X509Extension
 org.bouncycastle.asn1.x509.X509Extensions
 org.bouncycastle.asn1.x509.X509Name
-org.bouncycastle.asn1.x509.X509NameElementList
-org.bouncycastle.asn1.x509.X509ObjectIdentifiers
-org.bouncycastle.crypto.CipherParameters
-org.bouncycastle.crypto.Digest
-org.bouncycastle.crypto.ExtendedDigest
-org.bouncycastle.crypto.Mac
-org.bouncycastle.crypto.PBEParametersGenerator
+org.bouncycastle.crypto.digests.SHA1Digest
 org.bouncycastle.crypto.engines.AESFastEngine
 org.bouncycastle.crypto.generators.PKCS12ParametersGenerator
-org.bouncycastle.crypto.io.MacInputStream
 org.bouncycastle.crypto.macs.HMac
-org.bouncycastle.crypto.params.KeyParameter
-org.bouncycastle.jce.interfaces.BCKeyStore
-org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier
 org.bouncycastle.jce.provider.BouncyCastleProvider
 org.bouncycastle.jce.provider.CertPathValidatorUtilities
+org.bouncycastle.jce.provider.JCEBlockCipher
 org.bouncycastle.jce.provider.JCEBlockCipher$AES
-org.bouncycastle.jce.provider.JCERSAPublicKey
+org.bouncycastle.jce.provider.JCEMac
 org.bouncycastle.jce.provider.JDKKeyFactory
 org.bouncycastle.jce.provider.JDKKeyFactory$RSA
 org.bouncycastle.jce.provider.JDKKeyStore
-org.bouncycastle.jce.provider.JDKKeyStore$StoreEntry
 org.bouncycastle.jce.provider.JDKX509CertificateFactory
 org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi
-org.bouncycastle.jce.provider.PKIXPolicyNode
-org.bouncycastle.jce.provider.RSAUtil
+org.bouncycastle.jce.provider.WrapCipherSpi
 org.bouncycastle.jce.provider.X509CertificateObject
-org.bouncycastle.util.Strings
+org.ccil.cowan.tagsoup.AttributesImpl
 org.ccil.cowan.tagsoup.HTMLScanner
+org.ccil.cowan.tagsoup.HTMLSchema
 org.ccil.cowan.tagsoup.Parser
-org.json.JSONArray
 org.json.JSONObject
-org.json.JSONObject$Null
-org.json.JSONTokener
 org.kxml2.io.KXmlParser
 org.kxml2.io.KXmlSerializer
 org.openssl.NativeBN
-org.w3c.dom.DOMImplementation
 org.xml.sax.Attributes
-org.xml.sax.ContentHandler
-org.xml.sax.DTDHandler
-org.xml.sax.EntityResolver
-org.xml.sax.ErrorHandler
-org.xml.sax.InputSource
-org.xml.sax.Locator
-org.xml.sax.XMLReader
 org.xml.sax.helpers.DefaultHandler
 org.xmlpull.v1.XmlPullParser
-org.xmlpull.v1.XmlPullParserFactory
-org.xmlpull.v1.XmlSerializer
+org.xmlpull.v1.XmlPullParserException
+org.xmlpull.v1.sax2.Driver
 sun.misc.Unsafe
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 04bfae6..30a9c59 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -924,6 +924,7 @@
     static final int RESUME_TOP_ACTIVITY_MSG = 19;
     static final int PROC_START_TIMEOUT_MSG = 20;
     static final int DO_PENDING_ACTIVITY_LAUNCHES_MSG = 21;
+    static final int KILL_APPLICATION_MSG = 22;
 
     AlertDialog mUidAlert;
 
@@ -1153,6 +1154,14 @@
                     doPendingActivityLaunchesLocked(true);
                 }
             }
+            case KILL_APPLICATION_MSG: {
+                synchronized (ActivityManagerService.this) {
+                    int uid = msg.arg1;
+                    boolean restart = (msg.arg2 == 1);
+                    String pkg = (String) msg.obj;
+                    uninstallPackageLocked(pkg, uid, restart);
+                }
+            } break;
             }
         }
     };
@@ -4804,7 +4813,12 @@
         int callerUid = Binder.getCallingUid();
         // Only the system server can kill an application
         if (callerUid == Process.SYSTEM_UID) {
-            uninstallPackageLocked(pkg, uid, false);
+            // Post an aysnc message to kill the application
+            Message msg = mHandler.obtainMessage(KILL_APPLICATION_MSG);
+            msg.arg1 = uid;
+            msg.arg2 = 0;
+            msg.obj = pkg;
+            mHandler.sendMessage(msg);
         } else {
             throw new SecurityException(callerUid + " cannot kill pkg: " +
                     pkg);
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index e04491d..5f80ade 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -321,6 +321,7 @@
     LABEL_ATTR = 0x01010001,
     ICON_ATTR = 0x01010002,
     MIN_SDK_VERSION_ATTR = 0x0101020c,
+    MAX_SDK_VERSION_ATTR = 0x01010271,
     REQ_TOUCH_SCREEN_ATTR = 0x01010227,
     REQ_KEYBOARD_TYPE_ATTR = 0x01010228,
     REQ_HARD_KEYBOARD_ATTR = 0x01010229,
@@ -585,6 +586,10 @@
                             targetSdk = code;
                             printf("sdkVersion:'%d'\n", code);
                         }
+                        code = getIntegerAttribute(tree, MAX_SDK_VERSION_ATTR, NULL, -1);
+                        if (code != -1) {
+                            printf("maxSdkVersion:'%d'\n", code);
+                        }
                         code = getIntegerAttribute(tree, TARGET_SDK_VERSION_ATTR, &error);
                         if (error != "") {
                             error = "";
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap.java
index 6bc01b1..7dde634 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap.java
@@ -16,7 +16,6 @@
 
 package android.graphics;
 
-import com.android.layoutlib.bridge.BridgeCanvas;
 
 import java.awt.image.BufferedImage;
 import java.io.File;
@@ -25,15 +24,15 @@
 import javax.imageio.ImageIO;
 
 public final class Bitmap extends _Original_Bitmap {
-    
+
     private BufferedImage mImage;
 
     public Bitmap(File input) throws IOException {
         super(1, true, null);
-        
+
         mImage = ImageIO.read(input);
     }
-    
+
     Bitmap(BufferedImage image) {
         super(1, true, null);
         mImage = image;
@@ -42,9 +41,9 @@
     public BufferedImage getImage() {
         return mImage;
     }
-    
+
     // ----- overriden methods
-    
+
     public enum Config {
         // these native values must match up with the enum in SkBitmap.h
         ALPHA_8     (2),
@@ -56,27 +55,26 @@
             this.nativeInt = ni;
         }
         final int nativeInt;
-        
+
         /* package */ static Config nativeToConfig(int ni) {
             return sConfigs[ni];
         }
-        
+
         private static Config sConfigs[] = {
             null, null, ALPHA_8, null, RGB_565, ARGB_4444, ARGB_8888
         };
     }
 
-    
     @Override
     public int getWidth() {
         return mImage.getWidth();
     }
-    
+
     @Override
     public int getHeight() {
         return mImage.getHeight();
     }
-    
+
     /**
      * Returns an immutable bitmap from the source bitmap. The new bitmap may
      * be the same object as source, or a copy may have been made.
@@ -100,7 +98,7 @@
                                       int width, int height) {
         return new Bitmap(source.mImage.getSubimage(x, y, width, height));
     }
-    
+
     /**
      * Returns an immutable bitmap from subset of the source bitmap,
      * transformed by the optional matrix.
@@ -158,7 +156,7 @@
         neww = Math.round(deviceR.width());
         newh = Math.round(deviceR.height());
 
-        BridgeCanvas canvas = new BridgeCanvas(neww, newh);
+        Canvas canvas = new Canvas(neww, newh);
 
         canvas.translate(-deviceR.left, -deviceR.top);
         canvas.concat(m);
@@ -169,10 +167,10 @@
         }
 
         canvas.drawBitmap(source, srcR, dstR, paint);
-        
+
         return new Bitmap(canvas.getImage());
     }
-    
+
     /**
      * Returns a mutable bitmap with the specified width and height.
      *
@@ -184,7 +182,7 @@
     public static Bitmap createBitmap(int width, int height, Config config) {
         return new Bitmap(new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB));
     }
-    
+
     /**
      * Returns a immutable bitmap with the specified width and height, with each
      * pixel value set to the corresponding value in the colors array.
@@ -215,7 +213,7 @@
             || (lastScanline + width > length)) {
             throw new ArrayIndexOutOfBoundsException();
         }
-        
+
         // TODO: create an immutable bitmap...
         throw new UnsupportedOperationException();
     }
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeCanvas.java b/tools/layoutlib/bridge/src/android/graphics/Canvas.java
similarity index 89%
rename from tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeCanvas.java
rename to tools/layoutlib/bridge/src/android/graphics/Canvas.java
index 4710691..3fa1d1d 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeCanvas.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Canvas.java
@@ -14,24 +14,16 @@
  * limitations under the License.
  */
 
-package com.android.layoutlib.bridge;
+package android.graphics;
 
 import com.android.layoutlib.api.ILayoutLog;
 
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
 import android.graphics.DrawFilter;
-import android.graphics.LinearGradient;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Path;
 import android.graphics.Picture;
 import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.Region;
-import android.graphics.Shader;
 import android.graphics.Xfermode;
 import android.graphics.Paint.Align;
 import android.graphics.Paint.Style;
@@ -43,6 +35,7 @@
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
 import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
 import java.util.Stack;
 
@@ -51,36 +44,59 @@
 /**
  * Re-implementation of the Canvas, 100% in java on top of a BufferedImage.
  */
-public class BridgeCanvas extends Canvas {
-    
+public class Canvas extends _Original_Canvas {
+
     private BufferedImage mBufferedImage;
     private final Stack<Graphics2D> mGraphicsStack = new Stack<Graphics2D>();
     private final ILayoutLog mLogger;
 
-    public BridgeCanvas(int width, int height, ILayoutLog logger) {
+    public Canvas() {
+        mLogger = null;
+        // the mBufferedImage will be taken from a bitmap in #setBitmap()
+    }
+
+    public Canvas(Bitmap bitmap) {
+        mLogger = null;
+        mBufferedImage = bitmap.getImage();
+        mGraphicsStack.push(mBufferedImage.createGraphics());
+    }
+
+    public Canvas(int nativeCanvas) {
+        mLogger = null;
+        throw new UnsupportedOperationException("Can't create Canvas(int)");
+    }
+
+    public Canvas(javax.microedition.khronos.opengles.GL gl) {
+        mLogger = null;
+        throw new UnsupportedOperationException("Can't create Canvas(javax.microedition.khronos.opengles.GL)");
+    }
+
+    // custom constructors for our use.
+    public Canvas(int width, int height, ILayoutLog logger) {
         mLogger = logger;
         mBufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
         mGraphicsStack.push(mBufferedImage.createGraphics());
     }
-    
-    public BridgeCanvas(int width, int height) {
+
+    public Canvas(int width, int height) {
         this(width, height, null /* logger*/);
     }
-    
+
+    // custom mehtods
     public BufferedImage getImage() {
         return mBufferedImage;
     }
-    
-    Graphics2D getGraphics2d() {
+
+    public Graphics2D getGraphics2d() {
         return mGraphicsStack.peek();
     }
-    
-    void dispose() {
+
+    public void dispose() {
         while (mGraphicsStack.size() > 0) {
             mGraphicsStack.pop().dispose();
         }
     }
-    
+
     /**
      * Creates a new {@link Graphics2D} based on the {@link Paint} parameters.
      * <p/>The object must be disposed ({@link Graphics2D#dispose()}) after being used.
@@ -91,11 +107,11 @@
         g.setColor(new Color(paint.getColor()));
         int alpha = paint.getAlpha();
         float falpha = alpha / 255.f;
-        
+
         Xfermode xfermode = paint.getXfermode();
         if (xfermode instanceof PorterDuffXfermode) {
             PorterDuff.Mode mode = ((PorterDuffXfermode)xfermode).getMode();
-            
+
             setModeInGraphics(mode, g, falpha);
         } else {
             if (mLogger != null && xfermode != null) {
@@ -105,7 +121,7 @@
             }
             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, falpha));
         }
-        
+
         Shader shader = paint.getShader();
         if (shader instanceof LinearGradient) {
             g.setPaint(((LinearGradient)shader).getPaint());
@@ -116,10 +132,10 @@
                         shader.getClass().getCanonicalName()));
             }
         }
-        
+
         return g;
     }
-    
+
     private void setModeInGraphics(PorterDuff.Mode mode, Graphics2D g, float falpha) {
         switch (mode) {
             case CLEAR:
@@ -168,14 +184,43 @@
                 break;
         }
     }
-    
+
+
     // --------------------
-    
+    // OVERRIDEN ENUMS
+    // This is needed since we rename Canvas into _Original_Canvas
+    // --------------------
+
+    public enum EdgeType {
+        BW(0),  //!< treat edges by just rounding to nearest pixel boundary
+        AA(1);  //!< treat edges by rounding-out, since they may be antialiased
+
+        EdgeType(int nativeInt) {
+            this.nativeInt = nativeInt;
+        }
+        final int nativeInt;
+    }
+
+
+    // --------------------
+    // OVERRIDEN METHODS
+    // --------------------
+
     @Override
     public void finalize() throws Throwable {
         // pass
     }
-    
+
+    /* (non-Javadoc)
+     * @see android.graphics.Canvas#setBitmap(android.graphics.Bitmap)
+     */
+    @Override
+    public void setBitmap(Bitmap bitmap) {
+        mBufferedImage = bitmap.getImage();
+        mGraphicsStack.push(mBufferedImage.createGraphics());
+    }
+
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#translate(float, float)
      */
@@ -183,7 +228,7 @@
     public void translate(float dx, float dy) {
         getGraphics2d().translate(dx, dy);
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#save()
      */
@@ -191,7 +236,7 @@
     public int save() {
         Graphics2D g = (Graphics2D)getGraphics2d().create();
         mGraphicsStack.push(g);
-        
+
         return mGraphicsStack.size() - 1;
     }
 
@@ -203,7 +248,7 @@
         // For now we ignore saveFlags
         return save();
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#restore()
      */
@@ -221,7 +266,7 @@
             mGraphicsStack.pop();
         }
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#getSaveCount()
      */
@@ -229,8 +274,8 @@
     public int getSaveCount() {
         return mGraphicsStack.size() - 1;
     }
-    
-    
+
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#clipRect(float, float, float, float, android.graphics.Region.Op)
      */
@@ -288,23 +333,36 @@
     public boolean clipRect(RectF rect) {
         return clipRect(rect.left, rect.top, rect.right, rect.bottom);
     }
-    
-    @Override
+
     public boolean quickReject(RectF rect, EdgeType type) {
         return false;
     }
 
     @Override
+    public boolean quickReject(RectF rect, _Original_Canvas.EdgeType type) {
+        throw new UnsupportedOperationException("CALL TO PARENT FORBIDDEN");
+    }
+
     public boolean quickReject(Path path, EdgeType type) {
         return false;
     }
 
     @Override
+    public boolean quickReject(Path path, _Original_Canvas.EdgeType type) {
+        throw new UnsupportedOperationException("CALL TO PARENT FORBIDDEN");
+    }
+
     public boolean quickReject(float left, float top, float right, float bottom,
                                EdgeType type) {
         return false;
     }
 
+    @Override
+    public boolean quickReject(float left, float top, float right, float bottom,
+                               _Original_Canvas.EdgeType type) {
+        throw new UnsupportedOperationException("CALL TO PARENT FORBIDDEN");
+    }
+
     /**
      * Retrieve the clip bounds, returning true if they are non-empty.
      *
@@ -324,31 +382,31 @@
         }
         return false;
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawColor(int, android.graphics.PorterDuff.Mode)
      */
     @Override
     public void drawColor(int color, PorterDuff.Mode mode) {
         Graphics2D g = getGraphics2d();
-        
+
         // save old color
         Color c = g.getColor();
-        
+
         Composite composite = g.getComposite();
-        
+
         // get the alpha from the color
         int alpha = color >>> 24;
         float falpha = alpha / 255.f;
-        
+
         setModeInGraphics(mode, g, falpha);
-        
+
         g.setColor(new Color(color));
-        
+
         getGraphics2d().fillRect(0, 0, getWidth(), getHeight());
-        
+
         g.setComposite(composite);
-        
+
         // restore color
         g.setColor(c);
     }
@@ -360,7 +418,7 @@
     public void drawColor(int color) {
         drawColor(color, PorterDuff.Mode.SRC_OVER);
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawARGB(int, int, int, int)
      */
@@ -368,7 +426,7 @@
     public void drawARGB(int a, int r, int g, int b) {
         drawColor(a << 24 | r << 16 | g << 8 | b, PorterDuff.Mode.SRC_OVER);
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawRGB(int, int, int)
      */
@@ -377,7 +435,7 @@
         drawColor(0xFF << 24 | r << 16 | g << 8 | b, PorterDuff.Mode.SRC_OVER);
     }
 
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#getWidth()
      */
@@ -385,7 +443,7 @@
     public int getWidth() {
         return mBufferedImage.getWidth();
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#getHeight()
      */
@@ -401,7 +459,7 @@
     public void drawPaint(Paint paint) {
         drawColor(paint.getColor());
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint)
      */
@@ -417,7 +475,32 @@
      */
     @Override
     public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) {
-        throw new UnsupportedOperationException();
+        boolean needsRestore = false;
+        if (matrix.isIdentity() == false) {
+            // create a new graphics and apply the matrix to it
+            save(); // this creates a new Graphics2D, and stores it for children call to use
+            needsRestore = true;
+            Graphics2D g = getGraphics2d(); // get the newly create Graphics2D
+
+            // get the Graphics2D current matrix
+            AffineTransform currentTx = g.getTransform();
+            // get the AffineTransform from the matrix
+            AffineTransform matrixTx = matrix.getTransform();
+
+            // combine them so that the matrix is applied after.
+            currentTx.preConcatenate(matrixTx);
+
+            // give it to the graphics as a new matrix replacing all previous transform
+            g.setTransform(currentTx);
+        }
+
+        // draw the bitmap
+        drawBitmap(bitmap, 0, 0, paint);
+
+        if (needsRestore) {
+            // remove the new graphics
+            restore();
+        }
     }
 
     /* (non-Javadoc)
@@ -456,39 +539,42 @@
             int height, boolean hasAlpha, Paint paint) {
         throw new UnsupportedOperationException();
     }
-    
+
     private void drawBitmap(Bitmap bitmap, int sleft, int stop, int sright, int sbottom, int dleft,
             int dtop, int dright, int dbottom, Paint paint) {
         BufferedImage image = bitmap.getImage();
-        
+
         Graphics2D g = getGraphics2d();
-        
+
         Composite c = null;
-        
-        if (paint.isFilterBitmap()) {
-            g = (Graphics2D)g.create();
-            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
-                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+
+        if (paint != null) {
+            if (paint.isFilterBitmap()) {
+                g = (Graphics2D)g.create();
+                g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+                        RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+            }
+
+            if (paint.getAlpha() != 0xFF) {
+                c = g.getComposite();
+                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
+                        paint.getAlpha()/255.f));
+            }
         }
-        
-        if (paint.getAlpha() != 0xFF) {
-            c = g.getComposite();
-            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
-                    paint.getAlpha()/255.f));
-        }
-        
+
         g.drawImage(image, dleft, dtop, dright, dbottom,
                 sleft, stop, sright, sbottom, null);
 
-        if (paint.isFilterBitmap()) {
-            g.dispose();
-        }
-        
-        if (c != null) {
-            g.setComposite(c);
+        if (paint != null) {
+            if (paint.isFilterBitmap()) {
+                g.dispose();
+            }
+            if (c != null) {
+                g.setComposite(c);
+            }
         }
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#rotate(float, float, float)
      */
@@ -509,7 +595,7 @@
     public void rotate(float degrees) {
         getGraphics2d().rotate(Math.toRadians(degrees));
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#scale(float, float, float, float)
      */
@@ -528,19 +614,19 @@
     public void scale(float sx, float sy) {
         getGraphics2d().scale(sx, sy);
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawText(char[], int, int, float, float, android.graphics.Paint)
      */
     @Override
     public void drawText(char[] text, int index, int count, float x, float y, Paint paint) {
         Graphics2D g = getGraphics2d();
-        
+
         g = (Graphics2D)g.create();
         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-        
+
         g.setFont(paint.getFont());
-        
+
         // set the color. because this only handles RGB we have to handle the alpha separately
         g.setColor(new Color(paint.getColor()));
         int alpha = paint.getAlpha();
@@ -557,9 +643,9 @@
                 x -= m;
             }
         }
-        
+
         g.drawChars(text, index, count, (int)x, (int)y);
-        
+
         g.dispose();
     }
 
@@ -586,7 +672,7 @@
     public void drawText(String text, int start, int end, float x, float y, Paint paint) {
         drawText(text.toCharArray(), start, end - start, x, y, paint);
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawRect(android.graphics.RectF, android.graphics.Paint)
      */
@@ -594,7 +680,7 @@
     public void drawRect(RectF rect, Paint paint) {
         doDrawRect((int)rect.left, (int)rect.top, (int)rect.width(), (int)rect.height(), paint);
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawRect(float, float, float, float, android.graphics.Paint)
      */
@@ -614,11 +700,11 @@
     private final void doDrawRect(int left, int top, int width, int height, Paint paint) {
         // get current graphisc
         Graphics2D g = getGraphics2d();
-        
+
         g = getNewGraphics(paint, g);
 
         Style style = paint.getStyle();
-        
+
         // draw
         if (style == Style.FILL || style == Style.FILL_AND_STROKE) {
             g.fillRect(left, top, width, height);
@@ -639,16 +725,16 @@
     public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {
         // get current graphisc
         Graphics2D g = getGraphics2d();
-        
+
         g = getNewGraphics(paint, g);
 
         Style style = paint.getStyle();
-        
+
         // draw
-        
+
         int arcWidth = (int)(rx * 2);
         int arcHeight = (int)(ry * 2);
-        
+
         if (style == Style.FILL || style == Style.FILL_AND_STROKE) {
             g.fillRoundRect((int)rect.left, (int)rect.top, (int)rect.width(), (int)rect.height(),
                     arcWidth, arcHeight);
@@ -671,7 +757,7 @@
     public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {
         // get current graphisc
         Graphics2D g = getGraphics2d();
-        
+
         g = getNewGraphics(paint, g);
 
         g.drawLine((int)startX, (int)startY, (int)stopX, (int)stopY);
@@ -679,7 +765,7 @@
         // dispose Graphics2D object
         g.dispose();
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawLines(float[], int, int, android.graphics.Paint)
      */
@@ -687,7 +773,7 @@
     public void drawLines(float[] pts, int offset, int count, Paint paint) {
         // get current graphisc
         Graphics2D g = getGraphics2d();
-        
+
         g = getNewGraphics(paint, g);
 
         for (int i = 0 ; i < count ; i += 4) {
@@ -706,7 +792,7 @@
     public void drawLines(float[] pts, Paint paint) {
         drawLines(pts, 0, pts.length, paint);
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawCircle(float, float, float, android.graphics.Paint)
      */
@@ -714,11 +800,11 @@
     public void drawCircle(float cx, float cy, float radius, Paint paint) {
         // get current graphisc
         Graphics2D g = getGraphics2d();
-        
+
         g = getNewGraphics(paint, g);
 
         Style style = paint.getStyle();
-        
+
         int size = (int)(radius * 2);
 
         // draw
@@ -741,11 +827,11 @@
     public void drawOval(RectF oval, Paint paint) {
         // get current graphics
         Graphics2D g = getGraphics2d();
-        
+
         g = getNewGraphics(paint, g);
 
         Style style = paint.getStyle();
-        
+
         // draw
         if (style == Style.FILL || style == Style.FILL_AND_STROKE) {
             g.fillOval((int)oval.left, (int)oval.top, (int)oval.width(), (int)oval.height());
@@ -758,7 +844,7 @@
         // dispose Graphics2D object
         g.dispose();
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#drawPath(android.graphics.Path, android.graphics.Paint)
      */
@@ -766,11 +852,11 @@
     public void drawPath(Path path, Paint paint) {
         // get current graphics
         Graphics2D g = getGraphics2d();
-        
+
         g = getNewGraphics(paint, g);
 
         Style style = paint.getStyle();
-        
+
         // draw
         if (style == Style.FILL || style == Style.FILL_AND_STROKE) {
             g.fill(path.getAwtShape());
@@ -783,7 +869,7 @@
         // dispose Graphics2D object
         g.dispose();
     }
-    
+
     /* (non-Javadoc)
      * @see android.graphics.Canvas#setMatrix(android.graphics.Matrix)
      */
@@ -795,10 +881,10 @@
 
         // get the new current graphics
         Graphics2D g = getGraphics2d();
-        
+
         // and apply the matrix
         g.setTransform(matrix.getTransform());
-        
+
         if (mLogger != null && matrix.hasPerspective()) {
             mLogger.warning("android.graphics.Canvas#setMatrix(android.graphics.Matrix) only supports affine transformations in the Layout Editor.");
         }
@@ -1059,15 +1145,6 @@
     }
 
     /* (non-Javadoc)
-     * @see android.graphics.Canvas#setBitmap(android.graphics.Bitmap)
-     */
-    @Override
-    public void setBitmap(Bitmap bitmap) {
-        // TODO Auto-generated method stub
-        super.setBitmap(bitmap);
-    }
-
-    /* (non-Javadoc)
      * @see android.graphics.Canvas#setDrawFilter(android.graphics.DrawFilter)
      */
     @Override
diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix.java b/tools/layoutlib/bridge/src/android/graphics/Matrix.java
index 18c0e17..3974e08 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Matrix.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Matrix.java
@@ -17,6 +17,7 @@
 package android.graphics;
 
 import java.awt.geom.AffineTransform;
+import java.awt.geom.NoninvertibleTransformException;
 
 
 /**
@@ -747,7 +748,24 @@
      * inverted, ignore inverse and return false.
      */
     public boolean invert(Matrix inverse) {
-        throw new UnsupportedOperationException("STUB NEEDED");
+        if (inverse == null) {
+            return false;
+        }
+
+        try {
+            AffineTransform affineTransform = getTransform();
+            AffineTransform inverseTransform = affineTransform.createInverse();
+            inverse.mValues[0] = (float)inverseTransform.getScaleX();
+            inverse.mValues[1] = (float)inverseTransform.getShearX();
+            inverse.mValues[2] = (float)inverseTransform.getTranslateX();
+            inverse.mValues[3] = (float)inverseTransform.getScaleX();
+            inverse.mValues[4] = (float)inverseTransform.getShearY();
+            inverse.mValues[5] = (float)inverseTransform.getTranslateY();
+
+            return true;
+        } catch (NoninvertibleTransformException e) {
+            return false;
+        }
     }
 
     @Override
@@ -770,7 +788,19 @@
     public void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex,
                           int pointCount) {
         checkPointArrays(src, srcIndex, dst, dstIndex, pointCount);
-        throw new UnsupportedOperationException("STUB NEEDED");
+
+        for (int i = 0 ; i < pointCount ; i++) {
+            // just in case we are doing in place, we better put this in temp vars
+            float x = mValues[0] * src[i + srcIndex] +
+                      mValues[1] * src[i + srcIndex + 1] +
+                      mValues[2];
+            float y = mValues[3] * src[i + srcIndex] +
+                      mValues[4] * src[i + srcIndex + 1] +
+                      mValues[5];
+
+            dst[i + dstIndex]     = x;
+            dst[i + dstIndex + 1] = y;
+        }
     }
 
     /**
@@ -858,7 +888,26 @@
         if (dst == null || src == null) {
             throw new NullPointerException();
         }
-        throw new UnsupportedOperationException("STUB NEEDED");
+
+        // array with 4 corners
+        float[] corners = new float[] {
+                src.left, src.top,
+                src.right, src.top,
+                src.right, src.bottom,
+                src.left, src.bottom,
+        };
+
+        // apply the transform to them.
+        mapPoints(corners);
+
+        // now put the result in the rect. We take the min/max of Xs and min/max of Ys
+        dst.left = Math.min(Math.min(corners[0], corners[2]), Math.min(corners[4], corners[6]));
+        dst.right = Math.max(Math.max(corners[0], corners[2]), Math.max(corners[4], corners[6]));
+
+        dst.top = Math.min(Math.min(corners[1], corners[3]), Math.min(corners[5], corners[7]));
+        dst.bottom = Math.max(Math.max(corners[1], corners[3]), Math.max(corners[5], corners[7]));
+
+        return rectStaysRect();
     }
 
     /**
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index fd77d51..145a045 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -31,6 +31,7 @@
 import com.android.tools.layoutlib.create.OverrideMethod;
 
 import android.graphics.Bitmap;
+import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.graphics.Region;
 import android.graphics.Typeface;
@@ -358,7 +359,7 @@
                 windowBackground = context.findItemInStyle(currentTheme, "windowBackground");
                 windowBackground = context.resolveResValue(windowBackground);
 
-                screenOffset = getScreenOffset(currentTheme, context);
+                screenOffset = getScreenOffset(frameworkResources, currentTheme, context);
             }
 
             // we need to make sure the Looper has been initialized for this thread.
@@ -401,8 +402,7 @@
             view.layout(0, screenOffset, screenWidth, screenHeight);
 
             // draw them
-            BridgeCanvas canvas = new BridgeCanvas(screenWidth, screenHeight - screenOffset,
-                    logger);
+            Canvas canvas = new Canvas(screenWidth, screenHeight - screenOffset, logger);
 
             root.draw(canvas);
             canvas.dispose();
@@ -673,9 +673,13 @@
     /**
      * Returns the top screen offset. This depends on whether the current theme defines the user
      * of the title and status bars.
+     * @param frameworkResources The framework resources
+     * @param currentTheme The current theme
+     * @param context The context
      * @return the pixel height offset
      */
-    private int getScreenOffset(IStyleResourceValue currentTheme, BridgeContext context) {
+    private int getScreenOffset(Map<String, Map<String, IResourceValue>> frameworkResources,
+            IStyleResourceValue currentTheme, BridgeContext context) {
         int offset = 0;
 
         // get the title bar flag from the current theme.
@@ -687,22 +691,25 @@
         // if there's a value and it's true (default is false)
         if (value == null || value.getValue() == null ||
                 XmlUtils.convertValueToBoolean(value.getValue(), false /* defValue */) == false) {
+            // default size of the window title bar
+            int defaultOffset = DEFAULT_TITLE_BAR_HEIGHT;
+
             // get value from the theme.
             value = context.findItemInStyle(currentTheme, "windowTitleSize");
 
             // resolve it
             value = context.resolveResValue(value);
 
-            // default value
-            offset = DEFAULT_TITLE_BAR_HEIGHT;
-
-            // get the real value;
             if (value != null) {
+                // get the numerical value, if available
                 TypedValue typedValue = ResourceHelper.getValue(value.getValue());
                 if (typedValue != null) {
-                    offset = (int)typedValue.getDimension(context.getResources().mMetrics);
+                    // compute the pixel value based on the display metrics
+                    defaultOffset = (int)typedValue.getDimension(context.getResources().mMetrics);
                 }
             }
+
+            offset += defaultOffset;
         }
 
         // get the fullscreen flag from the current theme.
@@ -713,8 +720,25 @@
 
         if (value == null || value.getValue() == null ||
                 XmlUtils.convertValueToBoolean(value.getValue(), false /* defValue */) == false) {
-            // FIXME: Right now this is hard-coded in the platform, but once there's a constant, we'll need to use it.
-            offset += DEFAULT_STATUS_BAR_HEIGHT;
+
+            // default value
+            int defaultOffset = DEFAULT_STATUS_BAR_HEIGHT;
+
+            // get the real value, first the list of Dimensions from the framework map
+            Map<String, IResourceValue> dimens = frameworkResources.get(BridgeConstants.RES_DIMEN);
+
+            // now get the value
+            value = dimens.get("status_bar_height");
+            if (value != null) {
+                TypedValue typedValue = ResourceHelper.getValue(value.getValue());
+                if (typedValue != null) {
+                    // compute the pixel value based on the display metrics
+                    defaultOffset = (int)typedValue.getDimension(context.getResources().mMetrics);
+                }
+            }
+
+            // add the computed offset.
+            offset += defaultOffset;
         }
 
         return offset;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
index b426247..b5b7ceb 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeConstants.java
@@ -45,11 +45,12 @@
     public final static String PREFIX_RESOURCE_REF = "@";
     public final static String PREFIX_ANDROID_THEME_REF = "?android:";
     public final static String PREFIX_THEME_REF = "?";
-    
+
     public final static String PREFIX_ANDROID = "android:";
-    
+
     public final static String RES_STYLE = "style";
     public final static String RES_ATTR = "attr";
+    public final static String RES_DIMEN = "dimen";
     public final static String RES_DRAWABLE = "drawable";
     public final static String RES_COLOR = "color";
     public final static String RES_LAYOUT = "layout";
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java
index 8a040e41..2b0100b 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeResources.java
@@ -497,6 +497,24 @@
     }
 
     @Override
+    public InputStream openRawResource(int id, TypedValue value) throws NotFoundException {
+        getValue(id, value, true);
+
+        File f = new File(value.string.toString());
+        if (f.isFile()) {
+            try {
+                return new FileInputStream(f);
+            } catch (FileNotFoundException e) {
+                NotFoundException exception = new NotFoundException();
+                exception.initCause(e);
+                throw exception;
+            }
+        }
+
+        throw new NotFoundException();
+    }
+
+    @Override
     public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException {
         throw new UnsupportedOperationException();
     }
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/NinePatchDrawable.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/NinePatchDrawable.java
index 5f0852e..abbf2f0 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/NinePatchDrawable.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/NinePatchDrawable.java
@@ -30,17 +30,17 @@
     NinePatchDrawable(NinePatch ninePatch) {
         m9Patch = ninePatch;
     }
-    
+
     @Override
     public int getMinimumWidth() {
         return m9Patch.getWidth();
     }
-    
+
     @Override
     public int getMinimumHeight() {
         return m9Patch.getHeight();
     }
-    
+
     /**
      * Return the intrinsic width of the underlying drawable object.  Returns
      * -1 if it has no intrinsic width, such as with a solid color.
@@ -58,7 +58,7 @@
     public int getIntrinsicHeight() {
         return m9Patch.getHeight();
     }
-    
+
     /**
      * Return in padding the insets suggested by this Drawable for placing
      * content inside the drawable's bounds. Positive values move toward the
@@ -76,24 +76,18 @@
         padding.bottom = padd[3];
         return true;
     }
-    
+
     @Override
     public void draw(Canvas canvas) {
-        if (canvas instanceof BridgeCanvas) {
-            BridgeCanvas bridgeCanvas = (BridgeCanvas)canvas;
-            
-            Rect r = getBounds();
-            m9Patch.draw(bridgeCanvas.getGraphics2d(), r.left, r.top, r.width(), r.height());
-            
-            return;
-        }
+        Rect r = getBounds();
+        m9Patch.draw(canvas.getGraphics2d(), r.left, r.top, r.width(), r.height());
 
-        throw new UnsupportedOperationException();
+        return;
     }
 
-    
+
     // ----------- Not implemented methods ---------------
-    
+
 
     @Override
     public int getOpacity() {
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
index c07baff..47184f1 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
@@ -54,18 +54,19 @@
                     },
                     new String[] {  // classes to rename (so that we can replace them in layoutlib)
                         // original-platform-class-name ======> renamed-class-name
+                        "android.graphics.Bitmap",              "android.graphics._Original_Bitmap",
+                        "android.graphics.BitmapShader",        "android.graphics._Original_BitmapShader",
+                        "android.graphics.Canvas",              "android.graphics._Original_Canvas",
+                        "android.graphics.ComposeShader",       "android.graphics._Original_ComposeShader",
+                        "android.graphics.LinearGradient",      "android.graphics._Original_LinearGradient",
                         "android.graphics.Matrix",              "android.graphics._Original_Matrix",
                         "android.graphics.Paint",               "android.graphics._Original_Paint",
-                        "android.graphics.Typeface",            "android.graphics._Original_Typeface",
-                        "android.graphics.Bitmap",              "android.graphics._Original_Bitmap",
                         "android.graphics.Path",                "android.graphics._Original_Path",
                         "android.graphics.PorterDuffXfermode",  "android.graphics._Original_PorterDuffXfermode",
-                        "android.graphics.Shader",              "android.graphics._Original_Shader",
-                        "android.graphics.LinearGradient",      "android.graphics._Original_LinearGradient",
-                        "android.graphics.BitmapShader",        "android.graphics._Original_BitmapShader",
-                        "android.graphics.ComposeShader",       "android.graphics._Original_ComposeShader",
                         "android.graphics.RadialGradient",      "android.graphics._Original_RadialGradient",
+                        "android.graphics.Shader",              "android.graphics._Original_Shader",
                         "android.graphics.SweepGradient",       "android.graphics._Original_SweepGradient",
+                        "android.graphics.Typeface",            "android.graphics._Original_Typeface",
                         "android.os.ServiceManager",            "android.os._Original_ServiceManager",
                         "android.util.FloatMath",               "android.util._Original_FloatMath",
                         "android.view.SurfaceView",             "android.view._Original_SurfaceView",
diff --git a/tools/preload/20090811.compiled b/tools/preload/20090811.compiled
index dd61487..6dbeca0 100644
--- a/tools/preload/20090811.compiled
+++ b/tools/preload/20090811.compiled
Binary files differ
diff --git a/tools/preload/Android.mk b/tools/preload/Android.mk
index e6fa103..f325870 100644
--- a/tools/preload/Android.mk
+++ b/tools/preload/Android.mk
@@ -3,13 +3,13 @@
 include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES := \
-	ClassRank.java \
 	Compile.java  \
 	LoadedClass.java \
 	MemoryUsage.java \
 	Operation.java \
 	Policy.java \
 	PrintCsv.java \
+	PrintHtmlDiff.java \
 	PrintPsTree.java \
 	Proc.java \
 	Record.java \
diff --git a/tools/preload/ClassRank.java b/tools/preload/ClassRank.java
deleted file mode 100644
index c562d5c..0000000
--- a/tools/preload/ClassRank.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 java.util.Comparator;
-
-/**
- * Ranks classes for preloading based on how long their operations took
- * and how early the operations happened. Higher ranked classes come first.
- */
-class ClassRank implements Comparator<Operation> {
-
-    /**
-     * Increase this number to add more weight to classes which were loaded
-     * earlier.
-     */
-    static final int SEQUENCE_WEIGHT = 500; // 0.5ms
-
-    static final int BUCKET_SIZE = 5;
-
-    public int compare(Operation a, Operation b) {
-        // Higher ranked operations should come first.
-        int result = rankOf(b) - rankOf(a);
-        if (result != 0) {
-            return result;
-        }
-
-        // Make sure we don't drop one of two classes w/ the same rank.
-        // If a load and an initialization have the same rank, it's OK
-        // to treat the operations equally.
-        return a.loadedClass.name.compareTo(b.loadedClass.name);
-    }
-
-    /** Ranks the given operation. */
-    private static int rankOf(Operation o) {
-        return o.medianExclusiveTimeMicros()
-                + SEQUENCE_WEIGHT / (o.index / BUCKET_SIZE + 1);
-    }
-}
-
-
diff --git a/tools/preload/LoadedClass.java b/tools/preload/LoadedClass.java
index 9ef17f5..86e5dfc 100644
--- a/tools/preload/LoadedClass.java
+++ b/tools/preload/LoadedClass.java
@@ -51,7 +51,7 @@
     }
 
     void measureMemoryUsage() {
-//        this.memoryUsage = MemoryUsage.forClass(name);
+        this.memoryUsage = MemoryUsage.forClass(name);
     }
 
     int mlt = -1;
@@ -76,6 +76,10 @@
         return mit = calculateMedian(initializations);
     }
 
+    int medianTimeMicros() {
+        return medianInitTimeMicros() + medianLoadTimeMicros();
+    }
+
     /** Calculates the median duration for a list of operations. */
     private static int calculateMedian(List<Operation> operations) {
         int size = operations.size();
@@ -99,18 +103,18 @@
         }
     }
 
-    /** Returns names of apps that loaded this class. */
-    Set<String> applicationNames() {
-        Set<String> appNames = new HashSet<String>();
-        addProcessNames(loads, appNames);
-        addProcessNames(initializations, appNames);
-        return appNames;
+    /** Returns names of processes that loaded this class. */
+    Set<String> processNames() {
+        Set<String> names = new HashSet<String>();
+        addProcessNames(loads, names);
+        addProcessNames(initializations, names);
+        return names;
     }
 
-    private void addProcessNames(List<Operation> ops, Set<String> appNames) {
+    private void addProcessNames(List<Operation> ops, Set<String> names) {
         for (Operation operation : ops) {
-            if (operation.process.isApplication()) {
-                appNames.add(operation.process.name);
+            if (operation.process.fromZygote()) {
+                names.add(operation.process.name);
             }
         }
     }
@@ -123,31 +127,4 @@
     public String toString() {
         return name;
     }
-
-    /**
-     * Returns true if this class's initialization causes the given class to
-     * initialize.
-     */
-    public boolean initializes(LoadedClass clazz, Set<LoadedClass> visited) {
-        // Avoid infinite recursion.
-        if (!visited.add(this)) {
-            return false;
-        }
-
-        if (clazz == this) {
-            return true;
-        }
-
-        for (Operation initialization : initializations) {
-            if (initialization.loadedClass.initializes(clazz, visited)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public boolean isPreloadable() {
-        return systemClass && Policy.isPreloadableClass(name);
-    }
 }
diff --git a/tools/preload/MemoryUsage.java b/tools/preload/MemoryUsage.java
index e5dfb2a..bc21b6f 100644
--- a/tools/preload/MemoryUsage.java
+++ b/tools/preload/MemoryUsage.java
@@ -34,8 +34,8 @@
     static final MemoryUsage NOT_AVAILABLE = new MemoryUsage();
     
     static int errorCount = 0;
-    static final int MAXIMUM_ERRORS = 10;        // give up after this many fails
 
+    // These values are in 1kB increments (not 4kB like you'd expect).
     final int nativeSharedPages;
     final int javaSharedPages;
     final int otherSharedPages;
@@ -123,15 +123,24 @@
         return allocSize - freedSize;
     }
 
+    int totalHeap() {
+        return javaHeapSize() + (int) nativeHeapSize;
+    }
+
     int javaPagesInK() {
-        return (javaSharedPages + javaPrivatePages) * 4;
+        return javaSharedPages + javaPrivatePages;
     }
 
     int nativePagesInK() {
-        return (nativeSharedPages + nativePrivatePages) * 4;
+        return nativeSharedPages + nativePrivatePages;
     }
     int otherPagesInK() {
-        return (otherSharedPages + otherPrivatePages) * 4;
+        return otherSharedPages + otherPrivatePages;
+    }
+
+    int totalPages() {
+        return javaSharedPages + javaPrivatePages + nativeSharedPages +
+                nativePrivatePages + otherSharedPages + otherPrivatePages;
     }
 
     /**
@@ -163,13 +172,6 @@
      * Measures memory usage for the given class.
      */
     static MemoryUsage forClass(String className) {
-        
-        // This is a coarse approximation for determining that no device is connected,
-        // or that the communication protocol has changed, but we'll keep going and stop whining.
-        if (errorCount >= MAXIMUM_ERRORS) {
-            return NOT_AVAILABLE;
-        }
-        
         MeasureWithTimeout measurer = new MeasureWithTimeout(className);
 
         new Thread(measurer).start();
@@ -280,4 +282,17 @@
             e.printStackTrace();
         }
     }
+
+    /** Measures memory usage information and stores it in the model. */
+    public static void main(String[] args) throws IOException,
+            ClassNotFoundException {
+        Root root = Root.fromFile(args[0]);
+        root.baseline = baseline();
+        for (LoadedClass loadedClass : root.loadedClasses.values()) {
+            if (loadedClass.systemClass) {
+                loadedClass.measureMemoryUsage();
+            }
+        }
+        root.toFile(args[0]);
+    }
 }
diff --git a/tools/preload/Policy.java b/tools/preload/Policy.java
index ade889e3..7a190ac 100644
--- a/tools/preload/Policy.java
+++ b/tools/preload/Policy.java
@@ -19,10 +19,10 @@
 import java.util.Set;
 
 /**
- * This is not instantiated - we just provide data for other classes to use
+ * Policy that governs which classes are preloaded.
  */
 public class Policy {
-    
+
     /**
      * No constructor - use static methods only
      */
@@ -31,18 +31,24 @@
     /**
      * This location (in the build system) of the preloaded-classes file.
      */
-    private static final String PRELOADED_CLASS_FILE
+    static final String PRELOADED_CLASS_FILE
             = "frameworks/base/preloaded-classes";
 
     /**
      * Long running services. These are restricted in their contribution to the 
      * preloader because their launch time is less critical.
      */
+    // TODO: Generate this automatically from package manager.
     private static final Set<String> SERVICES = new HashSet<String>(Arrays.asList(
-            "system_server",
-            "com.google.process.content",
-            "android.process.media",
-            "com.google.process.gapps"
+        "system_server",
+        "com.google.process.content",
+        "android.process.media",
+        "com.android.phone",
+        "com.google.android.apps.maps.FriendService",
+        "com.google.android.apps.maps.LocationFriendService",
+        "com.google.android.googleapps",
+        "com.google.process.gapps",
+        "android.tts"
     ));
 
     /**
@@ -63,24 +69,15 @@
     ));
 
     /**
-     * Returns the path/file name of the preloaded classes file that will be written 
-     * by WritePreloadedClassFile.
-     */
-    public static String getPreloadedClassFileName() {
-        return PRELOADED_CLASS_FILE;
-    }
-    
-    /**
-     * Reports if the given process name is a "long running" process or service
+     * Returns true if the given process name is a "long running" process or
+     * service.
      */
     public static boolean isService(String processName) {
         return SERVICES.contains(processName);
     }
-    
-    /**
-     * Reports if the given class should never be preloaded
-     */
-    public static boolean isPreloadableClass(String className) {
-        return !EXCLUDED_CLASSES.contains(className);
+
+    /**Reports if the given class should be preloaded. */
+    public static boolean isPreloadable(LoadedClass clazz) {
+        return clazz.systemClass && !EXCLUDED_CLASSES.contains(clazz.name);
     }
 }
diff --git a/tools/preload/PrintCsv.java b/tools/preload/PrintCsv.java
index 62f4271..1820830 100644
--- a/tools/preload/PrintCsv.java
+++ b/tools/preload/PrintCsv.java
@@ -18,9 +18,12 @@
 import java.io.FileInputStream;
 import java.io.ObjectInputStream;
 import java.io.BufferedInputStream;
+import java.io.Writer;
+import java.io.PrintStream;
 import java.util.Set;
 import java.util.HashSet;
 import java.util.TreeSet;
+import java.util.Iterator;
 
 /**
  * Prints raw information in CSV format.
@@ -36,71 +39,89 @@
 
         Root root = Root.fromFile(args[0]);
 
-        System.out.println("Name"
-                + ",Preloaded"
-                + ",Median Load Time (us)"
-                + ",Median Init Time (us)"
-                + ",Process Names"
-                + ",Load Count"
-                + ",Init Count");
-//                + ",Managed Heap (B)"
-//                + ",Native Heap (B)"
-//                + ",Managed Pages (kB)"
-//                + ",Native Pages (kB)"
-//                + ",Other Pages (kB)");
+        printHeaders(System.out);
 
-        MemoryUsage baseline = root.baseline;
+        MemoryUsage baseline = MemoryUsage.baseline();
 
         for (LoadedClass loadedClass : root.loadedClasses.values()) {
             if (!loadedClass.systemClass) {
                 continue;
             }
 
-            System.out.print(loadedClass.name);
-            System.out.print(',');
-            System.out.print(loadedClass.preloaded);
-            System.out.print(',');
-            System.out.print(loadedClass.medianLoadTimeMicros());
-            System.out.print(',');
-            System.out.print(loadedClass.medianInitTimeMicros());
-            System.out.print(',');
-            System.out.print('"');
-
-            Set<String> procNames = new TreeSet<String>();
-            for (Operation op : loadedClass.loads)
-                procNames.add(op.process.name);
-            for (Operation op : loadedClass.initializations)
-                procNames.add(op.process.name);
-            for (String name : procNames) {
-                System.out.print(name + "\n");
-            }
-            
-            System.out.print('"');
-            System.out.print(',');
-            System.out.print(loadedClass.loads.size());
-            System.out.print(',');
-            System.out.print(loadedClass.initializations.size());
-/*
-            if (loadedClass.memoryUsage.isAvailable()) {
-                MemoryUsage subtracted
-                        = loadedClass.memoryUsage.subtract(baseline);
-
-                System.out.print(',');
-                System.out.print(subtracted.javaHeapSize());
-                System.out.print(',');
-                System.out.print(subtracted.nativeHeapSize);
-                System.out.print(',');
-                System.out.print(subtracted.javaPagesInK());
-                System.out.print(',');
-                System.out.print(subtracted.nativePagesInK());
-                System.out.print(',');
-                System.out.print(subtracted.otherPagesInK());
-
-            } else {
-                System.out.print(",n/a,n/a,n/a,n/a,n/a");
-            }
-*/
-            System.out.println();
+            printRow(System.out, baseline, loadedClass);
         }
     }
+
+    static void printHeaders(PrintStream out) {
+        out.println("Name"
+                + ",Preloaded"
+                + ",Median Load Time (us)"
+                + ",Median Init Time (us)"
+                + ",Process Names"
+                + ",Load Count"
+                + ",Init Count"
+                + ",Managed Heap (B)"
+                + ",Native Heap (B)"
+                + ",Managed Pages (kB)"
+                + ",Native Pages (kB)"
+                + ",Other Pages (kB)");
+    }
+
+    static void printRow(PrintStream out, MemoryUsage baseline,
+            LoadedClass loadedClass) {
+        out.print(loadedClass.name);
+        out.print(',');
+        out.print(loadedClass.preloaded);
+        out.print(',');
+        out.print(loadedClass.medianLoadTimeMicros());
+        out.print(',');
+        out.print(loadedClass.medianInitTimeMicros());
+        out.print(',');
+        out.print('"');
+
+        Set<String> procNames = new TreeSet<String>();
+        for (Operation op : loadedClass.loads)
+            procNames.add(op.process.name);
+        for (Operation op : loadedClass.initializations)
+            procNames.add(op.process.name);
+
+        if (procNames.size() <= 3) {
+            for (String name : procNames) {
+                out.print(name + "\n");
+            }
+        } else {
+            Iterator<String> i = procNames.iterator();
+            out.print(i.next() + "\n");
+            out.print(i.next() + "\n");
+            out.print("...and " + (procNames.size() - 2)
+                    + " others.");
+        }
+
+        out.print('"');
+        out.print(',');
+        out.print(loadedClass.loads.size());
+        out.print(',');
+        out.print(loadedClass.initializations.size());
+
+        if (loadedClass.memoryUsage.isAvailable()) {
+            MemoryUsage subtracted
+                    = loadedClass.memoryUsage.subtract(baseline);
+
+            out.print(',');
+            out.print(subtracted.javaHeapSize());
+            out.print(',');
+            out.print(subtracted.nativeHeapSize);
+            out.print(',');
+            out.print(subtracted.javaPagesInK());
+            out.print(',');
+            out.print(subtracted.nativePagesInK());
+            out.print(',');
+            out.print(subtracted.otherPagesInK());
+
+        } else {
+            out.print(",n/a,n/a,n/a,n/a,n/a");
+        }
+
+        out.println();
+    }
 }
diff --git a/tools/preload/PrintHtmlDiff.java b/tools/preload/PrintHtmlDiff.java
new file mode 100644
index 0000000..b101c85
--- /dev/null
+++ b/tools/preload/PrintHtmlDiff.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2009 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 java.io.IOException;
+import java.io.FileReader;
+import java.io.BufferedReader;
+import java.io.PrintStream;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.HashSet;
+import java.util.Iterator;
+
+/**
+ * Prints HTML containing removed and added files.
+ */
+public class PrintHtmlDiff {
+
+    private static final String OLD_PRELOADED_CLASSES
+            = "old-preloaded-classes";
+
+    public static void main(String[] args) throws IOException,
+            ClassNotFoundException {
+        Root root = Root.fromFile(args[0]);
+
+        BufferedReader oldClasses = new BufferedReader(
+            new FileReader(OLD_PRELOADED_CLASSES));
+
+        // Classes loaded implicitly by the zygote.
+        Set<LoadedClass> zygote = new HashSet<LoadedClass>();
+        for (Proc proc : root.processes.values()) {
+            if (proc.name.equals("zygote")) {
+                for (Operation op : proc.operations) {
+                    zygote.add(op.loadedClass);
+                }
+                break;
+            }
+        }
+
+        Set<LoadedClass> removed = new TreeSet<LoadedClass>();
+        Set<LoadedClass> added = new TreeSet<LoadedClass>();
+
+        for (LoadedClass loadedClass : root.loadedClasses.values()) {
+            if (loadedClass.preloaded && !zygote.contains(loadedClass)) {
+                added.add(loadedClass);
+            }
+        }
+
+        String line;
+        while ((line = oldClasses.readLine()) != null) {
+            line = line.trim();
+            LoadedClass clazz = root.loadedClasses.get(line);
+            if (clazz != null) {
+                added.remove(clazz);
+                if (!clazz.preloaded) removed.add(clazz);
+            }
+        }
+
+        PrintStream out = System.out;
+
+        out.println("<html><body>");
+        out.println("<style>");
+        out.println("a, th, td, h2 { font-family: arial }");
+        out.println("th, td { font-size: small }");
+        out.println("</style>");
+        out.println("<script src=\"sorttable.js\"></script>");
+        out.println("<p><a href=\"#removed\">Removed</a>");
+        out.println("<a name=\"added\"/><h2>Added</h2>");
+        printTable(out, root.baseline, added);
+        out.println("<a name=\"removed\"/><h2>Removed</h2>");
+        printTable(out, root.baseline, removed);
+        out.println("</body></html>");
+    }
+
+    static void printTable(PrintStream out, MemoryUsage baseline,
+            Iterable<LoadedClass> classes) {
+        out.println("<table border=\"1\" cellpadding=\"5\""
+                + " class=\"sortable\">");
+
+        out.println("<thead><tr>");
+        out.println("<th>Name</th>");
+        out.println("<th>Load Time (us)</th>");
+        out.println("<th>Loaded By</th>");
+        out.println("<th>Heap (B)</th>");
+        out.println("<th>Pages</th>");
+        out.println("</tr></thead>");
+
+        for (LoadedClass clazz : classes) {
+            out.println("<tr>");
+            out.println("<td>" + clazz.name + "</td>");
+            out.println("<td>" + clazz.medianTimeMicros() + "</td>");
+
+            out.println("<td>");
+            Set<String> procNames = new TreeSet<String>();
+            for (Operation op : clazz.loads) procNames.add(op.process.name);
+            for (Operation op : clazz.initializations) {
+                procNames.add(op.process.name);
+            }
+            if (procNames.size() <= 3) {
+                for (String name : procNames) {
+                    out.print(name + "<br/>");
+                }
+            } else {
+                Iterator<String> i = procNames.iterator();
+                out.print(i.next() + "<br/>");
+                out.print(i.next() + "<br/>");
+                out.print("...and " + (procNames.size() - 2)
+                        + " others.");
+            }
+            out.println("</td>");
+
+            if (clazz.memoryUsage.isAvailable()) {
+                MemoryUsage subtracted
+                        = clazz.memoryUsage.subtract(baseline);
+
+                out.println("<td>" + (subtracted.javaHeapSize()
+                        + subtracted.nativeHeapSize) + "</td>");
+                out.println("<td>" + subtracted.totalPages() + "</td>");
+            } else {
+                for (int i = 0; i < 2; i++) {
+                    out.println("<td>n/a</td>");                    
+                }
+            }
+
+            out.println("</tr>");
+        }
+
+        out.println("</table>");
+    }
+}
diff --git a/tools/preload/Proc.java b/tools/preload/Proc.java
index 66e04dc..2105021 100644
--- a/tools/preload/Proc.java
+++ b/tools/preload/Proc.java
@@ -14,13 +14,11 @@
  * limitations under the License.
  */
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Collections;
 import java.io.Serializable;
 
 /**
@@ -30,11 +28,6 @@
 
     private static final long serialVersionUID = 0;
 
-    /**
-     * Default percentage of time to cut off of app class loading times.
-     */
-    static final int PERCENTAGE_TO_PRELOAD = 75;
-
     /** Parent process. */
     final Proc parent;
 
@@ -80,72 +73,11 @@
     }
 
     /**
-     * Returns the percentage of time we should cut by preloading for this
-     * app.
+     * Returns true if this process comes from the zygote.
      */
-    int percentageToPreload() {
-        return PERCENTAGE_TO_PRELOAD;
-    }
-
-    /**
-     * Returns a list of classes which should be preloaded.
-     */
-    List<LoadedClass> highestRankedClasses() {
-        if (!isApplication() || Policy.isService(this.name)) {
-            return Collections.emptyList();
-        }
-
-        // Sort by rank.
-        Operation[] ranked = new Operation[operations.size()];
-        ranked = operations.toArray(ranked);
-        Arrays.sort(ranked, new ClassRank());
-
-        // The percentage of time to save by preloading.
-        int timeToSave = totalTimeMicros() * percentageToPreload() / 100;
-        int timeSaved = 0;
-
-        int count = 0;
-        List<LoadedClass> highest = new ArrayList<LoadedClass>();
-        for (Operation operation : ranked) {
-            if (timeSaved >= timeToSave || count++ > 100) {
-                break;
-            }
-
-            if (!Policy.isPreloadableClass(operation.loadedClass.name)) {
-                continue;
-            }
-            
-            if (!operation.loadedClass.systemClass) {
-                continue;
-            }
-    
-            highest.add(operation.loadedClass);
-            timeSaved += operation.medianExclusiveTimeMicros();
-        }
-
-        return highest;
-    }
-
-    /**
-     * Total time spent class loading and initializing.
-     */
-    int totalTimeMicros() {
-        int totalTime = 0;
-        for (Operation operation : operations) {
-            totalTime += operation.medianExclusiveTimeMicros();
-        }
-        return totalTime;
-    }
-
-    /** 
-     * Returns true if this process is an app.
-     */
-    public boolean isApplication() {
-        if (name.equals("com.android.development")) {
-            return false;
-        }
-
-        return parent != null && parent.name.equals("zygote");
+    public boolean fromZygote() {
+        return parent != null && parent.name.equals("zygote")
+                && !name.equals("com.android.development");
     }
 
     /**
diff --git a/tools/preload/Root.java b/tools/preload/Root.java
index 949f9b7..0bc29bf 100644
--- a/tools/preload/Root.java
+++ b/tools/preload/Root.java
@@ -46,7 +46,7 @@
     final Map<String, LoadedClass> loadedClasses
             = new HashMap<String, LoadedClass>();
 
-    final MemoryUsage baseline = MemoryUsage.baseline();
+    MemoryUsage baseline = MemoryUsage.baseline();
 
     /**
      * Records class loads and initializations.
diff --git a/tools/preload/WritePreloadedClassFile.java b/tools/preload/WritePreloadedClassFile.java
index b209af0..96c539b 100644
--- a/tools/preload/WritePreloadedClassFile.java
+++ b/tools/preload/WritePreloadedClassFile.java
@@ -24,12 +24,18 @@
 import java.util.TreeSet;
 
 /**
- * Writes /frameworks/base/preloaded-classes. Also updates LoadedClass.preloaded
- * fields and writes over compiled log file.
+ * Writes /frameworks/base/preloaded-classes. Also updates
+ * {@link LoadedClass#preloaded} fields and writes over compiled log file.
  */
 public class WritePreloadedClassFile {
 
-    public static void main(String[] args) throws IOException, ClassNotFoundException {
+    /**
+     * Preload any class that take longer to load than MIN_LOAD_TIME_MICROS us.
+     */
+    static final int MIN_LOAD_TIME_MICROS = 1250;
+
+    public static void main(String[] args) throws IOException,
+            ClassNotFoundException {
         if (args.length != 1) {
             System.err.println("Usage: WritePreloadedClassFile [compiled log]");
             System.exit(-1);
@@ -44,48 +50,64 @@
 
         // Open preloaded-classes file for output.
         Writer out = new BufferedWriter(new OutputStreamWriter(
-                new FileOutputStream(Policy.getPreloadedClassFileName()),
+                new FileOutputStream(Policy.PRELOADED_CLASS_FILE),
                 Charset.forName("US-ASCII")));
 
-        out.write("# Classes which are preloaded by com.android.internal.os.ZygoteInit.\n");
-        out.write("# Automatically generated by /frameworks/base/tools/preload.\n");
-        out.write("# percent=" + Proc.PERCENTAGE_TO_PRELOAD
-                + ", weight=" + ClassRank.SEQUENCE_WEIGHT
-                + ", bucket_size=" + ClassRank.BUCKET_SIZE
-                + "\n");
+        out.write("# Classes which are preloaded by"
+                + " com.android.internal.os.ZygoteInit.\n");
+        out.write("# Automatically generated by frameworks/base/tools/preload/"
+            + WritePreloadedClassFile.class.getSimpleName() + ".java.\n");
+        out.write("# MIN_LOAD_TIME_MICROS=" + MIN_LOAD_TIME_MICROS + "\n");
 
+        /*
+         * The set of classes to preload. We preload a class if:
+         *
+         *  a) it's loaded in the bootclasspath (i.e., is a system class)
+         *  b) it takes > MIN_LOAD_TIME_MICROS us to load, and
+         *  c) it's loaded by more than one process, or it's loaded by an
+         *     application (i.e., not a long running service)
+         */
         Set<LoadedClass> toPreload = new TreeSet<LoadedClass>();
 
-        // Preload all classes that were loaded by at least 2 apps, if both
-        // apps run at the same time, they'll share memory.
+        // Preload classes that were loaded by at least 2 processes. Hopefully,
+        // the memory associated with these classes will be shared.
         for (LoadedClass loadedClass : root.loadedClasses.values()) {
-            if (!loadedClass.isPreloadable()) {
-                continue;
-            }
-
-            Set<String> appNames = loadedClass.applicationNames();
-
-            if (appNames.size() > 3) {
+            Set<String> names = loadedClass.processNames();
+            if (shouldPreload(loadedClass) && names.size() > 1) {
                 toPreload.add(loadedClass);
             }
         }
 
-        // Try to make individual apps start faster by preloading slowest
-        // classes.
+        int initialSize = toPreload.size();
+        System.out.println(initialSize
+                + " classses were loaded by more than one app.");
+
+        // Preload eligable classes from applications (not long-running
+        // services).
         for (Proc proc : root.processes.values()) {
-            toPreload.addAll(proc.highestRankedClasses());
+            if (proc.fromZygote() && !Policy.isService(proc.name)) {
+                for (Operation operation : proc.operations) {
+                    LoadedClass loadedClass = operation.loadedClass;
+                    if (shouldPreload(loadedClass)) {
+                        toPreload.add(loadedClass);
+                    }
+                }
+            }
         }
 
-        System.out.println(toPreload.size() + " classes will be preloaded.");
+        System.out.println("Added " + (toPreload.size() - initialSize)
+                + " more to speed up applications.");
 
-        // Make classes that were already loaded by the zygote explicit.
+        System.out.println(toPreload.size()
+                + " total classes will be preloaded.");
+
+        // Make classes that were implicitly loaded by the zygote explicit.
         // This adds minimal overhead but avoid confusion about classes not
         // appearing in the list.
-        addAllClassesFor("zygote", root, toPreload);
+        addAllClassesFrom("zygote", root, toPreload);
 
         for (LoadedClass loadedClass : toPreload) {
-            out.write(loadedClass.name);
-            out.write('\n');
+            out.write(loadedClass.name + "\n");
         }
 
         out.close();
@@ -97,18 +119,26 @@
         root.toFile(rootFile);
     }
 
-    private static void addAllClassesFor(String packageName, Root root,
-                                         Set<LoadedClass> toPreload) {
+    private static void addAllClassesFrom(String processName, Root root,
+            Set<LoadedClass> toPreload) {
         for (Proc proc : root.processes.values()) {
-            if (proc.name.equals(packageName)) {
+            if (proc.name.equals(processName)) {
                 for (Operation operation : proc.operations) {
-                    // TODO: I'm not sure how the zygote loaded classes that
-                    // aren't supposed to be preloadable...
-                    if (operation.loadedClass.isPreloadable()) {
+                    boolean preloadable
+                            = Policy.isPreloadable(operation.loadedClass);
+                    if (preloadable) {
                         toPreload.add(operation.loadedClass);
                     }
                 }
             }
         }
     }
+
+    /**
+     * Returns true if the class should be preloaded.
+     */
+    private static boolean shouldPreload(LoadedClass clazz) {
+        return Policy.isPreloadable(clazz)
+                && clazz.medianTimeMicros() > MIN_LOAD_TIME_MICROS;
+    }
 }
diff --git a/tools/preload/loadclass/LoadClass.java b/tools/preload/loadclass/LoadClass.java
index 471cc84..a71b6a8 100644
--- a/tools/preload/loadclass/LoadClass.java
+++ b/tools/preload/loadclass/LoadClass.java
@@ -35,7 +35,11 @@
 
         if (args.length > 0) {
             try {
+                long start = System.currentTimeMillis();
                 Class.forName(args[0]);
+                long elapsed = System.currentTimeMillis() - start;
+                Log.i("LoadClass", "Loaded " + args[0] + " in " + elapsed
+                        + "ms.");
             } catch (ClassNotFoundException e) {
                 Log.w("LoadClass", e);
                 return;
diff --git a/tools/preload/preload.ipr b/tools/preload/preload.ipr
index f78bf76..0c9621c 100644
--- a/tools/preload/preload.ipr
+++ b/tools/preload/preload.ipr
@@ -25,7 +25,28 @@
     <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
   </component>
   <component name="CodeStyleSettingsManager">
-    <option name="PER_PROJECT_SETTINGS" />
+    <option name="PER_PROJECT_SETTINGS">
+      <value>
+        <ADDITIONAL_INDENT_OPTIONS fileType="java">
+          <option name="INDENT_SIZE" value="4" />
+          <option name="CONTINUATION_INDENT_SIZE" value="8" />
+          <option name="TAB_SIZE" value="4" />
+          <option name="USE_TAB_CHARACTER" value="false" />
+          <option name="SMART_TABS" value="false" />
+          <option name="LABEL_INDENT_SIZE" value="0" />
+          <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+        </ADDITIONAL_INDENT_OPTIONS>
+        <ADDITIONAL_INDENT_OPTIONS fileType="xml">
+          <option name="INDENT_SIZE" value="4" />
+          <option name="CONTINUATION_INDENT_SIZE" value="8" />
+          <option name="TAB_SIZE" value="4" />
+          <option name="USE_TAB_CHARACTER" value="false" />
+          <option name="SMART_TABS" value="false" />
+          <option name="LABEL_INDENT_SIZE" value="0" />
+          <option name="LABEL_INDENT_ABSOLUTE" value="false" />
+        </ADDITIONAL_INDENT_OPTIONS>
+      </value>
+    </option>
     <option name="USE_PER_PROJECT_SETTINGS" value="false" />
   </component>
   <component name="CompilerConfiguration">
@@ -405,6 +426,7 @@
   </component>
   <component name="VcsDirectoryMappings">
     <mapping directory="" vcs="Perforce" />
+    <mapping directory="/Volumes/Android/donut/frameworks/base" vcs="Git" />
   </component>
   <component name="VssConfiguration">
     <option name="CLIENT_PATH" value="" />
diff --git a/tools/preload/sorttable.js b/tools/preload/sorttable.js
new file mode 100644
index 0000000..25bccb2
--- /dev/null
+++ b/tools/preload/sorttable.js
@@ -0,0 +1,493 @@
+/*
+  SortTable
+  version 2
+  7th April 2007
+  Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/
+  
+  Instructions:
+  Download this file
+  Add <script src="sorttable.js"></script> to your HTML
+  Add class="sortable" to any table you'd like to make sortable
+  Click on the headers to sort
+  
+  Thanks to many, many people for contributions and suggestions.
+  Licenced as X11: http://www.kryogenix.org/code/browser/licence.html
+  This basically means: do what you want with it.
+*/
+
+ 
+var stIsIE = /*@cc_on!@*/false;
+
+sorttable = {
+  init: function() {
+    // quit if this function has already been called
+    if (arguments.callee.done) return;
+    // flag this function so we don't do the same thing twice
+    arguments.callee.done = true;
+    // kill the timer
+    if (_timer) clearInterval(_timer);
+    
+    if (!document.createElement || !document.getElementsByTagName) return;
+    
+    sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/;
+    
+    forEach(document.getElementsByTagName('table'), function(table) {
+      if (table.className.search(/\bsortable\b/) != -1) {
+        sorttable.makeSortable(table);
+      }
+    });
+    
+  },
+  
+  makeSortable: function(table) {
+    if (table.getElementsByTagName('thead').length == 0) {
+      // table doesn't have a tHead. Since it should have, create one and
+      // put the first table row in it.
+      the = document.createElement('thead');
+      the.appendChild(table.rows[0]);
+      table.insertBefore(the,table.firstChild);
+    }
+    // Safari doesn't support table.tHead, sigh
+    if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];
+    
+    if (table.tHead.rows.length != 1) return; // can't cope with two header rows
+    
+    // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as
+    // "total" rows, for example). This is B&R, since what you're supposed
+    // to do is put them in a tfoot. So, if there are sortbottom rows,
+    // for backwards compatibility, move them to tfoot (creating it if needed).
+    sortbottomrows = [];
+    for (var i=0; i<table.rows.length; i++) {
+      if (table.rows[i].className.search(/\bsortbottom\b/) != -1) {
+        sortbottomrows[sortbottomrows.length] = table.rows[i];
+      }
+    }
+    if (sortbottomrows) {
+      if (table.tFoot == null) {
+        // table doesn't have a tfoot. Create one.
+        tfo = document.createElement('tfoot');
+        table.appendChild(tfo);
+      }
+      for (var i=0; i<sortbottomrows.length; i++) {
+        tfo.appendChild(sortbottomrows[i]);
+      }
+      delete sortbottomrows;
+    }
+    
+    // work through each column and calculate its type
+    headrow = table.tHead.rows[0].cells;
+    for (var i=0; i<headrow.length; i++) {
+      // manually override the type with a sorttable_type attribute
+      if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col
+        mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/);
+        if (mtch) { override = mtch[1]; }
+	      if (mtch && typeof sorttable["sort_"+override] == 'function') {
+	        headrow[i].sorttable_sortfunction = sorttable["sort_"+override];
+	      } else {
+	        headrow[i].sorttable_sortfunction = sorttable.guessType(table,i);
+	      }
+	      // make it clickable to sort
+	      headrow[i].sorttable_columnindex = i;
+	      headrow[i].sorttable_tbody = table.tBodies[0];
+	      dean_addEvent(headrow[i],"click", function(e) {
+
+          if (this.className.search(/\bsorttable_sorted\b/) != -1) {
+            // if we're already sorted by this column, just 
+            // reverse the table, which is quicker
+            sorttable.reverse(this.sorttable_tbody);
+            this.className = this.className.replace('sorttable_sorted',
+                                                    'sorttable_sorted_reverse');
+            this.removeChild(document.getElementById('sorttable_sortfwdind'));
+            sortrevind = document.createElement('span');
+            sortrevind.id = "sorttable_sortrevind";
+            sortrevind.innerHTML = stIsIE ? '&nbsp<font face="webdings">5</font>' : '&nbsp;&#x25B4;';
+            this.appendChild(sortrevind);
+            return;
+          }
+          if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) {
+            // if we're already sorted by this column in reverse, just 
+            // re-reverse the table, which is quicker
+            sorttable.reverse(this.sorttable_tbody);
+            this.className = this.className.replace('sorttable_sorted_reverse',
+                                                    'sorttable_sorted');
+            this.removeChild(document.getElementById('sorttable_sortrevind'));
+            sortfwdind = document.createElement('span');
+            sortfwdind.id = "sorttable_sortfwdind";
+            sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
+            this.appendChild(sortfwdind);
+            return;
+          }
+          
+          // remove sorttable_sorted classes
+          theadrow = this.parentNode;
+          forEach(theadrow.childNodes, function(cell) {
+            if (cell.nodeType == 1) { // an element
+              cell.className = cell.className.replace('sorttable_sorted_reverse','');
+              cell.className = cell.className.replace('sorttable_sorted','');
+            }
+          });
+          sortfwdind = document.getElementById('sorttable_sortfwdind');
+          if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); }
+          sortrevind = document.getElementById('sorttable_sortrevind');
+          if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); }
+          
+          this.className += ' sorttable_sorted';
+          sortfwdind = document.createElement('span');
+          sortfwdind.id = "sorttable_sortfwdind";
+          sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
+          this.appendChild(sortfwdind);
+
+	        // build an array to sort. This is a Schwartzian transform thing,
+	        // i.e., we "decorate" each row with the actual sort key,
+	        // sort based on the sort keys, and then put the rows back in order
+	        // which is a lot faster because you only do getInnerText once per row
+	        row_array = [];
+	        col = this.sorttable_columnindex;
+	        rows = this.sorttable_tbody.rows;
+	        for (var j=0; j<rows.length; j++) {
+	          row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]];
+	        }
+	        /* If you want a stable sort, uncomment the following line */
+	        //sorttable.shaker_sort(row_array, this.sorttable_sortfunction);
+	        /* and comment out this one */
+	        row_array.sort(this.sorttable_sortfunction);
+	        
+	        tb = this.sorttable_tbody;
+	        for (var j=0; j<row_array.length; j++) {
+	          tb.appendChild(row_array[j][1]);
+	        }
+	        
+	        delete row_array;
+	      });
+	    }
+    }
+  },
+  
+  guessType: function(table, column) {
+    // guess the type of a column based on its first non-blank row
+    sortfn = sorttable.sort_alpha;
+    for (var i=0; i<table.tBodies[0].rows.length; i++) {
+      text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]);
+      if (text != '') {
+        if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {
+          return sorttable.sort_numeric;
+        }
+        // check for a date: dd/mm/yyyy or dd/mm/yy 
+        // can have / or . or - as separator
+        // can be mm/dd as well
+        possdate = text.match(sorttable.DATE_RE)
+        if (possdate) {
+          // looks like a date
+          first = parseInt(possdate[1]);
+          second = parseInt(possdate[2]);
+          if (first > 12) {
+            // definitely dd/mm
+            return sorttable.sort_ddmm;
+          } else if (second > 12) {
+            return sorttable.sort_mmdd;
+          } else {
+            // looks like a date, but we can't tell which, so assume
+            // that it's dd/mm (English imperialism!) and keep looking
+            sortfn = sorttable.sort_ddmm;
+          }
+        }
+      }
+    }
+    return sortfn;
+  },
+  
+  getInnerText: function(node) {
+    // gets the text we want to use for sorting for a cell.
+    // strips leading and trailing whitespace.
+    // this is *not* a generic getInnerText function; it's special to sorttable.
+    // for example, you can override the cell text with a customkey attribute.
+    // it also gets .value for <input> fields.
+    
+    hasInputs = (typeof node.getElementsByTagName == 'function') &&
+                 node.getElementsByTagName('input').length;
+    
+    if (node.getAttribute("sorttable_customkey") != null) {
+      return node.getAttribute("sorttable_customkey");
+    }
+    else if (typeof node.textContent != 'undefined' && !hasInputs) {
+      return node.textContent.replace(/^\s+|\s+$/g, '');
+    }
+    else if (typeof node.innerText != 'undefined' && !hasInputs) {
+      return node.innerText.replace(/^\s+|\s+$/g, '');
+    }
+    else if (typeof node.text != 'undefined' && !hasInputs) {
+      return node.text.replace(/^\s+|\s+$/g, '');
+    }
+    else {
+      switch (node.nodeType) {
+        case 3:
+          if (node.nodeName.toLowerCase() == 'input') {
+            return node.value.replace(/^\s+|\s+$/g, '');
+          }
+        case 4:
+          return node.nodeValue.replace(/^\s+|\s+$/g, '');
+          break;
+        case 1:
+        case 11:
+          var innerText = '';
+          for (var i = 0; i < node.childNodes.length; i++) {
+            innerText += sorttable.getInnerText(node.childNodes[i]);
+          }
+          return innerText.replace(/^\s+|\s+$/g, '');
+          break;
+        default:
+          return '';
+      }
+    }
+  },
+  
+  reverse: function(tbody) {
+    // reverse the rows in a tbody
+    newrows = [];
+    for (var i=0; i<tbody.rows.length; i++) {
+      newrows[newrows.length] = tbody.rows[i];
+    }
+    for (var i=newrows.length-1; i>=0; i--) {
+       tbody.appendChild(newrows[i]);
+    }
+    delete newrows;
+  },
+  
+  /* sort functions
+     each sort function takes two parameters, a and b
+     you are comparing a[0] and b[0] */
+  sort_numeric: function(a,b) {
+    aa = parseFloat(a[0].replace(/[^0-9.-]/g,''));
+    if (isNaN(aa)) aa = 0;
+    bb = parseFloat(b[0].replace(/[^0-9.-]/g,'')); 
+    if (isNaN(bb)) bb = 0;
+    return aa-bb;
+  },
+  sort_alpha: function(a,b) {
+    if (a[0]==b[0]) return 0;
+    if (a[0]<b[0]) return -1;
+    return 1;
+  },
+  sort_ddmm: function(a,b) {
+    mtch = a[0].match(sorttable.DATE_RE);
+    y = mtch[3]; m = mtch[2]; d = mtch[1];
+    if (m.length == 1) m = '0'+m;
+    if (d.length == 1) d = '0'+d;
+    dt1 = y+m+d;
+    mtch = b[0].match(sorttable.DATE_RE);
+    y = mtch[3]; m = mtch[2]; d = mtch[1];
+    if (m.length == 1) m = '0'+m;
+    if (d.length == 1) d = '0'+d;
+    dt2 = y+m+d;
+    if (dt1==dt2) return 0;
+    if (dt1<dt2) return -1;
+    return 1;
+  },
+  sort_mmdd: function(a,b) {
+    mtch = a[0].match(sorttable.DATE_RE);
+    y = mtch[3]; d = mtch[2]; m = mtch[1];
+    if (m.length == 1) m = '0'+m;
+    if (d.length == 1) d = '0'+d;
+    dt1 = y+m+d;
+    mtch = b[0].match(sorttable.DATE_RE);
+    y = mtch[3]; d = mtch[2]; m = mtch[1];
+    if (m.length == 1) m = '0'+m;
+    if (d.length == 1) d = '0'+d;
+    dt2 = y+m+d;
+    if (dt1==dt2) return 0;
+    if (dt1<dt2) return -1;
+    return 1;
+  },
+  
+  shaker_sort: function(list, comp_func) {
+    // A stable sort function to allow multi-level sorting of data
+    // see: http://en.wikipedia.org/wiki/Cocktail_sort
+    // thanks to Joseph Nahmias
+    var b = 0;
+    var t = list.length - 1;
+    var swap = true;
+
+    while(swap) {
+        swap = false;
+        for(var i = b; i < t; ++i) {
+            if ( comp_func(list[i], list[i+1]) > 0 ) {
+                var q = list[i]; list[i] = list[i+1]; list[i+1] = q;
+                swap = true;
+            }
+        } // for
+        t--;
+
+        if (!swap) break;
+
+        for(var i = t; i > b; --i) {
+            if ( comp_func(list[i], list[i-1]) < 0 ) {
+                var q = list[i]; list[i] = list[i-1]; list[i-1] = q;
+                swap = true;
+            }
+        } // for
+        b++;
+
+    } // while(swap)
+  }  
+}
+
+/* ******************************************************************
+   Supporting functions: bundled here to avoid depending on a library
+   ****************************************************************** */
+
+// Dean Edwards/Matthias Miller/John Resig
+
+/* for Mozilla/Opera9 */
+if (document.addEventListener) {
+    document.addEventListener("DOMContentLoaded", sorttable.init, false);
+}
+
+/* for Internet Explorer */
+/*@cc_on @*/
+/*@if (@_win32)
+    document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
+    var script = document.getElementById("__ie_onload");
+    script.onreadystatechange = function() {
+        if (this.readyState == "complete") {
+            sorttable.init(); // call the onload handler
+        }
+    };
+/*@end @*/
+
+/* for Safari */
+if (/WebKit/i.test(navigator.userAgent)) { // sniff
+    var _timer = setInterval(function() {
+        if (/loaded|complete/.test(document.readyState)) {
+            sorttable.init(); // call the onload handler
+        }
+    }, 10);
+}
+
+/* for other browsers */
+window.onload = sorttable.init;
+
+// written by Dean Edwards, 2005
+// with input from Tino Zijdel, Matthias Miller, Diego Perini
+
+// http://dean.edwards.name/weblog/2005/10/add-event/
+
+function dean_addEvent(element, type, handler) {
+	if (element.addEventListener) {
+		element.addEventListener(type, handler, false);
+	} else {
+		// assign each event handler a unique ID
+		if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++;
+		// create a hash table of event types for the element
+		if (!element.events) element.events = {};
+		// create a hash table of event handlers for each element/event pair
+		var handlers = element.events[type];
+		if (!handlers) {
+			handlers = element.events[type] = {};
+			// store the existing event handler (if there is one)
+			if (element["on" + type]) {
+				handlers[0] = element["on" + type];
+			}
+		}
+		// store the event handler in the hash table
+		handlers[handler.$$guid] = handler;
+		// assign a global event handler to do all the work
+		element["on" + type] = handleEvent;
+	}
+};
+// a counter used to create unique IDs
+dean_addEvent.guid = 1;
+
+function removeEvent(element, type, handler) {
+	if (element.removeEventListener) {
+		element.removeEventListener(type, handler, false);
+	} else {
+		// delete the event handler from the hash table
+		if (element.events && element.events[type]) {
+			delete element.events[type][handler.$$guid];
+		}
+	}
+};
+
+function handleEvent(event) {
+	var returnValue = true;
+	// grab the event object (IE uses a global event object)
+	event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
+	// get a reference to the hash table of event handlers
+	var handlers = this.events[event.type];
+	// execute each event handler
+	for (var i in handlers) {
+		this.$$handleEvent = handlers[i];
+		if (this.$$handleEvent(event) === false) {
+			returnValue = false;
+		}
+	}
+	return returnValue;
+};
+
+function fixEvent(event) {
+	// add W3C standard event methods
+	event.preventDefault = fixEvent.preventDefault;
+	event.stopPropagation = fixEvent.stopPropagation;
+	return event;
+};
+fixEvent.preventDefault = function() {
+	this.returnValue = false;
+};
+fixEvent.stopPropagation = function() {
+  this.cancelBubble = true;
+}
+
+// Dean's forEach: http://dean.edwards.name/base/forEach.js
+/*
+	forEach, version 1.0
+	Copyright 2006, Dean Edwards
+	License: http://www.opensource.org/licenses/mit-license.php
+*/
+
+// array-like enumeration
+if (!Array.forEach) { // mozilla already supports this
+	Array.forEach = function(array, block, context) {
+		for (var i = 0; i < array.length; i++) {
+			block.call(context, array[i], i, array);
+		}
+	};
+}
+
+// generic enumeration
+Function.prototype.forEach = function(object, block, context) {
+	for (var key in object) {
+		if (typeof this.prototype[key] == "undefined") {
+			block.call(context, object[key], key, object);
+		}
+	}
+};
+
+// character enumeration
+String.forEach = function(string, block, context) {
+	Array.forEach(string.split(""), function(chr, index) {
+		block.call(context, chr, index, string);
+	});
+};
+
+// globally resolve forEach enumeration
+var forEach = function(object, block, context) {
+	if (object) {
+		var resolve = Object; // default
+		if (object instanceof Function) {
+			// functions have a "length" property
+			resolve = Function;
+		} else if (object.forEach instanceof Function) {
+			// the object implements a custom forEach method so use that
+			object.forEach(block, context);
+			return;
+		} else if (typeof object == "string") {
+			// the object is a string
+			resolve = String;
+		} else if (typeof object.length == "number") {
+			// the object is array-like
+			resolve = Array;
+		}
+		resolve.forEach(object, block, context);
+	}
+};
+