Merge "add Noto Sans Khmer and Lao" into klp-dev
diff --git a/Android.mk b/Android.mk
index 69d1daf..eaafa87 100644
--- a/Android.mk
+++ b/Android.mk
@@ -142,7 +142,7 @@
 	core/java/android/net/INetworkStatsService.aidl \
 	core/java/android/net/INetworkStatsSession.aidl \
 	core/java/android/net/nsd/INsdManager.aidl \
-	core/java/android/nfc/INdefPushCallback.aidl \
+	core/java/android/nfc/IAppCallback.aidl \
 	core/java/android/nfc/INfcAdapter.aidl \
 	core/java/android/nfc/INfcAdapterExtras.aidl \
 	core/java/android/nfc/INfcTag.aidl \
diff --git a/api/current.txt b/api/current.txt
index 4b66d08..eb3596a 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -25,6 +25,7 @@
     field public static final java.lang.String BIND_NFC_SERVICE = "android.permission.BIND_NFC_SERVICE";
     field public static final java.lang.String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE";
     field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE";
+    field public static final java.lang.String BIND_PRINT_SPOOLER_SERVICE = "android.permission.BIND_PRINT_SPOOLER_SERVICE";
     field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS";
     field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE";
     field public static final java.lang.String BIND_VPN_SERVICE = "android.permission.BIND_VPN_SERVICE";
@@ -288,6 +289,7 @@
     field public static final deprecated int animationResolution = 16843546; // 0x101031a
     field public static final int antialias = 16843034; // 0x101011a
     field public static final int anyDensity = 16843372; // 0x101026c
+    field public static final int apduServiceBanner = 16843755; // 0x10103eb
     field public static final int apiKey = 16843281; // 0x1010211
     field public static final int author = 16843444; // 0x10102b4
     field public static final int authorities = 16842776; // 0x1010018
@@ -843,6 +845,7 @@
     field public static final int prompt = 16843131; // 0x101017b
     field public static final int propertyName = 16843489; // 0x10102e1
     field public static final int protectionLevel = 16842761; // 0x1010009
+    field public static final int provideAssistData = 16843756; // 0x10103ec
     field public static final int publicKey = 16843686; // 0x10103a6
     field public static final int queryActionMsg = 16843227; // 0x10101db
     field public static final int queryAfterZeroResults = 16843394; // 0x1010282
@@ -867,6 +870,7 @@
     field public static final int reqKeyboardType = 16843304; // 0x1010228
     field public static final int reqNavigation = 16843306; // 0x101022a
     field public static final int reqTouchScreen = 16843303; // 0x1010227
+    field public static final int requireDeviceUnlock = 16843754; // 0x10103ea
     field public static final int required = 16843406; // 0x101028e
     field public static final int requiredAccountType = 16843734; // 0x10103d6
     field public static final int requiredForAllUsers = 16843728; // 0x10103d0
@@ -5734,7 +5738,6 @@
     method public final android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle);
     method public deprecated void cancelSync(android.net.Uri);
     method public static void cancelSync(android.accounts.Account, java.lang.String);
-    method public static void cancelSync(android.content.SyncRequest);
     method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
     method public static deprecated android.content.SyncInfo getCurrentSync();
     method public static java.util.List<android.content.SyncInfo> getCurrentSyncs();
@@ -5955,6 +5958,7 @@
     field public static final int BIND_WAIVE_PRIORITY = 32; // 0x20
     field public static final java.lang.String BLUETOOTH_SERVICE = "bluetooth";
     field public static final java.lang.String CAMERA_SERVICE = "camera";
+    field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
     field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
     field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
     field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2
@@ -6713,9 +6717,7 @@
     field public final android.accounts.Account account;
     field public final java.lang.String authority;
     field public final android.os.Bundle extras;
-    field public final boolean isService;
     field public final long period;
-    field public final android.content.ComponentName service;
   }
 
   public class ReceiverCallNotAllowedException extends android.util.AndroidRuntimeException {
@@ -6836,7 +6838,6 @@
 
   public class SyncRequest implements android.os.Parcelable {
     method public int describeContents();
-    method public boolean isExpedited();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator CREATOR;
   }
@@ -6844,18 +6845,15 @@
   public static class SyncRequest.Builder {
     ctor public SyncRequest.Builder();
     method public android.content.SyncRequest build();
-    method public android.content.SyncRequest.Builder setAllowMetered(boolean);
+    method public android.content.SyncRequest.Builder setDisallowMetered(boolean);
     method public android.content.SyncRequest.Builder setExpedited(boolean);
     method public android.content.SyncRequest.Builder setExtras(android.os.Bundle);
     method public android.content.SyncRequest.Builder setIgnoreBackoff(boolean);
     method public android.content.SyncRequest.Builder setIgnoreSettings(boolean);
     method public android.content.SyncRequest.Builder setManual(boolean);
     method public android.content.SyncRequest.Builder setNoRetry(boolean);
-    method public android.content.SyncRequest.Builder setPriority(int);
     method public android.content.SyncRequest.Builder setSyncAdapter(android.accounts.Account, java.lang.String);
-    method public android.content.SyncRequest.Builder setSyncAdapter(android.content.ComponentName);
-    method public android.content.SyncRequest.Builder setTransferSize(long, long);
-    method public android.content.SyncRequest.Builder syncOnce(long, long);
+    method public android.content.SyncRequest.Builder syncOnce();
     method public android.content.SyncRequest.Builder syncPeriodic(long, long);
   }
 
@@ -6882,12 +6880,6 @@
     field public boolean tooManyRetries;
   }
 
-  public abstract class SyncService extends android.app.Service {
-    ctor public SyncService();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract void onPerformSync(android.os.Bundle, android.content.SyncResult);
-  }
-
   public class SyncStats implements android.os.Parcelable {
     ctor public SyncStats();
     ctor public SyncStats(android.os.Parcel);
@@ -7328,7 +7320,7 @@
     field public static final java.lang.String FEATURE_LOCATION_NETWORK = "android.hardware.location.network";
     field public static final java.lang.String FEATURE_MICROPHONE = "android.hardware.microphone";
     field public static final java.lang.String FEATURE_NFC = "android.hardware.nfc";
-    field public static final java.lang.String FEATURE_NFC_HCE = "android.hardware.nfc.hce";
+    field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
     field public static final java.lang.String FEATURE_SCREEN_LANDSCAPE = "android.hardware.screen.landscape";
     field public static final java.lang.String FEATURE_SCREEN_PORTRAIT = "android.hardware.screen.portrait";
     field public static final java.lang.String FEATURE_SENSOR_ACCELEROMETER = "android.hardware.sensor.accelerometer";
@@ -11931,6 +11923,7 @@
     field public static final java.lang.String KEY_PROVIDER_ENABLED = "providerEnabled";
     field public static final java.lang.String KEY_PROXIMITY_ENTERING = "entering";
     field public static final java.lang.String KEY_STATUS_CHANGED = "status";
+    field public static final java.lang.String MODE_CHANGED_ACTION = "android.location.MODE_CHANGED";
     field public static final java.lang.String NETWORK_PROVIDER = "network";
     field public static final java.lang.String PASSIVE_PROVIDER = "passive";
     field public static final java.lang.String PROVIDERS_CHANGED_ACTION = "android.location.PROVIDERS_CHANGED";
@@ -11957,13 +11950,14 @@
     ctor public SettingInjectorService(java.lang.String);
     method protected abstract android.location.SettingInjectorService.Status getStatus();
     method protected final void onHandleIntent(android.content.Intent);
-    field public static final java.lang.String ACTION_INJECTED_SETTING_CHANGED = "com.android.location.InjectedSettingChanged";
+    field public static final java.lang.String ACTION_INJECTED_SETTING_CHANGED = "android.location.InjectedSettingChanged";
+    field public static final java.lang.String ACTION_SERVICE_INTENT = "android.location.SettingInjectorService";
+    field public static final java.lang.String ATTRIBUTES_NAME = "injected-location-setting";
+    field public static final java.lang.String META_DATA_NAME = "android.location.SettingInjectorService";
   }
 
   public static final class SettingInjectorService.Status {
     ctor public SettingInjectorService.Status(java.lang.String, boolean);
-    field public final boolean enabled;
-    field public final java.lang.String summary;
   }
 
 }
@@ -12900,7 +12894,9 @@
     field public static final int MEDIA_INFO_BUFFERING_START = 701; // 0x2bd
     field public static final int MEDIA_INFO_METADATA_UPDATE = 802; // 0x322
     field public static final int MEDIA_INFO_NOT_SEEKABLE = 801; // 0x321
+    field public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902; // 0x386
     field public static final int MEDIA_INFO_UNKNOWN = 1; // 0x1
+    field public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901; // 0x385
     field public static final int MEDIA_INFO_VIDEO_RENDERING_START = 3; // 0x3
     field public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700; // 0x2bc
     field public static final java.lang.String MEDIA_MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
@@ -13197,6 +13193,7 @@
     ctor public RemoteControlClient(android.app.PendingIntent);
     ctor public RemoteControlClient(android.app.PendingIntent, android.os.Looper);
     method public android.media.RemoteControlClient.MetadataEditor editMetadata(boolean);
+    method public void setMetadataUpdateListener(android.media.RemoteControlClient.OnMetadataUpdateListener);
     method public void setOnGetPlaybackPositionListener(android.media.RemoteControlClient.OnGetPlaybackPositionListener);
     method public void setPlaybackPositionUpdateListener(android.media.RemoteControlClient.OnPlaybackPositionUpdateListener);
     method public void setPlaybackState(int);
@@ -13209,6 +13206,7 @@
     field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
     field public static final int FLAG_KEY_MEDIA_POSITION_UPDATE = 256; // 0x100
     field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
+    field public static final int FLAG_KEY_MEDIA_RATING = 512; // 0x200
     field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
     field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
     field public static final int PLAYSTATE_BUFFERING = 8; // 0x8
@@ -13223,18 +13221,32 @@
   }
 
   public class RemoteControlClient.MetadataEditor {
+    method public synchronized void addEditableKey(int);
     method public synchronized void apply();
     method public synchronized void clear();
+    method public synchronized void clearEditableKeys();
     method public synchronized android.media.RemoteControlClient.MetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
     method public synchronized android.media.RemoteControlClient.MetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
     method public synchronized android.media.RemoteControlClient.MetadataEditor putString(int, java.lang.String) throws java.lang.IllegalArgumentException;
     field public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
+    field public static final int LONG_KEY_RATING_BY_OTHERS = 102; // 0x66
+    field public static final int LONG_KEY_RATING_BY_USER = 268435457; // 0x10000001
+    field public static final int LONG_KEY_RATING_TYPE = 101; // 0x65
+    field public static final long RATING_HEART = -1L; // 0xffffffffffffffffL
+    field public static final long RATING_NOT_RATED = -101L; // 0xffffffffffffff9bL
+    field public static final long RATING_THUMB_UP_DOWN = -2L; // 0xfffffffffffffffeL
   }
 
   public static abstract interface RemoteControlClient.OnGetPlaybackPositionListener {
     method public abstract long onGetPlaybackPosition();
   }
 
+  public static abstract interface RemoteControlClient.OnMetadataUpdateListener {
+    method public abstract void onMetadataUpdateBitmap(int, android.graphics.Bitmap);
+    method public abstract void onMetadataUpdateLong(int, long);
+    method public abstract void onMetadataUpdateString(int, java.lang.String);
+  }
+
   public static abstract interface RemoteControlClient.OnPlaybackPositionUpdateListener {
     method public abstract void onPlaybackPositionUpdate(long);
   }
@@ -15192,7 +15204,7 @@
     method public void disableReaderMode(android.app.Activity);
     method public void enableForegroundDispatch(android.app.Activity, android.app.PendingIntent, android.content.IntentFilter[], java.lang.String[][]);
     method public deprecated void enableForegroundNdefPush(android.app.Activity, android.nfc.NdefMessage);
-    method public void enableReaderMode(android.app.Activity, int);
+    method public void enableReaderMode(android.app.Activity, android.nfc.NfcAdapter.ReaderCallback, int, android.os.Bundle);
     method public static android.nfc.NfcAdapter getDefaultAdapter(android.content.Context);
     method public boolean isEnabled();
     method public boolean isNdefPushEnabled();
@@ -15208,12 +15220,14 @@
     field public static final java.lang.String EXTRA_ADAPTER_STATE = "android.nfc.extra.ADAPTER_STATE";
     field public static final java.lang.String EXTRA_ID = "android.nfc.extra.ID";
     field public static final java.lang.String EXTRA_NDEF_MESSAGES = "android.nfc.extra.NDEF_MESSAGES";
+    field public static final java.lang.String EXTRA_READER_PRESENCE_CHECK_DELAY = "presence";
     field public static final java.lang.String EXTRA_TAG = "android.nfc.extra.TAG";
     field public static final int FLAG_READER_KOVIO = 16; // 0x10
     field public static final int FLAG_READER_NFC_A = 1; // 0x1
     field public static final int FLAG_READER_NFC_B = 2; // 0x2
     field public static final int FLAG_READER_NFC_F = 4; // 0x4
     field public static final int FLAG_READER_NFC_V = 8; // 0x8
+    field public static final int FLAG_READER_NO_PLATFORM_SOUNDS = 256; // 0x100
     field public static final int FLAG_READER_SKIP_NDEF_CHECK = 128; // 0x80
     field public static final int STATE_OFF = 1; // 0x1
     field public static final int STATE_ON = 3; // 0x3
@@ -15233,6 +15247,10 @@
     method public abstract void onNdefPushComplete(android.nfc.NfcEvent);
   }
 
+  public static abstract interface NfcAdapter.ReaderCallback {
+    method public abstract void onTagDiscovered(android.nfc.Tag);
+  }
+
   public final class NfcEvent {
     field public final android.nfc.NfcAdapter nfcAdapter;
   }
@@ -15258,15 +15276,19 @@
 
 package android.nfc.cardemulation {
 
-  public final class CardEmulationManager {
-    method public static synchronized android.nfc.cardemulation.CardEmulationManager getInstance(android.nfc.NfcAdapter);
+  public final class CardEmulation {
+    method public static synchronized android.nfc.cardemulation.CardEmulation getInstance(android.nfc.NfcAdapter);
+    method public int getSelectionModeForCategory(java.lang.String);
     method public boolean isDefaultServiceForAid(android.content.ComponentName, java.lang.String);
     method public boolean isDefaultServiceForCategory(android.content.ComponentName, java.lang.String);
-    field public static final java.lang.String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.ACTION_CHANGE_DEFAULT";
+    field public static final java.lang.String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT";
     field public static final java.lang.String CATEGORY_OTHER = "other";
     field public static final java.lang.String CATEGORY_PAYMENT = "payment";
     field public static final java.lang.String EXTRA_CATEGORY = "category";
     field public static final java.lang.String EXTRA_SERVICE_COMPONENT = "component";
+    field public static final int SELECTION_MODE_ALWAYS_ASK = 1; // 0x1
+    field public static final int SELECTION_MODE_ASK_IF_CONFLICT = 2; // 0x2
+    field public static final int SELECTION_MODE_PREFER_DEFAULT = 0; // 0x0
   }
 
   public abstract class HostApduService extends android.app.Service {
@@ -15275,19 +15297,18 @@
     method public final android.os.IBinder onBind(android.content.Intent);
     method public abstract void onDeactivated(int);
     method public byte[] processCommandApdu(byte[], android.os.Bundle);
-    method public abstract deprecated byte[] processCommandApdu(byte[], int);
     method public final void sendResponseApdu(byte[]);
     field public static final int DEACTIVATION_DESELECTED = 1; // 0x1
     field public static final int DEACTIVATION_LINK_LOSS = 0; // 0x0
-    field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.HostApduService";
-    field public static final java.lang.String SERVICE_META_DATA = "android.nfc.HostApduService";
+    field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.cardemulation.action.HOST_APDU_SERVICE";
+    field public static final java.lang.String SERVICE_META_DATA = "android.nfc.cardemulation.host_apdu_service";
   }
 
   public abstract class OffHostApduService extends android.app.Service {
     ctor public OffHostApduService();
     method public abstract android.os.IBinder onBind(android.content.Intent);
-    field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.OffHostApduService";
-    field public static final java.lang.String SERVICE_META_DATA = "android.nfc.OffHostApduService";
+    field public static final java.lang.String SERVICE_INTERFACE = "android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE";
+    field public static final java.lang.String SERVICE_META_DATA = "android.nfc.cardemulation.off_host_apdu_service";
   }
 
 }
@@ -19142,7 +19163,7 @@
     method public void onFinish();
     method public abstract void onLayout(android.print.PrintAttributes, android.print.PrintAttributes, android.os.CancellationSignal, android.print.PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle);
     method public void onStart();
-    method public abstract void onWrite(android.print.PageRange[], java.io.FileDescriptor, android.os.CancellationSignal, android.print.PrintDocumentAdapter.WriteResultCallback);
+    method public abstract void onWrite(android.print.PageRange[], android.os.ParcelFileDescriptor, android.os.CancellationSignal, android.print.PrintDocumentAdapter.WriteResultCallback);
     field public static final java.lang.String METADATA_KEY_PRINT_PREVIEW = "KEY_METADATA_PRINT_PREVIEW";
   }
 
@@ -19162,6 +19183,7 @@
     method public int describeContents();
     method public int getColorMode();
     method public int getContentType();
+    method public long getDataSize();
     method public int getFittingMode();
     method public android.print.PrintAttributes.Margins getMargins();
     method public android.print.PrintAttributes.MediaSize getMediaSize();
@@ -19193,7 +19215,7 @@
   public class PrintFileDocumentAdapter extends android.print.PrintDocumentAdapter {
     ctor public PrintFileDocumentAdapter(android.content.Context, java.io.File, android.print.PrintDocumentInfo);
     method public void onLayout(android.print.PrintAttributes, android.print.PrintAttributes, android.os.CancellationSignal, android.print.PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle);
-    method public void onWrite(android.print.PageRange[], java.io.FileDescriptor, android.os.CancellationSignal, android.print.PrintDocumentAdapter.WriteResultCallback);
+    method public void onWrite(android.print.PageRange[], android.os.ParcelFileDescriptor, android.os.CancellationSignal, android.print.PrintDocumentAdapter.WriteResultCallback);
   }
 
   public final class PrintJob {
@@ -19215,9 +19237,10 @@
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator CREATOR;
     field public static final int PRINT_JOB_ID_UNDEFINED = -1; // 0xffffffff
-    field public static final int STATE_CANCELED = 6; // 0x6
-    field public static final int STATE_COMPLETED = 4; // 0x4
-    field public static final int STATE_FAILED = 5; // 0x5
+    field public static final int STATE_BLOCKED = 4; // 0x4
+    field public static final int STATE_CANCELED = 7; // 0x7
+    field public static final int STATE_COMPLETED = 5; // 0x5
+    field public static final int STATE_FAILED = 6; // 0x6
     field public static final int STATE_QUEUED = 2; // 0x2
     field public static final int STATE_STARTED = 3; // 0x3
   }
@@ -19335,17 +19358,19 @@
 package android.printservice {
 
   public final class PrintDocument {
-    method public java.io.FileDescriptor getData();
+    method public android.os.ParcelFileDescriptor getData();
     method public android.print.PrintDocumentInfo getInfo();
   }
 
   public final class PrintJob {
+    method public boolean block(java.lang.String);
     method public boolean cancel();
     method public boolean complete();
     method public boolean fail(java.lang.String);
     method public android.printservice.PrintDocument getDocument();
     method public int getId();
     method public android.print.PrintJobInfo getInfo();
+    method public boolean isBlocked();
     method public boolean isCancelled();
     method public boolean isCompleted();
     method public boolean isFailed();
@@ -19377,9 +19402,11 @@
     method public final boolean isDestroyed();
     method public final boolean isPrinterDiscoveryStarted();
     method public abstract void onDestroy();
-    method public abstract void onRequestPrinterUpdate(android.print.PrinterId);
     method public abstract void onStartPrinterDiscovery(java.util.List<android.print.PrinterId>);
+    method public abstract void onStartPrinterStateTracking(android.print.PrinterId);
     method public abstract void onStopPrinterDiscovery();
+    method public abstract void onStopPrinterStateTracking(android.print.PrinterId);
+    method public abstract void onValidatePrinters(java.util.List<android.print.PrinterId>);
     method public final void removePrinters(java.util.List<android.print.PrinterId>);
     method public final void updatePrinters(java.util.List<android.print.PrinterInfo>);
   }
@@ -19392,8 +19419,8 @@
     ctor public AlarmClock();
     field public static final java.lang.String ACTION_SET_ALARM = "android.intent.action.SET_ALARM";
     field public static final java.lang.String ACTION_SET_TIMER = "android.intent.action.SET_TIMER";
+    field public static final java.lang.String ACTION_SHOW_ALARMS = "android.intent.action.SHOW_ALARMS";
     field public static final java.lang.String EXTRA_DAYS = "android.intent.extra.alarm.DAYS";
-    field public static final java.lang.String EXTRA_DELETE_AFTER_USE = "android.intent.extra.alarm.DELETE_AFTER_USE";
     field public static final java.lang.String EXTRA_HOUR = "android.intent.extra.alarm.HOUR";
     field public static final java.lang.String EXTRA_LENGTH = "android.intent.extra.alarm.LENGTH";
     field public static final java.lang.String EXTRA_MESSAGE = "android.intent.extra.alarm.MESSAGE";
@@ -20815,68 +20842,85 @@
   }
 
   public final class DocumentsContract {
-    ctor public DocumentsContract();
-    method public static android.net.Uri buildContentsUri(java.lang.String, java.lang.String, java.lang.String);
-    method public static android.net.Uri buildContentsUri(android.net.Uri);
-    method public static android.net.Uri buildDocumentUri(java.lang.String, java.lang.String, java.lang.String);
-    method public static android.net.Uri buildDocumentUri(android.net.Uri, java.lang.String);
-    method public static android.net.Uri buildRootUri(java.lang.String, java.lang.String);
+    method public static android.net.Uri buildChildDocumentsUri(java.lang.String, java.lang.String);
+    method public static android.net.Uri buildDocumentUri(java.lang.String, java.lang.String);
+    method public static android.net.Uri buildRecentDocumentsUri(java.lang.String, java.lang.String);
     method public static android.net.Uri buildRootsUri(java.lang.String);
-    method public static android.net.Uri buildSearchUri(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
-    method public static android.net.Uri buildSearchUri(android.net.Uri, java.lang.String);
+    method public static android.net.Uri buildSearchDocumentsUri(java.lang.String, java.lang.String, java.lang.String);
     method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String);
-    method public static java.lang.String getDocId(android.net.Uri);
+    method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri);
+    method public static java.lang.String getDocumentId(android.net.Uri);
+    method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal);
     method public static android.net.Uri[] getOpenDocuments(android.content.Context);
     method public static java.lang.String getRootId(android.net.Uri);
-    method public static java.lang.String getSearchQuery(android.net.Uri);
-    method public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point);
-    method public static boolean isLocalOnly(android.net.Uri);
-    method public static void notifyRootsChanged(android.content.Context, java.lang.String);
-    method public static boolean renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String);
-    method public static android.net.Uri setLocalOnly(android.net.Uri);
-    field public static final java.lang.String EXTRA_HAS_MORE = "has_more";
-    field public static final java.lang.String EXTRA_REQUEST_MORE = "request_more";
-    field public static final java.lang.String EXTRA_THUMBNAIL_SIZE = "thumbnail_size";
+    method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
+    field public static final java.lang.String EXTRA_ERROR = "error";
+    field public static final java.lang.String EXTRA_INFO = "info";
+    field public static final java.lang.String EXTRA_LOADING = "loading";
   }
 
-  public static abstract interface DocumentsContract.DocumentColumns implements android.provider.OpenableColumns {
-    field public static final java.lang.String DOC_ID = "doc_id";
-    field public static final java.lang.String FLAGS = "flags";
-    field public static final java.lang.String LAST_MODIFIED = "last_modified";
-    field public static final java.lang.String MIME_TYPE = "mime_type";
-    field public static final java.lang.String SUMMARY = "summary";
-  }
-
-  public static class DocumentsContract.Documents {
-    field public static final java.lang.String DOC_ID_ROOT = "0";
-    field public static final int FLAG_PREFERS_GRID = 64; // 0x40
-    field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1
+  public static final class DocumentsContract.Document {
+    field public static final java.lang.String COLUMN_DISPLAY_NAME = "_display_name";
+    field public static final java.lang.String COLUMN_DOCUMENT_ID = "document_id";
+    field public static final java.lang.String COLUMN_FLAGS = "flags";
+    field public static final java.lang.String COLUMN_ICON = "icon";
+    field public static final java.lang.String COLUMN_LAST_MODIFIED = "last_modified";
+    field public static final java.lang.String COLUMN_MIME_TYPE = "mime_type";
+    field public static final java.lang.String COLUMN_SIZE = "_size";
+    field public static final java.lang.String COLUMN_SUMMARY = "summary";
+    field public static final int FLAG_DIR_PREFERS_GRID = 32; // 0x20
+    field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8
+    field public static final int FLAG_DIR_SUPPORTS_SEARCH = 16; // 0x10
     field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4
-    field public static final int FLAG_SUPPORTS_RENAME = 2; // 0x2
-    field public static final int FLAG_SUPPORTS_SEARCH = 16; // 0x10
-    field public static final int FLAG_SUPPORTS_THUMBNAIL = 8; // 0x8
-    field public static final int FLAG_SUPPORTS_WRITE = 32; // 0x20
-    field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.cursor.dir/doc";
+    field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1
+    field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2
+    field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.document/directory";
   }
 
-  public static abstract interface DocumentsContract.RootColumns {
-    field public static final java.lang.String AVAILABLE_BYTES = "available_bytes";
-    field public static final java.lang.String ICON = "icon";
-    field public static final java.lang.String ROOT_ID = "root_id";
-    field public static final java.lang.String ROOT_TYPE = "root_type";
-    field public static final java.lang.String SUMMARY = "summary";
-    field public static final java.lang.String TITLE = "title";
-  }
-
-  public static class DocumentsContract.Roots {
-    field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.cursor.dir/root";
-    field public static final java.lang.String MIME_TYPE_ITEM = "vnd.android.cursor.item/root";
+  public static final class DocumentsContract.Root {
+    field public static final java.lang.String COLUMN_AVAILABLE_BYTES = "available_bytes";
+    field public static final java.lang.String COLUMN_DOCUMENT_ID = "document_id";
+    field public static final java.lang.String COLUMN_FLAGS = "flags";
+    field public static final java.lang.String COLUMN_ICON = "icon";
+    field public static final java.lang.String COLUMN_ROOT_ID = "root_id";
+    field public static final java.lang.String COLUMN_ROOT_TYPE = "root_type";
+    field public static final java.lang.String COLUMN_SUMMARY = "summary";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final int FLAG_ADVANCED = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 2; // 0x2
+    field public static final int FLAG_PROVIDES_AUDIO = 8; // 0x8
+    field public static final int FLAG_PROVIDES_IMAGES = 32; // 0x20
+    field public static final int FLAG_PROVIDES_VIDEO = 16; // 0x10
+    field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1
+    field public static final int FLAG_SUPPORTS_RECENTS = 64; // 0x40
     field public static final int ROOT_TYPE_DEVICE = 3; // 0x3
-    field public static final int ROOT_TYPE_DEVICE_ADVANCED = 4; // 0x4
     field public static final int ROOT_TYPE_SERVICE = 1; // 0x1
     field public static final int ROOT_TYPE_SHORTCUT = 2; // 0x2
   }
 
+  public abstract class DocumentsProvider extends android.content.ContentProvider {
+    ctor public DocumentsProvider();
+    method public java.lang.String createDocument(java.lang.String, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
+    method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+    method public void deleteDocument(java.lang.String) throws java.io.FileNotFoundException;
+    method public java.lang.String getDocumentType(java.lang.String) throws java.io.FileNotFoundException;
+    method public final java.lang.String getType(android.net.Uri);
+    method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+    method public abstract android.os.ParcelFileDescriptor openDocument(java.lang.String, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+    method public android.content.res.AssetFileDescriptor openDocumentThumbnail(java.lang.String, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+    method public final android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
+    method public final android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+    method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
+    method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
+    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    method public abstract android.database.Cursor queryChildDocuments(java.lang.String, java.lang.String[], java.lang.String) throws java.io.FileNotFoundException;
+    method public abstract android.database.Cursor queryDocument(java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
+    method public android.database.Cursor queryRecentDocuments(java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
+    method public abstract android.database.Cursor queryRoots(java.lang.String[]) throws java.io.FileNotFoundException;
+    method public android.database.Cursor querySearchDocuments(java.lang.String, java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
+    method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+  }
+
   public final deprecated class LiveFolders implements android.provider.BaseColumns {
     field public static final java.lang.String ACTION_CREATE_LIVE_FOLDER = "android.intent.action.CREATE_LIVE_FOLDER";
     field public static final java.lang.String DESCRIPTION = "description";
@@ -21228,6 +21272,7 @@
     field public static final java.lang.String ACTION_APPLICATION_DEVELOPMENT_SETTINGS = "android.settings.APPLICATION_DEVELOPMENT_SETTINGS";
     field public static final java.lang.String ACTION_APPLICATION_SETTINGS = "android.settings.APPLICATION_SETTINGS";
     field public static final java.lang.String ACTION_BLUETOOTH_SETTINGS = "android.settings.BLUETOOTH_SETTINGS";
+    field public static final java.lang.String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
     field public static final java.lang.String ACTION_DATA_ROAMING_SETTINGS = "android.settings.DATA_ROAMING_SETTINGS";
     field public static final java.lang.String ACTION_DATE_SETTINGS = "android.settings.DATE_SETTINGS";
     field public static final java.lang.String ACTION_DEVICE_INFO_SETTINGS = "android.settings.DEVICE_INFO_SETTINGS";
@@ -21696,6 +21741,7 @@
     method public deprecated synchronized void resize(int);
     method public void setFromFieldPacker(int, android.renderscript.FieldPacker);
     method public void setFromFieldPacker(int, int, android.renderscript.FieldPacker);
+    method public void setOnBufferAvailableListener(android.renderscript.Allocation.OnBufferAvailableListener);
     method public void setSurface(android.view.Surface);
     method public void syncAll(int);
     field public static final int USAGE_GRAPHICS_CONSTANTS = 8; // 0x8
@@ -21716,6 +21762,10 @@
     enum_constant public static final android.renderscript.Allocation.MipmapControl MIPMAP_ON_SYNC_TO_TEXTURE;
   }
 
+  public static abstract interface Allocation.OnBufferAvailableListener {
+    method public abstract void onBufferAvailable(android.renderscript.Allocation);
+  }
+
   public class AllocationAdapter extends android.renderscript.Allocation {
     method public static android.renderscript.AllocationAdapter create1D(android.renderscript.RenderScript, android.renderscript.Allocation);
     method public static android.renderscript.AllocationAdapter create2D(android.renderscript.RenderScript, android.renderscript.Allocation);
@@ -22365,7 +22415,7 @@
   }
 
   public final class ScriptIntrinsicColorMatrix extends android.renderscript.ScriptIntrinsic {
-    method public static android.renderscript.ScriptIntrinsicColorMatrix create(android.renderscript.RenderScript, android.renderscript.Element);
+    method public static deprecated android.renderscript.ScriptIntrinsicColorMatrix create(android.renderscript.RenderScript, android.renderscript.Element);
     method public static android.renderscript.ScriptIntrinsicColorMatrix create(android.renderscript.RenderScript);
     method public void forEach(android.renderscript.Allocation, android.renderscript.Allocation);
     method public android.renderscript.Script.KernelID getKernelID();
@@ -22399,9 +22449,9 @@
   public final class ScriptIntrinsicHistogram extends android.renderscript.ScriptIntrinsic {
     method public static android.renderscript.ScriptIntrinsicHistogram create(android.renderscript.RenderScript, android.renderscript.Element);
     method public void forEach(android.renderscript.Allocation);
-    method public void forEach_dot(android.renderscript.Allocation);
+    method public void forEach_Dot(android.renderscript.Allocation);
     method public android.renderscript.Script.FieldID getFieldID_Input();
-    method public android.renderscript.Script.KernelID getKernelID_seperate();
+    method public android.renderscript.Script.KernelID getKernelID_Separate();
     method public void setDotCoefficients(float, float, float, float);
     method public void setOutput(android.renderscript.Allocation);
   }
@@ -22554,8 +22604,11 @@
   }
 
   public final class KeyPairGeneratorSpec implements java.security.spec.AlgorithmParameterSpec {
+    method public java.security.spec.AlgorithmParameterSpec getAlgorithmParameterSpec();
     method public android.content.Context getContext();
     method public java.util.Date getEndDate();
+    method public int getKeySize();
+    method public java.lang.String getKeyType();
     method public java.lang.String getKeystoreAlias();
     method public java.math.BigInteger getSerialNumber();
     method public java.util.Date getStartDate();
@@ -22566,9 +22619,12 @@
   public static final class KeyPairGeneratorSpec.Builder {
     ctor public KeyPairGeneratorSpec.Builder(android.content.Context);
     method public android.security.KeyPairGeneratorSpec build();
+    method public android.security.KeyPairGeneratorSpec.Builder setAlgorithmParameterSpec(java.security.spec.AlgorithmParameterSpec);
     method public android.security.KeyPairGeneratorSpec.Builder setAlias(java.lang.String);
     method public android.security.KeyPairGeneratorSpec.Builder setEncryptionRequired();
     method public android.security.KeyPairGeneratorSpec.Builder setEndDate(java.util.Date);
+    method public android.security.KeyPairGeneratorSpec.Builder setKeySize(int);
+    method public android.security.KeyPairGeneratorSpec.Builder setKeyType(java.lang.String) throws java.security.NoSuchAlgorithmException;
     method public android.security.KeyPairGeneratorSpec.Builder setSerialNumber(java.math.BigInteger);
     method public android.security.KeyPairGeneratorSpec.Builder setStartDate(java.util.Date);
     method public android.security.KeyPairGeneratorSpec.Builder setSubject(javax.security.auth.x500.X500Principal);
@@ -25718,7 +25774,7 @@
     method public android.util.JsonWriter value(java.lang.Number) throws java.io.IOException;
   }
 
-  public abstract interface LayoutDirection {
+  public final class LayoutDirection {
     field public static final int INHERIT = 2; // 0x2
     field public static final int LOCALE = 3; // 0x3
     field public static final int LTR = 0; // 0x0
@@ -27117,6 +27173,7 @@
 
   public class ScaleGestureDetector {
     ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener);
+    ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener, android.os.Handler);
     method public float getCurrentSpan();
     method public float getCurrentSpanX();
     method public float getCurrentSpanY();
@@ -27130,6 +27187,7 @@
     method public long getTimeDelta();
     method public boolean isInProgress();
     method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setQuickScaleEnabled(boolean);
   }
 
   public static abstract interface ScaleGestureDetector.OnScaleGestureListener {
@@ -27810,9 +27868,9 @@
     field public static final int SOUND_EFFECTS_ENABLED = 134217728; // 0x8000000
     field public static final deprecated int STATUS_BAR_HIDDEN = 1; // 0x1
     field public static final deprecated int STATUS_BAR_VISIBLE = 0; // 0x0
-    field public static final int SYSTEM_UI_FLAG_ALLOW_TRANSIENT = 2048; // 0x800
     field public static final int SYSTEM_UI_FLAG_FULLSCREEN = 4; // 0x4
     field public static final int SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2; // 0x2
+    field public static final int SYSTEM_UI_FLAG_IMMERSIVE = 2048; // 0x800
     field public static final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024; // 0x400
     field public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512; // 0x200
     field public static final int SYSTEM_UI_FLAG_LAYOUT_STABLE = 256; // 0x100
@@ -28933,15 +28991,15 @@
   }
 
   public class CaptioningManager {
-    ctor public CaptioningManager();
-    method public static final float getFontSize(android.content.ContentResolver);
-    method public static final java.util.Locale getLocale(android.content.ContentResolver);
-    method public static final boolean isEnabled(android.content.ContentResolver);
-    field public static final java.lang.String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
+    method public void addCaptioningStateChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener);
+    method public final float getFontScale();
+    method public final java.util.Locale getLocale();
+    method public android.view.accessibility.CaptioningManager.CaptionStyle getUserStyle();
+    method public final boolean isEnabled();
+    method public void removeCaptioningStateChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener);
   }
 
   public static final class CaptioningManager.CaptionStyle {
-    method public static android.view.accessibility.CaptioningManager.CaptionStyle defaultUserStyle(android.content.ContentResolver);
     method public android.graphics.Typeface getTypeface();
     field public static final int EDGE_TYPE_DROP_SHADOW = 2; // 0x2
     field public static final int EDGE_TYPE_NONE = 0; // 0x0
@@ -28952,6 +29010,14 @@
     field public final int foregroundColor;
   }
 
+  public abstract class CaptioningManager.CaptioningChangeListener {
+    ctor public CaptioningManager.CaptioningChangeListener();
+    method public void onEnabledChanged(boolean);
+    method public void onFontScaleChanged(float);
+    method public void onLocaleChanged(java.util.Locale);
+    method public void onUserStyleChanged(android.view.accessibility.CaptioningManager.CaptionStyle);
+  }
+
 }
 
 package android.view.animation {
@@ -30339,6 +30405,7 @@
     ctor public AbsListView(android.content.Context, android.util.AttributeSet, int);
     method public void afterTextChanged(android.text.Editable);
     method public void beforeTextChanged(java.lang.CharSequence, int, int, int);
+    method public boolean canScrollList(int);
     method public void clearChoices();
     method public void clearTextFilter();
     method public void deferNotifyDataSetChanged();
@@ -30370,6 +30437,7 @@
     method protected void layoutChildren();
     method public void onFilterComplete(int);
     method public void onGlobalLayout();
+    method public void onInitializeAccessibilityNodeInfoForItem(android.view.View, int, android.view.accessibility.AccessibilityNodeInfo);
     method public boolean onRemoteAdapterConnected();
     method public void onRemoteAdapterDisconnected();
     method public void onRestoreInstanceState(android.os.Parcelable);
@@ -30379,7 +30447,7 @@
     method public int pointToPosition(int, int);
     method public long pointToRowId(int, int);
     method public void reclaimViews(java.util.List<android.view.View>);
-    method public boolean scrollListBy(int);
+    method public void scrollListBy(int);
     method public void setAdapter(android.widget.ListAdapter);
     method public void setCacheColorHint(int);
     method public void setChoiceMode(int);
@@ -31134,7 +31202,6 @@
     method public int getAlignmentMode();
     method public int getColumnCount();
     method public int getOrientation();
-    method public android.util.Printer getPrinter();
     method public int getRowCount();
     method public boolean getUseDefaultMargins();
     method public boolean isColumnOrderPreserved();
@@ -31144,7 +31211,6 @@
     method public void setColumnCount(int);
     method public void setColumnOrderPreserved(boolean);
     method public void setOrientation(int);
-    method public void setPrinter(android.util.Printer);
     method public void setRowCount(int);
     method public void setRowOrderPreserved(boolean);
     method public void setUseDefaultMargins(boolean);
@@ -31382,6 +31448,7 @@
     ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
     ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
     method public void clearListSelection();
+    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
     method public void dismiss();
     method public android.view.View getAnchorView();
     method public int getAnimationStyle();
@@ -31593,6 +31660,7 @@
   public class PopupMenu {
     ctor public PopupMenu(android.content.Context, android.view.View);
     method public void dismiss();
+    method public android.view.View.OnTouchListener getDragToOpenListener();
     method public android.view.Menu getMenu();
     method public android.view.MenuInflater getMenuInflater();
     method public void inflate(int);
@@ -32602,6 +32670,7 @@
     ctor public VideoView(android.content.Context);
     ctor public VideoView(android.content.Context, android.util.AttributeSet);
     ctor public VideoView(android.content.Context, android.util.AttributeSet, int);
+    method public void addSubtitleSource(java.io.InputStream, android.media.MediaFormat);
     method public boolean canPause();
     method public boolean canSeekBackward();
     method public boolean canSeekForward();
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index cdec399..f10290d 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -105,6 +105,7 @@
 import android.view.Display;
 import android.view.WindowManagerImpl;
 import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.CaptioningManager;
 import android.view.inputmethod.InputMethodManager;
 import android.view.textservice.TextServicesManager;
 import android.accounts.AccountManager;
@@ -307,6 +308,11 @@
                     return AccessibilityManager.getInstance(ctx);
                 }});
 
+        registerService(CAPTIONING_SERVICE, new ServiceFetcher() {
+                public Object getService(ContextImpl ctx) {
+                    return new CaptioningManager(ctx);
+                }});
+
         registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
                 public Object createService(ContextImpl ctx) {
                     IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index b390aa1..a2bb78c 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -702,6 +702,10 @@
      * @param start Start or stop advertising
      */
     /*package*/ void listen(boolean start) {
+        if (mContext == null || !mContext.getResources().
+            getBoolean(com.android.internal.R.bool.config_bluetooth_le_peripheral_mode_supported)) {
+            throw new UnsupportedOperationException("BluetoothGatt#listen is blocked");
+        }
         if (DBG) Log.d(TAG, "listen() - start: " + start);
         if (mService == null || mClientIf == 0) return;
 
@@ -728,6 +732,10 @@
     /*package*/ void setAdvData(boolean advData, boolean includeName, boolean includeTxPower,
                            Integer minInterval, Integer maxInterval,
                            Integer appearance, Byte[] manufacturerData) {
+        if (mContext == null || !mContext.getResources().
+            getBoolean(com.android.internal.R.bool.config_bluetooth_le_peripheral_mode_supported)) {
+            throw new UnsupportedOperationException("BluetoothGatt#setAdvData is blocked");
+        }
         if (DBG) Log.d(TAG, "setAdvData()");
         if (mService == null || mClientIf == 0) return;
 
diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java
index 024a521..4e8dd82 100644
--- a/core/java/android/content/ContentProviderClient.java
+++ b/core/java/android/content/ContentProviderClient.java
@@ -316,4 +316,11 @@
     public ContentProvider getLocalContentProvider() {
         return ContentProvider.coerceToLocalContentProvider(mContentProvider);
     }
+
+    /** {@hide} */
+    public static void closeQuietly(ContentProviderClient client) {
+        if (client != null) {
+            client.release();
+        }
+    }
 }
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index a761a89..8a5a56c 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -141,7 +141,7 @@
     public static final String SYNC_EXTRAS_PRIORITY = "sync_priority";
 
     /** {@hide} Flag to allow sync to occur on metered network. */
-    public static final String SYNC_EXTRAS_ALLOW_METERED = "allow_metered";
+    public static final String SYNC_EXTRAS_DISALLOW_METERED = "disallow_metered";
 
     /**
      * Set by the SyncManager to request that the SyncAdapter initialize itself for
@@ -1669,7 +1669,7 @@
             new SyncRequest.Builder()
                 .setSyncAdapter(account, authority)
                 .setExtras(extras)
-                .syncOnce(0, 0)     // Immediate sync.
+                .syncOnce()
                 .build();
         requestSync(request);
     }
@@ -1677,6 +1677,9 @@
     /**
      * Register a sync with the SyncManager. These requests are built using the
      * {@link SyncRequest.Builder}.
+     *
+     * @param request The immutable SyncRequest object containing the sync parameters. Use
+     * {@link SyncRequest.Builder} to construct these.
      */
     public static void requestSync(SyncRequest request) {
         try {
@@ -1812,6 +1815,9 @@
      * {@link #SYNC_EXTRAS_INITIALIZE}, {@link #SYNC_EXTRAS_FORCE},
      * {@link #SYNC_EXTRAS_EXPEDITED}, {@link #SYNC_EXTRAS_MANUAL} set to true.
      * If any are supplied then an {@link IllegalArgumentException} will be thrown.
+     * <p>As of API level 19 this function introduces a default flexibility of ~4% (up to a maximum
+     * of one hour in the day) into the requested period. Use
+     * {@link SyncRequest.Builder#syncPeriodic(long, long)} to set this flexibility manually.
      *
      * <p>This method requires the caller to hold the permission
      * {@link android.Manifest.permission#WRITE_SYNC_SETTINGS}.
@@ -1875,22 +1881,6 @@
     }
 
     /**
-     * Remove the specified sync. This will remove any syncs that have been scheduled to run, but
-     * will not cancel any running syncs.
-     * <p>This method requires the caller to hold the permission</p>
-     * If the request is for a periodic sync this will cancel future occurrences of the sync.
-     *
-     * It is possible to cancel a sync using a SyncRequest object that is different from the object
-     * with which you requested the sync. Do so by building a SyncRequest with exactly the same
-     * service/adapter, frequency, <b>and</b> extras bundle.
-     *
-     * @param request SyncRequest object containing information about sync to cancel.
-     */
-    public static void cancelSync(SyncRequest request) {
-        // TODO: Finish this implementation.
-    }
-
-    /**
      * Get the list of information about the periodic syncs for the given account and authority.
      * <p>This method requires the caller to hold the permission
      * {@link android.Manifest.permission#READ_SYNC_SETTINGS}.
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index cd1f87b..2ff9182 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -2011,6 +2011,17 @@
 
     /**
      * Use with {@link #getSystemService} to retrieve a
+     * {@link android.view.accessibility.CaptioningManager} for obtaining
+     * captioning properties and listening for changes in captioning
+     * preferences.
+     *
+     * @see #getSystemService
+     * @see android.view.accessibility.CaptioningManager
+     */
+    public static final String CAPTIONING_SERVICE = "captioning";
+
+    /**
+     * Use with {@link #getSystemService} to retrieve a
      * {@link android.app.NotificationManager} for controlling keyguard.
      *
      * @see #getSystemService
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index c99f09c..dfc0412 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2687,10 +2687,6 @@
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT";
 
-    /** {@hide} */
-    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_MANAGE_DOCUMENT = "android.intent.action.MANAGE_DOCUMENT";
-
     // ---------------------------------------------------------------------
     // ---------------------------------------------------------------------
     // Standard intent categories (see addCategory()).
@@ -3304,8 +3300,10 @@
     /**
      * Optional extra for {@link #ACTION_SHUTDOWN} that allows the sender to qualify that
      * this shutdown is only for the user space of the system, not a complete shutdown.
-     * Hardware should not be shut down when this is true.  The default if not supplied
-     * is false.
+     * When this is true, hardware devices can use this information to determine that
+     * they shouldn't do a complete shutdown of their device since this is not a
+     * complete shutdown down to the kernel, but only user space restarting.
+     * The default if not supplied is false.
      */
     public static final String EXTRA_SHUTDOWN_USERSPACE_ONLY
             = "android.intent.extra.SHUTDOWN_USERSPACE_ONLY";
diff --git a/core/java/android/content/PeriodicSync.java b/core/java/android/content/PeriodicSync.java
index 6aca151..b586eec 100644
--- a/core/java/android/content/PeriodicSync.java
+++ b/core/java/android/content/PeriodicSync.java
@@ -29,17 +29,13 @@
     public final Account account;
     /** The authority of the sync. Can be null. */
     public final String authority;
-    /** The service for syncing, if this is an anonymous sync. Can be null.*/
-    public final ComponentName service;
     /** Any extras that parameters that are to be passed to the sync adapter. */
     public final Bundle extras;
     /** How frequently the sync should be scheduled, in seconds. Kept around for API purposes. */
     public final long period;
-    /** Whether this periodic sync uses a service. */
-    public final boolean isService;
     /**
-     * How much flexibility can be taken in scheduling the sync, in seconds.
      * {@hide}
+     * How much flexibility can be taken in scheduling the sync, in seconds.
      */
     public final long flexTime;
 
@@ -52,76 +48,44 @@
     public PeriodicSync(Account account, String authority, Bundle extras, long periodInSeconds) {
         this.account = account;
         this.authority = authority;
-        this.service = null;
-        this.isService = false;
         if (extras == null) {
             this.extras = new Bundle();
         } else {
             this.extras = new Bundle(extras);
         }
         this.period = periodInSeconds;
-        // Old API uses default flex time. No-one should be using this ctor anyway.
+        // Initialise to a sane value.
         this.flexTime = 0L;
     }
 
-    // TODO: Add copy ctor from SyncRequest?
-
     /**
-     * Create a copy of a periodic sync.
      * {@hide}
+     * Create a copy of a periodic sync.
      */
     public PeriodicSync(PeriodicSync other) {
         this.account = other.account;
         this.authority = other.authority;
-        this.service = other.service;
-        this.isService = other.isService;
         this.extras = new Bundle(other.extras);
         this.period = other.period;
         this.flexTime = other.flexTime;
     }
 
     /**
-     * A PeriodicSync for a sync with a specified provider.
      * {@hide}
+     * A PeriodicSync for a sync with a specified provider.
      */
     public PeriodicSync(Account account, String authority, Bundle extras,
             long period, long flexTime) {
         this.account = account;
         this.authority = authority;
-        this.service = null;
-        this.isService = false;
-        this.extras = new Bundle(extras);
-        this.period = period;
-        this.flexTime = flexTime;
-    }
-
-    /**
-     * A PeriodicSync for a sync with a specified SyncService.
-     * {@hide}
-     */
-    public PeriodicSync(ComponentName service, Bundle extras,
-            long period,
-            long flexTime) {
-        this.account = null;
-        this.authority = null;
-        this.service = service;
-        this.isService = true;
         this.extras = new Bundle(extras);
         this.period = period;
         this.flexTime = flexTime;
     }
 
     private PeriodicSync(Parcel in) {
-        this.isService = (in.readInt() != 0);
-        if (this.isService) {
-            this.service = in.readParcelable(null);
-            this.account = null;
-            this.authority = null;
-        } else {
-            this.account = in.readParcelable(null);
-            this.authority = in.readString();
-            this.service = null;
-        }
+        this.account = in.readParcelable(null);
+        this.authority = in.readString();
         this.extras = in.readBundle();
         this.period = in.readLong();
         this.flexTime = in.readLong();
@@ -134,13 +98,8 @@
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(isService ? 1 : 0);
-        if (account == null && authority == null) {
-            dest.writeParcelable(service, flags);
-        } else {
-            dest.writeParcelable(account, flags);
-            dest.writeString(authority);
-        }
+        dest.writeParcelable(account, flags);
+        dest.writeString(authority);
         dest.writeBundle(extras);
         dest.writeLong(period);
         dest.writeLong(flexTime);
@@ -167,17 +126,8 @@
             return false;
         }
         final PeriodicSync other = (PeriodicSync) o;
-        if (this.isService != other.isService) {
-            return false;
-        }
-        boolean equal = false;
-        if (this.isService) {
-            equal = service.equals(other.service);
-        } else {
-            equal = account.equals(other.account)
-                    && authority.equals(other.authority);
-        }
-        return equal
+        return account.equals(other.account)
+            && authority.equals(other.authority)
             && period == other.period
             && syncExtrasEquals(extras, other.extras);
     }
@@ -208,7 +158,6 @@
     public String toString() {
         return "account: " + account +
                ", authority: " + authority +
-               ", service: " + service +
                ". period: " + period + "s " +
                ", flex: " + flexTime;
     }
diff --git a/core/java/android/content/SyncRequest.java b/core/java/android/content/SyncRequest.java
index 4474c70..d4e0c2a 100644
--- a/core/java/android/content/SyncRequest.java
+++ b/core/java/android/content/SyncRequest.java
@@ -20,20 +20,19 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.util.Pair;
 
 public class SyncRequest implements Parcelable {
     private static final String TAG = "SyncRequest";
-    /** Account to pass to the sync adapter. Can be null. */
+    /** Account to pass to the sync adapter. May be null. */
     private final Account mAccountToSync;
     /** Authority string that corresponds to a ContentProvider. */
     private final String mAuthority;
-    /** {@link SyncService} identifier. */
+    /** Sync service identifier. May be null.*/
     private final ComponentName mComponentInfo;
     /** Bundle containing user info as well as sync settings. */
     private final Bundle mExtras;
-    /** Allow this sync request on metered networks. */
-    private final boolean mAllowMetered;
+    /** Disallow this sync request on metered networks. */
+    private final boolean mDisallowMetered;
     /**
      * Anticipated upload size in bytes.
      * TODO: Not yet used - we put this information into the bundle for simplicity.
@@ -70,14 +69,18 @@
         return mIsPeriodic;
     }
 
+    /**
+     * {@hide}
+     * @return whether this is an expedited sync.
+     */
     public boolean isExpedited() {
         return mIsExpedited;
     }
 
     /**
      * {@hide}
-     * @return true if this sync uses an account/authority pair, or false if
-     *         this is an anonymous sync bound to an @link AnonymousSyncService.
+     * @return true if this sync uses an account/authority pair, or false if this sync is bound to
+     * a Sync Service.
      */
     public boolean hasAuthority() {
         return mIsAuthority;
@@ -85,31 +88,30 @@
 
     /**
      * {@hide}
-     * Throws a runtime IllegalArgumentException if this function is called for an
-     * anonymous sync.
-     *
-     * @return (Account, Provider) for this SyncRequest.
+     * @return account object for this sync.
+     * @throws IllegalArgumentException if this function is called for a request that does not
+     * specify an account/provider authority.
      */
-    public Pair<Account, String> getProviderInfo() {
+    public Account getAccount() {
         if (!hasAuthority()) {
-            throw new IllegalArgumentException("Cannot getProviderInfo() for an anonymous sync.");
+            throw new IllegalArgumentException("Cannot getAccount() for a sync that does not"
+                    + "specify an authority.");
         }
-        return Pair.create(mAccountToSync, mAuthority);
+        return mAccountToSync;
     }
 
     /**
      * {@hide}
-     * Throws a runtime IllegalArgumentException if this function is called for a
-     * SyncRequest that is bound to an account/provider.
-     *
-     * @return ComponentName for the service that this sync will bind to.
+     * @return provider for this sync.
+     * @throws IllegalArgumentException if this function is called for a request that does not
+     * specify an account/provider authority.
      */
-    public ComponentName getService() {
-        if (hasAuthority()) {
-            throw new IllegalArgumentException(
-                    "Cannot getAnonymousService() for a sync that has specified a provider.");
+    public String getProvider() {
+        if (!hasAuthority()) {
+            throw new IllegalArgumentException("Cannot getProvider() for a sync that does not"
+                    + "specify a provider.");
         }
-        return mComponentInfo;
+        return mAuthority;
     }
 
     /**
@@ -127,6 +129,7 @@
     public long getSyncFlexTime() {
         return mSyncFlexTimeSecs;
     }
+
     /**
      * {@hide}
      * @return the last point in time at which this sync must scheduled.
@@ -159,7 +162,7 @@
         parcel.writeLong(mSyncFlexTimeSecs);
         parcel.writeLong(mSyncRunTimeSecs);
         parcel.writeInt((mIsPeriodic ? 1 : 0));
-        parcel.writeInt((mAllowMetered ? 1 : 0));
+        parcel.writeInt((mDisallowMetered ? 1 : 0));
         parcel.writeLong(mTxBytes);
         parcel.writeLong(mRxBytes);
         parcel.writeInt((mIsAuthority ? 1 : 0));
@@ -177,7 +180,7 @@
         mSyncFlexTimeSecs = in.readLong();
         mSyncRunTimeSecs = in.readLong();
         mIsPeriodic = (in.readInt() != 0);
-        mAllowMetered = (in.readInt() != 0);
+        mDisallowMetered = (in.readInt() != 0);
         mTxBytes = in.readLong();
         mRxBytes = in.readLong();
         mIsAuthority = (in.readInt() != 0);
@@ -207,13 +210,13 @@
         // For now we merge the sync config extras & the custom extras into one bundle.
         // TODO: pass the configuration extras through separately.
         mExtras.putAll(b.mSyncConfigExtras);
-        mAllowMetered = b.mAllowMetered;
+        mDisallowMetered = b.mDisallowMetered;
         mTxBytes = b.mTxBytes;
         mRxBytes = b.mRxBytes;
     }
 
     /**
-     * Builder class for a @link SyncRequest. As you build your SyncRequest this class will also
+     * Builder class for a {@link SyncRequest}. As you build your SyncRequest this class will also
      * perform validation.
      */
     public static class Builder {
@@ -229,12 +232,9 @@
         private static final int SYNC_TARGET_SERVICE = 1;
         /** Specify that this is a sync with a provider. */
         private static final int SYNC_TARGET_ADAPTER = 2;
-        /**
-         * Earliest point of displacement into the future at which this sync can
-         * occur.
-         */
+        /** Earliest point of displacement into the future at which this sync can occur. */
         private long mSyncFlexTimeSecs;
-        /** Displacement into the future at which this sync must occur. */
+        /** Latest point of displacement into the future at which this sync must occur. */
         private long mSyncRunTimeSecs;
         /**
          * Sync configuration information - custom user data explicitly provided by the developer.
@@ -253,7 +253,7 @@
         /** Expected download transfer in bytes. */
         private long mRxBytes = -1L;
         /** Whether or not this sync can occur on metered networks. Default false. */
-        private boolean mAllowMetered;
+        private boolean mDisallowMetered;
         /** Priority of this sync relative to others from calling app [-2, 2]. Default 0. */
         private int mPriority = 0;
         /**
@@ -283,9 +283,8 @@
         private boolean mExpedited;
 
         /**
-         * The {@link SyncService} component that
-         * contains the sync logic if this is a provider-less sync, otherwise
-         * null.
+         * The sync component that contains the sync logic if this is a provider-less sync,
+         * otherwise null.
          */
         private ComponentName mComponentName;
         /**
@@ -303,46 +302,28 @@
         }
 
         /**
-         * Developer can define timing constraints for this one-shot request.
-         * These values are elapsed real-time.
-         *
-         * @param whenSeconds The time in seconds at which you want this
-         *            sync to occur.
-         * @param beforeSeconds The amount of time in advance of whenSeconds that this
-         *               sync may be permitted to occur. This is rounded up to a minimum of 5
-         *               seconds, for any sync for which whenSeconds > 5.
+         * Request that a sync occur immediately.
          *
          * Example
          * <pre>
-         *     Perform an immediate sync.
-         *     SyncRequest.Builder builder = (new SyncRequest.Builder()).syncOnce(0, 0);
-         *     That is, a sync 0 seconds from now with 0 seconds of flex.
-         *
-         *     Perform a sync in exactly 5 minutes.
-         *     SyncRequest.Builder builder =
-         *       new SyncRequest.Builder().syncOnce(5 * MIN_IN_SECS, 0);
-         *
-         *     Perform a sync in 5 minutes, with one minute of leeway (between 4 and 5 minutes from
-         *     now).
-         *     SyncRequest.Builder builder =
-         *       new SyncRequest.Builder().syncOnce(5 * MIN_IN_SECS, 1 * MIN_IN_SECS);
+         *     SyncRequest.Builder builder = (new SyncRequest.Builder()).syncOnce();
          * </pre>
          */
-        public Builder syncOnce(long whenSeconds, long beforeSeconds) {
+        public Builder syncOnce() {
             if (mSyncType != SYNC_TYPE_UNKNOWN) {
                 throw new IllegalArgumentException("Sync type has already been defined.");
             }
             mSyncType = SYNC_TYPE_ONCE;
-            setupInterval(whenSeconds, beforeSeconds);
+            setupInterval(0, 0);
             return this;
         }
 
         /**
          * Build a periodic sync. Either this or syncOnce() <b>must</b> be called for this builder.
-         * Syncs are identified by target {@link SyncService}/{@link android.provider} and by the
-         * contents of the extras bundle.
-         * You cannot reuse the same builder for one-time syncs after having specified a periodic
-         * sync (by calling this function). If you do, an <code>IllegalArgumentException</code>
+         * Syncs are identified by target {@link android.provider}/{@link android.accounts.Account}
+         * and by the contents of the extras bundle.
+         * You cannot reuse the same builder for one-time syncs (by calling this function) after
+         * having specified a periodic sync. If you do, an <code>IllegalArgumentException</code>
          * will be thrown.
          *
          * Example usage.
@@ -394,6 +375,7 @@
         }
 
         /**
+         * {@hide}
          * Developer can provide insight into their payload size; optional. -1 specifies unknown,
          * so that you are not restricted to defining both fields.
          *
@@ -407,21 +389,20 @@
         }
 
         /**
-         * @param allow false to allow this transfer on metered networks. Default true.
+         * @see android.net.ConnectivityManager#isActiveNetworkMetered()
+         * @param disallow true to enforce that this transfer not occur on metered networks.
+         *                 Default false.
          */
-        public Builder setAllowMetered(boolean allow) {
-            mAllowMetered = true;
+        public Builder setDisallowMetered(boolean disallow) {
+            mDisallowMetered = disallow;
             return this;
         }
 
         /**
-         * Specify an authority and account for this transfer. Cannot be used with
-         * {@link #setSyncAdapter(ComponentName cname)}.
+         * Specify an authority and account for this transfer.
          *
-         * @param authority
-         * @param account Account to sync. Can be null unless this is a periodic
-         *            sync, for which verification by the ContentResolver will
-         *            fail. If a sync is performed without an account, the
+         * @param authority String identifying which content provider to sync.
+         * @param account Account to sync. Can be null unless this is a periodic sync.
          */
         public Builder setSyncAdapter(Account account, String authority) {
             if (mSyncTarget != SYNC_TARGET_UNKNOWN) {
@@ -435,26 +416,10 @@
         }
 
         /**
-         * Specify the {@link SyncService} component for this sync. This is not validated until
-         * sync time so providing an incorrect component name here will not fail. Cannot be used
-         * with {@link #setSyncAdapter(Account account, String authority)}.
-         *
-         * @param cname ComponentName to identify your Anonymous service
-         */
-        public Builder setSyncAdapter(ComponentName cname) {
-            if (mSyncTarget != SYNC_TARGET_UNKNOWN) {
-                throw new IllegalArgumentException("Sync target has already been defined.");
-            }
-            mSyncTarget = SYNC_TARGET_SERVICE;
-            mComponentName = cname;
-            mAccount = null;
-            mAuthority = null;
-            return this;
-        }
-
-        /**
-         * Developer-provided extras handed back when sync actually occurs. This bundle is copied
-         * into the SyncRequest returned by {@link #build()}.
+         * Optional developer-provided extras handed back in
+         * {@link AbstractThreadedSyncAdapter#onPerformSync(Account, Bundle, String,
+         * ContentProviderClient, SyncResult)} occurs. This bundle is copied into the SyncRequest
+         * returned by {@link #build()}.
          *
          * Example:
          * <pre>
@@ -468,7 +433,7 @@
          *     Bundle extras = new Bundle();
          *     extras.setString("data", syncData);
          *     builder.setExtras(extras);
-         *     ContentResolver.sync(builder.build()); // Each sync() request creates a unique sync.
+         *     ContentResolver.sync(builder.build()); // Each sync() request is for a unique sync.
          *   }
          * </pre>
          * Only values of the following types may be used in the extras bundle:
@@ -509,7 +474,8 @@
         /**
          * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_IGNORE_SETTINGS}.
          *
-         * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
+         * A sync can specify that system sync settings be ignored (user has turned sync off). Not
+         * valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
          * {@link #build()}.
          *
          * @param ignoreSettings true to ignore the sync automatically settings. Default false.
@@ -522,13 +488,13 @@
         /**
          * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_IGNORE_BACKOFF}.
          *
-         * Ignoring back-off will force the sync scheduling process to ignore any back-off that was
-         * the result of a failed sync, as well as to invalidate any {@link SyncResult#delayUntil}
-         * value that may have been set by the adapter. Successive failures will not honor this
-         * flag. Not valid for periodic sync and will throw an <code>IllegalArgumentException</code>
-         * in {@link #build()}.
+         * Force the sync scheduling process to ignore any back-off that was the result of a failed
+         * sync, as well as to invalidate any {@link SyncResult#delayUntil} value that may have
+         * been set by the adapter. Successive failures will not honor this flag. Not valid for
+         * periodic sync and will throw an <code>IllegalArgumentException</code> in
+         * {@link #build()}.
          *
-         * @param ignoreBackoff ignore back off settings. Default false.
+         * @param ignoreBackoff ignore back-off settings. Default false.
          */
         public Builder setIgnoreBackoff(boolean ignoreBackoff) {
             mIgnoreBackoff = ignoreBackoff;
@@ -538,8 +504,9 @@
         /**
          * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_MANUAL}.
          *
-         * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
-         * {@link #build()}.
+         * A manual sync is functionally equivalent to calling {@link #setIgnoreBackoff(boolean)}
+         * and {@link #setIgnoreSettings(boolean)}. Not valid for periodic sync and will throw an
+         * <code>IllegalArgumentException</code> in {@link #build()}.
          *
          * @param isManual User-initiated sync or not. Default false.
          */
@@ -549,7 +516,7 @@
         }
 
         /**
-         * An expedited sync runs immediately and can preempt other non-expedited running syncs.
+         * An expedited sync runs immediately and will preempt another non-expedited running sync.
          *
          * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
          * {@link #build()}.
@@ -562,6 +529,7 @@
         }
 
         /**
+         * {@hide}
          * @param priority the priority of this request among all requests from the calling app.
          * Range of [-2,2] similar to how this is done with notifications.
          */
@@ -581,18 +549,18 @@
          *         builder.
          */
         public SyncRequest build() {
-            // Validate the extras bundle
-            ContentResolver.validateSyncExtrasBundle(mCustomExtras);
             if (mCustomExtras == null) {
                 mCustomExtras = new Bundle();
             }
+            // Validate the extras bundle
+            ContentResolver.validateSyncExtrasBundle(mCustomExtras);
             // Combine builder extra flags into the config bundle.
             mSyncConfigExtras = new Bundle();
             if (mIgnoreBackoff) {
                 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, true);
             }
-            if (mAllowMetered) {
-                mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_ALLOW_METERED, true);
+            if (mDisallowMetered) {
+                mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_DISALLOW_METERED, true);
             }
             if (mIgnoreSettings) {
                 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);
@@ -613,13 +581,22 @@
                 // If this is a periodic sync ensure than invalid extras were not set.
                 validatePeriodicExtras(mCustomExtras);
                 validatePeriodicExtras(mSyncConfigExtras);
+                // Verify that account and provider are not null.
+                if (mAccount == null) {
+                    throw new IllegalArgumentException("Account must not be null for periodic"
+                            + " sync.");
+                }
+                if (mAuthority == null) {
+                    throw new IllegalArgumentException("Authority must not be null for periodic"
+                            + " sync.");
+                }
             } else if (mSyncType == SYNC_TYPE_UNKNOWN) {
                 throw new IllegalArgumentException("Must call either syncOnce() or syncPeriodic()");
             }
             // Ensure that a target for the sync has been set.
             if (mSyncTarget == SYNC_TARGET_UNKNOWN) {
-                throw new IllegalArgumentException("Must specify an adapter with one of"
-                    + "setSyncAdapter(ComponentName) or setSyncAdapter(Account, String");
+                throw new IllegalArgumentException("Must specify an adapter with "
+                        + "setSyncAdapter(Account, String");
             }
             return new SyncRequest(this);
         }
diff --git a/core/java/android/content/SyncService.java b/core/java/android/content/SyncService.java
deleted file mode 100644
index 100fd40..0000000
--- a/core/java/android/content/SyncService.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package android.content;
-
-import android.app.Service;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.Process;
-import android.os.Trace;
-
-import com.android.internal.annotations.GuardedBy;
-
-import java.util.HashMap;
-
-/**
- * Simplified @link android.content.AbstractThreadedSyncAdapter. Folds that
- * behaviour into a service to which the system can bind when requesting an
- * anonymous (providerless/accountless) sync.
- * <p>
- * In order to perform an anonymous sync operation you must extend this service,
- * implementing the abstract methods. This service must then be declared in the
- * application's manifest as usual. You can use this service for other work, however you
- * <b> must not </b> override the onBind() method unless you know what you're doing,
- * which limits the usefulness of this service for other work.
- *
- * <pre>
- * &lt;service ndroid:name=".MyAnonymousSyncService" android:permission="android.permission.SYNC" /&gt;
- * </pre>
- * Like @link android.content.AbstractThreadedSyncAdapter this service supports
- * multiple syncs at the same time. Each incoming startSync() with a unique tag
- * will spawn a thread to do the work of that sync. If startSync() is called
- * with a tag that already exists, a SyncResult.ALREADY_IN_PROGRESS is returned.
- * Remember that your service will spawn multiple threads if you schedule multiple syncs
- * at once, so if you mutate local objects you must ensure synchronization.
- */
-public abstract class SyncService extends Service {
-
-    /** SyncAdapter Instantiation that any anonymous syncs call. */
-    private final AnonymousSyncAdapterImpl mSyncAdapter = new AnonymousSyncAdapterImpl();
-
-    /** Keep track of on-going syncs, keyed by tag. */
-    @GuardedBy("mLock")
-    private final HashMap<Bundle, AnonymousSyncThread>
-            mSyncThreads = new HashMap<Bundle, AnonymousSyncThread>();
-    /** Lock object for accessing the SyncThreads HashMap. */
-    private final Object mSyncThreadLock = new Object();
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mSyncAdapter.asBinder();
-    }
-
-    /** {@hide} */
-    private class AnonymousSyncAdapterImpl extends IAnonymousSyncAdapter.Stub {
-
-        @Override
-        public void startSync(ISyncContext syncContext, Bundle extras) {
-            // Wrap the provided Sync Context because it may go away by the time
-            // we call it.
-            final SyncContext syncContextClient = new SyncContext(syncContext);
-            boolean alreadyInProgress = false;
-            synchronized (mSyncThreadLock) {
-                if (mSyncThreads.containsKey(extras)) {
-                    // Don't want to call back to SyncManager while still
-                    // holding lock.
-                    alreadyInProgress = true;
-                } else {
-                    AnonymousSyncThread syncThread = new AnonymousSyncThread(
-                            syncContextClient, extras);
-                    mSyncThreads.put(extras, syncThread);
-                    syncThread.start();
-                }
-            }
-            if (alreadyInProgress) {
-                syncContextClient.onFinished(SyncResult.ALREADY_IN_PROGRESS);
-            }
-        }
-
-        /**
-         * Used by the SM to cancel a specific sync using the {@link
-         * com.android.server.content.SyncManager.ActiveSyncContext} as a handle.
-         */
-        @Override
-        public void cancelSync(ISyncContext syncContext) {
-            AnonymousSyncThread runningSync = null;
-            synchronized (mSyncThreadLock) {
-                for (AnonymousSyncThread thread : mSyncThreads.values()) {
-                    if (thread.mSyncContext.getSyncContextBinder() == syncContext.asBinder()) {
-                        runningSync = thread;
-                        break;
-                    }
-                }
-            }
-            if (runningSync != null) {
-                runningSync.interrupt();
-            }
-        }
-    }
-
-    /**
-     * {@hide}
-     * Similar to {@link android.content.AbstractThreadedSyncAdapter.SyncThread}. However while
-     * the ATSA considers an already in-progress sync to be if the account provided is currently
-     * syncing, this anonymous sync has no notion of account and therefore considers a sync unique
-     * if the provided bundle is different.
-     */
-    private class AnonymousSyncThread extends Thread {
-        private final SyncContext mSyncContext;
-        private final Bundle mExtras;
-
-        public AnonymousSyncThread(SyncContext syncContext, Bundle extras) {
-            mSyncContext = syncContext;
-            mExtras = extras;
-        }
-
-        @Override
-        public void run() {
-            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-
-            Trace.traceBegin(Trace.TRACE_TAG_SYNC_MANAGER, getApplication().getPackageName());
-
-            SyncResult syncResult = new SyncResult();
-            try {
-                if (isCancelled()) {
-                    return;
-                }
-                // Run the sync based off of the provided code.
-                SyncService.this.onPerformSync(mExtras, syncResult);
-            } finally {
-                Trace.traceEnd(Trace.TRACE_TAG_SYNC_MANAGER);
-                if (!isCancelled()) {
-                    mSyncContext.onFinished(syncResult);
-                }
-                // Synchronize so that the assignment will be seen by other
-                // threads
-                // that also synchronize accesses to mSyncThreads.
-                synchronized (mSyncThreadLock) {
-                    mSyncThreads.remove(mExtras);
-                }
-            }
-        }
-
-        private boolean isCancelled() {
-            return Thread.currentThread().isInterrupted();
-        }
-    }
-
-    /**
-     * Initiate an anonymous sync using this service. SyncAdapter-specific
-     * parameters may be specified in extras, which is guaranteed to not be
-     * null.
-     */
-    public abstract void onPerformSync(Bundle extras, SyncResult syncResult);
-
-}
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index eba69b6..2b0c896 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -216,6 +216,12 @@
 
     void resetPreferredActivities(int userId);
 
+    ResolveInfo getLastChosenActivity(in Intent intent,
+            String resolvedType, int flags);
+
+    void setLastChosenActivity(in Intent intent, String resolvedType, int flags,
+            in IntentFilter filter, int match, in ComponentName activity);
+
     void addPreferredActivity(in IntentFilter filter, int match,
             in ComponentName[] set, in ComponentName activity, int userId);
 
@@ -226,7 +232,7 @@
 
     int getPreferredActivities(out List<IntentFilter> outFilters,
             out List<ComponentName> outActivities, String packageName);
-    
+
     /**
      * As per {@link android.content.pm.PackageManager#setComponentEnabledSetting}.
      */
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 81f860e..d58b14c 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -957,12 +957,24 @@
      * Feature for {@link #getSystemAvailableFeatures} and
      * {@link #hasSystemFeature}: The device supports host-
      * based NFC card emulation.
+     *
+     * TODO remove when depending apps have moved to new constant.
+     * @hide
+     * @deprecated
      */
     @SdkConstant(SdkConstantType.FEATURE)
     public static final String FEATURE_NFC_HCE = "android.hardware.nfc.hce";
 
     /**
      * Feature for {@link #getSystemAvailableFeatures} and
+     * {@link #hasSystemFeature}: The device supports host-
+     * based NFC card emulation.
+     */
+    @SdkConstant(SdkConstantType.FEATURE)
+    public static final String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
+
+    /**
+     * Feature for {@link #getSystemAvailableFeatures} and
      * {@link #hasSystemFeature}: The device includes an accelerometer.
      */
     @SdkConstant(SdkConstantType.FEATURE)
diff --git a/core/java/android/content/pm/ServiceInfo.java b/core/java/android/content/pm/ServiceInfo.java
index 3f17dc4..3dc8717 100644
--- a/core/java/android/content/pm/ServiceInfo.java
+++ b/core/java/android/content/pm/ServiceInfo.java
@@ -52,7 +52,7 @@
      * Bit in {@link #flags}: If set,
      * {@link android.app.Service#onProvideAssistData(android.os.Bundle)} will
      * be called on the service when it is running in the foreground. Set from
-     * the android.R.attr#provideAssistData attribute.
+     * the {@link android.R.attr#provideAssistData} attribute.
      */
     public static final int FLAG_PROVIDE_ASSIST_DATA = 0x0004;
 
diff --git a/core/java/android/ddm/DdmHandleProfiling.java b/core/java/android/ddm/DdmHandleProfiling.java
index e0db5e7..ec08393 100644
--- a/core/java/android/ddm/DdmHandleProfiling.java
+++ b/core/java/android/ddm/DdmHandleProfiling.java
@@ -34,6 +34,8 @@
     public static final int CHUNK_MPSS = type("MPSS");
     public static final int CHUNK_MPSE = type("MPSE");
     public static final int CHUNK_MPRQ = type("MPRQ");
+    public static final int CHUNK_SPSS = type("SPSS");
+    public static final int CHUNK_SPSE = type("SPSE");
 
     private static DdmHandleProfiling mInstance = new DdmHandleProfiling();
 
@@ -50,6 +52,8 @@
         DdmServer.registerHandler(CHUNK_MPSS, mInstance);
         DdmServer.registerHandler(CHUNK_MPSE, mInstance);
         DdmServer.registerHandler(CHUNK_MPRQ, mInstance);
+        DdmServer.registerHandler(CHUNK_SPSS, mInstance);
+        DdmServer.registerHandler(CHUNK_SPSE, mInstance);
     }
 
     /**
@@ -82,6 +86,10 @@
             return handleMPSE(request);
         } else if (type == CHUNK_MPRQ) {
             return handleMPRQ(request);
+        } else if (type == CHUNK_SPSS) {
+            return handleSPSS(request);
+        } else if (type == CHUNK_SPSE) {
+            return handleSPSE(request);
         } else {
             throw new RuntimeException("Unknown packet "
                 + ChunkHandler.name(type));
@@ -144,7 +152,7 @@
         }
 
         try {
-            Debug.startMethodTracingDdms(bufferSize, flags);
+            Debug.startMethodTracingDdms(bufferSize, flags, false, 0);
             return null;        // empty response
         } catch (RuntimeException re) {
             return createFailChunk(1, re.getMessage());
@@ -178,11 +186,53 @@
      * Handle a "Method PRofiling Query" request.
      */
     private Chunk handleMPRQ(Chunk request) {
-        int result = Debug.isMethodTracingActive() ? 1 : 0;
+        int result = Debug.getMethodTracingMode();
 
         /* create a non-empty reply so the handler fires on completion */
         byte[] reply = { (byte) result };
         return new Chunk(CHUNK_MPRQ, reply, 0, reply.length);
     }
+
+    /*
+     * Handle a "Sample Profiling w/Streaming Start" request.
+     */
+    private Chunk handleSPSS(Chunk request) {
+        ByteBuffer in = wrapChunk(request);
+
+        int bufferSize = in.getInt();
+        int flags = in.getInt();
+        int interval = in.getInt();
+        if (false) {
+            Log.v("ddm-heap", "Sample prof stream start: size=" + bufferSize
+                + ", flags=" + flags + ", interval=" + interval);
+        }
+
+        try {
+            Debug.startMethodTracingDdms(bufferSize, flags, true, interval);
+            return null;        // empty response
+        } catch (RuntimeException re) {
+            return createFailChunk(1, re.getMessage());
+        }
+    }
+
+    /*
+     * Handle a "Sample Profiling w/Streaming End" request.
+     */
+    private Chunk handleSPSE(Chunk request) {
+        if (false) {
+            Log.v("ddm-heap", "Sample prof stream end");
+        }
+
+        try {
+            Debug.stopMethodTracing();
+        } catch (RuntimeException re) {
+            Log.w("ddm-heap", "Sample prof stream end failed: "
+                + re.getMessage());
+            return createFailChunk(1, re.getMessage());
+        }
+
+        /* VM sent the (perhaps very large) response directly */
+        return null;
+    }
 }
 
diff --git a/core/java/android/hardware/FlushCompleteListener.java b/core/java/android/hardware/FlushCompleteListener.java
new file mode 100644
index 0000000..cb5b9e3
--- /dev/null
+++ b/core/java/android/hardware/FlushCompleteListener.java
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+package android.hardware;
+
+/**
+ * Used for receiving a notification when a flush() has been successfully completed.
+ * @hide
+ */
+public interface FlushCompleteListener {
+    /**
+     * Called after flush() is completed. This flush() could have been initiated by this application
+     * or some other application. All the events in the batch at the point when the flush was called
+     * have been delivered to the applications registered for those sensor events.
+     * <p>
+     *
+     * @param sensor The {@link android.hardware.Sensor Sensor} on which flush was called.
+     *
+     * @see android.hardware.SensorManager#flush(Sensor)
+     */
+    public void onFlushCompleted(Sensor sensor);
+}
diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java
index 9bffdbe..bbede57 100644
--- a/core/java/android/hardware/Sensor.java
+++ b/core/java/android/hardware/Sensor.java
@@ -319,6 +319,8 @@
     private float   mResolution;
     private float   mPower;
     private int     mMinDelay;
+    private int     mFifoReservedEventCount;
+    private int     mFifoMaxEventCount;
 
     Sensor() {
     }
@@ -381,6 +383,26 @@
         return mMinDelay;
     }
 
+    /**
+     * @return Number of events reserved for this sensor in the batch mode FIFO. This gives a
+     * guarantee on the minimum number of events that can be batched
+     * @hide
+     */
+    public int getFifoReservedEventCount() {
+        return mFifoReservedEventCount;
+    }
+
+    /**
+     * @return Maximum number of events of this sensor that could be batched. If this value is zero
+     * it indicates that batch mode is not supported for this sensor. If other applications
+     * registered to batched sensors, the actual number of events that can be batched might be
+     * smaller because the hardware FiFo will be partially used to batch the other sensors.
+     * @hide
+     */
+    public int getFifoMaxEventCount() {
+        return mFifoMaxEventCount;
+    }
+
     /** @hide */
     public int getHandle() {
         return mHandle;
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index 30118f9..b6ca62a 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -608,8 +608,72 @@
     }
 
     /**
-     * Registers a {@link android.hardware.SensorEventListener
-     * SensorEventListener} for the given sensor.
+     * Enables batch mode for a sensor with the given rate and maxBatchReportLatency. If the
+     * underlying hardware does not support batch mode, this defaults to
+     * {@link #registerListener(SensorEventListener, Sensor, int)} and other parameters are are
+     * ignored. In non-batch mode, all sensor events must be reported as soon as they are detected.
+     * While in batch mode, sensor events do not need to be reported as soon as they are detected.
+     * They can be temporarily stored in batches and reported in batches, as long as no event is
+     * delayed by more than "maxBatchReportLatency" microseconds. That is, all events since the
+     * previous batch are recorded and returned all at once. This allows to reduce the amount of
+     * interrupts sent to the SoC, and allows the SoC to switch to a lower power state (Idle) while
+     * the sensor is capturing and batching data.
+     * <p>
+     * Registering to a sensor in batch mode will not prevent the SoC from going to suspend mode. In
+     * this case, the sensor will continue to gather events and store it in a hardware FIFO. If the
+     * FIFO gets full before the AP wakes up again, some events will be lost, as the older events
+     * get overwritten by new events in the hardware FIFO. This can be avoided by holding a wake
+     * lock. If the application holds a wake lock, the SoC will not go to suspend mode, so no events
+     * will be lost, as the events will be reported before the FIFO gets full.
+     * </p>
+     * <p>
+     * Batching is always best effort. If a different application requests updates in continuous
+     * mode, this application will also get events in continuous mode. Batch mode updates can be
+     * unregistered by calling {@link #unregisterListener(SensorEventListener)}.
+     * </p>
+     * <p class="note">
+     * </p>
+     * Note: Don't use this method with a one shot trigger sensor such as
+     * {@link Sensor#TYPE_SIGNIFICANT_MOTION}. Use
+     * {@link #requestTriggerSensor(TriggerEventListener, Sensor)} instead. </p>
+     *
+     * @param listener A {@link android.hardware.SensorEventListener SensorEventListener} object
+     *            that will receive the sensor events.
+     * @param sensor The {@link android.hardware.Sensor Sensor} to register to.
+     * @param rate The desired delay between two consecutive events in microseconds. This is only a
+     *            hint to the system. Events may be received faster or slower than the specified
+     *            rate. Usually events are received faster. Can be one of
+     *            {@link #SENSOR_DELAY_NORMAL}, {@link #SENSOR_DELAY_UI},
+     *            {@link #SENSOR_DELAY_GAME}, {@link #SENSOR_DELAY_FASTEST} or the delay in
+     *            microseconds.
+     * @param maxBatchReportLatency An event in the batch can be delayed by at most
+     *            maxBatchReportLatency microseconds. More events can be batched if this value is
+     *            large. If this is set to zero, batch mode is disabled and events are delivered in
+     *            continuous mode as soon as they are available which is equivalent to calling
+     *            {@link #registerListener(SensorEventListener, Sensor, int)}.
+     * @param reservedFlags Always set to Zero.
+     * @param flushCompleteListener A {@link android.hardware.FlushCompleteListener
+     *            FlushCompleteListener} object which is called when any application calls flush()
+     *            on this sensor and all the events in the batch at the time of calling flush() are
+     *            successfully delivered to the listeners.
+     * @return true if batch mode is successfully enabled for this sensor, false otherwise.
+     * @see #registerListener(SensorEventListener, Sensor, int)
+     * @see #unregisterListener(SensorEventListener)
+     * @see #flush(Sensor)
+     * @throws IllegalArgumentException when sensor or listener is null or a trigger sensor.
+     * @hide
+     */
+    public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs,
+            int maxBatchReportLatencyUs, int reservedFlags,
+            FlushCompleteListener flushCompleteListener) {
+        int delay = getDelay(rateUs);
+        return registerListenerImpl(listener, sensor, delay, null, maxBatchReportLatencyUs,
+                                        reservedFlags, flushCompleteListener);
+    }
+
+    /**
+     * Registers a {@link android.hardware.SensorEventListener SensorEventListener} for the given
+     * sensor. Events are delivered in continuous mode as soon as they are available.
      *
      * <p class="note"></p>
      * Note: Don't use this method with a one shot trigger sensor such as
@@ -655,31 +719,55 @@
             return false;
         }
 
-        int delay = -1;
-        switch (rate) {
-            case SENSOR_DELAY_FASTEST:
-                delay = 0;
-                break;
-            case SENSOR_DELAY_GAME:
-                delay = 20000;
-                break;
-            case SENSOR_DELAY_UI:
-                delay = 66667;
-                break;
-            case SENSOR_DELAY_NORMAL:
-                delay = 200000;
-                break;
-            default:
-                delay = rate;
-                break;
-        }
+        int delay = getDelay(rate);
+        return registerListenerImpl(listener, sensor, delay, handler, 0, 0, null);
+    }
 
-        return registerListenerImpl(listener, sensor, delay, handler);
+    /**
+     * Enables batch mode for a sensor with the given rate and maxBatchReportLatency.
+     * @param handler
+     *        The {@link android.os.Handler Handler} the
+     *        {@link android.hardware.SensorEvent sensor events} will be
+     *        delivered to.
+     *
+     * @see #registerListener(SensorEventListener, Sensor, int, int, int, FlushCompleteListener)
+     * @hide
+     */
+    public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs,
+            int maxBatchReportLatencyUs, int reservedFlags, Handler handler,
+            FlushCompleteListener flushCompleteListener) {
+        int delayUs = getDelay(rateUs);
+        return registerListenerImpl(listener, sensor, delayUs, handler, maxBatchReportLatencyUs,
+                                        reservedFlags, flushCompleteListener);
     }
 
     /** @hide */
     protected abstract boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
-            int delay, Handler handler);
+            int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags,
+            FlushCompleteListener flushCompleteListener);
+
+
+    /**
+     * Flushes the batch FIFO of the given sensor. If there are events in the FIFO of this sensor,
+     * they are returned as if the batch timeout has expired. Events are returned in the
+     * usual way through the SensorEventListener. This call doesn't effect the batch timeout for
+     * this sensor. This call is asynchronous and returns immediately. FlushCompleteListener is
+     * called after all the events in the batch at the time of calling this method have been
+     * delivered successfully.
+     * @param sensor
+     *        The {@link android.hardware.Sensor Sensor} to flush.
+     * @return true if the flush is initiated successfully. false if the sensor isn't active
+     *         i.e no application is registered for updates from this sensor.
+     * @see #registerListener(SensorEventListener, Sensor, int, int, int, FlushCompleteListener)
+     * @throws IllegalArgumentException when sensor is null or a trigger sensor.
+     * @hide
+     */
+    public boolean flush(Sensor sensor) {
+        return flushImpl(sensor);
+    }
+
+    /** @hide */
+    protected abstract boolean flushImpl(Sensor sensor);
 
     /**
      * <p>
@@ -1079,15 +1167,15 @@
      * <p>
      * All three angles above are in <b>radians</b> and <b>positive</b> in the
      * <b>counter-clockwise</b> direction.
-     * 
+     *
      * @param R
      *        rotation matrix see {@link #getRotationMatrix}.
-     * 
+     *
      * @param values
      *        an array of 3 floats to hold the result.
-     * 
+     *
      * @return The array values passed as argument.
-     * 
+     *
      * @see #getRotationMatrix(float[], float[], float[], float[])
      * @see GeomagneticField
      */
@@ -1407,4 +1495,26 @@
             return mLegacySensorManager;
         }
     }
+
+    private static int getDelay(int rate) {
+        int delay = -1;
+        switch (rate) {
+            case SENSOR_DELAY_FASTEST:
+                delay = 0;
+                break;
+            case SENSOR_DELAY_GAME:
+                delay = 20000;
+                break;
+            case SENSOR_DELAY_UI:
+                delay = 66667;
+                break;
+            case SENSOR_DELAY_NORMAL:
+                delay = 200000;
+                break;
+            default:
+                delay = rate;
+                break;
+        }
+        return delay;
+    }
 }
diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java
index 852cf4a..9747f0d 100644
--- a/core/java/android/hardware/SystemSensorManager.java
+++ b/core/java/android/hardware/SystemSensorManager.java
@@ -93,30 +93,35 @@
     /** @hide */
     @Override
     protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
-            int delay, Handler handler)
-    {
+            int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags,
+            FlushCompleteListener flushCompleteListener) {
+        if (sensor == null) throw new IllegalArgumentException("sensor cannot be null");
+        if (listener == null) throw new IllegalArgumentException("listener cannot be null");
+        if (reservedFlags != 0) throw new IllegalArgumentException("reservedFlags should be zero");
+        if (delayUs < 0) throw new IllegalArgumentException("rateUs should be positive");
+        if (maxBatchReportLatencyUs < 0)
+            throw new IllegalArgumentException("maxBatchReportLatencyUs should be positive");
+        // Trigger Sensors should use the requestTriggerSensor call.
+        if (Sensor.getReportingMode(sensor) == Sensor.REPORTING_MODE_ONE_SHOT)
+            throw new IllegalArgumentException("Trigger Sensors cannot use registerListener");
+
         // Invariants to preserve:
         // - one Looper per SensorEventListener
         // - one Looper per SensorEventQueue
         // We map SensorEventListener to a SensorEventQueue, which holds the looper
-        if (sensor == null) throw new IllegalArgumentException("sensor cannot be null");
-
-        // Trigger Sensors should use the requestTriggerSensor call.
-        if (Sensor.getReportingMode(sensor) == Sensor.REPORTING_MODE_ONE_SHOT) return false;
-
         synchronized (mSensorListeners) {
             SensorEventQueue queue = mSensorListeners.get(listener);
             if (queue == null) {
                 Looper looper = (handler != null) ? handler.getLooper() : mMainLooper;
-                queue = new SensorEventQueue(listener, looper, this);
-                if (!queue.addSensor(sensor, delay)) {
+                queue = new SensorEventQueue(listener, looper, this, flushCompleteListener);
+                if (!queue.addSensor(sensor, delayUs, maxBatchReportLatencyUs, reservedFlags)) {
                     queue.dispose();
                     return false;
                 }
                 mSensorListeners.put(listener, queue);
                 return true;
             } else {
-                return queue.addSensor(sensor, delay);
+                return queue.addSensor(sensor, delayUs, maxBatchReportLatencyUs, reservedFlags);
             }
         }
     }
@@ -157,14 +162,14 @@
             TriggerEventQueue queue = mTriggerListeners.get(listener);
             if (queue == null) {
                 queue = new TriggerEventQueue(listener, mMainLooper, this);
-                if (!queue.addSensor(sensor, 0)) {
+                if (!queue.addSensor(sensor, 0, 0, 0)) {
                     queue.dispose();
                     return false;
                 }
                 mTriggerListeners.put(listener, queue);
                 return true;
             } else {
-                return queue.addSensor(sensor, 0);
+                return queue.addSensor(sensor, 0, 0, 0);
             }
         }
     }
@@ -195,6 +200,18 @@
         }
     }
 
+    protected boolean flushImpl(Sensor sensor) {
+        if (sensor == null) throw new IllegalArgumentException("sensor cannot be null");
+        if(Sensor.getReportingMode(sensor) == Sensor.REPORTING_MODE_ONE_SHOT)
+            throw new IllegalArgumentException("Trigger Sensors cannot call flush");
+
+        FlushEventQueue queue = new FlushEventQueue(mMainLooper, this);
+        if (queue.flushSensor(sensor) != 0) {
+            return false;
+        }
+        return true;
+    }
+
     /*
      * BaseEventQueue is the communication channel with the sensor service,
      * SensorEventQueue, TriggerEventQueue are subclases and there is one-to-one mapping between
@@ -202,11 +219,12 @@
      */
     private static abstract class BaseEventQueue {
         private native int nativeInitBaseEventQueue(BaseEventQueue eventQ, MessageQueue msgQ,
-
                 float[] scratch);
-        private static native int nativeEnableSensor(int eventQ, int handle, int us);
+        private static native int nativeEnableSensor(int eventQ, int handle, int rateUs,
+                int maxBatchReportLatencyUs, int reservedFlags);
         private static native int nativeDisableSensor(int eventQ, int handle);
         private static native void nativeDestroySensorEventQueue(int eventQ);
+        private static native int nativeFlushSensor(int eventQ, int handle);
         private int nSensorEventQueue;
         private final SparseBooleanArray mActiveSensors = new SparseBooleanArray();
         protected final SparseIntArray mSensorAccuracies = new SparseIntArray();
@@ -225,7 +243,8 @@
             dispose(false);
         }
 
-        public boolean addSensor(Sensor sensor, int delay) {
+        public boolean addSensor(
+                Sensor sensor, int delayUs, int maxBatchReportLatencyUs, int reservedFlags) {
             // Check if already present.
             int handle = sensor.getHandle();
             if (mActiveSensors.get(handle)) return false;
@@ -233,9 +252,13 @@
             // Get ready to receive events before calling enable.
             mActiveSensors.put(handle, true);
             addSensorEvent(sensor);
-            if (enableSensor(sensor, delay) != 0) {
-                removeSensor(sensor, false);
-                return false;
+            if (enableSensor(sensor, delayUs, maxBatchReportLatencyUs, reservedFlags) != 0) {
+                // Try continuous mode if batching fails.
+                if (maxBatchReportLatencyUs == 0 ||
+                    maxBatchReportLatencyUs > 0 && enableSensor(sensor, delayUs, 0, 0) != 0) {
+                  removeSensor(sensor, false);
+                  return false;
+                }
             }
             return true;
         }
@@ -268,6 +291,12 @@
             return false;
         }
 
+        public int flushSensor(Sensor sensor) {
+            if (nSensorEventQueue == 0) throw new NullPointerException();
+            if (sensor == null) throw new NullPointerException();
+            return nativeFlushSensor(nSensorEventQueue, sensor.getHandle());
+        }
+
         public boolean hasSensors() {
             // no more sensors are set
             return mActiveSensors.indexOfValue(true) >= 0;
@@ -295,11 +324,14 @@
             }
         }
 
-        private int enableSensor(Sensor sensor, int us) {
+        private int enableSensor(
+                Sensor sensor, int rateUs, int maxBatchReportLatencyUs, int reservedFlags) {
             if (nSensorEventQueue == 0) throw new NullPointerException();
             if (sensor == null) throw new NullPointerException();
-            return nativeEnableSensor(nSensorEventQueue, sensor.getHandle(), us);
+            return nativeEnableSensor(nSensorEventQueue, sensor.getHandle(), rateUs,
+                    maxBatchReportLatencyUs, reservedFlags);
         }
+
         private int disableSensor(Sensor sensor) {
             if (nSensorEventQueue == 0) throw new NullPointerException();
             if (sensor == null) throw new NullPointerException();
@@ -307,6 +339,7 @@
         }
         protected abstract void dispatchSensorEvent(int handle, float[] values, int accuracy,
                 long timestamp);
+        protected abstract void dispatchFlushCompleteEvent(int handle);
 
         protected abstract void addSensorEvent(Sensor sensor);
         protected abstract void removeSensorEvent(Sensor sensor);
@@ -314,12 +347,14 @@
 
     static final class SensorEventQueue extends BaseEventQueue {
         private final SensorEventListener mListener;
+        private final FlushCompleteListener mFlushCompleteListener;
         private final SparseArray<SensorEvent> mSensorsEvents = new SparseArray<SensorEvent>();
 
         public SensorEventQueue(SensorEventListener listener, Looper looper,
-                SystemSensorManager manager) {
+                SystemSensorManager manager, FlushCompleteListener flushCompleteListener) {
             super(looper, manager);
             mListener = listener;
+            mFlushCompleteListener = flushCompleteListener;
         }
 
         public void addSensorEvent(Sensor sensor) {
@@ -370,6 +405,15 @@
             }
             mListener.onSensorChanged(t);
         }
+
+        @SuppressWarnings("unused")
+        protected void dispatchFlushCompleteEvent(int handle) {
+            final Sensor sensor = sHandleToSensor.get(handle);
+            if (mFlushCompleteListener != null) {
+                mFlushCompleteListener.onFlushCompleted(sensor);
+            }
+            return;
+        }
     }
 
     static final class TriggerEventQueue extends BaseEventQueue {
@@ -415,5 +459,35 @@
 
             mListener.onTrigger(t);
         }
+
+        @SuppressWarnings("unused")
+        protected void dispatchFlushCompleteEvent(int handle) {
+        }
+    }
+
+    static final class FlushEventQueue extends BaseEventQueue {
+        public FlushEventQueue(Looper looper, SystemSensorManager manager) {
+            super(looper, manager);
+        }
+
+        @SuppressWarnings("unused")
+        @Override
+        protected void dispatchSensorEvent(int handle, float[] values, int accuracy,
+                long timestamp) {
+        }
+
+        @Override
+        @SuppressWarnings("unused")
+        protected void addSensorEvent(Sensor sensor) {
+        }
+
+        @Override
+        @SuppressWarnings("unused")
+        protected void removeSensorEvent(Sensor sensor) {
+        }
+
+        @SuppressWarnings("unused")
+        protected void dispatchFlushCompleteEvent(int handle) {
+        }
     }
 }
diff --git a/core/java/android/hardware/camera2/impl/CameraDevice.java b/core/java/android/hardware/camera2/impl/CameraDevice.java
index 64e4dc9..86a073f 100644
--- a/core/java/android/hardware/camera2/impl/CameraDevice.java
+++ b/core/java/android/hardware/camera2/impl/CameraDevice.java
@@ -301,7 +301,9 @@
         synchronized (mLock) {
 
             try {
-                mRemoteDevice.disconnect();
+                if (mRemoteDevice != null) {
+                    mRemoteDevice.disconnect();
+                }
             } catch (CameraRuntimeException e) {
                 throw e.asChecked();
             } catch (RemoteException e) {
diff --git a/core/java/android/net/CaptivePortalTracker.java b/core/java/android/net/CaptivePortalTracker.java
index 74c2c59..01977cd 100644
--- a/core/java/android/net/CaptivePortalTracker.java
+++ b/core/java/android/net/CaptivePortalTracker.java
@@ -16,22 +16,16 @@
 
 package android.net;
 
-import android.app.Activity;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.net.ConnectivityManager;
 import android.net.IConnectivityManager;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.os.Handler;
-import android.os.UserHandle;
 import android.os.Message;
 import android.os.RemoteException;
 import android.os.SystemClock;
@@ -46,7 +40,6 @@
 import android.telephony.CellInfoLte;
 import android.telephony.CellInfoWcdma;
 import android.telephony.TelephonyManager;
-import android.text.TextUtils;
 
 import com.android.internal.util.State;
 import com.android.internal.util.StateMachine;
@@ -60,8 +53,6 @@
 import java.net.UnknownHostException;
 import java.util.List;
 
-import com.android.internal.R;
-
 /**
  * This class allows captive portal detection on a network.
  * @hide
@@ -71,7 +62,6 @@
     private static final String TAG = "CaptivePortalTracker";
 
     private static final String DEFAULT_SERVER = "clients3.google.com";
-    private static final String NOTIFICATION_ID = "CaptivePortal.Notification";
 
     private static final int SOCKET_TIMEOUT_MS = 10000;
 
@@ -93,7 +83,6 @@
 
     private String mServer;
     private String mUrl;
-    private boolean mNotificationShown = false;
     private boolean mIsCaptivePortalCheckEnabled = false;
     private IConnectivityManager mConnService;
     private TelephonyManager mTelephonyManager;
@@ -192,12 +181,12 @@
     private class DefaultState extends State {
         @Override
         public void enter() {
-            if (DBG) log(getName() + "\n");
+            setNotificationOff();
         }
 
         @Override
         public boolean processMessage(Message message) {
-            if (DBG) log(getName() + message.toString() + "\n");
+            if (DBG) log(getName() + message.toString());
             switch (message.what) {
                 case CMD_DETECT_PORTAL:
                     NetworkInfo info = (NetworkInfo) message.obj;
@@ -219,23 +208,24 @@
     private class NoActiveNetworkState extends State {
         @Override
         public void enter() {
-            if (DBG) log(getName() + "\n");
             mNetworkInfo = null;
-            /* Clear any previous notification */
-            setNotificationVisible(false);
         }
 
         @Override
         public boolean processMessage(Message message) {
-            if (DBG) log(getName() + message.toString() + "\n");
+            if (DBG) log(getName() + message.toString());
             InetAddress server;
             NetworkInfo info;
             switch (message.what) {
                 case CMD_CONNECTIVITY_CHANGE:
                     info = (NetworkInfo) message.obj;
-                    if (info.isConnected() && isActiveNetwork(info)) {
-                        mNetworkInfo = info;
-                        transitionTo(mDelayedCaptiveCheckState);
+                    if (info.getType() == ConnectivityManager.TYPE_WIFI) {
+                        if (info.isConnected() && isActiveNetwork(info)) {
+                            mNetworkInfo = info;
+                            transitionTo(mDelayedCaptiveCheckState);
+                        }
+                    } else {
+                        log(getName() + " not a wifi connectivity change, ignore");
                     }
                     break;
                 default:
@@ -248,7 +238,7 @@
     private class ActiveNetworkState extends State {
         @Override
         public void enter() {
-            if (DBG) log(getName() + "\n");
+            setNotificationOff();
         }
 
         @Override
@@ -281,7 +271,6 @@
     private class DelayedCaptiveCheckState extends State {
         @Override
         public void enter() {
-            if (DBG) log(getName() + "\n");
             Message message = obtainMessage(CMD_DELAYED_CAPTIVE_CHECK, ++mDelayedCheckToken, 0);
             if (mDeviceProvisioned) {
                 sendMessageDelayed(message, DELAYED_CHECK_INTERVAL_MS);
@@ -292,7 +281,7 @@
 
         @Override
         public boolean processMessage(Message message) {
-            if (DBG) log(getName() + message.toString() + "\n");
+            if (DBG) log(getName() + message.toString());
             switch (message.what) {
                 case CMD_DELAYED_CAPTIVE_CHECK:
                     if (message.arg1 == mDelayedCheckToken) {
@@ -308,7 +297,12 @@
                             if (captive) {
                                 // Setup Wizard will assist the user in connecting to a captive
                                 // portal, so make the notification visible unless during setup
-                                setNotificationVisible(true);
+                                try {
+                                    mConnService.setProvisioningNotificationVisible(true,
+                                        mNetworkInfo.getType(), mNetworkInfo.getExtraInfo(), mUrl);
+                                } catch(RemoteException e) {
+                                    e.printStackTrace();
+                                }
                             }
                         } else {
                             Intent intent = new Intent(
@@ -366,6 +360,15 @@
         return false;
     }
 
+    private void setNotificationOff() {
+        try {
+            mConnService.setProvisioningNotificationVisible(false, ConnectivityManager.TYPE_NONE,
+                    null, null);
+        } catch (RemoteException e) {
+            log("setNotificationOff: " + e);
+        }
+    }
+
     /**
      * Do a URL fetch on a known server to see if we get the data we expect.
      * Measure the response time and broadcast that.
@@ -394,17 +397,14 @@
             long responseTimestamp = SystemClock.elapsedRealtime();
 
             // we got a valid response, but not from the real google
-            boolean isCaptivePortal = urlConnection.getResponseCode() != 204;
+            int rspCode = urlConnection.getResponseCode();
+            boolean isCaptivePortal = rspCode != 204;
 
             sendNetworkConditionsBroadcast(true /* response received */, isCaptivePortal,
                     requestTimestamp, responseTimestamp);
+
+            if (DBG) log("isCaptivePortal: ret=" + isCaptivePortal + " rspCode=" + rspCode);
             return isCaptivePortal;
-        } catch (SocketTimeoutException e) {
-            if (DBG) log("Probably a portal: exception " + e);
-            if (requestTimestamp != -1) {
-                sendFailedCaptivePortalCheckBroadcast(requestTimestamp);
-            } // else something went wrong with setting up the urlConnection
-            return true;
         } catch (IOException e) {
             if (DBG) log("Probably not a portal: exception " + e);
             if (requestTimestamp != -1) {
@@ -435,77 +435,6 @@
         return null;
     }
 
-    private void setNotificationVisible(boolean visible) {
-        // if it should be hidden and it is already hidden, then noop
-        if (!visible && !mNotificationShown) {
-            if (DBG) log("setNotivicationVisible: false and not shown, so noop");
-            return;
-        }
-
-        Resources r = Resources.getSystem();
-        NotificationManager notificationManager = (NotificationManager) mContext
-            .getSystemService(Context.NOTIFICATION_SERVICE);
-
-        if (visible) {
-            CharSequence title;
-            CharSequence details;
-            int icon;
-            String url = null;
-            switch (mNetworkInfo.getType()) {
-                case ConnectivityManager.TYPE_WIFI:
-                    title = r.getString(R.string.wifi_available_sign_in, 0);
-                    details = r.getString(R.string.network_available_sign_in_detailed,
-                            mNetworkInfo.getExtraInfo());
-                    icon = R.drawable.stat_notify_wifi_in_range;
-                    url = mUrl;
-                    break;
-                case ConnectivityManager.TYPE_MOBILE:
-                    title = r.getString(R.string.network_available_sign_in, 0);
-                    // TODO: Change this to pull from NetworkInfo once a printable
-                    // name has been added to it
-                    details = mTelephonyManager.getNetworkOperatorName();
-                    icon = R.drawable.stat_notify_rssi_in_range;
-                    try {
-                        url = mConnService.getMobileProvisioningUrl();
-                        if (TextUtils.isEmpty(url)) {
-                            url = mConnService.getMobileRedirectedProvisioningUrl();
-                        }
-                    } catch(RemoteException e) {
-                        e.printStackTrace();
-                    }
-                    if (TextUtils.isEmpty(url)) {
-                        url = mUrl;
-                    }
-                    break;
-                default:
-                    title = r.getString(R.string.network_available_sign_in, 0);
-                    details = r.getString(R.string.network_available_sign_in_detailed,
-                            mNetworkInfo.getExtraInfo());
-                    icon = R.drawable.stat_notify_rssi_in_range;
-                    url = mUrl;
-                    break;
-            }
-
-            Notification notification = new Notification();
-            notification.when = 0;
-            notification.icon = icon;
-            notification.flags = Notification.FLAG_AUTO_CANCEL;
-            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
-            intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
-                    Intent.FLAG_ACTIVITY_NEW_TASK);
-            notification.contentIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
-            notification.tickerText = title;
-            notification.setLatestEventInfo(mContext, title, details, notification.contentIntent);
-
-            if (DBG) log("setNotivicationVisible: make visible");
-            notificationManager.notify(NOTIFICATION_ID, 1, notification);
-        } else {
-            if (DBG) log("setNotivicationVisible: cancel notification");
-            notificationManager.cancel(NOTIFICATION_ID, 1);
-        }
-        mNotificationShown = visible;
-    }
-
     private void sendFailedCaptivePortalCheckBroadcast(long requestTimestampMs) {
         sendNetworkConditionsBroadcast(false /* response received */, false /* ignored */,
                 requestTimestampMs, 0 /* ignored */);
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index f6a3a4a..3874369 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -624,6 +624,29 @@
     }
 
     /**
+     * Returns details about the Provisioning or currently active default data network. When
+     * connected, this network is the default route for outgoing connections.
+     * You should always check {@link NetworkInfo#isConnected()} before initiating
+     * network traffic. This may return {@code null} when there is no default
+     * network.
+     *
+     * @return a {@link NetworkInfo} object for the current default network
+     *        or {@code null} if no network default network is currently active
+     *
+     * <p>This method requires the call to hold the permission
+     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
+     *
+     * {@hide}
+     */
+    public NetworkInfo getProvisioningOrActiveNetworkInfo() {
+        try {
+            return mService.getProvisioningOrActiveNetworkInfo();
+        } catch (RemoteException e) {
+            return null;
+        }
+    }
+
+    /**
      * Returns the IP information for the current default network.
      *
      * @return a {@link LinkProperties} object describing the IP info
@@ -1357,63 +1380,19 @@
     }
 
     /**
-     * The ResultReceiver resultCode for checkMobileProvisioning (CMP_RESULT_CODE)
-     */
-
-    /**
-     * No connection was possible to the network.
-     * {@hide}
-     */
-    public static final int CMP_RESULT_CODE_NO_CONNECTION = 0;
-
-    /**
-     * A connection was made to the internet, all is well.
-     * {@hide}
-     */
-    public static final int CMP_RESULT_CODE_CONNECTABLE = 1;
-
-    /**
-     * A connection was made but there was a redirection, we appear to be in walled garden.
-     * This is an indication of a warm sim on a mobile network.
-     * {@hide}
-     */
-    public static final int CMP_RESULT_CODE_REDIRECTED = 2;
-
-    /**
-     * A connection was made but no dns server was available to resolve a name to address.
-     * This is an indication of a warm sim on a mobile network.
+     * Check mobile provisioning.
      *
-     * {@hide}
-     */
-    public static final int CMP_RESULT_CODE_NO_DNS = 3;
-
-    /**
-     * A connection was made but could not open a TCP connection.
-     * This is an indication of a warm sim on a mobile network.
-     * {@hide}
-     */
-    public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4;
-
-    /**
-     * Check mobile provisioning. The resultCode passed to
-     * onReceiveResult will be one of the CMP_RESULT_CODE_xxxx values above.
-     * This may take a minute or more to complete.
-     *
-     * @param sendNotificaiton, when true a notification will be sent to user.
      * @param suggestedTimeOutMs, timeout in milliseconds
-     * @param resultReceiver needs to  be supplied to receive the result
      *
      * @return time out that will be used, maybe less that suggestedTimeOutMs
      * -1 if an error.
      *
      * {@hide}
      */
-    public int checkMobileProvisioning(boolean sendNotification, int suggestedTimeOutMs,
-            ResultReceiver resultReceiver) {
+    public int checkMobileProvisioning(int suggestedTimeOutMs) {
         int timeOutMs = -1;
         try {
-            timeOutMs = mService.checkMobileProvisioning(sendNotification, suggestedTimeOutMs,
-                    resultReceiver);
+            timeOutMs = mService.checkMobileProvisioning(suggestedTimeOutMs);
         } catch (RemoteException e) {
         }
         return timeOutMs;
@@ -1481,4 +1460,20 @@
             return null;
         }
     }
+
+    /**
+     * Set sign in error notification to visible or in visible
+     *
+     * @param visible
+     * @param networkType
+     *
+     * {@hide}
+     */
+    public void setProvisioningNotificationVisible(boolean visible, int networkType,
+            String extraInfo, String url) {
+        try {
+            mService.setProvisioningNotificationVisible(visible, networkType, extraInfo, url);
+        } catch (RemoteException e) {
+        }
+    }
 }
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index bf2dade..c07e900 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -50,6 +50,8 @@
     NetworkInfo getNetworkInfo(int networkType);
     NetworkInfo[] getAllNetworkInfo();
 
+    NetworkInfo getProvisioningOrActiveNetworkInfo();
+
     boolean isNetworkSupported(int networkType);
 
     LinkProperties getActiveLinkProperties();
@@ -141,7 +143,7 @@
 
     int findConnectionTypeForIface(in String iface);
 
-    int checkMobileProvisioning(boolean sendNotification, int suggestedTimeOutMs, in ResultReceiver resultReceiver);
+    int checkMobileProvisioning(int suggestedTimeOutMs);
 
     String getMobileProvisioningUrl();
 
@@ -153,4 +155,5 @@
 
     LinkInfo[] getAllLinkInfo();
 
+    void setProvisioningNotificationVisible(boolean visible, int networkType, in String extraInfo, in String url);
 }
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index faa13b0..125d5c1 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -61,8 +61,12 @@
     private ITelephony mPhoneService;
 
     private String mApnType;
+    private NetworkInfo mNetworkInfo;
     private boolean mTeardownRequested = false;
     private Handler mTarget;
+    private Context mContext;
+    private LinkProperties mLinkProperties;
+    private LinkCapabilities mLinkCapabilities;
     private boolean mPrivateDnsRouteSet = false;
     private boolean mDefaultRouteSet = false;
 
@@ -106,6 +110,7 @@
 
         IntentFilter filter = new IntentFilter();
         filter.addAction(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
+        filter.addAction(TelephonyIntents.ACTION_DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN);
         filter.addAction(TelephonyIntents.ACTION_DATA_CONNECTION_FAILED);
 
         mContext.registerReceiver(new MobileDataStateReceiver(), filter);
@@ -184,10 +189,41 @@
     public void releaseWakeLock() {
     }
 
+    private void updateLinkProperitesAndCapatilities(Intent intent) {
+        mLinkProperties = intent.getParcelableExtra(
+                PhoneConstants.DATA_LINK_PROPERTIES_KEY);
+        if (mLinkProperties == null) {
+            loge("CONNECTED event did not supply link properties.");
+            mLinkProperties = new LinkProperties();
+        }
+        mLinkCapabilities = intent.getParcelableExtra(
+                PhoneConstants.DATA_LINK_CAPABILITIES_KEY);
+        if (mLinkCapabilities == null) {
+            loge("CONNECTED event did not supply link capabilities.");
+            mLinkCapabilities = new LinkCapabilities();
+        }
+    }
+
     private class MobileDataStateReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
             if (intent.getAction().equals(TelephonyIntents.
+                    ACTION_DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN)) {
+                String apnName = intent.getStringExtra(PhoneConstants.DATA_APN_KEY);
+                String apnType = intent.getStringExtra(PhoneConstants.DATA_APN_TYPE_KEY);
+                if (!TextUtils.equals(mApnType, apnType)) {
+                    return;
+                }
+                if (DBG) {
+                    log("Broadcast received: " + intent.getAction() + " apnType=" + apnType
+                            + " apnName=" + apnName);
+                }
+
+                // Make us in the connecting state until we make a new TYPE_MOBILE_PROVISIONING
+                mMobileDataState = PhoneConstants.DataState.CONNECTING;
+                updateLinkProperitesAndCapatilities(intent);
+                setDetailedState(DetailedState.CONNECTED_TO_PROVISIONING_NETWORK, "", apnName);
+            } else if (intent.getAction().equals(TelephonyIntents.
                     ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) {
                 String apnType = intent.getStringExtra(PhoneConstants.DATA_APN_TYPE_KEY);
                 if (VDBG) {
@@ -249,18 +285,7 @@
                             setDetailedState(DetailedState.SUSPENDED, reason, apnName);
                             break;
                         case CONNECTED:
-                            mLinkProperties = intent.getParcelableExtra(
-                                    PhoneConstants.DATA_LINK_PROPERTIES_KEY);
-                            if (mLinkProperties == null) {
-                                loge("CONNECTED event did not supply link properties.");
-                                mLinkProperties = new LinkProperties();
-                            }
-                            mLinkCapabilities = intent.getParcelableExtra(
-                                    PhoneConstants.DATA_LINK_CAPABILITIES_KEY);
-                            if (mLinkCapabilities == null) {
-                                loge("CONNECTED event did not supply link capabilities.");
-                                mLinkCapabilities = new LinkCapabilities();
-                            }
+                            updateLinkProperitesAndCapatilities(intent);
                             setDetailedState(DetailedState.CONNECTED, reason, apnName);
                             break;
                     }
@@ -319,8 +344,8 @@
                 String reason = intent.getStringExtra(PhoneConstants.FAILURE_REASON_KEY);
                 String apnName = intent.getStringExtra(PhoneConstants.DATA_APN_KEY);
                 if (DBG) {
-                    log("Received " + intent.getAction() +
-                                " broadcast" + (reason == null ? "" : "(" + reason + ")"));
+                    log("Broadcast received: " + intent.getAction() +
+                                " reason=" + reason == null ? "null" : reason);
                 }
                 setDetailedState(DetailedState.FAILED, reason, apnName);
             } else {
@@ -412,6 +437,13 @@
         return (setEnableApn(mApnType, false) != PhoneConstants.APN_REQUEST_FAILED);
     }
 
+    /**
+     * @return true if this is ready to operate
+     */
+    public boolean isReady() {
+        return mDataConnectionTrackerAc != null;
+    }
+
     @Override
     public void captivePortalCheckComplete() {
         // not implemented
@@ -574,6 +606,40 @@
         }
     }
 
+    /**
+     *  Inform DCT mobile provisioning has started, it ends when provisioning completes.
+     */
+    public void enableMobileProvisioning(String url) {
+        if (DBG) log("enableMobileProvisioning(url=" + url + ")");
+        final AsyncChannel channel = mDataConnectionTrackerAc;
+        if (channel != null) {
+            Message msg = Message.obtain();
+            msg.what = DctConstants.CMD_ENABLE_MOBILE_PROVISIONING;
+            msg.setData(Bundle.forPair(DctConstants.PROVISIONING_URL_KEY, url));
+            channel.sendMessage(msg);
+        }
+    }
+
+    /**
+     * Return if this network is the provisioning network. Valid only if connected.
+     * @param met
+     */
+    public boolean isProvisioningNetwork() {
+        boolean retVal;
+        try {
+            Message msg = Message.obtain();
+            msg.what = DctConstants.CMD_IS_PROVISIONING_APN;
+            msg.setData(Bundle.forPair(DctConstants.APN_TYPE_KEY, mApnType));
+            Message result = mDataConnectionTrackerAc.sendMessageSynchronously(msg);
+            retVal = result.arg1 == DctConstants.ENABLED;
+        } catch (NullPointerException e) {
+            loge("isProvisioningNetwork: X " + e);
+            retVal = false;
+        }
+        if (DBG) log("isProvisioningNetwork: retVal=" + retVal);
+        return retVal;
+    }
+
     @Override
     public void addStackedLink(LinkProperties link) {
         mLinkProperties.addStackedLink(link);
diff --git a/core/java/android/net/NetworkInfo.java b/core/java/android/net/NetworkInfo.java
index 689dae5..dabc73a 100644
--- a/core/java/android/net/NetworkInfo.java
+++ b/core/java/android/net/NetworkInfo.java
@@ -84,6 +84,12 @@
         VERIFYING_POOR_LINK,
         /** Checking if network is a captive portal */
         CAPTIVE_PORTAL_CHECK,
+        /**
+         * Network is connected to provisioning network
+         * TODO: Probably not needed when we add TYPE_PROVISIONING_NETWORK
+         * @hide
+         */
+        CONNECTED_TO_PROVISIONING_NETWORK
     }
 
     /**
@@ -108,6 +114,7 @@
         stateMap.put(DetailedState.DISCONNECTED, State.DISCONNECTED);
         stateMap.put(DetailedState.FAILED, State.DISCONNECTED);
         stateMap.put(DetailedState.BLOCKED, State.DISCONNECTED);
+        stateMap.put(DetailedState.CONNECTED_TO_PROVISIONING_NETWORK, State.CONNECTED);
     }
 
     private int mNetworkType;
diff --git a/core/java/android/nfc/INdefPushCallback.aidl b/core/java/android/nfc/IAppCallback.aidl
similarity index 89%
rename from core/java/android/nfc/INdefPushCallback.aidl
rename to core/java/android/nfc/IAppCallback.aidl
index 16771dc..9599308 100644
--- a/core/java/android/nfc/INdefPushCallback.aidl
+++ b/core/java/android/nfc/IAppCallback.aidl
@@ -17,12 +17,14 @@
 package android.nfc;
 
 import android.nfc.BeamShareData;
+import android.nfc.Tag;
 
 /**
  * @hide
  */
-interface INdefPushCallback
+interface IAppCallback
 {
     BeamShareData createBeamShareData();
     void onNdefPushComplete();
+    void onTagDiscovered(in Tag tag);
 }
diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl
index 15d0475..8414738 100644
--- a/core/java/android/nfc/INfcAdapter.aidl
+++ b/core/java/android/nfc/INfcAdapter.aidl
@@ -21,10 +21,11 @@
 import android.nfc.NdefMessage;
 import android.nfc.Tag;
 import android.nfc.TechListParcel;
-import android.nfc.INdefPushCallback;
+import android.nfc.IAppCallback;
 import android.nfc.INfcAdapterExtras;
 import android.nfc.INfcTag;
 import android.nfc.INfcCardEmulation;
+import android.os.Bundle;
 
 /**
  * @hide
@@ -44,10 +45,10 @@
 
     void setForegroundDispatch(in PendingIntent intent,
             in IntentFilter[] filters, in TechListParcel techLists);
-    void setNdefPushCallback(in INdefPushCallback callback);
+    void setAppCallback(in IAppCallback callback);
 
     void dispatch(in Tag tag);
 
-    void setReaderMode (IBinder b, int flags);
+    void setReaderMode (IBinder b, IAppCallback callback, int flags, in Bundle extras);
     void setP2pModes(int initatorModes, int targetModes);
 }
diff --git a/core/java/android/nfc/NfcActivityManager.java b/core/java/android/nfc/NfcActivityManager.java
index d0d943c..77c0234 100644
--- a/core/java/android/nfc/NfcActivityManager.java
+++ b/core/java/android/nfc/NfcActivityManager.java
@@ -19,6 +19,7 @@
 import android.app.Activity;
 import android.app.Application;
 import android.net.Uri;
+import android.nfc.NfcAdapter.ReaderCallback;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.RemoteException;
@@ -36,7 +37,7 @@
  *
  * @hide
  */
-public final class NfcActivityManager extends INdefPushCallback.Stub
+public final class NfcActivityManager extends IAppCallback.Stub
         implements Application.ActivityLifecycleCallbacks {
     static final String TAG = NfcAdapter.TAG;
     static final Boolean DBG = false;
@@ -113,6 +114,8 @@
         Uri[] uris = null;
         int flags = 0;
         int readerModeFlags = 0;
+        NfcAdapter.ReaderCallback readerCallback = null;
+        Bundle readerModeExtras = null;
         Binder token;
 
         public NfcActivityState(Activity activity) {
@@ -197,17 +200,20 @@
         mDefaultEvent = new NfcEvent(mAdapter);
     }
 
-    public void enableReaderMode(Activity activity, int flags) {
+    public void enableReaderMode(Activity activity, ReaderCallback callback, int flags,
+            Bundle extras) {
         boolean isResumed;
         Binder token;
         synchronized (NfcActivityManager.this) {
             NfcActivityState state = getActivityState(activity);
+            state.readerCallback = callback;
             state.readerModeFlags = flags;
+            state.readerModeExtras = extras;
             token = state.token;
             isResumed = state.resumed;
         }
         if (isResumed) {
-            setReaderMode(token, flags);
+            setReaderMode(token, flags, extras);
         }
     }
 
@@ -216,20 +222,22 @@
         Binder token;
         synchronized (NfcActivityManager.this) {
             NfcActivityState state = getActivityState(activity);
+            state.readerCallback = null;
             state.readerModeFlags = 0;
+            state.readerModeExtras = null;
             token = state.token;
             isResumed = state.resumed;
         }
         if (isResumed) {
-            setReaderMode(token, 0);
+            setReaderMode(token, 0, null);
         }
 
     }
 
-    public void setReaderMode(Binder token, int flags) {
+    public void setReaderMode(Binder token, int flags, Bundle extras) {
         if (DBG) Log.d(TAG, "Setting reader mode");
         try {
-            NfcAdapter.sService.setReaderMode(token, flags);
+            NfcAdapter.sService.setReaderMode(token, this, flags, extras);
         } catch (RemoteException e) {
             mAdapter.attemptDeadServiceRecovery(e);
         }
@@ -302,12 +310,12 @@
     }
 
     /**
-     * Request or unrequest NFC service callbacks for NDEF push.
+     * Request or unrequest NFC service callbacks.
      * Makes IPC call - do not hold lock.
      */
     void requestNfcServiceCallback() {
         try {
-            NfcAdapter.sService.setNdefPushCallback(this);
+            NfcAdapter.sService.setAppCallback(this);
         } catch (RemoteException e) {
             mAdapter.attemptDeadServiceRecovery(e);
         }
@@ -375,6 +383,22 @@
         }
     }
 
+    @Override
+    public void onTagDiscovered(Tag tag) throws RemoteException {
+        NfcAdapter.ReaderCallback callback;
+        synchronized (NfcActivityManager.this) {
+            NfcActivityState state = findResumedActivityState();
+            if (state == null) return;
+
+            callback = state.readerCallback;
+        }
+
+        // Make callback without lock
+        if (callback != null) {
+            callback.onTagDiscovered(tag);
+        }
+
+    }
     /** Callback from Activity life-cycle, on main thread */
     @Override
     public void onActivityCreated(Activity activity, Bundle savedInstanceState) { /* NO-OP */ }
@@ -387,6 +411,7 @@
     @Override
     public void onActivityResumed(Activity activity) {
         int readerModeFlags = 0;
+        Bundle readerModeExtras = null;
         Binder token;
         synchronized (NfcActivityManager.this) {
             NfcActivityState state = findActivityState(activity);
@@ -395,9 +420,10 @@
             state.resumed = true;
             token = state.token;
             readerModeFlags = state.readerModeFlags;
+            readerModeExtras = state.readerModeExtras;
         }
         if (readerModeFlags != 0) {
-            setReaderMode(token, readerModeFlags);
+            setReaderMode(token, readerModeFlags, readerModeExtras);
         }
         requestNfcServiceCallback();
     }
@@ -417,7 +443,7 @@
         }
         if (readerModeFlagsSet) {
             // Restore default p2p modes
-            setReaderMode(token, 0);
+            setReaderMode(token, 0, null);
         }
     }
 
@@ -441,4 +467,5 @@
             }
         }
     }
+
 }
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index fa0c1f6..2a18900 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -33,6 +33,7 @@
 import android.nfc.tech.Ndef;
 import android.nfc.tech.NfcA;
 import android.nfc.tech.NfcF;
+import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -196,42 +197,42 @@
     public static final int STATE_TURNING_OFF = 4;
 
     /**
-     * Flag for use with {@link #enableReaderMode(Activity, int)}.
+     * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}.
      * <p>
      * Setting this flag enables polling for Nfc-A technology.
      */
     public static final int FLAG_READER_NFC_A = 0x1;
 
     /**
-     * Flag for use with {@link #enableReaderMode(Activity, int)}.
+     * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}.
      * <p>
      * Setting this flag enables polling for Nfc-B technology.
      */
     public static final int FLAG_READER_NFC_B = 0x2;
 
     /**
-     * Flag for use with {@link #enableReaderMode(Activity, int)}.
+     * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}.
      * <p>
      * Setting this flag enables polling for Nfc-F technology.
      */
     public static final int FLAG_READER_NFC_F = 0x4;
 
     /**
-     * Flag for use with {@link #enableReaderMode(Activity, int)}.
+     * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}.
      * <p>
      * Setting this flag enables polling for Nfc-V (ISO15693) technology.
      */
     public static final int FLAG_READER_NFC_V = 0x8;
 
     /**
-     * Flag for use with {@link #enableReaderMode(Activity, int)}.
+     * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}.
      * <p>
      * Setting this flag enables polling for Kovio technology.
      */
     public static final int FLAG_READER_KOVIO = 0x10;
 
     /**
-     * Flag for use with {@link #enableReaderMode(Activity, int)}.
+     * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}.
      * <p>
      * Setting this flag allows the caller to prevent the
      * platform from performing an NDEF check on the tags it
@@ -239,6 +240,23 @@
      */
     public static final int FLAG_READER_SKIP_NDEF_CHECK = 0x80;
 
+    /**
+     * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}.
+     * <p>
+     * Setting this flag allows the caller to prevent the
+     * platform from playing sounds when it discovers a tag.
+     */
+    public static final int FLAG_READER_NO_PLATFORM_SOUNDS = 0x100;
+
+    /**
+     * Int Extra for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}.
+     * <p>
+     * Setting this integer extra allows the calling application to specify
+     * the delay that the platform will use for performing presence checks
+     * on any discovered tag.
+     */
+    public static final String EXTRA_READER_PRESENCE_CHECK_DELAY = "presence";
+
     /** @hide */
     public static final int FLAG_NDEF_PUSH_NO_CONFIRM = 0x1;
 
@@ -291,6 +309,14 @@
     final Context mContext;
 
     /**
+     * A callback to be invoked when the system has found a tag in
+     * reader mode.
+     */
+    public interface ReaderCallback {
+        public void onTagDiscovered(Tag tag);
+    }
+
+    /**
      * A callback to be invoked when the system successfully delivers your {@link NdefMessage}
      * to another device.
      * @see #setOnNdefPushCompleteCallback
@@ -1167,19 +1193,18 @@
      * {@link Ndef} tag technology from being enumerated on the tag, and that
      * NDEF-based tag dispatch will not be functional.
      *
-     * <p>It is recommended to combine this method with
-     * {@link #enableForegroundDispatch(Activity, PendingIntent, IntentFilter[], String[][])
-     * to ensure that tags are delivered to this activity.
-     *
      * <p>For interacting with tags that are emulated on another Android device
      * using Android's host-based card-emulation, the recommended flags are
      * {@link #FLAG_READER_NFC_A} and {@link #FLAG_READER_SKIP_NDEF_CHECK}.
      *
      * @param activity the Activity that requests the adapter to be in reader mode
+     * @param callback the callback to be called when a tag is discovered
      * @param flags Flags indicating poll technologies and other optional parameters
+     * @param extras Additional extras for configuring reader mode.
      */
-    public void enableReaderMode(Activity activity, int flags) {
-        mNfcActivityManager.enableReaderMode(activity, flags);
+    public void enableReaderMode(Activity activity, ReaderCallback callback, int flags,
+            Bundle extras) {
+        mNfcActivityManager.enableReaderMode(activity, callback, flags, extras);
     }
 
     /**
diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
index 3f7e3ef..41c6603 100644
--- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java
+++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
@@ -75,16 +75,22 @@
     final HashMap<String, AidGroup> mCategoryToGroup;
 
     /**
+     * Whether this service should only be started when the device is unlocked.
+     */
+    final boolean mRequiresDeviceUnlock;
+
+    /**
      * @hide
      */
     public ApduServiceInfo(ResolveInfo info, boolean onHost, String description,
-            ArrayList<AidGroup> aidGroups) {
+            ArrayList<AidGroup> aidGroups, boolean requiresUnlock) {
         this.mService = info;
         this.mDescription = description;
         this.mAidGroups = aidGroups;
         this.mAids = new ArrayList<String>();
         this.mCategoryToGroup = new HashMap<String, AidGroup>();
         this.mOnHost = onHost;
+        this.mRequiresDeviceUnlock = requiresUnlock;
         for (AidGroup aidGroup : aidGroups) {
             this.mCategoryToGroup.put(aidGroup.category, aidGroup);
             this.mAids.addAll(aidGroup.aids);
@@ -99,8 +105,12 @@
             if (onHost) {
                 parser = si.loadXmlMetaData(pm, HostApduService.SERVICE_META_DATA);
                 if (parser == null) {
-                    throw new XmlPullParserException("No " + HostApduService.SERVICE_META_DATA +
-                            " meta-data");
+                    Log.d(TAG, "Didn't find service meta-data, trying legacy.");
+                    parser = si.loadXmlMetaData(pm, HostApduService.OLD_SERVICE_META_DATA);
+                    if (parser == null) {
+                        throw new XmlPullParserException("No " + HostApduService.SERVICE_META_DATA +
+                                " meta-data");
+                    }
                 }
             } else {
                 parser = si.loadXmlMetaData(pm, OffHostApduService.SERVICE_META_DATA);
@@ -132,12 +142,16 @@
                 mService = info;
                 mDescription = sa.getString(
                         com.android.internal.R.styleable.HostApduService_description);
+                mRequiresDeviceUnlock = sa.getBoolean(
+                        com.android.internal.R.styleable.HostApduService_requireDeviceUnlock,
+                        false);
             } else {
                 TypedArray sa = res.obtainAttributes(attrs,
                         com.android.internal.R.styleable.OffHostApduService);
                 mService = info;
                 mDescription = sa.getString(
                         com.android.internal.R.styleable.OffHostApduService_description);
+                mRequiresDeviceUnlock = false;
             }
 
             mAidGroups = new ArrayList<AidGroup>();
@@ -160,12 +174,12 @@
                             com.android.internal.R.styleable.AidGroup_description);
                     String groupCategory = groupAttrs.getString(
                             com.android.internal.R.styleable.AidGroup_category);
-                    if (!CardEmulationManager.CATEGORY_PAYMENT.equals(groupCategory)) {
-                        groupCategory = CardEmulationManager.CATEGORY_OTHER;
+                    if (!CardEmulation.CATEGORY_PAYMENT.equals(groupCategory)) {
+                        groupCategory = CardEmulation.CATEGORY_OTHER;
                     }
                     currentGroup = mCategoryToGroup.get(groupCategory);
                     if (currentGroup != null) {
-                        if (!CardEmulationManager.CATEGORY_OTHER.equals(groupCategory)) {
+                        if (!CardEmulation.CATEGORY_OTHER.equals(groupCategory)) {
                             Log.e(TAG, "Not allowing multiple aid-groups in the " +
                                     groupCategory + " category");
                             currentGroup = null;
@@ -226,6 +240,10 @@
         return mOnHost;
     }
 
+    public boolean requiresUnlock() {
+        return mRequiresDeviceUnlock;
+    }
+
     public CharSequence loadLabel(PackageManager pm) {
         return mService.loadLabel(pm);
     }
@@ -287,6 +305,7 @@
         if (mAidGroups.size() > 0) {
             dest.writeTypedList(mAidGroups);
         }
+        dest.writeInt(mRequiresDeviceUnlock ? 1 : 0);
     };
 
     public static final Parcelable.Creator<ApduServiceInfo> CREATOR =
@@ -301,7 +320,8 @@
             if (numGroups > 0) {
                 source.readTypedList(aidGroups, AidGroup.CREATOR);
             }
-            return new ApduServiceInfo(info, onHost, description, aidGroups);
+            boolean requiresUnlock = (source.readInt() != 0) ? true : false;
+            return new ApduServiceInfo(info, onHost, description, aidGroups, requiresUnlock);
         }
 
         @Override
diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java
new file mode 100644
index 0000000..3cd7863
--- /dev/null
+++ b/core/java/android/nfc/cardemulation/CardEmulation.java
@@ -0,0 +1,343 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package android.nfc.cardemulation;
+
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
+import android.app.ActivityThread;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.nfc.INfcCardEmulation;
+import android.nfc.NfcAdapter;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.List;
+
+public final class CardEmulation {
+    static final String TAG = "CardEmulation";
+
+    /**
+     * Activity action: ask the user to change the default
+     * card emulation service for a certain category. This will
+     * show a dialog that asks the user whether he wants to
+     * replace the current default service with the service
+     * identified with the ComponentName specified in
+     * {@link #EXTRA_SERVICE_COMPONENT}, for the category
+     * specified in {@link #EXTRA_CATEGORY}
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_CHANGE_DEFAULT =
+            "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT";
+
+    /**
+     * The category extra for {@link #ACTION_CHANGE_DEFAULT}
+     *
+     * @see #ACTION_CHANGE_DEFAULT
+     */
+    public static final String EXTRA_CATEGORY = "category";
+
+    /**
+     * The ComponentName object passed in as a parcelable
+     * extra for {@link #ACTION_CHANGE_DEFAULT}
+     *
+     * @see #ACTION_CHANGE_DEFAULT
+     */
+    public static final String EXTRA_SERVICE_COMPONENT = "component";
+
+    /**
+     * The payment category can be used to indicate that an AID
+     * represents a payment application.
+     */
+    public static final String CATEGORY_PAYMENT = "payment";
+
+    /**
+     * If an AID group does not contain a category, or the
+     * specified category is not defined by the platform version
+     * that is parsing the AID group, all AIDs in the group will
+     * automatically be categorized under the {@link #CATEGORY_OTHER}
+     * category.
+     */
+    public static final String CATEGORY_OTHER = "other";
+
+    /**
+     * Return value for {@link #getSelectionModeForCategory(String)}.
+     *
+     * <p>In this mode, the user has set a default service for this
+     *    AID category. If a remote reader selects any of the AIDs
+     *    that the default service has registered in this category,
+     *    that service will automatically be bound to to handle
+     *    the transaction.
+     *
+     * <p>There are still cases where a service that is
+     *    not the default for a category can selected:
+     *    <p>
+     *    If a remote reader selects an AID in this category
+     *    that is not handled by the default service, and there is a set
+     *    of other services {S} that do handle this AID, the
+     *    user is asked if he wants to use any of the services in
+     *    {S} instead.
+     *    <p>
+     *    As a special case, if the size of {S} is one, containing a single service X,
+     *    and all AIDs X has registered in this category are not
+     *    registered by any other service, then X will be
+     *    selected automatically without asking the user.
+     *    <p>Example:
+     *    <ul>
+     *    <li>Service A registers AIDs "1", "2" and "3" in the category
+     *    <li>Service B registers AIDs "3" and "4" in the category
+     *    <li>Service C registers AIDs "5" and "6" in the category
+     *    </ul>
+     *    In this case, the following will happen when service A
+     *    is the default:
+     *    <ul>
+     *    <li>Reader selects AID "1", "2" or "3": service A is invoked automatically
+     *    <li>Reader selects AID "4": the user is asked to confirm he
+     *        wants to use service B, because its AIDs overlap with service A.
+     *    <li>Reader selects AID "5" or "6": service C is invoked automatically,
+     *        because all AIDs it has asked for are only registered by C,
+     *        and there is no overlap.
+     *    </ul>
+     *
+     */
+    public static final int SELECTION_MODE_PREFER_DEFAULT = 0;
+
+    /**
+     * Return value for {@link #getSelectionModeForCategory(String)}.
+     *
+     * <p>In this mode, whenever an AID of this category is selected,
+     *    the user is asked which service he wants to use to handle
+     *    the transaction, even if there is only one matching service.
+     */
+    public static final int SELECTION_MODE_ALWAYS_ASK = 1;
+
+    /**
+     * Return value for {@link #getSelectionModeForCategory(String)}.
+     *
+     * <p>In this mode, the user will only be asked to select a service
+     *    if the selected AID has been registered by multiple applications.
+     */
+    public static final int SELECTION_MODE_ASK_IF_CONFLICT = 2;
+
+    static boolean sIsInitialized = false;
+    static HashMap<Context, CardEmulation> sCardEmus = new HashMap();
+    static INfcCardEmulation sService;
+
+    final Context mContext;
+
+    private CardEmulation(Context context, INfcCardEmulation service) {
+        mContext = context.getApplicationContext();
+        sService = service;
+    }
+
+    public static synchronized CardEmulation getInstance(NfcAdapter adapter) {
+        if (adapter == null) throw new NullPointerException("NfcAdapter is null");
+        Context context = adapter.getContext();
+        if (context == null) {
+            Log.e(TAG, "NfcAdapter context is null.");
+            throw new UnsupportedOperationException();
+        }
+        if (!sIsInitialized) {
+            IPackageManager pm = ActivityThread.getPackageManager();
+            if (pm == null) {
+                Log.e(TAG, "Cannot get PackageManager");
+                throw new UnsupportedOperationException();
+            }
+            try {
+                if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
+                    Log.e(TAG, "This device does not support card emulation");
+                    throw new UnsupportedOperationException();
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, "PackageManager query failed.");
+                throw new UnsupportedOperationException();
+            }
+            sIsInitialized = true;
+        }
+        CardEmulation manager = sCardEmus.get(context);
+        if (manager == null) {
+            // Get card emu service
+            INfcCardEmulation service = adapter.getCardEmulationService();
+            manager = new CardEmulation(context, service);
+            sCardEmus.put(context, manager);
+        }
+        return manager;
+    }
+
+    /**
+     * Allows an application to query whether a service is currently
+     * the default service to handle a card emulation category.
+     *
+     * <p>Note that if {@link #getSelectionModeForCategory(String)}
+     * returns {@link #SELECTION_MODE_ALWAYS_ASK}, this method will always
+     * return false.
+     *
+     * @param service The ComponentName of the service
+     * @param category The category
+     * @return whether service is currently the default service for the category.
+     */
+    public boolean isDefaultServiceForCategory(ComponentName service, String category) {
+        try {
+            return sService.isDefaultServiceForCategory(UserHandle.myUserId(), service, category);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+            try {
+                return sService.isDefaultServiceForCategory(UserHandle.myUserId(), service,
+                        category);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+        }
+    }
+
+    /**
+     *
+     * Allows an application to query whether a service is currently
+     * the default handler for a specified ISO7816-4 Application ID.
+     *
+     * @param service The ComponentName of the service
+     * @param aid The ISO7816-4 Application ID
+     * @return
+     */
+    public boolean isDefaultServiceForAid(ComponentName service, String aid) {
+        try {
+            return sService.isDefaultServiceForAid(UserHandle.myUserId(), service, aid);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+            try {
+                return sService.isDefaultServiceForAid(UserHandle.myUserId(), service, aid);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to reach CardEmulationService.");
+                return false;
+            }
+        }
+    }
+
+    /**
+     * Returns the application selection mode for the passed in category.
+     * Valid return values are:
+     * <p>{@link #SELECTION_MODE_PREFER_DEFAULT} the user has requested a default
+     *    application for this category, which will be preferred.
+     * <p>{@link #SELECTION_MODE_ALWAYS_ASK} the user has requested to be asked
+     *    every time what app he would like to use in this category.
+     * <p>{@link #SELECTION_MODE_ASK_IF_CONFLICT} the user will only be asked
+     *    to pick a service if there is a conflict.
+     * @param category The category, for example {@link #CATEGORY_PAYMENT}
+     * @return
+     */
+    public int getSelectionModeForCategory(String category) {
+        if (CATEGORY_PAYMENT.equals(category)) {
+            String defaultComponent = Settings.Secure.getString(mContext.getContentResolver(),
+                    Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT);
+            if (defaultComponent != null) {
+                return SELECTION_MODE_PREFER_DEFAULT;
+            } else {
+                return SELECTION_MODE_ALWAYS_ASK;
+            }
+        } else {
+            // All other categories are in "only ask if conflict" mode
+            return SELECTION_MODE_ASK_IF_CONFLICT;
+        }
+    }
+
+    /**
+     * @hide
+     */
+    public boolean setDefaultServiceForCategory(ComponentName service, String category) {
+        try {
+            return sService.setDefaultServiceForCategory(UserHandle.myUserId(), service, category);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+            try {
+                return sService.setDefaultServiceForCategory(UserHandle.myUserId(), service,
+                        category);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to reach CardEmulationService.");
+                return false;
+            }
+        }
+    }
+
+    /**
+     * @hide
+     */
+    public boolean setDefaultForNextTap(ComponentName service) {
+        try {
+            return sService.setDefaultForNextTap(UserHandle.myUserId(), service);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
+            try {
+                return sService.setDefaultForNextTap(UserHandle.myUserId(), service);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to reach CardEmulationService.");
+                return false;
+            }
+        }
+    }
+    /**
+     * @hide
+     */
+    public List<ApduServiceInfo> getServices(String category) {
+        try {
+            return sService.getServices(UserHandle.myUserId(), category);
+        } catch (RemoteException e) {
+            // Try one more time
+            recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return null;
+            }
+            try {
+                return sService.getServices(UserHandle.myUserId(), category);
+            } catch (RemoteException ee) {
+                Log.e(TAG, "Failed to reach CardEmulationService.");
+                return null;
+            }
+        }
+    }
+
+    void recoverService() {
+        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext);
+        sService = adapter.getCardEmulationService();
+    }
+}
diff --git a/core/java/android/nfc/cardemulation/CardEmulationManager.java b/core/java/android/nfc/cardemulation/CardEmulationManager.java
index 537fded..124ea1c 100644
--- a/core/java/android/nfc/cardemulation/CardEmulationManager.java
+++ b/core/java/android/nfc/cardemulation/CardEmulationManager.java
@@ -27,11 +27,16 @@
 import android.nfc.NfcAdapter;
 import android.os.RemoteException;
 import android.os.UserHandle;
+import android.provider.Settings;
 import android.util.Log;
 
 import java.util.HashMap;
 import java.util.List;
 
+/**
+ * TODO Remove when calling .apks are upgraded
+ * @hide
+ */
 public final class CardEmulationManager {
     static final String TAG = "CardEmulationManager";
 
@@ -78,20 +83,69 @@
      */
     public static final String CATEGORY_OTHER = "other";
 
+    /**
+     * Return value for {@link #getSelectionModeForCategory(String)}.
+     *
+     * <p>In this mode, the user has set a default service for this
+     *    AID category. If a remote reader selects any of the AIDs
+     *    that the default service has registered in this category,
+     *    that service will automatically be bound to to handle
+     *    the transaction.
+     *
+     * <p>There are still cases where a service that is
+     *    not the default for a category can selected:
+     *    <p>
+     *    If a remote reader selects an AID in this category
+     *    that is not handled by the default service, and there is a set
+     *    of other services {S} that do handle this AID, the
+     *    user is asked if he wants to use any of the services in
+     *    {S} instead.
+     *    <p>
+     *    As a special case, if the size of {S} is one, containing a single service X,
+     *    and all AIDs X has registered in this category are not
+     *    registered by any other service, then X will be
+     *    selected automatically without asking the user.
+     *    <p>Example:
+     *    <ul>
+     *    <li>Service A registers AIDs "1", "2" and "3" in the category
+     *    <li>Service B registers AIDs "3" and "4" in the category
+     *    <li>Service C registers AIDs "5" and "6" in the category
+     *    </ul>
+     *    In this case, the following will happen when service A
+     *    is the default:
+     *    <ul>
+     *    <li>Reader selects AID "1", "2" or "3": service A is invoked automatically
+     *    <li>Reader selects AID "4": the user is asked to confirm he
+     *        wants to use service B, because its AIDs overlap with service A.
+     *    <li>Reader selects AID "5" or "6": service C is invoked automatically,
+     *        because all AIDs it has asked for are only registered by C,
+     *        and there is no overlap.
+     *    </ul>
+     *
+     */
+    public static final int SELECTION_MODE_PREFER_DEFAULT = 0;
+
+    /**
+     * Return value for {@link #getSelectionModeForCategory(String)}.
+     *
+     * <p>In this mode, whenever an AID of this category is selected,
+     *    the user is asked which service he wants to use to handle
+     *    the transaction, even if there is only one matching service.
+     */
+    public static final int SELECTION_MODE_ALWAYS_ASK = 1;
+
+    /**
+     * Return value for {@link #getSelectionModeForCategory(String)}.
+     *
+     * <p>In this mode, the user will only be asked to select a service
+     *    if the selected AID has been registered by multiple applications.
+     */
+    public static final int SELECTION_MODE_ASK_IF_CONFLICT = 2;
+
     static boolean sIsInitialized = false;
     static HashMap<Context, CardEmulationManager> sCardEmuManagers = new HashMap();
     static INfcCardEmulation sService;
 
-    /**
-     * @hide
-     */
-    public static final String PAYMENT_MODE_AUTO = "auto";
-
-    /**
-     * @hide
-     */
-    public static final String PAYMENT_MODE_MANUAL = "manual";
-
     final Context mContext;
 
     private CardEmulationManager(Context context, INfcCardEmulation service) {
@@ -113,7 +167,7 @@
                 throw new UnsupportedOperationException();
             }
             try {
-                if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HCE)) {
+                if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
                     Log.e(TAG, "This device does not support card emulation");
                     throw new UnsupportedOperationException();
                 }
@@ -137,6 +191,10 @@
      * Allows an application to query whether a service is currently
      * the default service to handle a card emulation category.
      *
+     * <p>Note that if {@link #getSelectionModeForCategory(String)}
+     * returns {@link #SELECTION_MODE_ALWAYS_ASK}, this method will always
+     * return false.
+     *
      * @param service The ComponentName of the service
      * @param category The category
      * @return whether service is currently the default service for the category.
@@ -147,6 +205,10 @@
         } catch (RemoteException e) {
             // Try one more time
             recoverService();
+            if (sService == null) {
+                Log.e(TAG, "Failed to recover CardEmulationService.");
+                return false;
+            }
             try {
                 return sService.isDefaultServiceForCategory(UserHandle.myUserId(), service,
                         category);
@@ -186,6 +248,33 @@
     }
 
     /**
+     * Returns the application selection mode for the passed in category.
+     * Valid return values are:
+     * <p>{@link #SELECTION_MODE_PREFER_DEFAULT} the user has requested a default
+     *    application for this category, which will be preferred.
+     * <p>{@link #SELECTION_MODE_ALWAYS_ASK} the user has requested to be asked
+     *    every time what app he would like to use in this category.
+     * <p>{@link #SELECTION_MODE_ASK_IF_CONFLICT} the user will only be asked
+     *    to pick a service if there is a conflict.
+     * @param category The category, for example {@link #CATEGORY_PAYMENT}
+     * @return
+     */
+    public int getSelectionModeForCategory(String category) {
+        if (CATEGORY_PAYMENT.equals(category)) {
+            String defaultComponent = Settings.Secure.getString(mContext.getContentResolver(),
+                    Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT);
+            if (defaultComponent != null) {
+                return SELECTION_MODE_PREFER_DEFAULT;
+            } else {
+                return SELECTION_MODE_ALWAYS_ASK;
+            }
+        } else {
+            // All other categories are in "only ask if conflict" mode
+            return SELECTION_MODE_ASK_IF_CONFLICT;
+        }
+    }
+
+    /**
      * @hide
      */
     public boolean setDefaultServiceForCategory(ComponentName service, String category) {
diff --git a/core/java/android/nfc/cardemulation/HostApduService.java b/core/java/android/nfc/cardemulation/HostApduService.java
index cdc4adb..174acc0 100644
--- a/core/java/android/nfc/cardemulation/HostApduService.java
+++ b/core/java/android/nfc/cardemulation/HostApduService.java
@@ -4,13 +4,11 @@
 import android.annotation.SdkConstant.SdkConstantType;
 import android.app.Service;
 import android.content.Intent;
-import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.Messenger;
-import android.os.Parcel;
 import android.os.RemoteException;
 import android.util.Log;
 
@@ -42,13 +40,31 @@
      */
     @SdkConstant(SdkConstantType.SERVICE_ACTION)
     public static final String SERVICE_INTERFACE =
-            "android.nfc.HostApduService";
+            "android.nfc.cardemulation.action.HOST_APDU_SERVICE";
 
     /**
      * The name of the meta-data element that contains
      * more information about this service.
      */
-    public static final String SERVICE_META_DATA = "android.nfc.HostApduService";
+    public static final String SERVICE_META_DATA =
+            "android.nfc.cardemulation.host_apdu_service";
+
+    /**
+     * The {@link Intent} that must be declared as handled by the service.
+     * TODO Remove
+     * @hide
+     */
+    public static final String OLD_SERVICE_INTERFACE =
+            "android.nfc.HostApduService";
+
+    /**
+     * The name of the meta-data element that contains
+     * more information about this service.
+     *
+     * TODO Remove
+     * @hide
+     */
+    public static final String OLD_SERVICE_META_DATA = "android.nfc.HostApduService";
 
     /**
      * Reason for {@link #onDeactivated(int)}.
@@ -65,7 +81,7 @@
      * currently active on the logical channel).
      *
      * <p>Note that this next AID may still be resolved to this
-     * service, in which case {@link #processCommandApdu(byte[], int)}
+     * service, in which case {@link #processCommandApdu(byte[], Bundle)}
      * will be called again.
      */
     public static final int DEACTIVATION_DESELECTED = 1;
@@ -133,7 +149,7 @@
 
                 byte[] apdu = dataBundle.getByteArray(KEY_DATA);
                 if (apdu != null) {
-                    byte[] responseApdu = processCommandApdu(apdu, 0);
+                    byte[] responseApdu = processCommandApdu(apdu, null);
                     if (responseApdu != null) {
                         if (mNfcService == null) {
                             Log.e(TAG, "Response not sent; service was deactivated.");
@@ -232,7 +248,7 @@
      * transaction.
      *
      * <p>Note: this method may be called anywhere between
-     *    the first {@link #processCommandApdu(byte[], int)}
+     *    the first {@link #processCommandApdu(byte[], Bundle)}
      *    call and a {@link #onDeactivated(int)} call.
      */
     public final void notifyUnhandled() {
@@ -292,8 +308,11 @@
      * @param flags
      * @return a byte-array containing the response APDU, or null if no
      *         response APDU can be sent at this point.
+     * @hide
      */
-    public abstract byte[] processCommandApdu(byte[] commandApdu, int flags);
+    public byte[] processCommandApdu(byte[] commandApdu, int flags) {
+        return null;
+    }
 
     /**
      * This method will be called in two possible scenarios:
diff --git a/core/java/android/nfc/cardemulation/OffHostApduService.java b/core/java/android/nfc/cardemulation/OffHostApduService.java
index 79599db..15f63f9 100644
--- a/core/java/android/nfc/cardemulation/OffHostApduService.java
+++ b/core/java/android/nfc/cardemulation/OffHostApduService.java
@@ -42,13 +42,14 @@
      */
     @SdkConstant(SdkConstantType.SERVICE_ACTION)
     public static final String SERVICE_INTERFACE =
-            "android.nfc.OffHostApduService";
+            "android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE";
 
     /**
      * The name of the meta-data element that contains
      * more information about this service.
      */
-    public static final String SERVICE_META_DATA = "android.nfc.OffHostApduService";
+    public static final String SERVICE_META_DATA =
+            "android.nfc.cardemulation.off_host_apdu_service";
 
     /**
      * The Android platform itself will not bind to this service,
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java
index f474504..32b1b604 100644
--- a/core/java/android/os/Bundle.java
+++ b/core/java/android/os/Bundle.java
@@ -22,6 +22,7 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -545,6 +546,13 @@
         mFdsKnown = false;
     }
 
+    /** {@hide} */
+    public void putParcelableList(String key, List<? extends Parcelable> value) {
+        unparcel();
+        mMap.put(key, value);
+        mFdsKnown = false;
+    }
+
     /**
      * Inserts a SparceArray of Parcelable values into the mapping of this
      * Bundle, replacing any existing value for the given key.  Either key
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 0a6db25..60ce132 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -639,16 +639,19 @@
      *
      * @hide
      */
-    public static void startMethodTracingDdms(int bufferSize, int flags) {
-        VMDebug.startMethodTracingDdms(bufferSize, flags);
+    public static void startMethodTracingDdms(int bufferSize, int flags,
+        boolean samplingEnabled, int intervalUs) {
+        VMDebug.startMethodTracingDdms(bufferSize, flags, samplingEnabled, intervalUs);
     }
 
     /**
-     * Determine whether method tracing is currently active.
+     * Determine whether method tracing is currently active and what type is
+     * active.
+     *
      * @hide
      */
-    public static boolean isMethodTracingActive() {
-        return VMDebug.isMethodTracingActive();
+    public static int getMethodTracingMode() {
+        return VMDebug.getMethodTracingMode();
     }
 
     /**
diff --git a/core/java/android/print/IPrintManager.aidl b/core/java/android/print/IPrintManager.aidl
index 3bfd9a1..fb6bb2e 100644
--- a/core/java/android/print/IPrintManager.aidl
+++ b/core/java/android/print/IPrintManager.aidl
@@ -41,7 +41,9 @@
     void startPrinterDiscovery(in IPrinterDiscoveryObserver observer,
             in List<PrinterId> priorityList, int userId);
     void stopPrinterDiscovery(in IPrinterDiscoveryObserver observer, int userId);
-    void requestPrinterUpdate(in PrinterId printerId, int userId);
+    void validatePrinters(in List<PrinterId> printerIds, int userId);
+    void startPrinterStateTracking(in PrinterId printerId, int userId);
+    void stopPrinterStateTracking(in PrinterId printerId, int userId);
     void destroyPrinterDiscoverySession(in IPrinterDiscoveryObserver observer,
             int userId);
 }
diff --git a/core/java/android/print/PrintDocumentAdapter.java b/core/java/android/print/PrintDocumentAdapter.java
index 8a64e85..33b4aad 100644
--- a/core/java/android/print/PrintDocumentAdapter.java
+++ b/core/java/android/print/PrintDocumentAdapter.java
@@ -18,8 +18,8 @@
 
 import android.os.Bundle;
 import android.os.CancellationSignal;
+import android.os.ParcelFileDescriptor;
 
-import java.io.FileDescriptor;
 import java.util.List;
 
 /**
@@ -41,7 +41,7 @@
  * <li>
  * After every call to {@link #onLayout(PrintAttributes, PrintAttributes,
  * CancellationSignal, LayoutResultCallback, Bundle)}, you may get a call to
- * {@link #onWrite(PageRange[], FileDescriptor, CancellationSignal, WriteResultCallback)}
+ * {@link #onWrite(PageRange[], ParcelFileDescriptor, CancellationSignal, WriteResultCallback)}
  * asking you to write a PDF file with the content for specific pages.
  * </li>
  * <li>
@@ -64,7 +64,7 @@
  * PrintAttributes, CancellationSignal, LayoutResultCallback, Bundle)} on
  * the UI thread (assuming onStart initializes resources needed for layout).
  * This will ensure that the UI does not change while you are laying out the
- * printed content. Then you can handle {@link #onWrite(PageRange[], FileDescriptor,
+ * printed content. Then you can handle {@link #onWrite(PageRange[], ParcelFileDescriptor,
  * CancellationSignal, WriteResultCallback)} and {@link #onFinish()} on another
  * thread. This will ensure that the UI is frozen for the minimal amount of
  * time. Also this assumes that you will generate the printed content in
@@ -150,10 +150,10 @@
      * from of a PDF file to the given file descriptor. This method is invoked
      * on the main thread.
      *<p>
-     * After you are done writing, you should <strong>not</strong> close the
-     * file descriptor, rather you must invoke: {@link WriteResultCallback
-     * #onWriteFinished(List)}, if writing completed successfully; or {@link
-     * WriteResultCallback#onWriteFailed(CharSequence)}, if an error occurred.
+     * After you are done writing, you should close the file descriptor and
+     * invoke {@link WriteResultCallback #onWriteFinished(List)}, if writing
+     * completed successfully; or {@link WriteResultCallback#onWriteFailed(
+     * CharSequence)}, if an error occurred.
      * </p>
      * <p>
      * <strong>Note:</strong> If the printed content is large, it is a good
@@ -171,7 +171,7 @@
      * @see WriteResultCallback
      * @see CancellationSignal
      */
-    public abstract void onWrite(PageRange[] pages, FileDescriptor destination,
+    public abstract void onWrite(PageRange[] pages, ParcelFileDescriptor destination,
             CancellationSignal cancellationSignal, WriteResultCallback callback);
 
     /**
@@ -185,7 +185,7 @@
 
     /**
      * Base class for implementing a callback for the result of {@link
-     * PrintDocumentAdapter#onWrite(PageRange[], FileDescriptor, CancellationSignal,
+     * PrintDocumentAdapter#onWrite(PageRange[], ParcelFileDescriptor, CancellationSignal,
      * WriteResultCallback)}.
      */
     public static abstract class WriteResultCallback {
diff --git a/core/java/android/print/PrintDocumentInfo.java b/core/java/android/print/PrintDocumentInfo.java
index b32961b..f2b91ae 100644
--- a/core/java/android/print/PrintDocumentInfo.java
+++ b/core/java/android/print/PrintDocumentInfo.java
@@ -60,6 +60,7 @@
     private int mColorMode;
     private Margins mMargins;
     private MediaSize mMediaSize;
+    private long mDataSize;
 
     /**
      * Creates a new instance.
@@ -82,6 +83,7 @@
         mColorMode = prototype.mColorMode;
         mMargins = prototype.mMargins;
         mMediaSize = prototype.mMediaSize;
+        mDataSize = prototype.mDataSize;
     }
 
     /**
@@ -98,6 +100,7 @@
         mColorMode = parcel.readInt();
         mMargins = Margins.createFromParcel(parcel);
         mMediaSize = MediaSize.createFromParcel(parcel);
+        mDataSize = parcel.readLong();
     }
 
     /**
@@ -188,6 +191,26 @@
         return mMediaSize;
     }
 
+    /**
+     * Gets the document data size in bytes.
+     *
+     * @return The data size.
+     */
+    public long getDataSize() {
+        return mDataSize;
+    }
+
+    /**
+     * Sets the document data size in bytes.
+     *
+     * @param dataSize The data size.
+     *
+     * @hide
+     */
+    public void setDataSize(long dataSize) {
+        mDataSize = dataSize;
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -203,6 +226,7 @@
         parcel.writeInt(mColorMode);
         mMargins.writeToParcel(parcel);
         mMediaSize.writeToParcel(parcel);
+        parcel.writeLong(mDataSize);
     }
 
     @Override
@@ -217,6 +241,8 @@
         result = prime * result + mColorMode;
         result = prime * result + (mMargins != null ? mMargins.hashCode() : 0);
         result = prime * result + (mMediaSize != null ? mMediaSize.hashCode() : 0);
+        result = prime * result + (int) mDataSize;
+        result = prime * result + (int) mDataSize >> 32;
         return result;
     }
 
@@ -264,6 +290,9 @@
         } else if (!mMediaSize.equals(other.mMediaSize)) {
             return false;
         }
+        if (mDataSize != other.mDataSize) {
+            return false;
+        }
         return true;
     }
 
@@ -279,6 +308,7 @@
         builder.append(", colorMode=").append(PrintAttributes.colorModeToString(mColorMode));
         builder.append(", margins=").append(mMargins);
         builder.append(", mediaSize=").append(mMediaSize);
+        builder.append(", size=").append(mDataSize);
         builder.append("}");
         return builder.toString();
     }
diff --git a/core/java/android/print/PrintFileDocumentAdapter.java b/core/java/android/print/PrintFileDocumentAdapter.java
index dbc8b6f..b905396 100644
--- a/core/java/android/print/PrintFileDocumentAdapter.java
+++ b/core/java/android/print/PrintFileDocumentAdapter.java
@@ -21,6 +21,7 @@
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.CancellationSignal.OnCancelListener;
+import android.os.ParcelFileDescriptor;
 import android.util.Log;
 
 import com.android.internal.R;
@@ -28,7 +29,6 @@
 import libcore.io.IoUtils;
 
 import java.io.File;
-import java.io.FileDescriptor;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -81,7 +81,7 @@
     }
 
     @Override
-    public void onWrite(PageRange[] pages, FileDescriptor destination,
+    public void onWrite(PageRange[] pages, ParcelFileDescriptor destination,
             CancellationSignal cancellationSignal, WriteResultCallback callback) {
         mWriteFileAsyncTask = new WriteFileAsyncTask(destination, cancellationSignal, callback);
         mWriteFileAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
@@ -90,13 +90,13 @@
 
     private final class WriteFileAsyncTask extends AsyncTask<Void, Void, Void> {
 
-        private final FileDescriptor mDestination;
+        private final ParcelFileDescriptor mDestination;
 
         private final WriteResultCallback mResultCallback;
 
         private final CancellationSignal mCancellationSignal;
 
-        public WriteFileAsyncTask(FileDescriptor destination,
+        public WriteFileAsyncTask(ParcelFileDescriptor destination,
                 CancellationSignal cancellationSignal, WriteResultCallback callback) {
             mDestination = destination;
             mResultCallback = callback;
@@ -112,7 +112,7 @@
         @Override
         protected Void doInBackground(Void... params) {
             InputStream in = null;
-            OutputStream out = new FileOutputStream(mDestination);
+            OutputStream out = new FileOutputStream(mDestination.getFileDescriptor());
             final byte[] buffer = new byte[8192];
             try {
                 in = new FileInputStream(mFile);
diff --git a/core/java/android/print/PrintJobInfo.java b/core/java/android/print/PrintJobInfo.java
index 602f3c1..b919ad6 100644
--- a/core/java/android/print/PrintJobInfo.java
+++ b/core/java/android/print/PrintJobInfo.java
@@ -44,6 +44,13 @@
     public static final int STATE_ANY_VISIBLE_TO_CLIENTS = -2;
 
     /**
+     * Constant for matching any active print job state.
+     *
+     * @hide
+     */
+    public static final int STATE_ANY_ACTIVE = -3;
+
+    /**
      * Print job state: The print job is being created but not yet
      * ready to be printed.
      * <p>
@@ -55,7 +62,7 @@
     public static final int STATE_CREATED = 1;
 
     /**
-     * Print job status: The print jobs is created, it is ready
+     * Print job state: The print jobs is created, it is ready
      * to be printed and should be processed.
      * <p>
      * Next valid states: {@link #STATE_STARTED}, {@link #STATE_FAILED},
@@ -65,40 +72,49 @@
     public static final int STATE_QUEUED = 2;
 
     /**
-     * Print job status: The print job is being printed.
+     * Print job state: The print job is being printed.
      * <p>
      * Next valid states: {@link #STATE_COMPLETED}, {@link #STATE_FAILED},
-     * {@link #STATE_CANCELED}
+     * {@link #STATE_CANCELED}, {@link #STATE_BLOCKED}
      * </p>
      */
     public static final int STATE_STARTED = 3;
 
     /**
-     * Print job status: The print job was successfully printed.
-     * This is a terminal state.
+     * Print job state: The print job is blocked.
      * <p>
-     * Next valid states: None
+     * Next valid states: {@link #STATE_FAILED}, {@link #STATE_CANCELED},
+     * {@link #STATE_STARTED}
      * </p>
      */
-    public static final int STATE_COMPLETED = 4;
+    public static final int STATE_BLOCKED = 4;
 
     /**
-     * Print job status: The print job was printing but printing failed.
+     * Print job state: The print job was successfully printed.
      * This is a terminal state.
      * <p>
      * Next valid states: None
      * </p>
      */
-    public static final int STATE_FAILED = 5;
+    public static final int STATE_COMPLETED = 5;
 
     /**
-     * Print job status: The print job was canceled.
+     * Print job state: The print job was printing but printing failed.
      * This is a terminal state.
      * <p>
      * Next valid states: None
      * </p>
      */
-    public static final int STATE_CANCELED = 6;
+    public static final int STATE_FAILED = 6;
+
+    /**
+     * Print job state: The print job was canceled.
+     * This is a terminal state.
+     * <p>
+     * Next valid states: None
+     * </p>
+     */
+    public static final int STATE_CANCELED = 7;
 
     /** The unique print job id. */
     private int mId;
@@ -127,8 +143,8 @@
     /** How many copies to print. */
     private int mCopies;
 
-    /** Failure reason if this job failed. */
-    private String mFailureReason;
+    /** Reason for the print job being in its current state. */
+    private String mStateReason;
 
     /** The pages to print */
     private PageRange[] mPageRanges;
@@ -155,7 +171,7 @@
         mUserId = other.mUserId;
         mTag = other.mTag;
         mCopies = other.mCopies;
-        mFailureReason = other.mFailureReason;
+        mStateReason = other.mStateReason;
         mPageRanges = other.mPageRanges;
         mAttributes = other.mAttributes;
         mDocumentInfo = other.mDocumentInfo;
@@ -171,7 +187,7 @@
         mUserId = parcel.readInt();
         mTag = parcel.readString();
         mCopies = parcel.readInt();
-        mFailureReason = parcel.readString();
+        mStateReason = parcel.readString();
         if (parcel.readInt() == 1) {
             Parcelable[] parcelables = parcel.readParcelableArray(null);
             mPageRanges = new PageRange[parcelables.length];
@@ -377,25 +393,27 @@
     }
 
     /**
-     * The failure reason if this print job failed.
+     * Gets the reason for the print job being in the current state.
      *
-     * @return The failure reason.
+     * @return The reason, or null if there is no reason or the
+     * reason is unknown.
      *
      * @hide
      */
-    public String getFailureReason() {
-        return mFailureReason;
+    public String getStateReason() {
+        return mStateReason;
     }
 
     /**
-     * The failure reason if this print job failed.
+     * Sets the reason for the print job being in the current state.
      *
-     * @param failureReason The failure reason.
+     * @param stateReason The reason, or null if there is no reason
+     * or the reason is unknown.
      *
      * @hide
      */
-    public void setFailureReason(String failureReason) {
-        mFailureReason = failureReason;
+    public void setStateReason(String stateReason) {
+        mStateReason = stateReason;
     }
 
     /**
@@ -476,7 +494,7 @@
         parcel.writeInt(mUserId);
         parcel.writeString(mTag);
         parcel.writeInt(mCopies);
-        parcel.writeString(mFailureReason);
+        parcel.writeString(mStateReason);
         if (mPageRanges != null) {
             parcel.writeInt(1);
             parcel.writeParcelableArray(mPageRanges, flags);
diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java
index d3e35c3..6e32c05 100644
--- a/core/java/android/print/PrintManager.java
+++ b/core/java/android/print/PrintManager.java
@@ -36,7 +36,6 @@
 import libcore.io.IoUtils;
 
 import java.io.File;
-import java.io.FileDescriptor;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -163,7 +162,7 @@
      * @param pdfFile The PDF file to print.
      * @param documentInfo Information about the printed document.
      * @param attributes The default print job attributes.
-     * @return The created print job.
+     * @return The created print job on success or null on failure.
      *
      * @see PrintJob
      */
@@ -181,7 +180,7 @@
      * @param printJobName A name for the new print job.
      * @param documentAdapter An adapter that emits the document to print.
      * @param attributes The default print job attributes.
-     * @return The created print job.
+     * @return The created print job on success or null on failure.
      *
      * @see PrintJob
      */
@@ -279,7 +278,7 @@
             }
             SomeArgs args = SomeArgs.obtain();
             args.arg1 = pages;
-            args.arg2 = fd.getFileDescriptor();
+            args.arg2 = fd;
             args.arg3 = callback;
             args.argi1 = sequence;
             mHandler.removeMessages(MyHandler.MSG_WRITE);
@@ -342,7 +341,7 @@
                     case MSG_WRITE: {
                         SomeArgs args = (SomeArgs) message.obj;
                         PageRange[] pages = (PageRange[]) args.arg1;
-                        FileDescriptor fd = (FileDescriptor) args.arg2;
+                        ParcelFileDescriptor fd = (ParcelFileDescriptor) args.arg2;
                         IWriteResultCallback callback = (IWriteResultCallback) args.arg3;
                         final int sequence = args.argi1;
                         args.recycle();
@@ -428,12 +427,12 @@
         }
 
         private final class MyWriteResultCallback extends WriteResultCallback {
-            private FileDescriptor mFd;
+            private ParcelFileDescriptor mFd;
             private int mSequence;
             private IWriteResultCallback mCallback;
 
             public MyWriteResultCallback(IWriteResultCallback callback,
-                    FileDescriptor fd, int sequence) {
+                    ParcelFileDescriptor fd, int sequence) {
                 mFd = fd;
                 mSequence = sequence;
                 mCallback = callback;
diff --git a/core/java/android/print/PrinterDiscoverySession.java b/core/java/android/print/PrinterDiscoverySession.java
index 8fbdd9c..46f0bef 100644
--- a/core/java/android/print/PrinterDiscoverySession.java
+++ b/core/java/android/print/PrinterDiscoverySession.java
@@ -74,6 +74,7 @@
     public final void startPrinterDisovery(List<PrinterId> priorityList) {
         if (isDestroyed()) {
             Log.w(LOG_TAG, "Ignoring start printers dsicovery - session destroyed");
+            return;
         }
         if (!mIsPrinterDiscoveryStarted) {
             mIsPrinterDiscoveryStarted = true;
@@ -88,6 +89,7 @@
     public final void stopPrinterDiscovery() {
         if (isDestroyed()) {
             Log.w(LOG_TAG, "Ignoring stop printers discovery - session destroyed");
+            return;
         }
         if (mIsPrinterDiscoveryStarted) {
             mIsPrinterDiscoveryStarted = false;
@@ -99,14 +101,39 @@
         }
     }
 
-    public final void requestPrinterUpdate(PrinterId printerId) {
+    public final void startPrinterStateTracking(PrinterId printerId) {
         if (isDestroyed()) {
-            Log.w(LOG_TAG, "Ignoring reqeust printer update - session destroyed");
+            Log.w(LOG_TAG, "Ignoring start printer state tracking - session destroyed");
+            return;
         }
         try {
-            mPrintManager.requestPrinterUpdate(printerId, mUserId);
+            mPrintManager.startPrinterStateTracking(printerId, mUserId);
         } catch (RemoteException re) {
-            Log.e(LOG_TAG, "Error requesting printer update", re);
+            Log.e(LOG_TAG, "Error starting printer state tracking", re);
+        }
+    }
+
+    public final void stopPrinterStateTracking(PrinterId printerId) {
+        if (isDestroyed()) {
+            Log.w(LOG_TAG, "Ignoring stop printer state tracking - session destroyed");
+            return;
+        }
+        try {
+            mPrintManager.stopPrinterStateTracking(printerId, mUserId);
+        } catch (RemoteException re) {
+            Log.e(LOG_TAG, "Error stoping printer state tracking", re);
+        }
+    }
+
+    public final void validatePrinters(List<PrinterId> printerIds) {
+        if (isDestroyed()) {
+            Log.w(LOG_TAG, "Ignoring validate printers - session destroyed");
+            return;
+        }
+        try {
+            mPrintManager.validatePrinters(printerIds, mUserId);
+        } catch (RemoteException re) {
+            Log.e(LOG_TAG, "Error validating printers", re);
         }
     }
 
diff --git a/core/java/android/print/pdf/PrintedPdfDocument.java b/core/java/android/print/pdf/PrintedPdfDocument.java
index a3be38b..bee17ef 100644
--- a/core/java/android/print/pdf/PrintedPdfDocument.java
+++ b/core/java/android/print/pdf/PrintedPdfDocument.java
@@ -111,7 +111,10 @@
      * @see #finishPage(Page)
      */
     public Page startPage(int pageNumber) {
-        PageInfo pageInfo = new PageInfo.Builder(mPageSize, 0).create();
+        PageInfo pageInfo = new PageInfo
+                .Builder(mPageSize, 0)
+                .setContentSize(mContentSize)
+                .create();
         Page page = mDocument.startPage(pageInfo);
         return page;
     }
diff --git a/core/java/android/printservice/IPrintService.aidl b/core/java/android/printservice/IPrintService.aidl
index 2cee1d8..ee36619 100644
--- a/core/java/android/printservice/IPrintService.aidl
+++ b/core/java/android/printservice/IPrintService.aidl
@@ -33,6 +33,8 @@
     void createPrinterDiscoverySession();
     void startPrinterDiscovery(in List<PrinterId> priorityList);
     void stopPrinterDiscovery();
-    void requestPrinterUpdate(in PrinterId printerId);
+    void validatePrinters(in List<PrinterId> printerIds);
+    void startPrinterStateTracking(in PrinterId printerId);
+    void stopPrinterStateTracking(in PrinterId printerId);
     void destroyPrinterDiscoverySession();
 }
diff --git a/core/java/android/printservice/PrintDocument.java b/core/java/android/printservice/PrintDocument.java
index 7437dc5..8292cfbc 100644
--- a/core/java/android/printservice/PrintDocument.java
+++ b/core/java/android/printservice/PrintDocument.java
@@ -21,12 +21,15 @@
 import android.print.PrintDocumentInfo;
 import android.util.Log;
 
-import java.io.FileDescriptor;
 import java.io.IOException;
 
 /**
  * This class represents a printed document from the perspective of a print
  * service. It exposes APIs to query the document and obtain its data.
+ * <p>
+ * <strong>Note: </strong> All methods of this class must be executed on the
+ * main application thread.
+ * </p>
  */
 public final class PrintDocument {
 
@@ -51,6 +54,7 @@
      * @return The document info.
      */
     public PrintDocumentInfo getInfo() {
+        PrintService.throwIfNotCalledOnMainThread();
         return mInfo;
     }
 
@@ -64,7 +68,8 @@
      *
      * @return A file descriptor for reading the data.
      */
-    public FileDescriptor getData() {
+    public ParcelFileDescriptor getData() {
+        PrintService.throwIfNotCalledOnMainThread();
         ParcelFileDescriptor source = null;
         ParcelFileDescriptor sink = null;
         try {
@@ -72,7 +77,7 @@
             source = fds[0];
             sink = fds[1];
             mPrintServiceClient.writePrintJobData(sink, mPrintJobId);
-            return source.getFileDescriptor();
+            return source;
         } catch (IOException ioe) {
             Log.e(LOG_TAG, "Error calling getting print job data!", ioe);
         } catch (RemoteException re) {
diff --git a/core/java/android/printservice/PrintJob.java b/core/java/android/printservice/PrintJob.java
index d2fbef2..8bae9d6 100644
--- a/core/java/android/printservice/PrintJob.java
+++ b/core/java/android/printservice/PrintJob.java
@@ -18,6 +18,7 @@
 
 import android.os.RemoteException;
 import android.print.PrintJobInfo;
+import android.text.TextUtils;
 import android.util.Log;
 
 /**
@@ -123,6 +124,21 @@
     }
 
     /**
+     * Gets whether this print job is blocked. Such a print job is halted
+     * due to an abnormal condition and can be started or canceled or failed.
+     *
+     * @return Whether the print job is blocked.
+     *
+     * @see #start()
+     * @see #cancel()
+     * @see #fail(CharSequence)
+     */
+    public boolean isBlocked() {
+        PrintService.throwIfNotCalledOnMainThread();
+        return getInfo().getState() == PrintJobInfo.STATE_BLOCKED;
+    }
+
+    /**
      * Gets whether this print job is completed. Such a print job
      * is successfully printed. This is a final state.
      *
@@ -163,21 +179,49 @@
 
     /**
      * Starts the print job. You should call this method if {@link
-     * #isQueued()} returns true and you started printing.
+     * #isQueued()} or {@link #isBlocked()} returns true and you started
+     * resumed printing.
      *
-     * @return Whether the job as started.
+     * @return Whether the job was started.
      *
      * @see #isQueued()
+     * @see #isBlocked()
      */
     public boolean start() {
         PrintService.throwIfNotCalledOnMainThread();
-        if (isQueued()) {
+        final int state = getInfo().getState();
+        if (state == PrintJobInfo.STATE_QUEUED
+                || state == PrintJobInfo.STATE_BLOCKED) {
             return setState(PrintJobInfo.STATE_STARTED, null);
         }
         return false;
     }
 
     /**
+     * Blocks the print job. You should call this method if {@link
+     * #isStarted()} or {@link #isBlocked()} returns true and you need
+     * to block the print job. For example, the user has to add some
+     * paper to continue printing. To resume the print job call {@link
+     * #start()}.
+     *
+     * @return Whether the job was blocked.
+     *
+     * @see #isStarted()
+     * @see #isBlocked()
+     */
+    public boolean block(String reason) {
+        PrintService.throwIfNotCalledOnMainThread();
+        PrintJobInfo info = getInfo();
+        final int state = info.getState();
+        if (state == PrintJobInfo.STATE_STARTED
+                || (state == PrintJobInfo.STATE_BLOCKED
+                        && !TextUtils.equals(info.getStateReason(), reason))) {
+            return setState(PrintJobInfo.STATE_BLOCKED, reason);
+        }
+        return false;
+    }
+
+    /**
      * Completes the print job. You should call this method if {@link
      * #isStarted()} returns true and you are done printing.
      *
@@ -195,8 +239,8 @@
 
     /**
      * Fails the print job. You should call this method if {@link
-     * #isQueued()} or {@link #isStarted()} returns true you failed
-     * while printing.
+     * #isQueued()} or {@link #isStarted()} or {@link #isBlocked()}
+     * returns true you failed while printing.
      *
      * @param error The human readable, short, and translated reason
      * for the failure.
@@ -204,10 +248,11 @@
      *
      * @see #isQueued()
      * @see #isStarted()
+     * @see #isBlocked()
      */
     public boolean fail(String error) {
         PrintService.throwIfNotCalledOnMainThread();
-        if (isQueued() || isStarted()) {
+        if (!isInImmutableState()) {
             return setState(PrintJobInfo.STATE_FAILED, error);
         }
         return false;
@@ -215,18 +260,19 @@
 
     /**
      * Cancels the print job. You should call this method if {@link
-     * #isQueued()} or {@link #isStarted()} returns true and you canceled
-     * the print job as a response to a call to {@link
-     * PrintService#onRequestCancelPrintJob(PrintJob)}.
+     * #isQueued()} or {@link #isStarted() or #isBlocked()} returns
+     * true and you canceled the print job as a response to a call to
+     * {@link PrintService#onRequestCancelPrintJob(PrintJob)}.
      *
      * @return Whether the job is canceled.
      *
      * @see #isStarted()
      * @see #isQueued()
+     * @see #isBlocked()
      */
     public boolean cancel() {
         PrintService.throwIfNotCalledOnMainThread();
-        if (isQueued() || isStarted()) {
+        if (!isInImmutableState()) {
             return setState(PrintJobInfo.STATE_CANCELED, null);
         }
         return false;
@@ -277,7 +323,8 @@
     private boolean isInImmutableState() {
         final int state = mCachedInfo.getState();
         return state == PrintJobInfo.STATE_COMPLETED
-                || state == PrintJobInfo.STATE_CANCELED;
+                || state == PrintJobInfo.STATE_CANCELED
+                || state == PrintJobInfo.STATE_FAILED;
     }
 
     private boolean setState(int state, String error) {
@@ -287,7 +334,7 @@
                 // we may not be able to re-fetch it later if the job gets
                 // removed from the spooler as a result of the state change.
                 mCachedInfo.setState(state);
-                mCachedInfo.setFailureReason(error);
+                mCachedInfo.setStateReason(error);
                 return true;
             }
         } catch (RemoteException re) {
diff --git a/core/java/android/printservice/PrintService.java b/core/java/android/printservice/PrintService.java
index f6c0a9a..96552af 100644
--- a/core/java/android/printservice/PrintService.java
+++ b/core/java/android/printservice/PrintService.java
@@ -314,8 +314,20 @@
             }
 
             @Override
-            public void requestPrinterUpdate(PrinterId printerId) {
-                mHandler.obtainMessage(ServiceHandler.MSG_REQUEST_PRINTER_UPDATE,
+            public void validatePrinters(List<PrinterId> printerIds) {
+                mHandler.obtainMessage(ServiceHandler.MSG_VALIDATE_PRINTERS,
+                        printerIds).sendToTarget();
+            }
+
+            @Override
+            public void startPrinterStateTracking(PrinterId printerId) {
+                mHandler.obtainMessage(ServiceHandler.MSG_START_PRINTER_STATE_TRACKING,
+                        printerId).sendToTarget();
+            }
+
+            @Override
+            public void stopPrinterStateTracking(PrinterId printerId) {
+                mHandler.obtainMessage(ServiceHandler.MSG_STOP_PRINTER_STATE_TRACKING,
                         printerId).sendToTarget();
             }
 
@@ -344,10 +356,12 @@
         public static final int MSG_DESTROY_PRINTER_DISCOVERY_SESSION = 2;
         public static final int MSG_START_PRINTER_DISCOVERY = 3;
         public static final int MSG_STOP_PRINTER_DISCOVERY = 4;
-        public static final int MSG_REQUEST_PRINTER_UPDATE = 5;
-        public static final int MSG_ON_PRINTJOB_QUEUED = 6;
-        public static final int MSG_ON_REQUEST_CANCEL_PRINTJOB = 7;
-        public static final int MSG_SET_CLEINT = 8;
+        public static final int MSG_VALIDATE_PRINTERS = 5;
+        public static final int MSG_START_PRINTER_STATE_TRACKING = 6;
+        public static final int MSG_STOP_PRINTER_STATE_TRACKING = 7;
+        public static final int MSG_ON_PRINTJOB_QUEUED = 8;
+        public static final int MSG_ON_REQUEST_CANCEL_PRINTJOB = 9;
+        public static final int MSG_SET_CLEINT = 10;
 
         public ServiceHandler(Looper looper) {
             super(looper, null, true);
@@ -391,10 +405,24 @@
                     }
                 } break;
 
-                case MSG_REQUEST_PRINTER_UPDATE: {
+                case MSG_VALIDATE_PRINTERS: {
+                    if (mDiscoverySession != null) {
+                        List<PrinterId> printerIds = (List<PrinterId>) message.obj;
+                        mDiscoverySession.validatePrinters(printerIds);
+                    }
+                } break;
+
+                case MSG_START_PRINTER_STATE_TRACKING: {
                     if (mDiscoverySession != null) {
                         PrinterId printerId = (PrinterId) message.obj;
-                        mDiscoverySession.requestPrinterUpdate(printerId);
+                        mDiscoverySession.startPrinterStateTracking(printerId);
+                    }
+                } break;
+
+                case MSG_STOP_PRINTER_STATE_TRACKING: {
+                    if (mDiscoverySession != null) {
+                        PrinterId printerId = (PrinterId) message.obj;
+                        mDiscoverySession.stopPrinterStateTracking(printerId);
                     }
                 } break;
 
diff --git a/core/java/android/printservice/PrinterDiscoverySession.java b/core/java/android/printservice/PrinterDiscoverySession.java
index 8b959a6..6464cc1 100644
--- a/core/java/android/printservice/PrinterDiscoverySession.java
+++ b/core/java/android/printservice/PrinterDiscoverySession.java
@@ -53,15 +53,23 @@
  * session. Printers are <strong>not</strong> persisted across sessions.
  * </p>
  * <p>
- * The system will make a call to
- * {@link PrinterDiscoverySession#onRequestPrinterUpdate(PrinterId)} if you
- * need to update a given printer. It is possible that you add a printer without
+ * The system will make a call to {@link #onValidatePrinters(List)} if you
+ * need to update some printers. It is possible that you add a printer without
  * specifying its capabilities. This enables you to avoid querying all discovered
  * printers for their capabilities, rather querying the capabilities of a printer
  * only if necessary. For example, the system will request that you update a printer
- * if it gets selected by the user. If you did not report the printer capabilities
- * when adding it, you must do so after the system requests a printer update.
- * Otherwise, the printer will be ignored.
+ * if it gets selected by the user. When validating printers you do not need to
+ * provide the printers' capabilities but may do so.
+ * </p>
+ * <p>
+ * If the system is interested in being constantly updated for the state of a
+ * printer you will receive a call to {@link #onStartPrinterStateTracking(PrinterId)}
+ * after which you will have to do a best effort to keep the system updated for
+ * changes in the printer state and capabilities. You also <strong>must</strong>
+ * update the printer capabilities if you did not provide them when adding it, or
+ * the printer will be ignored. When the system is no longer interested in getting
+ * updates for a printer you will receive a call to {@link #onStopPrinterStateTracking(
+ * PrinterId)}.
  * </p>
  * <p>
  * <strong>Note: </strong> All callbacks in this class are executed on the main
@@ -72,7 +80,7 @@
 public abstract class PrinterDiscoverySession {
     private static final String LOG_TAG = "PrinterDiscoverySession";
 
-    private static final int MAX_ITEMS_PER_CALLBACK = 100;
+    private static final int MAX_ITEMS_PER_CALLBACK = 50;
 
     private static int sIdCounter = 0;
 
@@ -115,7 +123,7 @@
      * the printer that was added but not removed.
      * <p>
      * <strong>Note: </strong> Calls to this method after the session is
-     * destroyed, i.e. after the {@link #onDestroy()} callback, will be ignored.
+     * destroyed, that is after the {@link #onDestroy()} callback, will be ignored.
      * </p>
      *
      * @return The printers.
@@ -139,7 +147,7 @@
      * times during the life of this session. Duplicates will be ignored.
      * <p>
      * <strong>Note: </strong> Calls to this method after the session is
-     * destroyed, i.e. after the {@link #onDestroy()} callback, will be ignored.
+     * destroyed, that is after the {@link #onDestroy()} callback, will be ignored.
      * </p>
      *
      * @param printers The printers to add.
@@ -218,7 +226,7 @@
      * call this method multiple times during the lifetime of this session.
      * <p>
      * <strong>Note: </strong> Calls to this method after the session is
-     * destroyed, i.e. after the {@link #onDestroy()} callback, will be ignored.
+     * destroyed, that is after the {@link #onDestroy()} callback, will be ignored.
      * </p>
      *
      * @param printerIds The ids of the removed printers.
@@ -293,7 +301,7 @@
      * during the lifetime of this session.
      * <p>
      * <strong>Note: </strong> Calls to this method after the session is
-     * destroyed, i.e. after the {@link #onDestroy()} callback, will be ignored.
+     * destroyed, that is after the {@link #onDestroy()} callback, will be ignored.
      * </p>
      *
      * @param printers The printers to update.
@@ -441,7 +449,9 @@
      * <p>
      * <strong>Note: </strong>You are also given a list of printers whose availability
      * has to be checked first. For example, these printers could be the user's favorite
-     * ones, therefore they have to be verified first.
+     * ones, therefore they have to be verified first. You do <strong>not need</strong>
+     * to provide the capabilities of the printers, rather verify whether they exist
+     * similarly to {@link #onValidatePrinters(List)}.
      * </p>
      *
      * @param priorityList The list of printers to validate first. Never null.
@@ -463,9 +473,28 @@
     public abstract void onStopPrinterDiscovery();
 
     /**
-     * Requests that you update a printer. You are responsible for updating
-     * the printer by also reporting its capabilities via calling {@link
-     * #updatePrinters(List)}.
+     * Callback asking you to validate that the given printers are valid, that
+     * is they exist. You are responsible for checking whether these printers
+     * exist and for the ones that do exist notify the system via calling
+     * {@link #updatePrinters(List)}.
+     * <p>
+     * <strong>Note: </strong> You are <strong>not required</strong> to provide
+     * the printer capabilities when updating the printers that do exist.
+     * <p>
+     *
+     * @param printerIds The printers to validate.
+     *
+     * @see #updatePrinters(List)
+     * @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo)
+     *      PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo)
+     */
+    public abstract void onValidatePrinters(List<PrinterId> printerIds);
+
+    /**
+     * Callback asking you to start tracking the state of a printer. Tracking
+     * the state means that you should do a best effort to observe the state
+     * of this printer and notify the system if that state changes via calling
+     * {@link #updatePrinters(List)}.
      * <p>
      * <strong>Note: </strong> A printer can be initially added without its
      * capabilities to avoid polling printers that the user will not select.
@@ -473,18 +502,33 @@
      * printer <strong>including</strong> its capabilities. Otherwise, the
      * printer will be ignored.
      * <p>
-     * A scenario when you may be requested to update a printer is if the user
-     * selects it and the system has to present print options UI based on the
-     * printer's capabilities.
+     * <p>
+     * A scenario when you may be requested to track a printer's state is if
+     * the user selects that printer and the system has to present print
+     * options UI based on the printer's capabilities. In this case the user
+     * should be promptly informed if, for example, the printer becomes
+     * unavailable.
      * </p>
      *
-     * @param printerId The printer id.
+     * @param printerId The printer to start tracking.
      *
+     * @see #onStopPrinterStateTracking(PrinterId)
      * @see #updatePrinters(List)
      * @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo)
      *      PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo)
      */
-    public abstract void onRequestPrinterUpdate(PrinterId printerId);
+    public abstract void onStartPrinterStateTracking(PrinterId printerId);
+
+    /**
+     * Callback asking you to stop tracking the state of a printer. The passed
+     * in printer id is the one for which you received a call to {@link
+     * #onStartPrinterStateTracking(PrinterId)}.
+     *
+     * @param printerId The printer to stop tracking.
+     *
+     * @see #onStartPrinterStateTracking(PrinterId)
+     */
+    public abstract void onStopPrinterStateTracking(PrinterId printerId);
 
     /**
      * Notifies you that the session is destroyed. After this callback is invoked
@@ -538,9 +582,21 @@
         }
     }
 
-    void requestPrinterUpdate(PrinterId printerId) {
-        if (!mIsDestroyed) {
-            onRequestPrinterUpdate(printerId);
+    void validatePrinters(List<PrinterId> printerIds) {
+        if (!mIsDestroyed && mObserver != null) {
+            onValidatePrinters(printerIds);
+        }
+    }
+
+    void startPrinterStateTracking(PrinterId printerId) {
+        if (!mIsDestroyed && mObserver != null) {
+            onStartPrinterStateTracking(printerId);
+        }
+    }
+
+    void stopPrinterStateTracking(PrinterId printerId) {
+        if (!mIsDestroyed && mObserver != null) {
+            onStopPrinterStateTracking(printerId);
         }
     }
 
diff --git a/core/java/android/provider/AlarmClock.java b/core/java/android/provider/AlarmClock.java
index f3267ee..724d76d 100644
--- a/core/java/android/provider/AlarmClock.java
+++ b/core/java/android/provider/AlarmClock.java
@@ -36,10 +36,15 @@
      * <p>
      * Activates an existing alarm or creates a new one.
      * </p><p>
-     * This action requests an alarm to be set for a given time of day. If an alarm already
-     * exists for this time, an implementation may use it rather than create a new one. If no time
-     * of day is specified, the implementation should start an activity that is capable of setting
-     * an alarm (SKIP_UI is ignored in this case). This action always enables the alarm.
+     * This action requests an alarm to be set for a given time of day. If no time of day is
+     * specified, an implementation should start an activity that is capable of setting an alarm
+     * ({@link #EXTRA_SKIP_UI} is ignored in this case). If a time of day is specified, and
+     * {@link #EXTRA_SKIP_UI} is {@code true}, and the alarm is not repeating, the implementation
+     * should remove this alarm after it has been dismissed. If an identical alarm exists matching
+     * all parameters, the implementation may re-use it instead of creating a new one (in this case,
+     * the alarm should not be removed after dismissal).
+     *
+     * This action always enables the alarm.
      * </p>
      * <h3>Request parameters</h3>
      * <ul>
@@ -52,8 +57,6 @@
      * vibrator for this alarm.
      * <li>{@link #EXTRA_SKIP_UI} <em>(optional)</em>: Whether or not to display an activity for
      * setting this alarm.
-     * <li>{@link #EXTRA_DELETE_AFTER_USE} <em>(optional)</em>: Whether or not to delete this
-     * alarm after it is dismissed.
      * </ul>
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
@@ -65,13 +68,14 @@
      * Activates an existing timer or creates a new one.
      * </p><p>
      * This action requests a timer to be started for a specific {@link #EXTRA_LENGTH length} of
-     * time. If a timer already exists for this {@link #EXTRA_LENGTH length}, an implementation may
-     * use it rather than create a new one. If no {@link #EXTRA_LENGTH length} is specified, the
-     * implementation should start an activity that is capable of setting a timer
-     * ({@link #EXTRA_SKIP_UI} is ignored in this case).
-     * </p><p>
-     * An existing timer should only be used if it matches the provided extras and is not currently
-     * in use.
+     * time. If no {@link #EXTRA_LENGTH length} is specified, the implementation should start an
+     * activity that is capable of setting a timer ({@link #EXTRA_SKIP_UI} is ignored in this case).
+     * If a {@link #EXTRA_LENGTH length} is specified, and {@link #EXTRA_SKIP_UI} is {@code true},
+     * the implementation should remove this timer after it has been dismissed. If an identical,
+     * unused timer exists matching both parameters, an implementation may re-use it instead of
+     * creating a new one (in this case, the timer should not be removed after dismissal).
+     *
+     * This action always starts the timer.
      * </p>
      *
      * <h3>Request parameters</h3>
@@ -80,14 +84,21 @@
      * <li>{@link #EXTRA_MESSAGE} <em>(optional)</em>: A custom message for the timer.
      * <li>{@link #EXTRA_SKIP_UI} <em>(optional)</em>: Whether or not to display an activity for
      * setting this timer.
-     * <li>{@link #EXTRA_DELETE_AFTER_USE} <em>(optional)</em>: Whether or not to delete this
-     * timer after it is dismissed.
      * </ul>
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String ACTION_SET_TIMER = "android.intent.action.SET_TIMER";
 
     /**
+     * Activity Action: Show the alarms.
+     * <p>
+     * This action opens the alarms page.
+     * </p>
+     */
+     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+     public static final String ACTION_SHOW_ALARMS = "android.intent.action.SHOW_ALARMS";
+
+    /**
      * Bundle extra: Weekdays for repeating alarm.
      * <p>
      * Used by {@link #ACTION_SET_ALARM}.
@@ -103,30 +114,10 @@
      * <li> {@link java.util.Calendar#FRIDAY},
      * <li> {@link java.util.Calendar#SATURDAY}
      * </ul>
-     * <p>
-     * Note: If this extra is provided, {@link #EXTRA_DELETE_AFTER_USE} is ignored.
-     * </p>
      */
     public static final String EXTRA_DAYS = "android.intent.extra.alarm.DAYS";
 
     /**
-     * Bundle extra: Whether or not to delete this alarm/timer after it's dismissed.
-     * <p>
-     * Used by {@link #ACTION_SET_ALARM} and {@link #ACTION_SET_TIMER}.
-     * </p><p>
-     * If this value is true, the alarm/timer used by this action should be deleted after it's been
-     * dismissed. The alarm/timer should only be removed if was actually created by the action. If
-     * an existing alarm/timer was used, it should not be deleted after it's dismissed.
-     * </p><p>
-     * The value is a {@link Boolean}.
-     * </p>
-     *
-     * @see #ACTION_SET_ALARM
-     * @see #ACTION_SET_TIMER
-     */
-    public static final String EXTRA_DELETE_AFTER_USE = "android.intent.extra.alarm.DELETE_AFTER_USE";
-
-    /**
      * Bundle extra: The hour of the alarm.
      * <p>
      * Used by {@link #ACTION_SET_ALARM}.
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index 65c9220..f445fd5 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -19,9 +19,7 @@
 import static android.net.TrafficStats.KB_IN_BYTES;
 import static libcore.io.OsConstants.SEEK_SET;
 
-import android.content.ContentProvider;
 import android.content.ContentResolver;
-import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -33,6 +31,7 @@
 import android.graphics.Point;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.CancellationSignal;
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelFileDescriptor.OnCloseListener;
 import android.util.Log;
@@ -51,448 +50,532 @@
 /**
  * Defines the contract between a documents provider and the platform.
  * <p>
- * A document provider is a {@link ContentProvider} that presents a set of
- * documents in a hierarchical structure. The system provides UI that visualizes
- * all available document providers, offering users the ability to open existing
- * documents or create new documents.
- * <p>
- * Each provider expresses one or more "roots" which each serve as the top-level
- * of a tree. For example, a root could represent an account, or a physical
- * storage device. Under each root, documents are referenced by a unique
- * {@link DocumentColumns#DOC_ID}, and each root starts at the
- * {@link Documents#DOC_ID_ROOT} document.
- * <p>
- * Documents can be either an openable file (with a specific MIME type), or a
- * directory containing additional documents (with the
- * {@link Documents#MIME_TYPE_DIR} MIME type). Each document can have different
- * capabilities, as described by {@link DocumentColumns#FLAGS}. The same
- * {@link DocumentColumns#DOC_ID} can be included in multiple directories.
- * <p>
- * Document providers must be protected with the
- * {@link android.Manifest.permission#MANAGE_DOCUMENTS} permission, which can
- * only be requested by the system. The system-provided UI then issues narrow
- * Uri permission grants for individual documents when the user explicitly picks
- * documents.
+ * To create a document provider, extend {@link DocumentsProvider}, which
+ * provides a foundational implementation of this contract.
  *
- * @see Intent#ACTION_OPEN_DOCUMENT
- * @see Intent#ACTION_CREATE_DOCUMENT
+ * @see DocumentsProvider
  */
 public final class DocumentsContract {
     private static final String TAG = "Documents";
 
-    // content://com.example/roots/
-    // content://com.example/roots/sdcard/
-    // content://com.example/roots/sdcard/docs/0/
-    // content://com.example/roots/sdcard/docs/0/contents/
-    // content://com.example/roots/sdcard/docs/0/search/?query=pony
+    // content://com.example/root/
+    // content://com.example/root/sdcard/
+    // content://com.example/root/sdcard/recent/
+    // content://com.example/document/12/
+    // content://com.example/document/12/children/
+    // content://com.example/document/12/search/?query=pony
+
+    private DocumentsContract() {
+    }
 
     /** {@hide} */
     public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER";
 
     /** {@hide} */
-    public static final String ACTION_DOCUMENT_CHANGED = "android.provider.action.DOCUMENT_CHANGED";
+    public static final String ACTION_MANAGE_DOCUMENTS = "android.provider.action.MANAGE_DOCUMENTS";
 
     /**
-     * Constants for individual documents.
+     * Constants related to a document, including {@link Cursor} columns names
+     * and flags.
+     * <p>
+     * A document can be either an openable file (with a specific MIME type), or
+     * a directory containing additional documents (with the
+     * {@link #MIME_TYPE_DIR} MIME type).
+     * <p>
+     * All columns are <em>read-only</em> to client applications.
      */
-    public static class Documents {
-        private Documents() {
+    public final static class Document {
+        private Document() {
         }
 
         /**
-         * MIME type of a document which is a directory that may contain additional
-         * documents.
-         *
-         * @see #buildContentsUri(String, String, String)
-         */
-        public static final String MIME_TYPE_DIR = "vnd.android.cursor.dir/doc";
-
-        /**
-         * {@link DocumentColumns#DOC_ID} value representing the root directory of a
-         * documents root.
-         */
-        public static final String DOC_ID_ROOT = "0";
-
-        /**
-         * Flag indicating that a document is a directory that supports creation of
-         * new files within it.
-         *
-         * @see DocumentColumns#FLAGS
-         * @see #createDocument(ContentResolver, Uri, String, String)
-         */
-        public static final int FLAG_SUPPORTS_CREATE = 1;
-
-        /**
-         * Flag indicating that a document is renamable.
-         *
-         * @see DocumentColumns#FLAGS
-         * @see #renameDocument(ContentResolver, Uri, String)
-         */
-        public static final int FLAG_SUPPORTS_RENAME = 1 << 1;
-
-        /**
-         * Flag indicating that a document is deletable.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_SUPPORTS_DELETE = 1 << 2;
-
-        /**
-         * Flag indicating that a document can be represented as a thumbnail.
-         *
-         * @see DocumentColumns#FLAGS
-         * @see #getThumbnail(ContentResolver, Uri, Point)
-         */
-        public static final int FLAG_SUPPORTS_THUMBNAIL = 1 << 3;
-
-        /**
-         * Flag indicating that a document is a directory that supports search.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_SUPPORTS_SEARCH = 1 << 4;
-
-        /**
-         * Flag indicating that a document is writable.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_SUPPORTS_WRITE = 1 << 5;
-
-        /**
-         * Flag indicating that a document is a directory that prefers its contents
-         * be shown in a larger format grid. Usually suitable when a directory
-         * contains mostly pictures.
-         *
-         * @see DocumentColumns#FLAGS
-         */
-        public static final int FLAG_PREFERS_GRID = 1 << 6;
-    }
-
-    /**
-     * Optimal dimensions for a document thumbnail request, stored as a
-     * {@link Point} object. This is only a hint, and the returned thumbnail may
-     * have different dimensions.
-     *
-     * @see ContentProvider#openTypedAssetFile(Uri, String, Bundle)
-     */
-    public static final String EXTRA_THUMBNAIL_SIZE = "thumbnail_size";
-
-    /**
-     * Extra boolean flag included in a directory {@link Cursor#getExtras()}
-     * indicating that the document provider can provide additional data if
-     * requested, such as additional search results.
-     */
-    public static final String EXTRA_HAS_MORE = "has_more";
-
-    /**
-     * Extra boolean flag included in a {@link Cursor#respond(Bundle)} call to a
-     * directory to request that additional data should be fetched. When
-     * requested data is ready, the provider should send a change notification
-     * to cause a requery.
-     *
-     * @see Cursor#respond(Bundle)
-     * @see ContentResolver#notifyChange(Uri, android.database.ContentObserver,
-     *      boolean)
-     */
-    public static final String EXTRA_REQUEST_MORE = "request_more";
-
-    private static final String PATH_ROOTS = "roots";
-    private static final String PATH_DOCS = "docs";
-    private static final String PATH_CONTENTS = "contents";
-    private static final String PATH_SEARCH = "search";
-
-    private static final String PARAM_QUERY = "query";
-    private static final String PARAM_LOCAL_ONLY = "localOnly";
-
-    /**
-     * Build Uri representing the roots offered by a document provider.
-     */
-    public static Uri buildRootsUri(String authority) {
-        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
-                .authority(authority).appendPath(PATH_ROOTS).build();
-    }
-
-    /**
-     * Build Uri representing a specific root offered by a document provider.
-     */
-    public static Uri buildRootUri(String authority, String rootId) {
-        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
-                .authority(authority).appendPath(PATH_ROOTS).appendPath(rootId).build();
-    }
-
-    /**
-     * Build Uri representing the given {@link DocumentColumns#DOC_ID} in a
-     * document provider.
-     */
-    public static Uri buildDocumentUri(String authority, String rootId, String docId) {
-        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority)
-                .appendPath(PATH_ROOTS).appendPath(rootId).appendPath(PATH_DOCS).appendPath(docId)
-                .build();
-    }
-
-    /**
-     * Build Uri representing the contents of the given directory in a document
-     * provider. The given document must be {@link Documents#MIME_TYPE_DIR}.
-     */
-    public static Uri buildContentsUri(String authority, String rootId, String docId) {
-        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority)
-                .appendPath(PATH_ROOTS).appendPath(rootId).appendPath(PATH_DOCS).appendPath(docId)
-                .appendPath(PATH_CONTENTS).build();
-    }
-
-    /**
-     * Build Uri representing a search for matching documents under a specific
-     * directory in a document provider. The given document must have
-     * {@link Documents#FLAG_SUPPORTS_SEARCH}.
-     */
-    public static Uri buildSearchUri(String authority, String rootId, String docId, String query) {
-        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority)
-                .appendPath(PATH_ROOTS).appendPath(rootId).appendPath(PATH_DOCS).appendPath(docId)
-                .appendPath(PATH_SEARCH).appendQueryParameter(PARAM_QUERY, query).build();
-    }
-
-    /**
-     * Convenience method for {@link #buildDocumentUri(String, String, String)},
-     * extracting authority and root from the given Uri.
-     */
-    public static Uri buildDocumentUri(Uri relatedUri, String docId) {
-        return buildDocumentUri(relatedUri.getAuthority(), getRootId(relatedUri), docId);
-    }
-
-    /**
-     * Convenience method for {@link #buildContentsUri(String, String, String)},
-     * extracting authority and root from the given Uri.
-     */
-    public static Uri buildContentsUri(Uri relatedUri) {
-        return buildContentsUri(
-                relatedUri.getAuthority(), getRootId(relatedUri), getDocId(relatedUri));
-    }
-
-    /**
-     * Convenience method for
-     * {@link #buildSearchUri(String, String, String, String)}, extracting
-     * authority and root from the given Uri.
-     */
-    public static Uri buildSearchUri(Uri relatedUri, String query) {
-        return buildSearchUri(
-                relatedUri.getAuthority(), getRootId(relatedUri), getDocId(relatedUri), query);
-    }
-
-    /**
-     * Extract the {@link RootColumns#ROOT_ID} from the given Uri.
-     */
-    public static String getRootId(Uri documentUri) {
-        final List<String> paths = documentUri.getPathSegments();
-        if (paths.size() < 2) {
-            throw new IllegalArgumentException("Not a root: " + documentUri);
-        }
-        if (!PATH_ROOTS.equals(paths.get(0))) {
-            throw new IllegalArgumentException("Not a root: " + documentUri);
-        }
-        return paths.get(1);
-    }
-
-    /**
-     * Extract the {@link DocumentColumns#DOC_ID} from the given Uri.
-     */
-    public static String getDocId(Uri documentUri) {
-        final List<String> paths = documentUri.getPathSegments();
-        if (paths.size() < 4) {
-            throw new IllegalArgumentException("Not a document: " + documentUri);
-        }
-        if (!PATH_ROOTS.equals(paths.get(0))) {
-            throw new IllegalArgumentException("Not a document: " + documentUri);
-        }
-        if (!PATH_DOCS.equals(paths.get(2))) {
-            throw new IllegalArgumentException("Not a document: " + documentUri);
-        }
-        return paths.get(3);
-    }
-
-    /**
-     * Return requested search query from the given Uri, as constructed by
-     * {@link #buildSearchUri(String, String, String, String)}.
-     */
-    public static String getSearchQuery(Uri documentUri) {
-        return documentUri.getQueryParameter(PARAM_QUERY);
-    }
-
-    /**
-     * Mark the given Uri to indicate that only locally-available data should be
-     * returned. That is, no network connections should be initiated to provide
-     * the metadata or content.
-     */
-    public static Uri setLocalOnly(Uri documentUri) {
-        return documentUri.buildUpon()
-                .appendQueryParameter(PARAM_LOCAL_ONLY, String.valueOf(true)).build();
-    }
-
-    /**
-     * Return if the given Uri is requesting that only locally-available data be
-     * returned. That is, no network connections should be initiated to provide
-     * the metadata or content.
-     */
-    public static boolean isLocalOnly(Uri documentUri) {
-        return documentUri.getBooleanQueryParameter(PARAM_LOCAL_ONLY, false);
-    }
-
-    /**
-     * Standard columns for document queries. Document providers <em>must</em>
-     * support at least these columns when queried.
-     *
-     * @see DocumentsContract#buildDocumentUri(String, String, String)
-     * @see DocumentsContract#buildContentsUri(String, String, String)
-     * @see DocumentsContract#buildSearchUri(String, String, String, String)
-     */
-    public interface DocumentColumns extends OpenableColumns {
-        /**
-         * The ID for a document under a storage backend root. Values
-         * <em>must</em> never change once returned. This field is read-only to
-         * document clients.
+         * Unique ID of a document. This ID is both provided by and interpreted
+         * by a {@link DocumentsProvider}, and should be treated as an opaque
+         * value by client applications.
+         * <p>
+         * Each document must have a unique ID within a provider, but that
+         * single document may be included as a child of multiple directories.
+         * <p>
+         * A provider must always return durable IDs, since they will be used to
+         * issue long-term Uri permission grants when an application interacts
+         * with {@link Intent#ACTION_OPEN_DOCUMENT} and
+         * {@link Intent#ACTION_CREATE_DOCUMENT}.
          * <p>
          * Type: STRING
          */
-        public static final String DOC_ID = "doc_id";
+        public static final String COLUMN_DOCUMENT_ID = "document_id";
 
         /**
-         * MIME type of a document, matching the value returned by
-         * {@link ContentResolver#getType(android.net.Uri)}. This field must be
-         * provided when a new document is created. This field is read-only to
-         * document clients.
+         * Concrete MIME type of a document. For example, "image/png" or
+         * "application/pdf" for openable files. A document can also be a
+         * directory containing additional documents, which is represented with
+         * the {@link #MIME_TYPE_DIR} MIME type.
          * <p>
          * Type: STRING
          *
-         * @see Documents#MIME_TYPE_DIR
+         * @see #MIME_TYPE_DIR
          */
-        public static final String MIME_TYPE = "mime_type";
+        public static final String COLUMN_MIME_TYPE = "mime_type";
+
+        /**
+         * Display name of a document, used as the primary title displayed to a
+         * user.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_DISPLAY_NAME = OpenableColumns.DISPLAY_NAME;
+
+        /**
+         * Summary of a document, which may be shown to a user. The summary may
+         * be {@code null}.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_SUMMARY = "summary";
 
         /**
          * Timestamp when a document was last modified, in milliseconds since
-         * January 1, 1970 00:00:00.0 UTC. This field is read-only to document
-         * clients. Document providers can update this field using events from
+         * January 1, 1970 00:00:00.0 UTC, or {@code null} if unknown. A
+         * {@link DocumentsProvider} can update this field using events from
          * {@link OnCloseListener} or other reliable
-         * {@link ParcelFileDescriptor} transport.
+         * {@link ParcelFileDescriptor} transports.
          * <p>
          * Type: INTEGER (long)
          *
          * @see System#currentTimeMillis()
          */
-        public static final String LAST_MODIFIED = "last_modified";
+        public static final String COLUMN_LAST_MODIFIED = "last_modified";
 
         /**
-         * Flags that apply to a specific document. This field is read-only to
-         * document clients.
+         * Specific icon resource ID for a document, or {@code null} to use
+         * platform default icon based on {@link #COLUMN_MIME_TYPE}.
          * <p>
          * Type: INTEGER (int)
          */
-        public static final String FLAGS = "flags";
+        public static final String COLUMN_ICON = "icon";
 
         /**
-         * Summary for this document, or {@code null} to omit. This field is
-         * read-only to document clients.
+         * Flags that apply to a document.
          * <p>
-         * Type: STRING
+         * Type: INTEGER (int)
+         *
+         * @see #FLAG_SUPPORTS_WRITE
+         * @see #FLAG_SUPPORTS_DELETE
+         * @see #FLAG_SUPPORTS_THUMBNAIL
+         * @see #FLAG_DIR_PREFERS_GRID
+         * @see #FLAG_DIR_SUPPORTS_CREATE
+         * @see #FLAG_DIR_SUPPORTS_SEARCH
          */
-        public static final String SUMMARY = "summary";
+        public static final String COLUMN_FLAGS = "flags";
+
+        /**
+         * Size of a document, in bytes, or {@code null} if unknown.
+         * <p>
+         * Type: INTEGER (long)
+         */
+        public static final String COLUMN_SIZE = OpenableColumns.SIZE;
+
+        /**
+         * MIME type of a document which is a directory that may contain
+         * additional documents.
+         *
+         * @see #COLUMN_MIME_TYPE
+         */
+        public static final String MIME_TYPE_DIR = "vnd.android.document/directory";
+
+        /**
+         * Flag indicating that a document can be represented as a thumbnail.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsContract#getDocumentThumbnail(ContentResolver, Uri,
+         *      Point, CancellationSignal)
+         * @see DocumentsProvider#openDocumentThumbnail(String, Point,
+         *      android.os.CancellationSignal)
+         */
+        public static final int FLAG_SUPPORTS_THUMBNAIL = 1;
+
+        /**
+         * Flag indicating that a document supports writing.
+         * <p>
+         * When a document is opened with {@link Intent#ACTION_OPEN_DOCUMENT},
+         * the calling application is granted both
+         * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION} and
+         * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}. However, the actual
+         * writability of a document may change over time, for example due to
+         * remote access changes. This flag indicates that a document client can
+         * expect {@link ContentResolver#openOutputStream(Uri)} to succeed.
+         *
+         * @see #COLUMN_FLAGS
+         */
+        public static final int FLAG_SUPPORTS_WRITE = 1 << 1;
+
+        /**
+         * Flag indicating that a document is deletable.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsContract#deleteDocument(ContentResolver, Uri)
+         * @see DocumentsProvider#deleteDocument(String)
+         */
+        public static final int FLAG_SUPPORTS_DELETE = 1 << 2;
+
+        /**
+         * Flag indicating that a document is a directory that supports creation
+         * of new files within it. Only valid when {@link #COLUMN_MIME_TYPE} is
+         * {@link #MIME_TYPE_DIR}.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsContract#createDocument(ContentResolver, Uri, String,
+         *      String)
+         * @see DocumentsProvider#createDocument(String, String, String)
+         */
+        public static final int FLAG_DIR_SUPPORTS_CREATE = 1 << 3;
+
+        /**
+         * Flag indicating that a directory supports search. Only valid when
+         * {@link #COLUMN_MIME_TYPE} is {@link #MIME_TYPE_DIR}.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsProvider#querySearchDocuments(String, String,
+         *      String[])
+         */
+        public static final int FLAG_DIR_SUPPORTS_SEARCH = 1 << 4;
+
+        /**
+         * Flag indicating that a directory prefers its contents be shown in a
+         * larger format grid. Usually suitable when a directory contains mostly
+         * pictures. Only valid when {@link #COLUMN_MIME_TYPE} is
+         * {@link #MIME_TYPE_DIR}.
+         *
+         * @see #COLUMN_FLAGS
+         */
+        public static final int FLAG_DIR_PREFERS_GRID = 1 << 5;
     }
 
     /**
-     * Constants for individual document roots.
+     * Constants related to a root of documents, including {@link Cursor}
+     * columns names and flags.
+     * <p>
+     * All columns are <em>read-only</em> to client applications.
      */
-    public static class Roots {
-        private Roots() {
+    public final static class Root {
+        private Root() {
         }
 
-        public static final String MIME_TYPE_DIR = "vnd.android.cursor.dir/root";
-        public static final String MIME_TYPE_ITEM = "vnd.android.cursor.item/root";
+        /**
+         * Unique ID of a root. This ID is both provided by and interpreted by a
+         * {@link DocumentsProvider}, and should be treated as an opaque value
+         * by client applications.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_ROOT_ID = "root_id";
 
         /**
-         * Root that represents a storage service, such as a cloud-based
+         * Type of a root, used for clustering when presenting multiple roots to
+         * a user.
+         * <p>
+         * Type: INTEGER (int)
+         *
+         * @see #ROOT_TYPE_SERVICE
+         * @see #ROOT_TYPE_SHORTCUT
+         * @see #ROOT_TYPE_DEVICE
+         */
+        public static final String COLUMN_ROOT_TYPE = "root_type";
+
+        /**
+         * Flags that apply to a root.
+         * <p>
+         * Type: INTEGER (int)
+         *
+         * @see #FLAG_LOCAL_ONLY
+         * @see #FLAG_SUPPORTS_CREATE
+         * @see #FLAG_ADVANCED
+         * @see #FLAG_PROVIDES_AUDIO
+         * @see #FLAG_PROVIDES_IMAGES
+         * @see #FLAG_PROVIDES_VIDEO
+         */
+        public static final String COLUMN_FLAGS = "flags";
+
+        /**
+         * Icon resource ID for a root.
+         * <p>
+         * Type: INTEGER (int)
+         */
+        public static final String COLUMN_ICON = "icon";
+
+        /**
+         * Title for a root, which will be shown to a user.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_TITLE = "title";
+
+        /**
+         * Summary for this root, which may be shown to a user. The summary may
+         * be {@code null}.
+         * <p>
+         * Type: STRING
+         */
+        public static final String COLUMN_SUMMARY = "summary";
+
+        /**
+         * Document which is a directory that represents the top directory of
+         * this root.
+         * <p>
+         * Type: STRING
+         *
+         * @see Document#COLUMN_DOCUMENT_ID
+         */
+        public static final String COLUMN_DOCUMENT_ID = "document_id";
+
+        /**
+         * Number of bytes available in this root, or {@code null} if unknown or
+         * unbounded.
+         * <p>
+         * Type: INTEGER (long)
+         */
+        public static final String COLUMN_AVAILABLE_BYTES = "available_bytes";
+
+        /**
+         * Type of root that represents a storage service, such as a cloud-based
          * service.
          *
-         * @see RootColumns#ROOT_TYPE
+         * @see #COLUMN_ROOT_TYPE
          */
         public static final int ROOT_TYPE_SERVICE = 1;
 
         /**
-         * Root that represents a shortcut to content that may be available
-         * elsewhere through another storage root.
+         * Type of root that represents a shortcut to content that may be
+         * available elsewhere through another storage root.
          *
-         * @see RootColumns#ROOT_TYPE
+         * @see #COLUMN_ROOT_TYPE
          */
         public static final int ROOT_TYPE_SHORTCUT = 2;
 
         /**
-         * Root that represents a physical storage device.
+         * Type of root that represents a physical storage device.
          *
-         * @see RootColumns#ROOT_TYPE
+         * @see #COLUMN_ROOT_TYPE
          */
         public static final int ROOT_TYPE_DEVICE = 3;
 
         /**
-         * Root that represents a physical storage device that should only be
-         * displayed to advanced users.
+         * Flag indicating that at least one directory under this root supports
+         * creating content. Roots with this flag will be shown when an
+         * application interacts with {@link Intent#ACTION_CREATE_DOCUMENT}.
          *
-         * @see RootColumns#ROOT_TYPE
+         * @see #COLUMN_FLAGS
          */
-        public static final int ROOT_TYPE_DEVICE_ADVANCED = 4;
+        public static final int FLAG_SUPPORTS_CREATE = 1;
+
+        /**
+         * Flag indicating that this root offers content that is strictly local
+         * on the device. That is, no network requests are made for the content.
+         *
+         * @see #COLUMN_FLAGS
+         * @see Intent#EXTRA_LOCAL_ONLY
+         */
+        public static final int FLAG_LOCAL_ONLY = 1 << 1;
+
+        /**
+         * Flag indicating that this root should only be visible to advanced
+         * users.
+         *
+         * @see #COLUMN_FLAGS
+         */
+        public static final int FLAG_ADVANCED = 1 << 2;
+
+        /**
+         * Flag indicating that a root offers audio documents. When a user is
+         * selecting audio, roots not providing audio may be excluded.
+         *
+         * @see #COLUMN_FLAGS
+         * @see Intent#EXTRA_MIME_TYPES
+         */
+        public static final int FLAG_PROVIDES_AUDIO = 1 << 3;
+
+        /**
+         * Flag indicating that a root offers video documents. When a user is
+         * selecting video, roots not providing video may be excluded.
+         *
+         * @see #COLUMN_FLAGS
+         * @see Intent#EXTRA_MIME_TYPES
+         */
+        public static final int FLAG_PROVIDES_VIDEO = 1 << 4;
+
+        /**
+         * Flag indicating that a root offers image documents. When a user is
+         * selecting images, roots not providing images may be excluded.
+         *
+         * @see #COLUMN_FLAGS
+         * @see Intent#EXTRA_MIME_TYPES
+         */
+        public static final int FLAG_PROVIDES_IMAGES = 1 << 5;
+
+        /**
+         * Flag indicating that this root can report recently modified
+         * documents.
+         *
+         * @see #COLUMN_FLAGS
+         * @see DocumentsContract#buildRecentDocumentsUri(String, String)
+         */
+        public static final int FLAG_SUPPORTS_RECENTS = 1 << 6;
     }
 
     /**
-     * Standard columns for document root queries.
+     * Optional boolean flag included in a directory {@link Cursor#getExtras()}
+     * indicating that a document provider is still loading data. For example, a
+     * provider has returned some results, but is still waiting on an
+     * outstanding network request. The provider must send a content changed
+     * notification when loading is finished.
      *
-     * @see DocumentsContract#buildRootsUri(String)
-     * @see DocumentsContract#buildRootUri(String, String)
+     * @see ContentResolver#notifyChange(Uri, android.database.ContentObserver,
+     *      boolean)
      */
-    public interface RootColumns {
-        public static final String ROOT_ID = "root_id";
+    public static final String EXTRA_LOADING = "loading";
 
-        /**
-         * Storage root type, use for clustering. This field is read-only to
-         * document clients.
-         * <p>
-         * Type: INTEGER (int)
-         *
-         * @see Roots#ROOT_TYPE_SERVICE
-         * @see Roots#ROOT_TYPE_DEVICE
-         */
-        public static final String ROOT_TYPE = "root_type";
+    /**
+     * Optional string included in a directory {@link Cursor#getExtras()}
+     * providing an informational message that should be shown to a user. For
+     * example, a provider may wish to indicate that not all documents are
+     * available.
+     */
+    public static final String EXTRA_INFO = "info";
 
-        /**
-         * Icon resource ID for this storage root, or {@code null} to use the
-         * default {@link ProviderInfo#icon}. This field is read-only to
-         * document clients.
-         * <p>
-         * Type: INTEGER (int)
-         */
-        public static final String ICON = "icon";
+    /**
+     * Optional string included in a directory {@link Cursor#getExtras()}
+     * providing an error message that should be shown to a user. For example, a
+     * provider may wish to indicate that a network error occurred. The user may
+     * choose to retry, resulting in a new query.
+     */
+    public static final String EXTRA_ERROR = "error";
 
-        /**
-         * Title for this storage root, or {@code null} to use the default
-         * {@link ProviderInfo#labelRes}. This field is read-only to document
-         * clients.
-         * <p>
-         * Type: STRING
-         */
-        public static final String TITLE = "title";
+    /** {@hide} */
+    public static final String METHOD_CREATE_DOCUMENT = "android:createDocument";
+    /** {@hide} */
+    public static final String METHOD_DELETE_DOCUMENT = "android:deleteDocument";
 
-        /**
-         * Summary for this storage root, or {@code null} to omit. This field is
-         * read-only to document clients.
-         * <p>
-         * Type: STRING
-         */
-        public static final String SUMMARY = "summary";
+    /** {@hide} */
+    public static final String EXTRA_THUMBNAIL_SIZE = "thumbnail_size";
 
-        /**
-         * Number of free bytes of available in this storage root, or
-         * {@code null} if unknown or unbounded. This field is read-only to
-         * document clients.
-         * <p>
-         * Type: INTEGER (long)
-         */
-        public static final String AVAILABLE_BYTES = "available_bytes";
+    private static final String PATH_ROOT = "root";
+    private static final String PATH_RECENT = "recent";
+    private static final String PATH_DOCUMENT = "document";
+    private static final String PATH_CHILDREN = "children";
+    private static final String PATH_SEARCH = "search";
+
+    private static final String PARAM_QUERY = "query";
+
+    /**
+     * Build Uri representing the roots of a document provider. When queried, a
+     * provider will return one or more rows with columns defined by
+     * {@link Root}.
+     *
+     * @see DocumentsProvider#queryRoots(String[])
+     */
+    public static Uri buildRootsUri(String authority) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(authority).appendPath(PATH_ROOT).build();
+    }
+
+    /**
+     * Build Uri representing the recently modified documents of a specific
+     * root. When queried, a provider will return zero or more rows with columns
+     * defined by {@link Document}.
+     *
+     * @see DocumentsProvider#queryRecentDocuments(String, String[])
+     * @see #getRootId(Uri)
+     */
+    public static Uri buildRecentDocumentsUri(String authority, String rootId) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(authority).appendPath(PATH_ROOT).appendPath(rootId)
+                .appendPath(PATH_RECENT).build();
+    }
+
+    /**
+     * Build Uri representing the given {@link Document#COLUMN_DOCUMENT_ID} in a
+     * document provider. When queried, a provider will return a single row with
+     * columns defined by {@link Document}.
+     *
+     * @see DocumentsProvider#queryDocument(String, String[])
+     * @see #getDocumentId(Uri)
+     */
+    public static Uri buildDocumentUri(String authority, String documentId) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(authority).appendPath(PATH_DOCUMENT).appendPath(documentId).build();
+    }
+
+    /**
+     * Build Uri representing the children of the given directory in a document
+     * provider. When queried, a provider will return zero or more rows with
+     * columns defined by {@link Document}.
+     *
+     * @param parentDocumentId the document to return children for, which must
+     *            be a directory with MIME type of
+     *            {@link Document#MIME_TYPE_DIR}.
+     * @see DocumentsProvider#queryChildDocuments(String, String[], String)
+     * @see #getDocumentId(Uri)
+     */
+    public static Uri buildChildDocumentsUri(String authority, String parentDocumentId) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority)
+                .appendPath(PATH_DOCUMENT).appendPath(parentDocumentId).appendPath(PATH_CHILDREN)
+                .build();
+    }
+
+    /**
+     * Build Uri representing a search for matching documents under a specific
+     * directory in a document provider. When queried, a provider will return
+     * zero or more rows with columns defined by {@link Document}.
+     *
+     * @param parentDocumentId the document to return children for, which must
+     *            be both a directory with MIME type of
+     *            {@link Document#MIME_TYPE_DIR} and have
+     *            {@link Document#FLAG_DIR_SUPPORTS_SEARCH} set.
+     * @see DocumentsProvider#querySearchDocuments(String, String, String[])
+     * @see #getDocumentId(Uri)
+     * @see #getSearchDocumentsQuery(Uri)
+     */
+    public static Uri buildSearchDocumentsUri(
+            String authority, String parentDocumentId, String query) {
+        return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(authority)
+                .appendPath(PATH_DOCUMENT).appendPath(parentDocumentId).appendPath(PATH_SEARCH)
+                .appendQueryParameter(PARAM_QUERY, query).build();
+    }
+
+    /**
+     * Extract the {@link Root#COLUMN_ROOT_ID} from the given Uri.
+     */
+    public static String getRootId(Uri rootUri) {
+        final List<String> paths = rootUri.getPathSegments();
+        if (paths.size() < 2) {
+            throw new IllegalArgumentException("Not a root: " + rootUri);
+        }
+        if (!PATH_ROOT.equals(paths.get(0))) {
+            throw new IllegalArgumentException("Not a root: " + rootUri);
+        }
+        return paths.get(1);
+    }
+
+    /**
+     * Extract the {@link Document#COLUMN_DOCUMENT_ID} from the given Uri.
+     */
+    public static String getDocumentId(Uri documentUri) {
+        final List<String> paths = documentUri.getPathSegments();
+        if (paths.size() < 2) {
+            throw new IllegalArgumentException("Not a document: " + documentUri);
+        }
+        if (!PATH_DOCUMENT.equals(paths.get(0))) {
+            throw new IllegalArgumentException("Not a document: " + documentUri);
+        }
+        return paths.get(1);
+    }
+
+    /**
+     * Extract the search query from a Uri built by
+     * {@link #buildSearchDocumentsUri(String, String, String)}.
+     */
+    public static String getSearchDocumentsQuery(Uri searchDocumentsUri) {
+        return searchDocumentsUri.getQueryParameter(PARAM_QUERY);
     }
 
     /**
@@ -503,6 +586,7 @@
      * {@link Intent#ACTION_CREATE_DOCUMENT}.
      *
      * @see Context#grantUriPermission(String, Uri, int)
+     * @see Context#revokeUriPermission(Uri, int)
      * @see ContentResolver#getIncomingUriPermissionGrants(int, int)
      */
     public static Uri[] getOpenDocuments(Context context) {
@@ -526,19 +610,28 @@
     }
 
     /**
-     * Return thumbnail representing the document at the given URI. Callers are
-     * responsible for their own in-memory caching. Given document must have
-     * {@link Documents#FLAG_SUPPORTS_THUMBNAIL} set.
+     * Return thumbnail representing the document at the given Uri. Callers are
+     * responsible for their own in-memory caching.
      *
+     * @param documentUri document to return thumbnail for, which must have
+     *            {@link Document#FLAG_SUPPORTS_THUMBNAIL} set.
+     * @param size optimal thumbnail size desired. A provider may return a
+     *            thumbnail of a different size, but never more than double the
+     *            requested size.
+     * @param signal signal used to indicate that caller is no longer interested
+     *            in the thumbnail.
      * @return decoded thumbnail, or {@code null} if problem was encountered.
+     * @see DocumentsProvider#openDocumentThumbnail(String, Point,
+     *      android.os.CancellationSignal)
      */
-    public static Bitmap getThumbnail(ContentResolver resolver, Uri documentUri, Point size) {
+    public static Bitmap getDocumentThumbnail(
+            ContentResolver resolver, Uri documentUri, Point size, CancellationSignal signal) {
         final Bundle openOpts = new Bundle();
         openOpts.putParcelable(DocumentsContract.EXTRA_THUMBNAIL_SIZE, size);
 
         AssetFileDescriptor afd = null;
         try {
-            afd = resolver.openTypedAssetFileDescriptor(documentUri, "image/*", openOpts);
+            afd = resolver.openTypedAssetFileDescriptor(documentUri, "image/*", openOpts, signal);
 
             final FileDescriptor fd = afd.getFileDescriptor();
             final long offset = afd.getStartOffset();
@@ -589,43 +682,46 @@
     }
 
     /**
-     * Create a new document under a specific parent document with the given
-     * display name and MIME type.
+     * Create a new document with given MIME type and display name.
      *
-     * @param parentDocumentUri document with
-     *            {@link Documents#FLAG_SUPPORTS_CREATE}
-     * @param displayName name for new document
-     * @param mimeType MIME type for new document, which cannot be changed
-     * @return newly created document Uri, or {@code null} if failed
+     * @param parentDocumentUri directory with
+     *            {@link Document#FLAG_DIR_SUPPORTS_CREATE}
+     * @param mimeType MIME type of new document
+     * @param displayName name of new document
+     * @return newly created document, or {@code null} if failed
      */
-    public static Uri createDocument(
-            ContentResolver resolver, Uri parentDocumentUri, String displayName, String mimeType) {
-        final ContentValues values = new ContentValues();
-        values.put(DocumentColumns.MIME_TYPE, mimeType);
-        values.put(DocumentColumns.DISPLAY_NAME, displayName);
-        return resolver.insert(parentDocumentUri, values);
+    public static Uri createDocument(ContentResolver resolver, Uri parentDocumentUri,
+            String mimeType, String displayName) {
+        final Bundle in = new Bundle();
+        in.putString(Document.COLUMN_DOCUMENT_ID, getDocumentId(parentDocumentUri));
+        in.putString(Document.COLUMN_MIME_TYPE, mimeType);
+        in.putString(Document.COLUMN_DISPLAY_NAME, displayName);
+
+        try {
+            final Bundle out = resolver.call(parentDocumentUri, METHOD_CREATE_DOCUMENT, null, in);
+            return buildDocumentUri(
+                    parentDocumentUri.getAuthority(), out.getString(Document.COLUMN_DOCUMENT_ID));
+        } catch (Exception e) {
+            Log.w(TAG, "Failed to create document", e);
+            return null;
+        }
     }
 
     /**
-     * Rename the document at the given URI. Given document must have
-     * {@link Documents#FLAG_SUPPORTS_RENAME} set.
+     * Delete the given document.
      *
-     * @return if rename was successful.
+     * @param documentUri document with {@link Document#FLAG_SUPPORTS_DELETE}
      */
-    public static boolean renameDocument(
-            ContentResolver resolver, Uri documentUri, String displayName) {
-        final ContentValues values = new ContentValues();
-        values.put(DocumentColumns.DISPLAY_NAME, displayName);
-        return (resolver.update(documentUri, values, null, null) == 1);
-    }
+    public static boolean deleteDocument(ContentResolver resolver, Uri documentUri) {
+        final Bundle in = new Bundle();
+        in.putString(Document.COLUMN_DOCUMENT_ID, getDocumentId(documentUri));
 
-    /**
-     * Notify the system that roots have changed for the given storage provider.
-     * This signal is used to invalidate internal caches.
-     */
-    public static void notifyRootsChanged(Context context, String authority) {
-        final Intent intent = new Intent(ACTION_DOCUMENT_CHANGED);
-        intent.setData(buildRootsUri(authority));
-        context.sendBroadcast(intent);
+        try {
+            final Bundle out = resolver.call(documentUri, METHOD_DELETE_DOCUMENT, null, in);
+            return true;
+        } catch (Exception e) {
+            Log.w(TAG, "Failed to delete document", e);
+            return false;
+        }
     }
 }
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
new file mode 100644
index 0000000..09f4866
--- /dev/null
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -0,0 +1,419 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package android.provider;
+
+import static android.provider.DocumentsContract.EXTRA_THUMBNAIL_SIZE;
+import static android.provider.DocumentsContract.METHOD_CREATE_DOCUMENT;
+import static android.provider.DocumentsContract.METHOD_DELETE_DOCUMENT;
+import static android.provider.DocumentsContract.getDocumentId;
+import static android.provider.DocumentsContract.getRootId;
+import static android.provider.DocumentsContract.getSearchDocumentsQuery;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.content.UriMatcher;
+import android.content.pm.ProviderInfo;
+import android.content.res.AssetFileDescriptor;
+import android.database.Cursor;
+import android.graphics.Point;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.ParcelFileDescriptor;
+import android.os.ParcelFileDescriptor.OnCloseListener;
+import android.provider.DocumentsContract.Document;
+import android.util.Log;
+
+import libcore.io.IoUtils;
+
+import java.io.FileNotFoundException;
+
+/**
+ * Base class for a document provider. A document provider should extend this
+ * class and implement the abstract methods.
+ * <p>
+ * Each document provider expresses one or more "roots" which each serve as the
+ * top-level of a tree. For example, a root could represent an account, or a
+ * physical storage device. Under each root, documents are referenced by
+ * {@link Document#COLUMN_DOCUMENT_ID}, which must not change once returned.
+ * <p>
+ * Documents can be either an openable file (with a specific MIME type), or a
+ * directory containing additional documents (with the
+ * {@link Document#MIME_TYPE_DIR} MIME type). Each document can have different
+ * capabilities, as described by {@link Document#COLUMN_FLAGS}. The same
+ * {@link Document#COLUMN_DOCUMENT_ID} can be included in multiple directories.
+ * <p>
+ * Document providers must be protected with the
+ * {@link android.Manifest.permission#MANAGE_DOCUMENTS} permission, which can
+ * only be requested by the system. The system-provided UI then issues narrow
+ * Uri permission grants for individual documents when the user explicitly picks
+ * documents.
+ *
+ * @see Intent#ACTION_OPEN_DOCUMENT
+ * @see Intent#ACTION_CREATE_DOCUMENT
+ */
+public abstract class DocumentsProvider extends ContentProvider {
+    private static final String TAG = "DocumentsProvider";
+
+    private static final int MATCH_ROOT = 1;
+    private static final int MATCH_RECENT = 2;
+    private static final int MATCH_DOCUMENT = 3;
+    private static final int MATCH_CHILDREN = 4;
+    private static final int MATCH_SEARCH = 5;
+
+    private String mAuthority;
+
+    private UriMatcher mMatcher;
+
+    /**
+     * Implementation is provided by the parent class.
+     */
+    @Override
+    public void attachInfo(Context context, ProviderInfo info) {
+        mAuthority = info.authority;
+
+        mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+        mMatcher.addURI(mAuthority, "root", MATCH_ROOT);
+        mMatcher.addURI(mAuthority, "root/*/recent", MATCH_RECENT);
+        mMatcher.addURI(mAuthority, "document/*", MATCH_DOCUMENT);
+        mMatcher.addURI(mAuthority, "document/*/children", MATCH_CHILDREN);
+        mMatcher.addURI(mAuthority, "document/*/search", MATCH_SEARCH);
+
+        // Sanity check our setup
+        if (!info.exported) {
+            throw new SecurityException("Provider must be exported");
+        }
+        if (!info.grantUriPermissions) {
+            throw new SecurityException("Provider must grantUriPermissions");
+        }
+        if (!android.Manifest.permission.MANAGE_DOCUMENTS.equals(info.readPermission)
+                || !android.Manifest.permission.MANAGE_DOCUMENTS.equals(info.writePermission)) {
+            throw new SecurityException("Provider must be protected by MANAGE_DOCUMENTS");
+        }
+
+        super.attachInfo(context, info);
+    }
+
+    /**
+     * Create a new document and return its {@link Document#COLUMN_DOCUMENT_ID}.
+     * A provider must allocate a new {@link Document#COLUMN_DOCUMENT_ID} to
+     * represent the document, which must not change once returned.
+     *
+     * @param documentId the parent directory to create the new document under.
+     * @param mimeType the MIME type associated with the new document.
+     * @param displayName the display name of the new document.
+     */
+    @SuppressWarnings("unused")
+    public String createDocument(String documentId, String mimeType, String displayName)
+            throws FileNotFoundException {
+        throw new UnsupportedOperationException("Create not supported");
+    }
+
+    /**
+     * Delete the given document. Upon returning, any Uri permission grants for
+     * the given document will be revoked. If additional documents were deleted
+     * as a side effect of this call, such as documents inside a directory, the
+     * implementor is responsible for revoking those permissions.
+     *
+     * @param documentId the document to delete.
+     */
+    @SuppressWarnings("unused")
+    public void deleteDocument(String documentId) throws FileNotFoundException {
+        throw new UnsupportedOperationException("Delete not supported");
+    }
+
+    public abstract Cursor queryRoots(String[] projection) throws FileNotFoundException;
+
+    @SuppressWarnings("unused")
+    public Cursor queryRecentDocuments(String rootId, String[] projection)
+            throws FileNotFoundException {
+        throw new UnsupportedOperationException("Recent not supported");
+    }
+
+    /**
+     * Return metadata for the given document. A provider should avoid making
+     * network requests to keep this request fast.
+     *
+     * @param documentId the document to return.
+     */
+    public abstract Cursor queryDocument(String documentId, String[] projection)
+            throws FileNotFoundException;
+
+    /**
+     * Return the children of the given document which is a directory.
+     *
+     * @param parentDocumentId the directory to return children for.
+     */
+    public abstract Cursor queryChildDocuments(
+            String parentDocumentId, String[] projection, String sortOrder)
+            throws FileNotFoundException;
+
+    /**
+     * Return documents that that match the given query, starting the search at
+     * the given directory.
+     *
+     * @param parentDocumentId the directory to start search at.
+     */
+    @SuppressWarnings("unused")
+    public Cursor querySearchDocuments(String parentDocumentId, String query, String[] projection)
+            throws FileNotFoundException {
+        throw new UnsupportedOperationException("Search not supported");
+    }
+
+    /**
+     * Return MIME type for the given document. Must match the value of
+     * {@link Document#COLUMN_MIME_TYPE} for this document.
+     */
+    public String getDocumentType(String documentId) throws FileNotFoundException {
+        final Cursor cursor = queryDocument(documentId, null);
+        try {
+            if (cursor.moveToFirst()) {
+                return cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_MIME_TYPE));
+            } else {
+                return null;
+            }
+        } finally {
+            IoUtils.closeQuietly(cursor);
+        }
+    }
+
+    /**
+     * Open and return the requested document. A provider should return a
+     * reliable {@link ParcelFileDescriptor} to detect when the remote caller
+     * has finished reading or writing the document. A provider may return a
+     * pipe or socket pair if the mode is exclusively
+     * {@link ParcelFileDescriptor#MODE_READ_ONLY} or
+     * {@link ParcelFileDescriptor#MODE_WRITE_ONLY}, but complex modes like
+     * {@link ParcelFileDescriptor#MODE_READ_WRITE} require a normal file on
+     * disk. If a provider blocks while downloading content, it should
+     * periodically check {@link CancellationSignal#isCanceled()} to abort
+     * abandoned open requests.
+     *
+     * @param docId the document to return.
+     * @param mode the mode to open with, such as 'r', 'w', or 'rw'.
+     * @param signal used by the caller to signal if the request should be
+     *            cancelled.
+     * @see ParcelFileDescriptor#open(java.io.File, int, android.os.Handler,
+     *      OnCloseListener)
+     * @see ParcelFileDescriptor#createReliablePipe()
+     * @see ParcelFileDescriptor#createReliableSocketPair()
+     */
+    public abstract ParcelFileDescriptor openDocument(
+            String docId, String mode, CancellationSignal signal) throws FileNotFoundException;
+
+    /**
+     * Open and return a thumbnail of the requested document. A provider should
+     * return a thumbnail closely matching the hinted size, attempting to serve
+     * from a local cache if possible. A provider should never return images
+     * more than double the hinted size. If a provider performs expensive
+     * operations to download or generate a thumbnail, it should periodically
+     * check {@link CancellationSignal#isCanceled()} to abort abandoned
+     * thumbnail requests.
+     *
+     * @param docId the document to return.
+     * @param sizeHint hint of the optimal thumbnail dimensions.
+     * @param signal used by the caller to signal if the request should be
+     *            cancelled.
+     * @see Document#FLAG_SUPPORTS_THUMBNAIL
+     */
+    @SuppressWarnings("unused")
+    public AssetFileDescriptor openDocumentThumbnail(
+            String docId, Point sizeHint, CancellationSignal signal) throws FileNotFoundException {
+        throw new UnsupportedOperationException("Thumbnails not supported");
+    }
+
+    /**
+     * Implementation is provided by the parent class. Cannot be overriden.
+     *
+     * @see #queryRoots(String[])
+     * @see #queryRecentDocuments(String, String[])
+     * @see #queryDocument(String, String[])
+     * @see #queryChildDocuments(String, String[], String)
+     * @see #querySearchDocuments(String, String, String[])
+     */
+    @Override
+    public final Cursor query(Uri uri, String[] projection, String selection,
+            String[] selectionArgs, String sortOrder) {
+        try {
+            switch (mMatcher.match(uri)) {
+                case MATCH_ROOT:
+                    return queryRoots(projection);
+                case MATCH_RECENT:
+                    return queryRecentDocuments(getRootId(uri), projection);
+                case MATCH_DOCUMENT:
+                    return queryDocument(getDocumentId(uri), projection);
+                case MATCH_CHILDREN:
+                    return queryChildDocuments(getDocumentId(uri), projection, sortOrder);
+                case MATCH_SEARCH:
+                    return querySearchDocuments(
+                            getDocumentId(uri), getSearchDocumentsQuery(uri), projection);
+                default:
+                    throw new UnsupportedOperationException("Unsupported Uri " + uri);
+            }
+        } catch (FileNotFoundException e) {
+            Log.w(TAG, "Failed during query", e);
+            return null;
+        }
+    }
+
+    /**
+     * Implementation is provided by the parent class. Cannot be overriden.
+     *
+     * @see #getDocumentType(String)
+     */
+    @Override
+    public final String getType(Uri uri) {
+        try {
+            switch (mMatcher.match(uri)) {
+                case MATCH_DOCUMENT:
+                    return getDocumentType(getDocumentId(uri));
+                default:
+                    return null;
+            }
+        } catch (FileNotFoundException e) {
+            Log.w(TAG, "Failed during getType", e);
+            return null;
+        }
+    }
+
+    /**
+     * Implementation is provided by the parent class. Throws by default, and
+     * cannot be overriden.
+     *
+     * @see #createDocument(String, String, String)
+     */
+    @Override
+    public final Uri insert(Uri uri, ContentValues values) {
+        throw new UnsupportedOperationException("Insert not supported");
+    }
+
+    /**
+     * Implementation is provided by the parent class. Throws by default, and
+     * cannot be overriden.
+     *
+     * @see #deleteDocument(String)
+     */
+    @Override
+    public final int delete(Uri uri, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException("Delete not supported");
+    }
+
+    /**
+     * Implementation is provided by the parent class. Throws by default, and
+     * cannot be overriden.
+     */
+    @Override
+    public final int update(
+            Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException("Update not supported");
+    }
+
+    /** {@hide} */
+    @Override
+    public final Bundle callFromPackage(
+            String callingPackage, String method, String arg, Bundle extras) {
+        if (!method.startsWith("android:")) {
+            // Let non-platform methods pass through
+            return super.callFromPackage(callingPackage, method, arg, extras);
+        }
+
+        // Require that caller can manage given document
+        final String documentId = extras.getString(Document.COLUMN_DOCUMENT_ID);
+        final Uri documentUri = DocumentsContract.buildDocumentUri(mAuthority, documentId);
+        getContext().enforceCallingOrSelfUriPermission(
+                documentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, method);
+
+        final Bundle out = new Bundle();
+        try {
+            if (METHOD_CREATE_DOCUMENT.equals(method)) {
+                final String mimeType = extras.getString(Document.COLUMN_MIME_TYPE);
+                final String displayName = extras.getString(Document.COLUMN_DISPLAY_NAME);
+
+                // TODO: issue Uri grant towards calling package
+                // TODO: enforce that package belongs to caller
+                final String newDocumentId = createDocument(documentId, mimeType, displayName);
+                out.putString(Document.COLUMN_DOCUMENT_ID, newDocumentId);
+
+            } else if (METHOD_DELETE_DOCUMENT.equals(method)) {
+                final String docId = extras.getString(Document.COLUMN_DOCUMENT_ID);
+                deleteDocument(docId);
+
+            } else {
+                throw new UnsupportedOperationException("Method not supported " + method);
+            }
+        } catch (FileNotFoundException e) {
+            throw new IllegalStateException("Failed call " + method, e);
+        }
+        return out;
+    }
+
+    /**
+     * Implementation is provided by the parent class.
+     *
+     * @see #openDocument(String, String, CancellationSignal)
+     */
+    @Override
+    public final ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+        return openDocument(getDocumentId(uri), mode, null);
+    }
+
+    /**
+     * Implementation is provided by the parent class.
+     *
+     * @see #openDocument(String, String, CancellationSignal)
+     */
+    @Override
+    public final ParcelFileDescriptor openFile(Uri uri, String mode, CancellationSignal signal)
+            throws FileNotFoundException {
+        return openDocument(getDocumentId(uri), mode, signal);
+    }
+
+    /**
+     * Implementation is provided by the parent class.
+     *
+     * @see #openDocumentThumbnail(String, Point, CancellationSignal)
+     */
+    @Override
+    public final AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts)
+            throws FileNotFoundException {
+        if (opts != null && opts.containsKey(EXTRA_THUMBNAIL_SIZE)) {
+            final Point sizeHint = opts.getParcelable(EXTRA_THUMBNAIL_SIZE);
+            return openDocumentThumbnail(getDocumentId(uri), sizeHint, null);
+        } else {
+            return super.openTypedAssetFile(uri, mimeTypeFilter, opts);
+        }
+    }
+
+    /**
+     * Implementation is provided by the parent class.
+     *
+     * @see #openDocumentThumbnail(String, Point, CancellationSignal)
+     */
+    @Override
+    public final AssetFileDescriptor openTypedAssetFile(
+            Uri uri, String mimeTypeFilter, Bundle opts, CancellationSignal signal)
+            throws FileNotFoundException {
+        if (opts != null && opts.containsKey(EXTRA_THUMBNAIL_SIZE)) {
+            final Point sizeHint = opts.getParcelable(EXTRA_THUMBNAIL_SIZE);
+            return openDocumentThumbnail(getDocumentId(uri), sizeHint, signal);
+        } else {
+            return super.openTypedAssetFile(uri, mimeTypeFilter, opts, signal);
+        }
+    }
+}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 24dbf0e..83e1544 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -690,6 +690,19 @@
     public static final String ACTION_NOTIFICATION_LISTENER_SETTINGS
             = "android.settings.NOTIFICATION_LISTENER_SETTINGS";
 
+    /**
+     * Activity Action: Show settings for video captioning.
+     * <p>
+     * In some cases, a matching Activity may not exist, so ensure you safeguard
+     * against this.
+     * <p>
+     * Input: Nothing.
+     * <p>
+     * Output: Nothing.
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
+
     // End of Intent actions for Settings
 
     /**
@@ -3588,7 +3601,7 @@
          * <li>{@link #ACCESSIBILITY_CAPTIONING_EDGE_COLOR}
          * <li>{@link #ACCESSIBILITY_CAPTIONING_EDGE_TYPE}
          * <li>{@link #ACCESSIBILITY_CAPTIONING_TYPEFACE}
-         * <li>{@link #ACCESSIBILITY_CAPTIONING_FONT_SIZE}
+         * <li>{@link #ACCESSIBILITY_CAPTIONING_FONT_SCALE}
          * </ul>
          *
          * @hide
@@ -3610,9 +3623,8 @@
          * Integer property that specifies the preset style for captions, one
          * of:
          * <ul>
-         * <li>{@link android.view.accessibility.CaptioningManager#PRESET_WHITE_ON_BLACK}
-         * <li>{@link android.view.accessibility.CaptioningManager#PRESET_BLACK_ON_WHITE}
-         * <li>{@link android.view.accessibility.CaptioningManager#PRESET_CUSTOM}
+         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#PRESET_CUSTOM}
+         * <li>a valid index of {@link android.view.accessibility.CaptioningManager.CaptionStyle#PRESETS}
          * </ul>
          *
          * @see java.util.Locale#toString
@@ -3644,9 +3656,9 @@
         /**
          * Integer property that specifes the edge type for captions, one of:
          * <ul>
-         * <li>{@link android.view.accessibility.CaptioningManager#EDGE_TYPE_NONE}
-         * <li>{@link android.view.accessibility.CaptioningManager#EDGE_TYPE_OUTLINE}
-         * <li>{@link android.view.accessibility.CaptioningManager#EDGE_TYPE_DROP_SHADOWED}
+         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_NONE}
+         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_OUTLINE}
+         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_DROP_SHADOW}
          * </ul>
          *
          * @see #ACCESSIBILITY_CAPTIONING_EDGE_COLOR
@@ -3682,13 +3694,12 @@
                 "accessibility_captioning_typeface";
 
         /**
-         * Integer point property that specifies font size for captions in
-         * scaled pixels (sp).
+         * Floating point property that specifies font scaling for captions.
          *
          * @hide
          */
-        public static final String ACCESSIBILITY_CAPTIONING_FONT_SIZE =
-                "accessibility_captioning_font_size";
+        public static final String ACCESSIBILITY_CAPTIONING_FONT_SCALE =
+                "accessibility_captioning_font_scale";
 
         /**
          * The timout for considering a press to be a long press in milliseconds.
@@ -3697,13 +3708,22 @@
         public static final String LONG_PRESS_TIMEOUT = "long_press_timeout";
 
         /**
-         * List of the enabled print providers.
+         * List of the enabled print services.
          * @hide
          */
         public static final String ENABLED_PRINT_SERVICES =
             "enabled_print_services";
 
         /**
+         * List of the system print services we enabled on first boot. On
+         * first boot we enable all system, i.e. bundled print services,
+         * once, so they work out-of-the-box.
+         * @hide
+         */
+        public static final String ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES =
+            "enabled_on_first_boot_system_print_services";
+
+        /**
          * Setting to always use the default text-to-speech settings regardless
          * of the application settings.
          * 1 = override application settings,
@@ -4285,12 +4305,6 @@
         public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component";
 
         /**
-         * Whether to automatically invoke NFC payment app or manually select on tap.
-         * @hide
-         */
-        public static final String NFC_PAYMENT_MODE = "nfc_payment_mode";
-
-        /**
          * Name of a package that the current user has explicitly allowed to see all of that
          * user's notifications.
          *
@@ -4333,7 +4347,7 @@
             ACCESSIBILITY_CAPTIONING_EDGE_TYPE,
             ACCESSIBILITY_CAPTIONING_EDGE_COLOR,
             ACCESSIBILITY_CAPTIONING_TYPEFACE,
-            ACCESSIBILITY_CAPTIONING_FONT_SIZE,
+            ACCESSIBILITY_CAPTIONING_FONT_SCALE,
             TTS_USE_DEFAULTS,
             TTS_DEFAULT_RATE,
             TTS_DEFAULT_PITCH,
diff --git a/core/java/android/security/IKeystoreService.java b/core/java/android/security/IKeystoreService.java
index 3d75dc8..bf8d4e5 100644
--- a/core/java/android/security/IKeystoreService.java
+++ b/core/java/android/security/IKeystoreService.java
@@ -244,7 +244,8 @@
                 return _result;
             }
 
-            public int generate(String name, int uid, int flags) throws RemoteException {
+            public int generate(String name, int uid, int keyType, int keySize, int flags,
+                    byte[][] args) throws RemoteException {
                 Parcel _data = Parcel.obtain();
                 Parcel _reply = Parcel.obtain();
                 int _result;
@@ -252,7 +253,17 @@
                     _data.writeInterfaceToken(DESCRIPTOR);
                     _data.writeString(name);
                     _data.writeInt(uid);
+                    _data.writeInt(keyType);
+                    _data.writeInt(keySize);
                     _data.writeInt(flags);
+                    if (args == null) {
+                        _data.writeInt(0);
+                    } else {
+                        _data.writeInt(args.length);
+                        for (int i = 0; i < args.length; i++) {
+                            _data.writeByteArray(args[i]);
+                        }
+                    }
                     mRemote.transact(Stub.TRANSACTION_generate, _data, _reply, 0);
                     _reply.readException();
                     _result = _reply.readInt();
@@ -560,7 +571,8 @@
 
     public int zero() throws RemoteException;
 
-    public int generate(String name, int uid, int flags) throws RemoteException;
+    public int generate(String name, int uid, int keyType, int keySize, int flags, byte[][] args)
+            throws RemoteException;
 
     public int import_key(String name, byte[] data, int uid, int flags) throws RemoteException;
 
diff --git a/core/java/android/speech/hotword/HotwordRecognitionService.java b/core/java/android/speech/hotword/HotwordRecognitionService.java
index c16d2a9..521d06d 100644
--- a/core/java/android/speech/hotword/HotwordRecognitionService.java
+++ b/core/java/android/speech/hotword/HotwordRecognitionService.java
@@ -21,7 +21,6 @@
 import android.app.PendingIntent;
 import android.app.Service;
 import android.content.Intent;
-import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
@@ -113,8 +112,9 @@
                 listener.onHotwordError(HotwordRecognizer.ERROR_RECOGNIZER_BUSY);
                 Log.w(TAG, "stopRecognition called by a different caller - ignoring");
             } else { // the correct state
-                HotwordRecognitionService.this.onStopHotwordRecognition(mCurrentCallback);
+                mCurrentCallback.onHotwordRecognitionStopped();
                 mCurrentCallback = null;
+                HotwordRecognitionService.this.onStopHotwordRecognition();
             }
         } catch (RemoteException e) { // occurs if onError fails
             if (DBG) Log.d(TAG, "onError call from stopRecognition failed");
@@ -139,27 +139,6 @@
     }
 
     /**
-     * Checks whether the caller has sufficient permissions
-     *
-     * @param listener to send the error message to in case of error
-     * @return {@code true} if the caller has enough permissions, {@code false} otherwise
-     */
-    private boolean checkPermissions(IHotwordRecognitionListener listener) {
-        if (DBG) Log.d(TAG, "checkPermissions");
-        if (checkCallingOrSelfPermission(
-                android.Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
-            return true;
-        }
-        try {
-            Log.e(TAG, "Recognition service called without RECORD_AUDIO permissions");
-            listener.onHotwordError(HotwordRecognizer.ERROR_FAILED);
-        } catch (RemoteException e) {
-            Log.e(TAG, "onHotwordError(ERROR_INSUFFICIENT_PERMISSIONS) message failed", e);
-        }
-        return false;
-    }
-
-    /**
      * Notifies the service to start a recognition.
      *
      * @param callback that receives the callbacks from the service.
@@ -168,10 +147,8 @@
 
     /**
      * Notifies the service to stop recognition.
-     *
-     * @param callback that receives the callbacks from the service.
      */
-    public abstract void onStopHotwordRecognition(Callback callback);
+    public abstract void onStopHotwordRecognition();
 
     /** Binder of the hotword recognition service */
     private static class RecognitionServiceBinder extends IHotwordRecognitionService.Stub {
@@ -183,7 +160,7 @@
 
         public void startHotwordRecognition(IHotwordRecognitionListener listener) {
             if (DBG) Log.d(TAG, "startRecognition called by: " + listener.asBinder());
-            if (mInternalService != null && mInternalService.checkPermissions(listener)) {
+            if (mInternalService != null) {
                 mInternalService.mHandler.sendMessage(
                         Message.obtain(mInternalService.mHandler, MSG_START_RECOGNITION, listener));
             }
diff --git a/core/java/android/speech/hotword/HotwordRecognizer.java b/core/java/android/speech/hotword/HotwordRecognizer.java
index c6bd1f3..82cec10 100644
--- a/core/java/android/speech/hotword/HotwordRecognizer.java
+++ b/core/java/android/speech/hotword/HotwordRecognizer.java
@@ -21,6 +21,8 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.Bundle;
 import android.os.Handler;
@@ -82,7 +84,6 @@
     /** action codes */
     private static final int MSG_START = 1;
     private static final int MSG_STOP = 2;
-    private final static int MSG_CHANGE_LISTENER = 3;
 
     /** The underlying HotwordRecognitionService endpoint */
     private IHotwordRecognitionService mService;
@@ -107,9 +108,6 @@
                 case MSG_STOP:
                     handleStopRecognition();
                     break;
-                case MSG_CHANGE_LISTENER:
-                    handleChangeListener((HotwordRecognitionListener) msg.obj);
-                    break;
             }
         }
     };
@@ -138,24 +136,38 @@
     }
 
     /**
-     * Factory method to create a new {@code HotwordRecognizer}. Please note that
-     * {@link #setRecognitionListener(HotwordRecognitionListener)}
-     * should be called before dispatching any command to the created {@code HotwordRecognizer},
-     * otherwise no notifications will be received.
+     * Factory method to create a new {@code HotwordRecognizer}.
      *
      * @param context in which to create {@code HotwordRecognizer}
      * @return a new {@code HotwordRecognizer}
      */
     public static HotwordRecognizer createHotwordRecognizer(final Context context) {
-        return createHotwordRecognizer(context, null);
+        ComponentName serviceComponent = null;
+        // Resolve to a default ComponentName.
+        final List<ResolveInfo> list = context.getPackageManager().queryIntentServices(
+                new Intent(HotwordRecognitionService.SERVICE_INTERFACE), 0);
+        for (int i = 0; i < list.size(); i++) {
+            final ResolveInfo ri = list.get(i);
+            if (!ri.serviceInfo.enabled) {
+                continue;
+            }
+            if ((ri.serviceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)
+                    != PackageManager.MATCH_DEFAULT_ONLY) {
+                serviceComponent = new ComponentName(
+                        ri.serviceInfo.packageName, ri.serviceInfo.name);
+                break;
+            }
+        }
+        // If all else fails, pick the first one.
+        if (serviceComponent == null && !list.isEmpty()) {
+            serviceComponent =  new ComponentName(
+                    list.get(0).serviceInfo.packageName, list.get(0).serviceInfo.name);
+        }
+        return createHotwordRecognizer(context, serviceComponent);
     }
 
-
     /**
-     * Factory method to create a new {@code HotwordRecognizer}. Please note that
-     * {@link #setRecognitionListener(HotwordRecognitionListener)}
-     * should be called before dispatching any command to the created {@code HotwordRecognizer},
-     * otherwise no notifications will be received.
+     * Factory method to create a new {@code HotwordRecognizer}.
      *
      * Use this version of the method to specify a specific service to direct this
      * {@link HotwordRecognizer} to. Normally you would not use this; use
@@ -177,40 +189,26 @@
     }
 
     /**
-     * Sets the listener that will receive all the callbacks. The previous unfinished commands will
-     * be executed with the old listener, while any following command will be executed with the new
-     * listener.
+     * Starts recognizing hotword and sets the listener that will receive the callbacks.
      *
      * @param listener listener that will receive all the callbacks from the created
      *        {@link HotwordRecognizer}, this must not be null.
      */
-    public void setRecognitionListener(HotwordRecognitionListener listener) {
-        checkIsCalledFromMainThread();
-        putMessage(Message.obtain(mHandler, MSG_CHANGE_LISTENER, listener));
-    }
-
-    /**
-     * Starts recognizing hotword. Please note that
-     * {@link #setRecognitionListener(HotwordRecognitionListener)} should be called beforehand,
-     * otherwise no notifications will be received.
-     */
-    public void startRecognition() {
+    public void startRecognition(HotwordRecognitionListener listener) {
         checkIsCalledFromMainThread();
         if (mConnection == null) { // first time connection
+            if (listener == null) {
+                throw new IllegalArgumentException("listener must not be null");
+            }
+
             mConnection = new Connection();
-
             Intent serviceIntent = new Intent(HotwordRecognitionService.SERVICE_INTERFACE);
-
+            mListener.mInternalListener = listener;
 
             if (mServiceComponent == null) {
-                // TODO: Resolve the ComponentName here and use it.
-                String serviceComponent = null;
-                if (TextUtils.isEmpty(serviceComponent)) {
-                    Log.e(TAG, "no selected voice recognition service");
-                    mListener.onHotwordError(ERROR_CLIENT);
-                    return;
-                }
-                serviceIntent.setComponent(ComponentName.unflattenFromString(serviceComponent));
+                Log.e(TAG, "no selected voice recognition service");
+                mListener.onHotwordError(ERROR_CLIENT);
+                return;
             } else {
                 serviceIntent.setComponent(mServiceComponent);
             }
@@ -222,17 +220,15 @@
                 mListener.onHotwordError(ERROR_CLIENT);
                 return;
             }
+            putMessage(Message.obtain(mHandler, MSG_START));
         } else {
             mListener.onHotwordError(ERROR_SERVICE_ALREADY_STARTED);
             return;
         }
-        putMessage(Message.obtain(mHandler, MSG_START));
     }
 
     /**
-     * Stops recognizing hotword. Please note that
-     * {@link #setRecognitionListener(HotwordRecognitionListener)} should be called beforehand,
-     * otherwise no notifications will be received.
+     * Stops recognizing hotword.
      */
     public void stopRecognition() {
         checkIsCalledFromMainThread();
@@ -245,19 +241,6 @@
         mServiceComponent = serviceComponent;
     }
 
-    /**
-     * Destroys the {@code HotwordRecognizer} object.
-     */
-    public void destroy() {
-        if (mConnection != null) {
-            mContext.unbindService(mConnection);
-        }
-        mPendingTasks.clear();
-        mService = null;
-        mConnection = null;
-        mListener.mInternalListener = null;
-    }
-
     private void handleStartRecognition() {
         if (!checkOpenConnection()) {
             return;
@@ -271,26 +254,27 @@
         }
     }
 
-
     private void handleStopRecognition() {
         if (!checkOpenConnection()) {
             return;
         }
         try {
             mService.stopHotwordRecognition(mListener);
+            if (mConnection != null) {
+                mContext.unbindService(mConnection);
+            }
             if (DBG) Log.d(TAG, "service stopRecognition command succeeded");
         } catch (final RemoteException e) {
             Log.e(TAG, "stopRecognition() failed", e);
             mListener.onHotwordError(ERROR_CLIENT);
+        } finally {
+            mPendingTasks.clear();
+            mService = null;
+            mConnection = null;
+            mListener.mInternalListener = null;
         }
     }
 
-    /** changes the listener */
-    private void handleChangeListener(HotwordRecognitionListener listener) {
-        if (DBG) Log.d(TAG, "handleChangeListener, listener=" + listener);
-        mListener.mInternalListener = listener;
-    }
-
     private boolean checkOpenConnection() {
         if (mService != null) {
             return true;
diff --git a/core/java/android/speech/tts/SynthesisRequest.java b/core/java/android/speech/tts/SynthesisRequest.java
index 917a109..12a026b 100644
--- a/core/java/android/speech/tts/SynthesisRequest.java
+++ b/core/java/android/speech/tts/SynthesisRequest.java
@@ -30,7 +30,7 @@
  * </ul>
  *
  * Any additional parameters sent to the text to speech service are passed in
- * uninterpreted, see the @code{params} argument in {@link TextToSpeech#speak}
+ * uninterpreted, see the {@code params} argument in {@link TextToSpeech#speak}
  * and {@link TextToSpeech#synthesizeToFile}.
  */
 public final class SynthesisRequest {
diff --git a/core/java/android/util/LayoutDirection.java b/core/java/android/util/LayoutDirection.java
index e37d2f2..20af20b 100644
--- a/core/java/android/util/LayoutDirection.java
+++ b/core/java/android/util/LayoutDirection.java
@@ -17,11 +17,15 @@
 package android.util;
 
 /**
- * An interface for defining layout directions. A layout direction can be left-to-right (LTR)
+ * A class for defining layout directions. A layout direction can be left-to-right (LTR)
  * or right-to-left (RTL). It can also be inherited (from a parent) or deduced from the default
  * language script of a locale.
  */
-public interface LayoutDirection {
+public final class LayoutDirection {
+
+    // No instantiation
+    private LayoutDirection() {}
+
     /**
      * Horizontal layout direction is from Left to Right.
      */
diff --git a/core/java/android/view/ScaleGestureDetector.java b/core/java/android/view/ScaleGestureDetector.java
index 51c5c7b..0bebc04 100644
--- a/core/java/android/view/ScaleGestureDetector.java
+++ b/core/java/android/view/ScaleGestureDetector.java
@@ -18,6 +18,8 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.os.Build;
+import android.os.Handler;
 import android.os.SystemClock;
 import android.util.FloatMath;
 
@@ -128,6 +130,8 @@
     private float mFocusX;
     private float mFocusY;
 
+    private boolean mDoubleTapScales;
+
     private float mCurrSpan;
     private float mPrevSpan;
     private float mInitialSpan;
@@ -148,9 +152,14 @@
     private int mTouchHistoryDirection;
     private long mTouchHistoryLastAcceptedTime;
     private int mTouchMinMajor;
+    private MotionEvent mDoubleTapEvent;
+    private int mDoubleTapMode = DOUBLE_TAP_MODE_NONE;
+    private final Handler mHandler;
 
     private static final long TOUCH_STABILIZE_TIME = 128; // ms
-    private static final int TOUCH_MIN_MAJOR = 48; // dp
+    private static final int DOUBLE_TAP_MODE_NONE = 0;
+    private static final int DOUBLE_TAP_MODE_IN_PROGRESS = 1;
+
 
     /**
      * Consistency verifier for debugging purposes.
@@ -158,8 +167,37 @@
     private final InputEventConsistencyVerifier mInputEventConsistencyVerifier =
             InputEventConsistencyVerifier.isInstrumentationEnabled() ?
                     new InputEventConsistencyVerifier(this, 0) : null;
+    private GestureDetector mGestureDetector;
 
+    private boolean mEventBeforeOrAboveStartingGestureEvent;
+
+    /**
+     * Creates a ScaleGestureDetector with the supplied listener.
+     * You may only use this constructor from a {@link android.os.Looper Looper} thread.
+     *
+     * @param context the application's context
+     * @param listener the listener invoked for all the callbacks, this must
+     * not be null.
+     *
+     * @throws NullPointerException if {@code listener} is null.
+     */
     public ScaleGestureDetector(Context context, OnScaleGestureListener listener) {
+        this(context, listener, null);
+    }
+
+    /**
+     * Creates a ScaleGestureDetector with the supplied listener.
+     * @see android.os.Handler#Handler()
+     *
+     * @param context the application's context
+     * @param listener the listener invoked for all the callbacks, this must
+     * not be null.
+     * @param handler the handler to use for running deferred listener events.
+     *
+     * @throws NullPointerException if {@code listener} is null.
+     */
+    public ScaleGestureDetector(Context context, OnScaleGestureListener listener,
+            Handler handler) {
         mContext = context;
         mListener = listener;
         mSpanSlop = ViewConfiguration.get(context).getScaledTouchSlop() * 2;
@@ -167,8 +205,12 @@
         final Resources res = context.getResources();
         mTouchMinMajor = res.getDimensionPixelSize(
                 com.android.internal.R.dimen.config_minScalingTouchMajor);
-        mMinSpan = res.getDimensionPixelSize(
-                com.android.internal.R.dimen.config_minScalingSpan);
+        mMinSpan = res.getDimensionPixelSize(com.android.internal.R.dimen.config_minScalingSpan);
+        mHandler = handler;
+        // Quick scale is enabled by default after JB_MR2
+        if (context.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.JELLY_BEAN_MR2) {
+            setQuickScaleEnabled(true);
+        }
     }
 
     /**
@@ -263,8 +305,14 @@
 
         final int action = event.getActionMasked();
 
+        // Forward the event to check for double tap gesture
+        if (mDoubleTapScales) {
+            mGestureDetector.onTouchEvent(event);
+        }
+
         final boolean streamComplete = action == MotionEvent.ACTION_UP ||
                 action == MotionEvent.ACTION_CANCEL;
+
         if (action == MotionEvent.ACTION_DOWN || streamComplete) {
             // Reset any scale in progress with the listener.
             // If it's an ACTION_DOWN we're beginning a new event stream.
@@ -273,6 +321,7 @@
                 mListener.onScaleEnd(this);
                 mInProgress = false;
                 mInitialSpan = 0;
+                mDoubleTapMode = DOUBLE_TAP_MODE_NONE;
             }
 
             if (streamComplete) {
@@ -284,21 +333,37 @@
         final boolean configChanged = action == MotionEvent.ACTION_DOWN ||
                 action == MotionEvent.ACTION_POINTER_UP ||
                 action == MotionEvent.ACTION_POINTER_DOWN;
+
+
         final boolean pointerUp = action == MotionEvent.ACTION_POINTER_UP;
         final int skipIndex = pointerUp ? event.getActionIndex() : -1;
 
         // Determine focal point
         float sumX = 0, sumY = 0;
         final int count = event.getPointerCount();
-        for (int i = 0; i < count; i++) {
-            if (skipIndex == i) continue;
-            sumX += event.getX(i);
-            sumY += event.getY(i);
-        }
         final int div = pointerUp ? count - 1 : count;
-        final float focusX = sumX / div;
-        final float focusY = sumY / div;
+        final float focusX;
+        final float focusY;
+        if (mDoubleTapMode == DOUBLE_TAP_MODE_IN_PROGRESS) {
+            // In double tap mode, the focal pt is always where the double tap
+            // gesture started
+            focusX = mDoubleTapEvent.getX();
+            focusY = mDoubleTapEvent.getY();
+            if (event.getY() < focusY) {
+                mEventBeforeOrAboveStartingGestureEvent = true;
+            } else {
+                mEventBeforeOrAboveStartingGestureEvent = false;
+            }
+        } else {
+            for (int i = 0; i < count; i++) {
+                if (skipIndex == i) continue;
+                sumX += event.getX(i);
+                sumY += event.getY(i);
+            }
 
+            focusX = sumX / div;
+            focusY = sumY / div;
+        }
 
         addTouchHistory(event);
 
@@ -320,7 +385,12 @@
         // the focal point.
         final float spanX = devX * 2;
         final float spanY = devY * 2;
-        final float span = FloatMath.sqrt(spanX * spanX + spanY * spanY);
+        final float span;
+        if (inDoubleTapMode()) {
+            span = spanY;
+        } else {
+            span = FloatMath.sqrt(spanX * spanX + spanY * spanY);
+        }
 
         // Dispatch begin/end events as needed.
         // If the configuration changes, notify the app to reset its current state by beginning
@@ -328,10 +398,11 @@
         final boolean wasInProgress = mInProgress;
         mFocusX = focusX;
         mFocusY = focusY;
-        if (mInProgress && (span < mMinSpan || configChanged)) {
+        if (!inDoubleTapMode() && mInProgress && (span < mMinSpan || configChanged)) {
             mListener.onScaleEnd(this);
             mInProgress = false;
             mInitialSpan = span;
+            mDoubleTapMode = DOUBLE_TAP_MODE_NONE;
         }
         if (configChanged) {
             mPrevSpanX = mCurrSpanX = spanX;
@@ -354,6 +425,7 @@
             mCurrSpan = span;
 
             boolean updatePrev = true;
+
             if (mInProgress) {
                 updatePrev = mListener.onScale(this);
             }
@@ -369,6 +441,34 @@
         return true;
     }
 
+
+    private boolean inDoubleTapMode() {
+        return mDoubleTapMode == DOUBLE_TAP_MODE_IN_PROGRESS;
+    }
+
+    /**
+     * Set whether the associated {@link OnScaleGestureListener} should receive onScale callbacks
+     * when the user performs a doubleTap followed by a swipe. Note that this is enabled by default
+     * if the app targets API 19 and newer.
+     * @param scales true to enable quick scaling, false to disable
+     */
+    public void setQuickScaleEnabled(boolean scales) {
+        mDoubleTapScales = scales;
+        if (mDoubleTapScales && mGestureDetector == null) {
+            GestureDetector.SimpleOnGestureListener gestureListener =
+                    new GestureDetector.SimpleOnGestureListener() {
+                        @Override
+                        public boolean onDoubleTap(MotionEvent e) {
+                            // Double tap: start watching for a swipe
+                            mDoubleTapEvent = e;
+                            mDoubleTapMode = DOUBLE_TAP_MODE_IN_PROGRESS;
+                            return true;
+                        }
+            };
+            mGestureDetector = new GestureDetector(mContext, gestureListener, mHandler);
+        }
+    }
+
     /**
      * Returns {@code true} if a scale gesture is in progress.
      */
@@ -472,6 +572,12 @@
      * @return The current scaling factor.
      */
     public float getScaleFactor() {
+        if (inDoubleTapMode() && mEventBeforeOrAboveStartingGestureEvent) {
+            // Drag is moving up; the further away from the gesture
+            // start, the smaller the span should be, the closer,
+            // the larger the span, and therefore the larger the scale
+            return (1 / mCurrSpan) / (1 / mPrevSpan);
+        }
         return mPrevSpan > 0 ? mCurrSpan / mPrevSpan : 1;
     }
 
@@ -493,4 +599,4 @@
     public long getEventTime() {
         return mCurrTime;
     }
-}
+}
\ No newline at end of file
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 21a342f..907290b 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -2375,20 +2375,29 @@
     public static final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 0x00000400;
 
     /**
-     * Flag for {@link #setSystemUiVisibility(int)}: View would like to receive touch events
-     * when hiding the status bar with {@link #SYSTEM_UI_FLAG_FULLSCREEN} and/or hiding the
-     * navigation bar with {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION} instead of having the system
-     * clear these flags upon interaction.  The system may compensate by temporarily overlaying
-     * semi-transparent system bars while also delivering the event.
+     * Flag for {@link #setSystemUiVisibility(int)}: View would like to remain interactive when
+     * hiding the status bar with {@link #SYSTEM_UI_FLAG_FULLSCREEN} and/or hiding the navigation
+     * bar with {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}.  Use this flag to create an immersive
+     * experience while also hiding the system bars.  If this flag is not set,
+     * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION} will be force cleared by the system on any user
+     * interaction, and {@link #SYSTEM_UI_FLAG_FULLSCREEN} will be force-cleared by the system
+     * if the user swipes from the top of the screen.
+     * <p>When system bars are hidden in immersive mode, they can be revealed temporarily with
+     * system gestures, such as swiping from the top of the screen.  These transient system bars
+     * will overlay app’s content, may have some degree of transparency, and will automatically
+     * hide after a short timeout.
+     * </p><p>Since this flag is a modifier for {@link #SYSTEM_UI_FLAG_FULLSCREEN} and
+     * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, it only has an effect when used in combination
+     * with one or both of those flags.</p>
      */
-    public static final int SYSTEM_UI_FLAG_ALLOW_TRANSIENT = 0x00000800;
+    public static final int SYSTEM_UI_FLAG_IMMERSIVE = 0x00000800;
 
     /**
      * Flag for {@link #setSystemUiVisibility(int)}: View would like the status bar to have
      * transparency.
      *
      * <p>The transparency request may be denied if the bar is in another mode with a specific
-     * style, like {@link #SYSTEM_UI_FLAG_ALLOW_TRANSIENT transient mode}.
+     * style, like {@link #SYSTEM_UI_FLAG_IMMERSIVE immersive mode}.
      */
     public static final int SYSTEM_UI_FLAG_TRANSPARENT_STATUS = 0x00001000;
 
@@ -2397,7 +2406,7 @@
      * transparency.
      *
      * <p>The transparency request may be denied if the bar is in another mode with a specific
-     * style, like {@link #SYSTEM_UI_FLAG_ALLOW_TRANSIENT transient mode}.
+     * style, like {@link #SYSTEM_UI_FLAG_IMMERSIVE immersive mode}.
      */
     public static final int SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION = 0x00002000;
 
@@ -3390,17 +3399,16 @@
      * @param context The Context the view is running in, through which it can
      *        access the current theme, resources, etc.
      * @param attrs The attributes of the XML tag that is inflating the view.
-     * @param defStyle The default style to apply to this view. If 0, no style
-     *        will be applied (beyond what is included in the theme). This may
-     *        either be an attribute resource, whose value will be retrieved
-     *        from the current theme, or an explicit style resource.
+     * @param defStyleAttr An attribute in the current theme that contains a
+     *        reference to a style resource to apply to this view. If 0, no
+     *        default style will be applied.
      * @see #View(Context, AttributeSet)
      */
-    public View(Context context, AttributeSet attrs, int defStyle) {
+    public View(Context context, AttributeSet attrs, int defStyleAttr) {
         this(context);
 
         TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View,
-                defStyle, 0);
+                defStyleAttr, 0);
 
         Drawable background = null;
 
@@ -13248,14 +13256,8 @@
                     // Keep the DRAWING_CACHE_QUALITY_LOW flag just in case
                     switch (mViewFlags & DRAWING_CACHE_QUALITY_MASK) {
                         case DRAWING_CACHE_QUALITY_AUTO:
-                            quality = Bitmap.Config.ARGB_8888;
-                            break;
                         case DRAWING_CACHE_QUALITY_LOW:
-                            quality = Bitmap.Config.ARGB_8888;
-                            break;
                         case DRAWING_CACHE_QUALITY_HIGH:
-                            quality = Bitmap.Config.ARGB_8888;
-                            break;
                         default:
                             quality = Bitmap.Config.ARGB_8888;
                             break;
@@ -16664,7 +16666,7 @@
      * @param visibility  Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE},
      * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN},
      * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION},
-     * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_ALLOW_TRANSIENT},
+     * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_IMMERSIVE},
      * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS},
      * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}.
      */
@@ -16682,7 +16684,7 @@
      * @return  Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE},
      * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, {@link #SYSTEM_UI_FLAG_FULLSCREEN},
      * {@link #SYSTEM_UI_FLAG_LAYOUT_STABLE}, {@link #SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION},
-     * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_ALLOW_TRANSIENT},
+     * {@link #SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}, {@link #SYSTEM_UI_FLAG_IMMERSIVE},
      * {@link #SYSTEM_UI_FLAG_TRANSPARENT_STATUS},
      * and {@link #SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION}.
      */
diff --git a/core/java/android/view/accessibility/CaptioningManager.java b/core/java/android/view/accessibility/CaptioningManager.java
index b1be24c..d4c6abe 100644
--- a/core/java/android/view/accessibility/CaptioningManager.java
+++ b/core/java/android/view/accessibility/CaptioningManager.java
@@ -17,58 +17,77 @@
 package android.view.accessibility;
 
 import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
 import android.graphics.Color;
 import android.graphics.Typeface;
+import android.net.Uri;
+import android.os.Handler;
 import android.provider.Settings.Secure;
 import android.text.TextUtils;
 
+import java.util.ArrayList;
 import java.util.Locale;
 
 /**
- * Contains methods for accessing preferred video captioning state and
+ * Contains methods for accessing and monitoring preferred video captioning state and visual
  * properties.
+ * <p>
+ * To obtain a handle to the captioning manager, do the following:
+ * <p>
+ * <code>
+ * <pre>CaptioningManager captioningManager =
+ *        (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);</pre>
+ * </code>
  */
 public class CaptioningManager {
-    /**
-     * Activity Action: Show settings for video captioning.
-     * <p>
-     * In some cases, a matching Activity may not exist, so ensure you safeguard
-     * against this.
-     * <p>
-     * Input: Nothing.
-     * <p>
-     * Output: Nothing.
-     */
-    public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
-
-    private static final int DEFAULT_PRESET = 0;
+    /** Default captioning enabled value. */
     private static final int DEFAULT_ENABLED = 0;
-    private static final float DEFAULT_FONT_SIZE = 24;
+
+    /** Default style preset as an index into {@link CaptionStyle#PRESETS}. */
+    private static final int DEFAULT_PRESET = 0;
+
+    /** Default scaling value for caption fonts. */
+    private static final float DEFAULT_FONT_SCALE = 1;
+
+    private final ArrayList<CaptioningChangeListener>
+            mListeners = new ArrayList<CaptioningChangeListener>();
+    private final Handler mHandler = new Handler();
+
+    private final ContentResolver mContentResolver;
 
     /**
-     * @param cr Resolver to access the database with.
-     * @return The user's preferred caption enabled state.
-     */
-    public static final boolean isEnabled(ContentResolver cr) {
-        return Secure.getInt(cr, Secure.ACCESSIBILITY_CAPTIONING_ENABLED, DEFAULT_ENABLED) == 1;
-    }
-
-    /**
-     * @param cr Resolver to access the database with.
-     * @return The raw locale string for the user's preferred caption language.
+     * Creates a new captioning manager for the specified context.
+     *
      * @hide
      */
-    public static final String getRawLocale(ContentResolver cr) {
-        return Secure.getString(cr, Secure.ACCESSIBILITY_CAPTIONING_LOCALE);
+    public CaptioningManager(Context context) {
+        mContentResolver = context.getContentResolver();
     }
 
     /**
-     * @param cr Resolver to access the database with.
-     * @return The locale for the user's preferred caption language, or null if
-     *         not specified.
+     * @return the user's preferred captioning enabled state
      */
-    public static final Locale getLocale(ContentResolver cr) {
-        final String rawLocale = getRawLocale(cr);
+    public final boolean isEnabled() {
+        return Secure.getInt(
+                mContentResolver, Secure.ACCESSIBILITY_CAPTIONING_ENABLED, DEFAULT_ENABLED) == 1;
+    }
+
+    /**
+     * @return the raw locale string for the user's preferred captioning
+     *         language
+     * @hide
+     */
+    public final String getRawLocale() {
+        return Secure.getString(mContentResolver, Secure.ACCESSIBILITY_CAPTIONING_LOCALE);
+    }
+
+    /**
+     * @return the locale for the user's preferred captioning language, or null
+     *         if not specified
+     */
+    public final Locale getLocale() {
+        final String rawLocale = getRawLocale();
         if (!TextUtils.isEmpty(rawLocale)) {
             final String[] splitLocale = rawLocale.split("_");
             switch (splitLocale.length) {
@@ -85,14 +104,151 @@
     }
 
     /**
-     * @param cr Resolver to access the database with.
-     * @return The user's preferred font size for video captions, or 0 if not
-     *         specified.
+     * @return the user's preferred font scaling factor for video captions, or 1 if not
+     *         specified
      */
-    public static final float getFontSize(ContentResolver cr) {
-        return Secure.getFloat(cr, Secure.ACCESSIBILITY_CAPTIONING_FONT_SIZE, DEFAULT_FONT_SIZE);
+    public final float getFontScale() {
+        return Secure.getFloat(
+                mContentResolver, Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE, DEFAULT_FONT_SCALE);
     }
 
+    /**
+     * @return the raw preset number, or the first preset if not specified
+     * @hide
+     */
+    public int getRawUserStyle() {
+        return Secure.getInt(
+                mContentResolver, Secure.ACCESSIBILITY_CAPTIONING_PRESET, DEFAULT_PRESET);
+    }
+
+    /**
+     * @return the user's preferred visual properties for captions as a
+     *         {@link CaptionStyle}, or the default style if not specified
+     */
+    public CaptionStyle getUserStyle() {
+        final int preset = getRawUserStyle();
+        if (preset == CaptionStyle.PRESET_CUSTOM) {
+            return CaptionStyle.getCustomStyle(mContentResolver);
+        }
+
+        return CaptionStyle.PRESETS[preset];
+    }
+
+    /**
+     * Adds a listener for changes in the user's preferred captioning enabled
+     * state and visual properties.
+     *
+     * @param listener the listener to add
+     */
+    public void addCaptioningStateChangeListener(CaptioningChangeListener listener) {
+        synchronized (mListeners) {
+            if (mListeners.isEmpty()) {
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_ENABLED);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE);
+                registerObserver(Secure.ACCESSIBILITY_CAPTIONING_LOCALE);
+            }
+
+            mListeners.add(listener);
+        }
+    }
+
+    private void registerObserver(String key) {
+        mContentResolver.registerContentObserver(Secure.getUriFor(key), false, mContentObserver);
+    }
+
+    /**
+     * Removes a listener previously added using
+     * {@link #addCaptioningStateChangeListener}.
+     *
+     * @param listener the listener to remove
+     */
+    public void removeCaptioningStateChangeListener(CaptioningChangeListener listener) {
+        synchronized (mListeners) {
+            mListeners.remove(listener);
+
+            if (mListeners.isEmpty()) {
+                mContentResolver.unregisterContentObserver(mContentObserver);
+            }
+        }
+    }
+
+    private void notifyEnabledChanged() {
+        final boolean enabled = isEnabled();
+        synchronized (mListeners) {
+            for (CaptioningChangeListener listener : mListeners) {
+                listener.onEnabledChanged(enabled);
+            }
+        }
+    }
+
+    private void notifyUserStyleChanged() {
+        final CaptionStyle userStyle = getUserStyle();
+        synchronized (mListeners) {
+            for (CaptioningChangeListener listener : mListeners) {
+                listener.onUserStyleChanged(userStyle);
+            }
+        }
+    }
+
+    private void notifyLocaleChanged() {
+        final Locale locale = getLocale();
+        synchronized (mListeners) {
+            for (CaptioningChangeListener listener : mListeners) {
+                listener.onLocaleChanged(locale);
+            }
+        }
+    }
+
+    private void notifyFontScaleChanged() {
+        final float fontScale = getFontScale();
+        synchronized (mListeners) {
+            for (CaptioningChangeListener listener : mListeners) {
+                listener.onFontScaleChanged(fontScale);
+            }
+        }
+    }
+
+    private final ContentObserver mContentObserver = new ContentObserver(mHandler) {
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            final String uriPath = uri.getPath();
+            final String name = uriPath.substring(uriPath.lastIndexOf('/') + 1);
+            if (Secure.ACCESSIBILITY_CAPTIONING_ENABLED.equals(name)) {
+                notifyEnabledChanged();
+            } else if (Secure.ACCESSIBILITY_CAPTIONING_LOCALE.equals(name)) {
+                notifyLocaleChanged();
+            } else if (Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE.equals(name)) {
+                notifyFontScaleChanged();
+            } else {
+                // We only need a single callback when multiple style properties
+                // change in rapid succession.
+                mHandler.removeCallbacks(mStyleChangedRunnable);
+                mHandler.post(mStyleChangedRunnable);
+            }
+        }
+    };
+
+    /**
+     * Runnable posted when user style properties change. This is used to
+     * prevent unnecessary change notifications when multiple properties change
+     * in rapid succession.
+     */
+    private final Runnable mStyleChangedRunnable = new Runnable() {
+        @Override
+        public void run() {
+            notifyUserStyleChanged();
+        }
+    };
+
+    /**
+     * Specifies visual properties for video captions, including foreground and
+     * background colors, edge properties, and typeface.
+     */
     public static final class CaptionStyle {
         private static final CaptionStyle WHITE_ON_BLACK;
         private static final CaptionStyle BLACK_ON_WHITE;
@@ -155,8 +311,8 @@
         }
 
         /**
-         * @return The preferred {@link Typeface} for video captions, or null if
-         *         not specified.
+         * @return the preferred {@link Typeface} for video captions, or null if
+         *         not specified
          */
         public Typeface getTypeface() {
             if (mParsedTypeface == null && !TextUtils.isEmpty(mRawTypeface)) {
@@ -168,41 +324,20 @@
         /**
          * @hide
          */
-        public static int getRawPreset(ContentResolver cr) {
-            return Secure.getInt(cr, Secure.ACCESSIBILITY_CAPTIONING_PRESET, DEFAULT_PRESET);
-        }
-
-        /**
-         * @param cr Resolver to access the database with.
-         * @return The user's preferred caption style.
-         */
-        public static CaptionStyle defaultUserStyle(ContentResolver cr) {
-            final int preset = getRawPreset(cr);
-            if (preset == PRESET_CUSTOM) {
-                return getCustomStyle(cr);
-            }
-
-            return PRESETS[preset];
-        }
-
-        /**
-         * @hide
-         */
         public static CaptionStyle getCustomStyle(ContentResolver cr) {
+            final CaptionStyle defStyle = CaptionStyle.DEFAULT_CUSTOM;
             final int foregroundColor = Secure.getInt(
-                    cr, Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,
-                    DEFAULT_CUSTOM.foregroundColor);
-            final int backgroundColor = Secure.getInt(cr,
-                    Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR,
-                    DEFAULT_CUSTOM.backgroundColor);
+                    cr, Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR, defStyle.foregroundColor);
+            final int backgroundColor = Secure.getInt(
+                    cr, Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR, defStyle.backgroundColor);
             final int edgeType = Secure.getInt(
-                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE, DEFAULT_CUSTOM.edgeType);
+                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE, defStyle.edgeType);
             final int edgeColor = Secure.getInt(
-                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR, DEFAULT_CUSTOM.edgeColor);
+                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR, defStyle.edgeColor);
 
             String rawTypeface = Secure.getString(cr, Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE);
             if (rawTypeface == null) {
-                rawTypeface = DEFAULT_CUSTOM.mRawTypeface;
+                rawTypeface = defStyle.mRawTypeface;
             }
 
             return new CaptionStyle(
@@ -226,4 +361,45 @@
             DEFAULT_CUSTOM = WHITE_ON_BLACK;
         }
     }
+
+    /**
+     * Listener for changes in captioning properties, including enabled state
+     * and user style preferences.
+     */
+    public abstract class CaptioningChangeListener {
+        /**
+         * Called when the captioning enabled state changes.
+         *
+         * @param enabled the user's new preferred captioning enabled state
+         */
+        public void onEnabledChanged(boolean enabled) {
+        }
+
+        /**
+         * Called when the captioning user style changes.
+         *
+         * @param userStyle the user's new preferred style
+         * @see CaptioningManager#getUserStyle()
+         */
+        public void onUserStyleChanged(CaptionStyle userStyle) {
+        }
+
+        /**
+         * Called when the captioning locale changes.
+         *
+         * @param locale the preferred captioning locale
+         * @see CaptioningManager#getLocale()
+         */
+        public void onLocaleChanged(Locale locale) {
+        }
+
+        /**
+         * Called when the captioning font scaling factor changes.
+         *
+         * @param fontScale the preferred font scaling factor
+         * @see CaptioningManager#getFontScale()
+         */
+        public void onFontScaleChanged(float fontScale) {
+        }
+    }
 }
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index f97e3dd..54b87de 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1876,9 +1876,13 @@
     }
 
     /**
-     * Returns true if the current IME needs to offer the users a way to switch to a next input
-     * method. When the user triggers it, the IME has to call {@link #switchToNextInputMethod} to
-     * switch to a next input method which is selected by the system.
+     * Returns true if the current IME needs to offer the users ways to switch to a next input
+     * method (e.g. a globe key.).
+     * When an IME sets supportsSwitchingToNextInputMethod and this method returns true,
+     * the IME has to offer ways to to invoke {@link #switchToNextInputMethod} accordingly.
+     * <p> Note that the system determines the most appropriate next input method
+     * and subtype in order to provide the consistent user experience in switching
+     * between IMEs and subtypes.
      * @param imeToken Supplies the identifying token given to an input method when it was started,
      * which allows it to perform this operation on itself.
      */
diff --git a/core/java/android/view/transition/Move.java b/core/java/android/view/transition/Move.java
index ae7d759..fda0cd2 100644
--- a/core/java/android/view/transition/Move.java
+++ b/core/java/android/view/transition/Move.java
@@ -40,7 +40,7 @@
     private static final String PROPNAME_PARENT = "android:move:parent";
     private static final String PROPNAME_WINDOW_X = "android:move:windowX";
     private static final String PROPNAME_WINDOW_Y = "android:move:windowY";
-    private static String[] sTransitionProperties = {
+    private static final String[] sTransitionProperties = {
             PROPNAME_BOUNDS,
             PROPNAME_PARENT,
             PROPNAME_WINDOW_X,
diff --git a/core/java/android/view/transition/TextChange.java b/core/java/android/view/transition/TextChange.java
index 04ff707..7973c97 100644
--- a/core/java/android/view/transition/TextChange.java
+++ b/core/java/android/view/transition/TextChange.java
@@ -78,6 +78,10 @@
      */
     public static final int CHANGE_BEHAVIOR_OUT_IN = 3;
 
+    private static final String[] sTransitionProperties = {
+            PROPNAME_TEXT
+    };
+
     /**
      * Sets the type of changing animation that will be run, one of
      * {@link #CHANGE_BEHAVIOR_KEEP} and {@link #CHANGE_BEHAVIOR_OUT_IN}.
@@ -92,6 +96,11 @@
     }
 
     @Override
+    public String[] getTransitionProperties() {
+        return sTransitionProperties;
+    }
+
+    @Override
     protected void captureValues(TransitionValues values, boolean start) {
         if (values.view instanceof TextView) {
             TextView textview = (TextView) values.view;
@@ -111,7 +120,7 @@
         final TextView view = (TextView) endValues.view;
         Map<String, Object> startVals = startValues.values;
         Map<String, Object> endVals = endValues.values;
-        String startText = (String) startVals.get(PROPNAME_TEXT);
+        final String startText = (String) startVals.get(PROPNAME_TEXT);
         final String endText = (String) endVals.get(PROPNAME_TEXT);
         if (!startText.equals(endText)) {
             view.setText(startText);
@@ -121,7 +130,10 @@
                 anim.addListener(new AnimatorListenerAdapter() {
                     @Override
                     public void onAnimationEnd(Animator animation) {
-                        view.setText(endText);
+                        if (startText.equals(view.getText())) {
+                            // Only set if it hasn't been changed since anim started
+                            view.setText(endText);
+                        }
                     }
                 });
             } else {
@@ -143,7 +155,10 @@
                     outAnim.addListener(new AnimatorListenerAdapter() {
                         @Override
                         public void onAnimationEnd(Animator animation) {
-                            view.setText(endText);
+                            if (startText.equals(view.getText())) {
+                                // Only set if it hasn't been changed since anim started
+                                view.setText(endText);
+                            }
                         }
                     });
                 }
@@ -169,6 +184,20 @@
                     anim = inAnim;
                 }
             }
+            TransitionListener transitionListener = new TransitionListenerAdapter() {
+                boolean mCanceled = false;
+
+                @Override
+                public void onTransitionPause(Transition transition) {
+                    view.setText(endText);
+                }
+
+                @Override
+                public void onTransitionResume(Transition transition) {
+                    view.setText(startText);
+                }
+            };
+            addListener(transitionListener);
             return anim;
         }
         return null;
diff --git a/core/java/android/view/transition/Transition.java b/core/java/android/view/transition/Transition.java
index 0444843..a66fa52 100644
--- a/core/java/android/view/transition/Transition.java
+++ b/core/java/android/view/transition/Transition.java
@@ -843,7 +843,6 @@
         for (int i = numOldAnims - 1; i >= 0; i--) {
             Animator anim = runningAnimators.keyAt(i);
             if (anim != null) {
-                anim.resume();
                 AnimationInfo oldInfo = runningAnimators.get(anim);
                 if (oldInfo != null) {
                     boolean cancel = false;
@@ -851,22 +850,25 @@
                     View oldView = oldInfo.view;
                     TransitionValues newValues = mEndValues.viewValues != null ?
                             mEndValues.viewValues.get(oldView) : null;
-                    if (oldValues == null || newValues == null) {
-                        if (oldValues != null || newValues != null) {
+                    if (oldValues != null) {
+                        // if oldValues null, then transition didn't care to stash values,
+                        // and won't get canceled
+                        if (newValues == null) {
                             cancel = true;
-                        }
-                    } else {
-                        for (String key : oldValues.values.keySet()) {
-                            Object oldValue = oldValues.values.get(key);
-                            Object newValue = newValues.values.get(key);
-                            if ((oldValue == null && newValue != null) ||
-                                    (oldValue != null && !oldValue.equals(newValue))) {
-                                cancel = true;
-                                if (DBG) {
-                                    Log.d(LOG_TAG, "Transition.play: oldValue != newValue for " +
-                                            key + ": old, new = " + oldValue + ", " + newValue);
+                        } else {
+                            for (String key : oldValues.values.keySet()) {
+                                Object oldValue = oldValues.values.get(key);
+                                Object newValue = newValues.values.get(key);
+                                if (oldValue != null && newValue != null &&
+                                        !oldValue.equals(newValue)) {
+                                    cancel = true;
+                                    if (DBG) {
+                                        Log.d(LOG_TAG, "Transition.playTransition: " +
+                                                "oldValue != newValue for " + key +
+                                                ": old, new = " + oldValue + ", " + newValue);
+                                    }
+                                    break;
                                 }
-                                break;
                             }
                         }
                     }
diff --git a/core/java/android/view/transition/TransitionManager.java b/core/java/android/view/transition/TransitionManager.java
index 3cb6f68..bde891d 100644
--- a/core/java/android/view/transition/TransitionManager.java
+++ b/core/java/android/view/transition/TransitionManager.java
@@ -183,9 +183,12 @@
                     final ArrayMap<ViewGroup, ArrayList<Transition>> runningTransitions =
                             getRunningTransitions();
                     ArrayList<Transition> currentTransitions = runningTransitions.get(sceneRoot);
+                    ArrayList<Transition> previousRunningTransitions = null;
                     if (currentTransitions == null) {
                         currentTransitions = new ArrayList<Transition>();
                         runningTransitions.put(sceneRoot, currentTransitions);
+                    } else if (currentTransitions.size() > 0) {
+                        previousRunningTransitions = new ArrayList<Transition>(currentTransitions);
                     }
                     currentTransitions.add(transition);
                     transition.addListener(new Transition.TransitionListenerAdapter() {
@@ -197,6 +200,11 @@
                         }
                     });
                     transition.captureValues(sceneRoot, false);
+                    if (previousRunningTransitions != null) {
+                        for (Transition runningTransition : previousRunningTransitions) {
+                            runningTransition.resume();
+                        }
+                    }
                     transition.playTransition(sceneRoot);
 
                     // Returning false from onPreDraw() skips the current frame. This is
diff --git a/core/java/android/view/transition/Visibility.java b/core/java/android/view/transition/Visibility.java
index 4df53da..348dcfb 100644
--- a/core/java/android/view/transition/Visibility.java
+++ b/core/java/android/view/transition/Visibility.java
@@ -53,7 +53,7 @@
 
     private static final String PROPNAME_VISIBILITY = "android:visibility:visibility";
     private static final String PROPNAME_PARENT = "android:visibility:parent";
-    private static String[] sTransitionProperties = {
+    private static final String[] sTransitionProperties = {
             PROPNAME_VISIBILITY,
             PROPNAME_PARENT,
     };
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index fea6be6..7707392 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -50,7 +50,9 @@
  */
 class CallbackProxy extends Handler {
     // Logging tag
-    private static final String LOGTAG = "CallbackProxy";
+    static final String LOGTAG = "WebViewCallback";
+    // Enables API callback tracing
+    private static final boolean TRACE = DebugFlags.TRACE_CALLBACK;
     // Instance of WebViewClient that is the client callback.
     private volatile WebViewClient mWebViewClient;
     // Instance of WebChromeClient for handling all chrome functions.
@@ -258,6 +260,7 @@
         }
         boolean override = false;
         if (mWebViewClient != null) {
+            if (TRACE) Log.d(LOGTAG, "shouldOverrideUrlLoading=" + overrideUrl);
             override = mWebViewClient.shouldOverrideUrlLoading(mWebView.getWebView(),
                     overrideUrl);
         } else {
@@ -307,6 +310,7 @@
                 String startedUrl = msg.getData().getString("url");
                 mWebView.onPageStarted(startedUrl);
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onPageStarted=" + startedUrl);
                     mWebViewClient.onPageStarted(mWebView.getWebView(), startedUrl,
                             (Bitmap) msg.obj);
                 }
@@ -316,18 +320,21 @@
                 String finishedUrl = (String) msg.obj;
                 mWebView.onPageFinished(finishedUrl);
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onPageFinished=" + finishedUrl);
                     mWebViewClient.onPageFinished(mWebView.getWebView(), finishedUrl);
                 }
                 break;
 
             case RECEIVED_ICON:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onReceivedIcon");
                     mWebChromeClient.onReceivedIcon(mWebView.getWebView(), (Bitmap) msg.obj);
                 }
                 break;
 
             case RECEIVED_TOUCH_ICON_URL:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onReceivedTouchIconUrl");
                     mWebChromeClient.onReceivedTouchIconUrl(mWebView.getWebView(),
                             (String) msg.obj, msg.arg1 == 1);
                 }
@@ -335,6 +342,7 @@
 
             case RECEIVED_TITLE:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onReceivedTitle");
                     mWebChromeClient.onReceivedTitle(mWebView.getWebView(),
                             (String) msg.obj);
                 }
@@ -345,6 +353,7 @@
                     int reasonCode = msg.arg1;
                     final String description  = msg.getData().getString("description");
                     final String failUrl  = msg.getData().getString("failingUrl");
+                    if (TRACE) Log.d(LOGTAG, "onReceivedError=" + failUrl);
                     mWebViewClient.onReceivedError(mWebView.getWebView(), reasonCode,
                             description, failUrl);
                 }
@@ -356,6 +365,7 @@
                 Message dontResend =
                         (Message) msg.getData().getParcelable("dontResend");
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onFormResubmission");
                     mWebViewClient.onFormResubmission(mWebView.getWebView(), dontResend,
                             resend);
                 } else {
@@ -379,6 +389,7 @@
                     HttpAuthHandler handler = (HttpAuthHandler) msg.obj;
                     String host = msg.getData().getString("host");
                     String realm = msg.getData().getString("realm");
+                    if (TRACE) Log.d(LOGTAG, "onReceivedHttpAuthRequest");
                     mWebViewClient.onReceivedHttpAuthRequest(mWebView.getWebView(), handler,
                             host, realm);
                 }
@@ -388,6 +399,7 @@
                 if (mWebViewClient != null) {
                     HashMap<String, Object> map =
                         (HashMap<String, Object>) msg.obj;
+                    if (TRACE) Log.d(LOGTAG, "onReceivedSslError");
                     mWebViewClient.onReceivedSslError(mWebView.getWebView(),
                             (SslErrorHandler) map.get("handler"),
                             (SslError) map.get("error"));
@@ -396,6 +408,7 @@
 
             case PROCEEDED_AFTER_SSL_ERROR:
                 if (mWebViewClient != null && mWebViewClient instanceof WebViewClientClassicExt) {
+                    if (TRACE) Log.d(LOGTAG, "onProceededAfterSslError");
                     ((WebViewClientClassicExt) mWebViewClient).onProceededAfterSslError(
                             mWebView.getWebView(),
                             (SslError) msg.obj);
@@ -404,6 +417,7 @@
 
             case CLIENT_CERT_REQUEST:
                 if (mWebViewClient != null  && mWebViewClient instanceof WebViewClientClassicExt) {
+                    if (TRACE) Log.d(LOGTAG, "onReceivedClientCertRequest");
                     HashMap<String, Object> map = (HashMap<String, Object>) msg.obj;
                     ((WebViewClientClassicExt) mWebViewClient).onReceivedClientCertRequest(
                             mWebView.getWebView(),
@@ -418,6 +432,7 @@
                 // changed.
                 synchronized (this) {
                     if (mWebChromeClient != null) {
+                        if (TRACE) Log.d(LOGTAG, "onProgressChanged=" + mLatestProgress);
                         mWebChromeClient.onProgressChanged(mWebView.getWebView(),
                                 mLatestProgress);
                     }
@@ -427,14 +442,18 @@
 
             case UPDATE_VISITED:
                 if (mWebViewClient != null) {
+                    String url = (String) msg.obj;
+                    if (TRACE) Log.d(LOGTAG, "doUpdateVisitedHistory=" + url);
                     mWebViewClient.doUpdateVisitedHistory(mWebView.getWebView(),
-                            (String) msg.obj, msg.arg1 != 0);
+                            url, msg.arg1 != 0);
                 }
                 break;
 
             case LOAD_RESOURCE:
                 if (mWebViewClient != null) {
-                    mWebViewClient.onLoadResource(mWebView.getWebView(), (String) msg.obj);
+                    String url = (String) msg.obj;
+                    if (TRACE) Log.d(LOGTAG, "onLoadResource=" + url);
+                    mWebViewClient.onLoadResource(mWebView.getWebView(), url);
                 }
                 break;
 
@@ -448,6 +467,7 @@
                     String referer = msg.getData().getString("referer");
                     Long contentLength = msg.getData().getLong("contentLength");
 
+                    if (TRACE) Log.d(LOGTAG, "onDownloadStart");
                     if (mDownloadListener instanceof BrowserDownloadListener) {
                         ((BrowserDownloadListener) mDownloadListener).onDownloadStart(url,
                              userAgent, contentDisposition, mimetype, referer, contentLength);
@@ -460,6 +480,7 @@
 
             case CREATE_WINDOW:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onCreateWindow");
                     if (!mWebChromeClient.onCreateWindow(mWebView.getWebView(),
                                 msg.arg1 == 1, msg.arg2 == 1,
                                 (Message) msg.obj)) {
@@ -473,12 +494,14 @@
 
             case REQUEST_FOCUS:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onRequestFocus");
                     mWebChromeClient.onRequestFocus(mWebView.getWebView());
                 }
                 break;
 
             case CLOSE_WINDOW:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onCloseWindow");
                     mWebChromeClient.onCloseWindow(((WebViewClassic) msg.obj).getWebView());
                 }
                 break;
@@ -500,6 +523,7 @@
 
             case ASYNC_KEYEVENTS:
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onUnhandledKeyEvent");
                     mWebViewClient.onUnhandledKeyEvent(mWebView.getWebView(),
                             (KeyEvent) msg.obj);
                 }
@@ -521,6 +545,7 @@
                     WebStorage.QuotaUpdater quotaUpdater =
                         (WebStorage.QuotaUpdater) map.get("quotaUpdater");
 
+                    if (TRACE) Log.d(LOGTAG, "onExceededDatabaseQuota");
                     mWebChromeClient.onExceededDatabaseQuota(url,
                             databaseIdentifier, quota, estimatedDatabaseSize,
                             totalQuota, quotaUpdater);
@@ -538,6 +563,7 @@
                     WebStorage.QuotaUpdater quotaUpdater =
                         (WebStorage.QuotaUpdater) map.get("quotaUpdater");
 
+                    if (TRACE) Log.d(LOGTAG, "onReachedMaxAppCacheSize");
                     mWebChromeClient.onReachedMaxAppCacheSize(requiredStorage,
                             quota, quotaUpdater);
                 }
@@ -551,6 +577,7 @@
                     GeolocationPermissions.Callback callback =
                             (GeolocationPermissions.Callback)
                             map.get("callback");
+                    if (TRACE) Log.d(LOGTAG, "onGeolocationPermissionsShowPrompt");
                     mWebChromeClient.onGeolocationPermissionsShowPrompt(origin,
                             callback);
                 }
@@ -558,6 +585,7 @@
 
             case GEOLOCATION_PERMISSIONS_HIDE_PROMPT:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onGeolocationPermissionsHidePrompt");
                     mWebChromeClient.onGeolocationPermissionsHidePrompt();
                 }
                 break;
@@ -566,6 +594,7 @@
                 if (mWebChromeClient != null) {
                     final JsResultReceiver receiver = (JsResultReceiver) msg.obj;
                     JsDialogHelper helper = new JsDialogHelper(receiver.mJsResult, msg);
+                    if (TRACE) Log.d(LOGTAG, "onJsAlert");
                     if (!helper.invokeCallback(mWebChromeClient, mWebView.getWebView())) {
                         helper.showDialog(mContext);
                     }
@@ -577,6 +606,7 @@
                 if(mWebChromeClient != null) {
                     final JsResultReceiver receiver = (JsResultReceiver) msg.obj;
                     final JsResult res = receiver.mJsResult;
+                    if (TRACE) Log.d(LOGTAG, "onJsTimeout");
                     if (mWebChromeClient.onJsTimeout()) {
                         res.confirm();
                     } else {
@@ -598,6 +628,7 @@
 
             case SCALE_CHANGED:
                 if (mWebViewClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onScaleChanged");
                     mWebViewClient.onScaleChanged(mWebView.getWebView(), msg.getData()
                             .getFloat("old"), msg.getData().getFloat("new"));
                 }
@@ -624,6 +655,7 @@
                 ConsoleMessage.MessageLevel messageLevel =
                         ConsoleMessage.MessageLevel.values()[msgLevel];
 
+                if (TRACE) Log.d(LOGTAG, "onConsoleMessage");
                 if (!mWebChromeClient.onConsoleMessage(new ConsoleMessage(message, sourceID,
                         lineNumber, messageLevel))) {
                     // If false was returned the user did not provide their own console function so
@@ -654,12 +686,14 @@
 
             case GET_VISITED_HISTORY:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "getVisitedHistory");
                     mWebChromeClient.getVisitedHistory((ValueCallback<String[]>)msg.obj);
                 }
                 break;
 
             case OPEN_FILE_CHOOSER:
                 if (mWebChromeClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "openFileChooser");
                     UploadFileMessageData data = (UploadFileMessageData)msg.obj;
                     mWebChromeClient.openFileChooser(data.getUploadFile(), data.getAcceptType(),
                             data.getCapture());
@@ -668,6 +702,7 @@
 
             case ADD_HISTORY_ITEM:
                 if (mWebBackForwardListClient != null) {
+                    if (TRACE) Log.d(LOGTAG, "onNewHistoryItem");
                     mWebBackForwardListClient.onNewHistoryItem(
                             (WebHistoryItem) msg.obj);
                 }
@@ -693,6 +728,7 @@
                     String realm = msg.getData().getString("realm");
                     String account = msg.getData().getString("account");
                     String args = msg.getData().getString("args");
+                    if (TRACE) Log.d(LOGTAG, "onReceivedLoginRequest");
                     mWebViewClient.onReceivedLoginRequest(mWebView.getWebView(), realm,
                             account, args);
                 }
@@ -910,6 +946,7 @@
             return null;
         }
         // Note: This method does _not_ send a message.
+        if (TRACE) Log.d(LOGTAG, "shouldInterceptRequest=" + url);
         WebResourceResponse r =
                 mWebViewClient.shouldInterceptRequest(mWebView.getWebView(), url);
         if (r == null) {
diff --git a/core/java/android/webkit/DebugFlags.java b/core/java/android/webkit/DebugFlags.java
index 349113e..524f610 100644
--- a/core/java/android/webkit/DebugFlags.java
+++ b/core/java/android/webkit/DebugFlags.java
@@ -24,25 +24,33 @@
  * The name of each flags maps directly to the name of the class in which that
  * flag is used.
  *
+ * @hide Only used by WebView implementations.
  */
-class DebugFlags {
+public class DebugFlags {
 
+    public static final boolean COOKIE_SYNC_MANAGER = false;
+    public static final boolean TRACE_API = false;
+    public static final boolean TRACE_CALLBACK = false;
+    public static final boolean TRACE_JAVASCRIPT_BRIDGE = false;
+    public static final boolean URL_UTIL = false;
+    public static final boolean WEB_SYNC_MANAGER = false;
+
+    // TODO: Delete these when WebViewClassic is moved
     public static final boolean BROWSER_FRAME = false;
     public static final boolean CACHE_MANAGER = false;
     public static final boolean CALLBACK_PROXY = false;
     public static final boolean COOKIE_MANAGER = false;
-    public static final boolean COOKIE_SYNC_MANAGER = false;
     public static final boolean FRAME_LOADER = false;
     public static final boolean J_WEB_CORE_JAVA_BRIDGE = false;// HIGHLY VERBOSE
     public static final boolean LOAD_LISTENER = false;
+    public static final boolean MEASURE_PAGE_SWAP_FPS = false;
     public static final boolean NETWORK = false;
     public static final boolean SSL_ERROR_HANDLER = false;
     public static final boolean STREAM_LOADER = false;
-    public static final boolean URL_UTIL = false;
     public static final boolean WEB_BACK_FORWARD_LIST = false;
     public static final boolean WEB_SETTINGS = false;
-    public static final boolean WEB_SYNC_MANAGER = false;
     public static final boolean WEB_VIEW = false;
     public static final boolean WEB_VIEW_CORE = false;
-    public static final boolean MEASURE_PAGE_SWAP_FPS = false;
+
+
 }
diff --git a/core/java/android/webkit/HTML5VideoFullScreen.java b/core/java/android/webkit/HTML5VideoFullScreen.java
index b52218d..6fb32c8 100644
--- a/core/java/android/webkit/HTML5VideoFullScreen.java
+++ b/core/java/android/webkit/HTML5VideoFullScreen.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.media.MediaPlayer;
 import android.media.Metadata;
+import android.util.Log;
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.SurfaceHolder;
@@ -293,12 +294,16 @@
         mLayout.setVisibility(View.VISIBLE);
         WebChromeClient client = webView.getWebChromeClient();
         if (client != null) {
+            if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onShowCustomView");
             client.onShowCustomView(mLayout, mCallback);
             // Plugins like Flash will draw over the video so hide
             // them while we're playing.
             if (webView.getViewManager() != null)
                 webView.getViewManager().hideAll();
 
+            if (DebugFlags.TRACE_CALLBACK) {
+                Log.d(CallbackProxy.LOGTAG, "getVideoLoadingProgressView");
+            }
             mProgressView = client.getVideoLoadingProgressView();
             if (mProgressView != null) {
                 mLayout.addView(mProgressView, layoutParams);
diff --git a/core/java/android/webkit/HTML5VideoViewProxy.java b/core/java/android/webkit/HTML5VideoViewProxy.java
index a3d62ae..e8538f6 100644
--- a/core/java/android/webkit/HTML5VideoViewProxy.java
+++ b/core/java/android/webkit/HTML5VideoViewProxy.java
@@ -180,6 +180,7 @@
             if (!mHTML5VideoView.fullScreenExited() && mHTML5VideoView.isFullScreenMode()) {
                 WebChromeClient client = webView.getWebChromeClient();
                 if (client != null) {
+                    if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onHideCustomView");
                     client.onHideCustomView();
                 }
             }
@@ -405,6 +406,7 @@
             case ERROR: {
                 WebChromeClient client = mWebView.getWebChromeClient();
                 if (client != null) {
+                    if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onHideCustomView");
                     client.onHideCustomView();
                 }
                 break;
@@ -412,6 +414,9 @@
             case LOAD_DEFAULT_POSTER: {
                 WebChromeClient client = mWebView.getWebChromeClient();
                 if (client != null) {
+                    if (DebugFlags.TRACE_CALLBACK) {
+                        Log.d(CallbackProxy.LOGTAG, "getDefaultVideoPoster");
+                    }
                     doSetPoster(client.getDefaultVideoPoster());
                 }
                 break;
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 1b57d50..f0e8c4f 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -31,7 +31,9 @@
 import android.os.CancellationSignal;
 import android.os.Looper;
 import android.os.Message;
+import android.os.ParcelFileDescriptor;
 import android.os.StrictMode;
+import android.print.PrintAttributes;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -49,7 +51,6 @@
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.OutputStream;
 import java.util.Map;
 
 /**
@@ -243,7 +244,7 @@
         implements ViewTreeObserver.OnGlobalFocusChangeListener,
         ViewGroup.OnHierarchyChangeListener, ViewDebug.HierarchyHandler {
 
-    private static final String LOGTAG = "webview_proxy";
+    private static final String LOGTAG = "WebView";
 
     // Throwing an exception for incorrect thread usage if the
     // build target is JB MR2 or newer. Defaults to false, and is
@@ -495,9 +496,12 @@
         sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
                 Build.VERSION_CODES.JELLY_BEAN_MR2;
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "WebView<init>");
 
         ensureProviderCreated();
         mProvider.init(javaScriptInterfaces, privateBrowsing);
+        // Post condition of creating a webview is the CookieSyncManager instance exists.
+        CookieSyncManager.createInstance(getContext());
     }
 
     /**
@@ -507,6 +511,7 @@
      */
     public void setHorizontalScrollbarOverlay(boolean overlay) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setHorizontalScrollbarOverlay=" + overlay);
         mProvider.setHorizontalScrollbarOverlay(overlay);
     }
 
@@ -517,6 +522,7 @@
      */
     public void setVerticalScrollbarOverlay(boolean overlay) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setVerticalScrollbarOverlay=" + overlay);
         mProvider.setVerticalScrollbarOverlay(overlay);
     }
 
@@ -571,6 +577,7 @@
     @Deprecated
     public void setCertificate(SslCertificate certificate) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setCertificate=" + certificate);
         mProvider.setCertificate(certificate);
     }
 
@@ -594,6 +601,7 @@
     @Deprecated
     public void savePassword(String host, String username, String password) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "savePassword=" + host);
         mProvider.savePassword(host, username, password);
     }
 
@@ -613,6 +621,7 @@
     public void setHttpAuthUsernamePassword(String host, String realm,
             String username, String password) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setHttpAuthUsernamePassword=" + host);
         mProvider.setHttpAuthUsernamePassword(host, realm, username, password);
     }
 
@@ -642,6 +651,7 @@
      */
     public void destroy() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "destroy");
         mProvider.destroy();
     }
 
@@ -680,6 +690,7 @@
      */
     public void setNetworkAvailable(boolean networkUp) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setNetworkAvailable=" + networkUp);
         mProvider.setNetworkAvailable(networkUp);
     }
 
@@ -696,6 +707,7 @@
      */
     public WebBackForwardList saveState(Bundle outState) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "saveState");
         return mProvider.saveState(outState);
     }
 
@@ -712,6 +724,7 @@
     @Deprecated
     public boolean savePicture(Bundle b, final File dest) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "savePicture=" + dest.getName());
         return mProvider.savePicture(b, dest);
     }
 
@@ -729,6 +742,7 @@
     @Deprecated
     public boolean restorePicture(Bundle b, File src) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "restorePicture=" + src.getName());
         return mProvider.restorePicture(b, src);
     }
 
@@ -746,6 +760,7 @@
      */
     public WebBackForwardList restoreState(Bundle inState) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "restoreState");
         return mProvider.restoreState(inState);
     }
 
@@ -762,6 +777,7 @@
      */
     public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadUrl(extra headers)=" + url);
         mProvider.loadUrl(url, additionalHttpHeaders);
     }
 
@@ -772,6 +788,7 @@
      */
     public void loadUrl(String url) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadUrl=" + url);
         mProvider.loadUrl(url);
     }
 
@@ -786,6 +803,7 @@
      */
     public void postUrl(String url, byte[] postData) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "postUrl=" + url);
         mProvider.postUrl(url, postData);
     }
 
@@ -820,6 +838,7 @@
      */
     public void loadData(String data, String mimeType, String encoding) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadData");
         mProvider.loadData(data, mimeType, encoding);
     }
 
@@ -852,6 +871,7 @@
     public void loadDataWithBaseURL(String baseUrl, String data,
             String mimeType, String encoding, String historyUrl) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadDataWithBaseURL=" + baseUrl);
         mProvider.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
     }
 
@@ -868,6 +888,7 @@
      */
     public void evaluateJavascript(String script, ValueCallback<String> resultCallback) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "evaluateJavascript=" + script);
         mProvider.evaluateJavaScript(script, resultCallback);
     }
 
@@ -878,6 +899,7 @@
      */
     public void saveWebArchive(String filename) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "saveWebArchive=" + filename);
         mProvider.saveWebArchive(filename);
     }
 
@@ -895,6 +917,7 @@
      */
     public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "saveWebArchive(auto)=" + basename);
         mProvider.saveWebArchive(basename, autoname, callback);
     }
 
@@ -903,6 +926,7 @@
      */
     public void stopLoading() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "stopLoading");
         mProvider.stopLoading();
     }
 
@@ -911,6 +935,7 @@
      */
     public void reload() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "reload");
         mProvider.reload();
     }
 
@@ -929,6 +954,7 @@
      */
     public void goBack() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "goBack");
         mProvider.goBack();
     }
 
@@ -947,6 +973,7 @@
      */
     public void goForward() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "goForward");
         mProvider.goForward();
     }
 
@@ -972,6 +999,7 @@
      */
     public void goBackOrForward(int steps) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "goBackOrForwad=" + steps);
         mProvider.goBackOrForward(steps);
     }
 
@@ -991,6 +1019,7 @@
      */
     public boolean pageUp(boolean top) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "pageUp");
         return mProvider.pageUp(top);
     }
 
@@ -1002,6 +1031,7 @@
      */
     public boolean pageDown(boolean bottom) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "pageDown");
         return mProvider.pageDown(bottom);
     }
 
@@ -1014,6 +1044,7 @@
     @Deprecated
     public void clearView() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearView");
         mProvider.clearView();
     }
 
@@ -1033,6 +1064,7 @@
      */
     public Picture capturePicture() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "capturePicture");
         return mProvider.capturePicture();
     }
 
@@ -1040,7 +1072,9 @@
      * Exports the contents of this Webview as PDF. Only supported for API levels
      * {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE} and above.
      *
-     * @param out            The stream to export the PDF contents to. Cannot be null.
+     * TODO(sgurun) the parameter list is stale. Fix it before unhiding.
+     *
+     * @param fd             The FileDescriptor to export the PDF contents to. Cannot be null.
      * @param width          The page width. Should be larger than 0.
      * @param height         The page height. Should be larger than 0.
      * @param resultCallback A callback to be invoked when the PDF content is exported.
@@ -1049,21 +1083,27 @@
      *                       be null.
      *
      * The PDF conversion is done asynchronously and the PDF output is written to the provided
-     * outputstream. The caller should not close the outputstream until the resultCallback is
-     * called, indicating PDF conversion is complete. Webview cannot be drawn during the pdf
-     * export so the  application is recommended to take it offscreen, or putting in a layer
-     * with an overlaid progress UI / spinner.
+     * file descriptor. The caller should not close the file descriptor until the resultCallback
+     * is called, indicating PDF conversion is complete. Webview will never close the file
+     * descriptor.
+     * Limitations: Webview cannot be drawn during the PDF export so the  application is
+     * recommended to take it offscreen, or putting in a layer with an overlaid progress
+     * UI / spinner.
      *
      * If the caller cancels the task using the cancellationSignal, the cancellation will be
      * acked using the resultCallback signal.
      *
+     * Throws an exception if an IO error occurs accessing the file descriptor.
+     *
      * TODO(sgurun) margins, explain the units, make it public.
      * @hide
      */
-    public void exportToPdf(OutputStream out, int width, int height,
-            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal) {
+    public void exportToPdf(ParcelFileDescriptor fd, PrintAttributes attributes,
+            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal)
+            throws java.io.IOException {
         checkThread();
-        mProvider.exportToPdf(out, width, height, resultCallback, cancellationSignal);
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "exportToPdf");
+        mProvider.exportToPdf(fd, attributes, resultCallback, cancellationSignal);
     }
 
     /**
@@ -1094,6 +1134,7 @@
      */
     public void setInitialScale(int scaleInPercent) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setInitialScale=" + scaleInPercent);
         mProvider.setInitialScale(scaleInPercent);
     }
 
@@ -1104,6 +1145,7 @@
      */
     public void invokeZoomPicker() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "invokeZoomPicker");
         mProvider.invokeZoomPicker();
     }
 
@@ -1127,6 +1169,7 @@
      */
     public HitTestResult getHitTestResult() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "getHitTestResult");
         return mProvider.getHitTestResult();
     }
 
@@ -1145,6 +1188,7 @@
      */
     public void requestFocusNodeHref(Message hrefMsg) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "requestFocusNodeHref");
         mProvider.requestFocusNodeHref(hrefMsg);
     }
 
@@ -1157,6 +1201,7 @@
      */
     public void requestImageRef(Message msg) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "requestImageRef");
         mProvider.requestImageRef(msg);
     }
 
@@ -1261,6 +1306,7 @@
      */
     public void pauseTimers() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "pauseTimers");
         mProvider.pauseTimers();
     }
 
@@ -1270,6 +1316,7 @@
      */
     public void resumeTimers() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "resumeTimers");
         mProvider.resumeTimers();
     }
 
@@ -1282,6 +1329,7 @@
      */
     public void onPause() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "onPause");
         mProvider.onPause();
     }
 
@@ -1290,6 +1338,7 @@
      */
     public void onResume() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "onResume");
         mProvider.onResume();
     }
 
@@ -1309,6 +1358,7 @@
      */
     public void freeMemory() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "freeMemory");
         mProvider.freeMemory();
     }
 
@@ -1320,6 +1370,7 @@
      */
     public void clearCache(boolean includeDiskFiles) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearCache");
         mProvider.clearCache(includeDiskFiles);
     }
 
@@ -1331,6 +1382,7 @@
      */
     public void clearFormData() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearFormData");
         mProvider.clearFormData();
     }
 
@@ -1339,6 +1391,7 @@
      */
     public void clearHistory() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearHistory");
         mProvider.clearHistory();
     }
 
@@ -1348,6 +1401,7 @@
      */
     public void clearSslPreferences() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearSslPreferences");
         mProvider.clearSslPreferences();
     }
 
@@ -1389,6 +1443,7 @@
      */
     public void findNext(boolean forward) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "findNext");
         mProvider.findNext(forward);
     }
 
@@ -1404,6 +1459,7 @@
     @Deprecated
     public int findAll(String find) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "findAll");
         StrictMode.noteSlowCall("findAll blocks UI: prefer findAllAsync");
         return mProvider.findAll(find);
     }
@@ -1418,6 +1474,7 @@
      */
     public void findAllAsync(String find) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "findAllAsync");
         mProvider.findAllAsync(find);
     }
 
@@ -1438,6 +1495,7 @@
     @Deprecated
     public boolean showFindDialog(String text, boolean showIme) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "showFindDialog");
         return mProvider.showFindDialog(text, showIme);
     }
 
@@ -1473,6 +1531,7 @@
      */
     public void clearMatches() {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearMatches");
         mProvider.clearMatches();
     }
 
@@ -1533,6 +1592,7 @@
     @Deprecated
     public void setPictureListener(PictureListener listener) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setPictureListener=" + listener);
         mProvider.setPictureListener(listener);
     }
 
@@ -1582,6 +1642,7 @@
      */
     public void addJavascriptInterface(Object object, String name) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "addJavascriptInterface=" + name);
         mProvider.addJavascriptInterface(object, name);
     }
 
@@ -1594,6 +1655,7 @@
      */
     public void removeJavascriptInterface(String name) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "removeJavascriptInterface=" + name);
         mProvider.removeJavascriptInterface(name);
     }
 
@@ -1683,6 +1745,7 @@
 
     public void flingScroll(int vx, int vy) {
         checkThread();
+        if (DebugFlags.TRACE_API) Log.d(LOGTAG, "flingScroll");
         mProvider.flingScroll(vx, vy);
     }
 
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index db98d30..3f22d53 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -62,6 +62,7 @@
 import android.os.Looper;
 import android.os.Message;
 import android.os.SystemClock;
+import android.print.PrintAttributes;
 import android.security.KeyChain;
 import android.text.Editable;
 import android.text.InputType;
@@ -2896,11 +2897,11 @@
      * See {@link WebView#exportToPdf()}
      */
     @Override
-    public void exportToPdf(java.io.OutputStream out, int width, int height,
-            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal) {
+    public void exportToPdf(android.os.ParcelFileDescriptor fd, PrintAttributes attributes,
+            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal)
+            throws java.io.IOException {
         // K-only API not implemented in WebViewClassic.
         throw new IllegalStateException("This API not supported on Android 4.3 and earlier");
-
     }
 
     /**
@@ -7950,6 +7951,7 @@
             // triggered in setNewPicture
             Picture picture = mContext.getApplicationInfo().targetSdkVersion <
                     Build.VERSION_CODES.JELLY_BEAN_MR2 ? capturePicture() : null;
+            if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onNewPicture");
             mPictureListener.onNewPicture(getWebView(), picture);
         }
     }
@@ -8037,6 +8039,7 @@
                 // triggered in pageSwapCallback
                 Picture picture = mContext.getApplicationInfo().targetSdkVersion <
                         Build.VERSION_CODES.JELLY_BEAN_MR2 ? capturePicture() : null;
+                if (DebugFlags.TRACE_CALLBACK) Log.d(CallbackProxy.LOGTAG, "onNewPicture");
                 mPictureListener.onNewPicture(getWebView(), picture);
             }
         }
diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java
index 8fe6edf..d625d8a 100644
--- a/core/java/android/webkit/WebViewProvider.java
+++ b/core/java/android/webkit/WebViewProvider.java
@@ -27,6 +27,8 @@
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Message;
+import android.os.ParcelFileDescriptor;
+import android.print.PrintAttributes;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
@@ -41,7 +43,6 @@
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.OutputStream;
 import java.util.Map;
 
 /**
@@ -148,8 +149,9 @@
 
     public Picture capturePicture();
 
-    public void exportToPdf(OutputStream out, int width, int height,
-            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal);
+    public void exportToPdf(ParcelFileDescriptor fd, PrintAttributes attributes,
+            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal)
+            throws java.io.IOException;
 
     public float getScale();
 
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 285e6f2..c308024 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2309,33 +2309,7 @@
             super.onInitializeAccessibilityNodeInfo(host, info);
 
             final int position = getPositionForView(host);
-            final ListAdapter adapter = getAdapter();
-
-            if ((position == INVALID_POSITION) || (adapter == null)) {
-                return;
-            }
-
-            if (!isEnabled() || !adapter.isEnabled(position)) {
-                return;
-            }
-
-            if (position == getSelectedItemPosition()) {
-                info.setSelected(true);
-                info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION);
-            } else {
-                info.addAction(AccessibilityNodeInfo.ACTION_SELECT);
-            }
-
-            if (isClickable()) {
-                info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
-                info.setClickable(true);
-            }
-
-            if (isLongClickable()) {
-                info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
-                info.setLongClickable(true);
-            }
-
+            onInitializeAccessibilityNodeInfoForItem(host, position, info);
         }
 
         @Override
@@ -2388,6 +2362,45 @@
         }
     }
 
+    /**
+     * Initializes an {@link AccessibilityNodeInfo} with information about a
+     * particular item in the list.
+     *
+     * @param view View representing the list item.
+     * @param position Position of the list item within the adapter.
+     * @param info Node info to populate.
+     */
+    public void onInitializeAccessibilityNodeInfoForItem(
+            View view, int position, AccessibilityNodeInfo info) {
+        final ListAdapter adapter = getAdapter();
+        if (position == INVALID_POSITION || adapter == null) {
+            // The item doesn't exist, so there's not much we can do here.
+            return;
+        }
+
+        if (!isEnabled() || !adapter.isEnabled(position)) {
+            info.setEnabled(false);
+            return;
+        }
+
+        if (position == getSelectedItemPosition()) {
+            info.setSelected(true);
+            info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION);
+        } else {
+            info.addAction(AccessibilityNodeInfo.ACTION_SELECT);
+        }
+
+        if (isClickable()) {
+            info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
+            info.setClickable(true);
+        }
+
+        if (isLongClickable()) {
+            info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
+            info.setLongClickable(true);
+        }
+    }
+
     void positionSelector(int position, View sel) {
         if (position != INVALID_POSITION) {
             mSelectorPosition = position;
@@ -4911,11 +4924,37 @@
      * Scrolls the list items within the view by a specified number of pixels.
      *
      * @param y the amount of pixels to scroll by vertically
-     * @return true if the list is able to scroll, or false if the list is
-     *         already at the beginning/end and unable to scroll any more.
+     * @see #canScrollList(int)
      */
-    public boolean scrollListBy(int y) {
-        return !trackMotionScroll(-y, -y);
+    public void scrollListBy(int y) {
+        trackMotionScroll(-y, -y);
+    }
+
+    /**
+     * Check if the items in the list can be scrolled in a certain direction.
+     *
+     * @param direction Negative to check scrolling up, positive to check
+     *            scrolling down.
+     * @return true if the list can be scrolled in the specified direction,
+     *         false otherwise.
+     * @see #scrollListBy(int)
+     */
+    public boolean canScrollList(int direction) {
+        final int childCount = getChildCount();
+        if (childCount == 0) {
+            return false;
+        }
+
+        final int firstPosition = mFirstPosition;
+        final Rect listPadding = mListPadding;
+        if (direction > 0) {
+            final int lastBottom = getChildAt(childCount - 1).getBottom();
+            final int lastPosition = firstPosition + childCount;
+            return lastPosition < mItemCount || lastBottom > getHeight() - listPadding.bottom;
+        } else {
+            final int firstTop = getChildAt(0).getTop();
+            return firstPosition > 0 || firstTop < listPadding.top;
+        }
     }
 
     /**
diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java
index 6970cde..de2be75 100644
--- a/core/java/android/widget/CalendarView.java
+++ b/core/java/android/widget/CalendarView.java
@@ -1028,26 +1028,29 @@
      * Sets up the strings to be used by the header.
      */
     private void setUpHeader() {
+        final String[] tinyWeekdayNames = LocaleData.get(Locale.getDefault()).tinyWeekdayNames;
         mDayLabels = new String[mDaysPerWeek];
-        for (int i = mFirstDayOfWeek, count = mFirstDayOfWeek + mDaysPerWeek; i < count; i++) {
-            int calendarDay = (i > Calendar.SATURDAY) ? i - Calendar.SATURDAY : i;
-            mDayLabels[i - mFirstDayOfWeek] = DateUtils.getDayOfWeekString(calendarDay,
-                    DateUtils.LENGTH_SHORTEST);
+        for (int i = 0; i < mDaysPerWeek; i++) {
+            final int j = i + mFirstDayOfWeek;
+            final int calendarDay = (j > Calendar.SATURDAY) ? j - Calendar.SATURDAY : j;
+            mDayLabels[i] = tinyWeekdayNames[calendarDay];
         }
-
+        // Deal with week number
         TextView label = (TextView) mDayNamesHeader.getChildAt(0);
         if (mShowWeekNumber) {
             label.setVisibility(View.VISIBLE);
         } else {
             label.setVisibility(View.GONE);
         }
-        for (int i = 1, count = mDayNamesHeader.getChildCount(); i < count; i++) {
-            label = (TextView) mDayNamesHeader.getChildAt(i);
+        // Deal with day labels
+        final int count = mDayNamesHeader.getChildCount();
+        for (int i = 0; i < count - 1; i++) {
+            label = (TextView) mDayNamesHeader.getChildAt(i + 1);
             if (mWeekDayTextAppearanceResId > -1) {
                 label.setTextAppearance(mContext, mWeekDayTextAppearanceResId);
             }
-            if (i < mDaysPerWeek + 1) {
-                label.setText(mDayLabels[i - 1]);
+            if (i < mDaysPerWeek) {
+                label.setText(mDayLabels[i]);
                 label.setVisibility(View.VISIBLE);
             } else {
                 label.setVisibility(View.GONE);
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java
index 109fcfe..54cc3f4 100644
--- a/core/java/android/widget/GridLayout.java
+++ b/core/java/android/widget/GridLayout.java
@@ -251,14 +251,14 @@
 
     // Instance variables
 
-    final Axis horizontalAxis = new Axis(true);
-    final Axis verticalAxis = new Axis(false);
-    int orientation = DEFAULT_ORIENTATION;
-    boolean useDefaultMargins = DEFAULT_USE_DEFAULT_MARGINS;
-    int alignmentMode = DEFAULT_ALIGNMENT_MODE;
-    int defaultGap;
-    int lastLayoutParamsHashCode = UNINITIALIZED_HASH;
-    Printer printer = LOG_PRINTER;
+    final Axis mHorizontalAxis = new Axis(true);
+    final Axis mVerticalAxis = new Axis(false);
+    int mOrientation = DEFAULT_ORIENTATION;
+    boolean mUseDefaultMargins = DEFAULT_USE_DEFAULT_MARGINS;
+    int mAlignmentMode = DEFAULT_ALIGNMENT_MODE;
+    int mDefaultGap;
+    int mLastLayoutParamsHashCode = UNINITIALIZED_HASH;
+    Printer mPrinter = LOG_PRINTER;
 
     // Constructors
 
@@ -267,7 +267,7 @@
      */
     public GridLayout(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
-        defaultGap = context.getResources().getDimensionPixelOffset(R.dimen.default_gap);
+        mDefaultGap = context.getResources().getDimensionPixelOffset(R.dimen.default_gap);
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GridLayout);
         try {
             setRowCount(a.getInt(ROW_COUNT, DEFAULT_COUNT));
@@ -309,7 +309,7 @@
      * @attr ref android.R.styleable#GridLayout_orientation
      */
     public int getOrientation() {
-        return orientation;
+        return mOrientation;
     }
 
     /**
@@ -349,8 +349,8 @@
      * @attr ref android.R.styleable#GridLayout_orientation
      */
     public void setOrientation(int orientation) {
-        if (this.orientation != orientation) {
-            this.orientation = orientation;
+        if (this.mOrientation != orientation) {
+            this.mOrientation = orientation;
             invalidateStructure();
             requestLayout();
         }
@@ -369,7 +369,7 @@
      * @attr ref android.R.styleable#GridLayout_rowCount
      */
     public int getRowCount() {
-        return verticalAxis.getCount();
+        return mVerticalAxis.getCount();
     }
 
     /**
@@ -384,7 +384,7 @@
      * @attr ref android.R.styleable#GridLayout_rowCount
      */
     public void setRowCount(int rowCount) {
-        verticalAxis.setCount(rowCount);
+        mVerticalAxis.setCount(rowCount);
         invalidateStructure();
         requestLayout();
     }
@@ -402,7 +402,7 @@
      * @attr ref android.R.styleable#GridLayout_columnCount
      */
     public int getColumnCount() {
-        return horizontalAxis.getCount();
+        return mHorizontalAxis.getCount();
     }
 
     /**
@@ -417,7 +417,7 @@
      * @attr ref android.R.styleable#GridLayout_columnCount
      */
     public void setColumnCount(int columnCount) {
-        horizontalAxis.setCount(columnCount);
+        mHorizontalAxis.setCount(columnCount);
         invalidateStructure();
         requestLayout();
     }
@@ -433,7 +433,7 @@
      * @attr ref android.R.styleable#GridLayout_useDefaultMargins
      */
     public boolean getUseDefaultMargins() {
-        return useDefaultMargins;
+        return mUseDefaultMargins;
     }
 
     /**
@@ -463,7 +463,7 @@
      * @attr ref android.R.styleable#GridLayout_useDefaultMargins
      */
     public void setUseDefaultMargins(boolean useDefaultMargins) {
-        this.useDefaultMargins = useDefaultMargins;
+        this.mUseDefaultMargins = useDefaultMargins;
         requestLayout();
     }
 
@@ -480,7 +480,7 @@
      * @attr ref android.R.styleable#GridLayout_alignmentMode
      */
     public int getAlignmentMode() {
-        return alignmentMode;
+        return mAlignmentMode;
     }
 
     /**
@@ -499,7 +499,7 @@
      * @attr ref android.R.styleable#GridLayout_alignmentMode
      */
     public void setAlignmentMode(int alignmentMode) {
-        this.alignmentMode = alignmentMode;
+        this.mAlignmentMode = alignmentMode;
         requestLayout();
     }
 
@@ -514,7 +514,7 @@
      * @attr ref android.R.styleable#GridLayout_rowOrderPreserved
      */
     public boolean isRowOrderPreserved() {
-        return verticalAxis.isOrderPreserved();
+        return mVerticalAxis.isOrderPreserved();
     }
 
     /**
@@ -534,7 +534,7 @@
      * @attr ref android.R.styleable#GridLayout_rowOrderPreserved
      */
     public void setRowOrderPreserved(boolean rowOrderPreserved) {
-        verticalAxis.setOrderPreserved(rowOrderPreserved);
+        mVerticalAxis.setOrderPreserved(rowOrderPreserved);
         invalidateStructure();
         requestLayout();
     }
@@ -550,7 +550,7 @@
      * @attr ref android.R.styleable#GridLayout_columnOrderPreserved
      */
     public boolean isColumnOrderPreserved() {
-        return horizontalAxis.isOrderPreserved();
+        return mHorizontalAxis.isOrderPreserved();
     }
 
     /**
@@ -570,7 +570,7 @@
      * @attr ref android.R.styleable#GridLayout_columnOrderPreserved
      */
     public void setColumnOrderPreserved(boolean columnOrderPreserved) {
-        horizontalAxis.setOrderPreserved(columnOrderPreserved);
+        mHorizontalAxis.setOrderPreserved(columnOrderPreserved);
         invalidateStructure();
         requestLayout();
     }
@@ -581,9 +581,11 @@
      * @see #setPrinter(android.util.Printer)
      *
      * @return the printer associated with this view
+     *
+     * @hide
      */
     public Printer getPrinter() {
-        return printer;
+        return mPrinter;
     }
 
     /**
@@ -593,9 +595,11 @@
      * @param printer the printer associated with this layout
      *
      * @see #getPrinter()
+     *
+     * @hide
      */
     public void setPrinter(Printer printer) {
-        this.printer = (printer == null) ? NO_PRINTER : printer;
+        this.mPrinter = (printer == null) ? NO_PRINTER : printer;
     }
 
     // Static utility methods
@@ -643,7 +647,7 @@
         if (c.getClass() == Space.class) {
             return 0;
         }
-        return defaultGap / 2;
+        return mDefaultGap / 2;
     }
 
     private int getDefaultMargin(View c, boolean isAtEdge, boolean horizontal, boolean leading) {
@@ -651,11 +655,11 @@
     }
 
     private int getDefaultMargin(View c, LayoutParams p, boolean horizontal, boolean leading) {
-        if (!useDefaultMargins) {
+        if (!mUseDefaultMargins) {
             return 0;
         }
         Spec spec = horizontal ? p.columnSpec : p.rowSpec;
-        Axis axis = horizontal ? horizontalAxis : verticalAxis;
+        Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis;
         Interval span = spec.span;
         boolean leading1 = (horizontal && isLayoutRtl()) ? !leading : leading;
         boolean isAtEdge = leading1 ? (span.min == 0) : (span.max == axis.getCount());
@@ -672,10 +676,10 @@
     }
 
     private int getMargin(View view, boolean horizontal, boolean leading) {
-        if (alignmentMode == ALIGN_MARGINS) {
+        if (mAlignmentMode == ALIGN_MARGINS) {
             return getMargin1(view, horizontal, leading);
         } else {
-            Axis axis = horizontal ? horizontalAxis : verticalAxis;
+            Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis;
             int[] margins = leading ? axis.getLeadingMargins() : axis.getTrailingMargins();
             LayoutParams lp = getLayoutParams(view);
             Spec spec = horizontal ? lp.columnSpec : lp.rowSpec;
@@ -722,8 +726,8 @@
 
     // install default indices for cells that don't define them
     private void validateLayoutParams() {
-        final boolean horizontal = (orientation == HORIZONTAL);
-        final Axis axis = horizontal ? horizontalAxis : verticalAxis;
+        final boolean horizontal = (mOrientation == HORIZONTAL);
+        final Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis;
         final int count = (axis.definedCount != UNDEFINED) ? axis.definedCount : 0;
 
         int major = 0;
@@ -779,9 +783,9 @@
     }
 
     private void invalidateStructure() {
-        lastLayoutParamsHashCode = UNINITIALIZED_HASH;
-        horizontalAxis.invalidateStructure();
-        verticalAxis.invalidateStructure();
+        mLastLayoutParamsHashCode = UNINITIALIZED_HASH;
+        mHorizontalAxis.invalidateStructure();
+        mVerticalAxis.invalidateStructure();
         // This can end up being done twice. Better twice than not at all.
         invalidateValues();
     }
@@ -789,9 +793,9 @@
     private void invalidateValues() {
         // Need null check because requestLayout() is called in View's initializer,
         // before we are set up.
-        if (horizontalAxis != null && verticalAxis != null) {
-            horizontalAxis.invalidateValues();
-            verticalAxis.invalidateValues();
+        if (mHorizontalAxis != null && mVerticalAxis != null) {
+            mHorizontalAxis.invalidateValues();
+            mVerticalAxis.invalidateValues();
         }
     }
 
@@ -822,7 +826,7 @@
         if (span.min != UNDEFINED && span.min < 0) {
             handleInvalidParams(groupName + " indices must be positive");
         }
-        Axis axis = horizontal ? horizontalAxis : verticalAxis;
+        Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis;
         int count = axis.definedCount;
         if (count != UNDEFINED) {
             if (span.max > count) {
@@ -908,7 +912,7 @@
         int right  = getWidth()  - getPaddingRight()  - insets.right;
         int bottom = getHeight() - getPaddingBottom() - insets.bottom;
 
-        int[] xs = horizontalAxis.locations;
+        int[] xs = mHorizontalAxis.locations;
         if (xs != null) {
             for (int i = 0, length = xs.length; i < length; i++) {
                 int x = left + xs[i];
@@ -916,7 +920,7 @@
             }
         }
 
-        int[] ys = verticalAxis.locations;
+        int[] ys = mVerticalAxis.locations;
         if (ys != null) {
             for (int i = 0, length = ys.length; i < length; i++) {
                 int y = top + ys[i];
@@ -973,11 +977,11 @@
     }
 
     private void consistencyCheck() {
-        if (lastLayoutParamsHashCode == UNINITIALIZED_HASH) {
+        if (mLastLayoutParamsHashCode == UNINITIALIZED_HASH) {
             validateLayoutParams();
-            lastLayoutParamsHashCode = computeLayoutParamsHashCode();
-        } else if (lastLayoutParamsHashCode != computeLayoutParamsHashCode()) {
-            printer.println("The fields of some layout parameters were modified in between "
+            mLastLayoutParamsHashCode = computeLayoutParamsHashCode();
+        } else if (mLastLayoutParamsHashCode != computeLayoutParamsHashCode()) {
+            mPrinter.println("The fields of some layout parameters were modified in between "
                     + "layout operations. Check the javadoc for GridLayout.LayoutParams#rowSpec.");
             invalidateStructure();
             consistencyCheck();
@@ -1005,11 +1009,11 @@
             if (firstPass) {
                 measureChildWithMargins2(c, widthSpec, heightSpec, lp.width, lp.height);
             } else {
-                boolean horizontal = (orientation == HORIZONTAL);
+                boolean horizontal = (mOrientation == HORIZONTAL);
                 Spec spec = horizontal ? lp.columnSpec : lp.rowSpec;
                 if (spec.alignment == FILL) {
                     Interval span = spec.span;
-                    Axis axis = horizontal ? horizontalAxis : verticalAxis;
+                    Axis axis = horizontal ? mHorizontalAxis : mVerticalAxis;
                     int[] locations = axis.getLocations();
                     int cellSize = locations[span.max] - locations[span.min];
                     int viewSize = cellSize - getTotalMargin(c, horizontal);
@@ -1048,14 +1052,14 @@
         int heightSansPadding;
 
         // Use the orientation property to decide which axis should be laid out first.
-        if (orientation == HORIZONTAL) {
-            widthSansPadding = horizontalAxis.getMeasure(widthSpecSansPadding);
+        if (mOrientation == HORIZONTAL) {
+            widthSansPadding = mHorizontalAxis.getMeasure(widthSpecSansPadding);
             measureChildrenWithMargins(widthSpecSansPadding, heightSpecSansPadding, false);
-            heightSansPadding = verticalAxis.getMeasure(heightSpecSansPadding);
+            heightSansPadding = mVerticalAxis.getMeasure(heightSpecSansPadding);
         } else {
-            heightSansPadding = verticalAxis.getMeasure(heightSpecSansPadding);
+            heightSansPadding = mVerticalAxis.getMeasure(heightSpecSansPadding);
             measureChildrenWithMargins(widthSpecSansPadding, heightSpecSansPadding, false);
-            widthSansPadding = horizontalAxis.getMeasure(widthSpecSansPadding);
+            widthSansPadding = mHorizontalAxis.getMeasure(widthSpecSansPadding);
         }
 
         int measuredWidth  = Math.max(widthSansPadding  + hPadding, getSuggestedMinimumWidth());
@@ -1114,11 +1118,11 @@
         int paddingRight = getPaddingRight();
         int paddingBottom = getPaddingBottom();
 
-        horizontalAxis.layout(targetWidth - paddingLeft - paddingRight);
-        verticalAxis.layout(targetHeight - paddingTop - paddingBottom);
+        mHorizontalAxis.layout(targetWidth - paddingLeft - paddingRight);
+        mVerticalAxis.layout(targetHeight - paddingTop - paddingBottom);
 
-        int[] hLocations = horizontalAxis.getLocations();
-        int[] vLocations = verticalAxis.getLocations();
+        int[] hLocations = mHorizontalAxis.getLocations();
+        int[] vLocations = mVerticalAxis.getLocations();
 
         for (int i = 0, N = getChildCount(); i < N; i++) {
             View c = getChildAt(i);
@@ -1145,8 +1149,8 @@
             Alignment hAlign = getAlignment(columnSpec.alignment, true);
             Alignment vAlign = getAlignment(rowSpec.alignment, false);
 
-            Bounds boundsX = horizontalAxis.getGroupBounds().getValue(i);
-            Bounds boundsY = verticalAxis.getGroupBounds().getValue(i);
+            Bounds boundsX = mHorizontalAxis.getGroupBounds().getValue(i);
+            Bounds boundsY = mVerticalAxis.getGroupBounds().getValue(i);
 
             // Gravity offsets: the location of the alignment group relative to its cell group.
             int gravityOffsetX = hAlign.getGravityOffset(c, cellWidth - boundsX.size(true));
@@ -1571,7 +1575,7 @@
                     removed.add(arc);
                 }
             }
-            printer.println(axisName + " constraints: " + arcsToString(culprits) +
+            mPrinter.println(axisName + " constraints: " + arcsToString(culprits) +
                     " are inconsistent; permanently removing: " + arcsToString(removed) + ". ");
         }
 
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index a7d546a..15daf83 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -30,7 +30,10 @@
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
+import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
 import android.view.animation.GridLayoutAnimationController;
+import android.widget.AbsListView.LayoutParams;
 import android.widget.RemoteViews.RemoteView;
 
 
@@ -2259,5 +2262,37 @@
     public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
         super.onInitializeAccessibilityNodeInfo(info);
         info.setClassName(GridView.class.getName());
+
+        final int columnsCount = getNumColumns();
+        final int rowsCount = getCount() / columnsCount;
+        final CollectionInfo collectionInfo = CollectionInfo.obtain(columnsCount, rowsCount, false);
+        info.setCollectionInfo(collectionInfo);
+    }
+
+    @Override
+    public void onInitializeAccessibilityNodeInfoForItem(
+            View view, int position, AccessibilityNodeInfo info) {
+        super.onInitializeAccessibilityNodeInfoForItem(view, position, info);
+
+        final int count = getCount();
+        final int columnsCount = getNumColumns();
+        final int rowsCount = count / columnsCount;
+
+        final int row;
+        final int column;
+        if (!mStackFromBottom) {
+            column = position % columnsCount;
+            row = position / columnsCount;
+        } else {
+            final int invertedIndex = count - 1 - position;
+
+            column = columnsCount - 1 - (invertedIndex % columnsCount);
+            row = rowsCount - 1 - invertedIndex / columnsCount;
+        }
+
+        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
+        final boolean isHeading = lp != null && lp.viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
+        final CollectionItemInfo itemInfo = CollectionItemInfo.obtain(column, 1, row, 1, isHeading);
+        info.setCollectionItemInfo(itemInfo);
     }
 }
diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java
index 6262387..b7e1fdd 100644
--- a/core/java/android/widget/ListPopupWindow.java
+++ b/core/java/android/widget/ListPopupWindow.java
@@ -965,6 +965,35 @@
     }
 
     /**
+     * Returns an {@link OnTouchListener} that can be added to the source view
+     * to implement drag-to-open behavior. Generally, the source view should be
+     * the same view that was passed to {@link #setAnchorView}.
+     * <p>
+     * When the listener is set on a view, touching that view and dragging
+     * outside of its bounds will open the popup window. Lifting will select the
+     * currently touched list item.
+     * <p>
+     * Example usage:
+     * <pre>
+     * ListPopupWindow myPopup = new ListPopupWindow(context);
+     * myPopup.setAnchor(myAnchor);
+     * OnTouchListener dragListener = myPopup.createDragToOpenListener(myAnchor);
+     * myAnchor.setOnTouchListener(dragListener);
+     * </pre>
+     *
+     * @param src the view on which the resulting listener will be set
+     * @return a touch listener that controls drag-to-open behavior
+     */
+    public OnTouchListener createDragToOpenListener(View src) {
+        return new ForwardingListener(src) {
+            @Override
+            public ListPopupWindow getPopup() {
+                return ListPopupWindow.this;
+            }
+        };
+    }
+
+    /**
      * <p>Builds the popup window's content and returns the height the popup
      * should have. Returns -1 when the content already exists.</p>
      *
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 014306d..941ddfc 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -42,6 +42,8 @@
 import android.view.ViewRootImpl;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
+import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
 import android.widget.RemoteViews.RemoteView;
 
 import java.util.ArrayList;
@@ -3778,5 +3780,20 @@
     public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
         super.onInitializeAccessibilityNodeInfo(info);
         info.setClassName(ListView.class.getName());
+
+        final int count = getCount();
+        final CollectionInfo collectionInfo = CollectionInfo.obtain(1, count, false);
+        info.setCollectionInfo(collectionInfo);
+    }
+
+    @Override
+    public void onInitializeAccessibilityNodeInfoForItem(
+            View view, int position, AccessibilityNodeInfo info) {
+        super.onInitializeAccessibilityNodeInfoForItem(view, position, info);
+
+        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
+        final boolean isHeading = lp != null && lp.viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
+        final CollectionItemInfo itemInfo = CollectionItemInfo.obtain(0, 1, position, 1, isHeading);
+        info.setCollectionItemInfo(itemInfo);
     }
 }
diff --git a/core/java/android/widget/PopupMenu.java b/core/java/android/widget/PopupMenu.java
index 6a6d767..603db70 100644
--- a/core/java/android/widget/PopupMenu.java
+++ b/core/java/android/widget/PopupMenu.java
@@ -26,6 +26,8 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.View.OnTouchListener;
+import android.widget.ListPopupWindow.ForwardingListener;
 
 /**
  * A PopupMenu displays a {@link Menu} in a modal popup window anchored to a {@link View}.
@@ -40,6 +42,7 @@
     private MenuPopupHelper mPopup;
     private OnMenuItemClickListener mMenuItemClickListener;
     private OnDismissListener mDismissListener;
+    private OnTouchListener mDragListener;
 
     /**
      * Callback interface used to notify the application that the menu has closed.
@@ -71,6 +74,35 @@
     }
 
     /**
+     * Returns an {@link OnTouchListener} that can be added to the anchor view
+     * to implement drag-to-open behavior.
+     * <p>
+     * When the listener is set on a view, touching that view and dragging
+     * outside of its bounds will open the popup window. Lifting will select the
+     * currently touched list item.
+     * <p>
+     * Example usage:
+     * <pre>
+     * PopupMenu myPopup = new PopupMenu(context, myAnchor);
+     * myAnchor.setOnTouchListener(myPopup.getDragToOpenListener());
+     * </pre>
+     *
+     * @return a touch listener that controls drag-to-open behavior
+     */
+    public OnTouchListener getDragToOpenListener() {
+        if (mDragListener == null) {
+            mDragListener = new ForwardingListener(mAnchor) {
+                @Override
+                public ListPopupWindow getPopup() {
+                    return mPopup.getPopup();
+                }
+            };
+        }
+
+        return mDragListener;
+    }
+
+    /**
      * @return the {@link Menu} associated with this popup. Populate the returned Menu with
      * items before calling {@link #show()}.
      *
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index d5fc21c..a2d48a8 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -4406,6 +4406,7 @@
     public void setError(CharSequence error, Drawable icon) {
         createEditorIfNeeded();
         mEditor.setError(error, icon);
+        notifyViewAccessibilityStateChangedIfNeeded();
     }
 
     @Override
@@ -8147,6 +8148,10 @@
 
         if (mEditor != null) {
             info.setInputType(mEditor.mInputType);
+
+            if (mEditor.mError != null) {
+                info.setContentInvalid(true);
+            }
         }
 
         if (!TextUtils.isEmpty(mText)) {
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index ebf9fe0..0ddc131 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -21,12 +21,14 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.Resources;
+import android.graphics.Canvas;
 import android.media.AudioManager;
+import android.media.MediaFormat;
 import android.media.MediaPlayer;
-import android.media.Metadata;
 import android.media.MediaPlayer.OnCompletionListener;
 import android.media.MediaPlayer.OnErrorListener;
 import android.media.MediaPlayer.OnInfoListener;
+import android.media.Metadata;
 import android.net.Uri;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -40,7 +42,10 @@
 import android.widget.MediaController.MediaPlayerControl;
 
 import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.Map;
+import java.util.Vector;
 
 /**
  * Displays a video file.  The VideoView class
@@ -91,6 +96,15 @@
     private boolean     mCanSeekBack;
     private boolean     mCanSeekForward;
 
+    /** List of views overlaid on top of the video. */
+    private ArrayList<View> mOverlays;
+
+    /**
+     * Listener for overlay layout changes. Invalidates the video view to ensure
+     * that captions are redrawn whenever their layout changes.
+     */
+    private OnLayoutChangeListener mOverlayLayoutListener;
+
     public VideoView(Context context) {
         super(context);
         initVideoView();
@@ -194,6 +208,7 @@
         setFocusable(true);
         setFocusableInTouchMode(true);
         requestFocus();
+        mPendingSubtitleTracks = 0;
         mCurrentState = STATE_IDLE;
         mTargetState  = STATE_IDLE;
     }
@@ -218,6 +233,47 @@
         invalidate();
     }
 
+    /**
+     * Adds an external subtitle source file (from the provided input stream.)
+     *
+     * Note that a single external subtitle source may contain multiple or no
+     * supported tracks in it. If the source contained at least one track in
+     * it, one will receive an {@link MediaPlayer#MEDIA_INFO_METADATA_UPDATE}
+     * info message. Otherwise, if reading the source takes excessive time,
+     * one will receive a {@link MediaPlayer#MEDIA_INFO_SUBTITLE_TIMED_OUT}
+     * message. If the source contained no supported track (including an empty
+     * source file or null input stream), one will receive a {@link
+     * MediaPlayer#MEDIA_INFO_UNSUPPORTED_SUBTITLE} message. One can find the
+     * total number of available tracks using {@link MediaPlayer#getTrackInfo()}
+     * to see what additional tracks become available after this method call.
+     *
+     * @param is     input stream containing the subtitle data.  It will be
+     *               closed by the media framework.
+     * @param format the format of the subtitle track(s).  Must contain at least
+     *               the mime type ({@link MediaFormat#KEY_MIME}) and the
+     *               language ({@link MediaFormat#KEY_LANGUAGE}) of the file.
+     *               If the file itself contains the language information,
+     *               specify "und" for the language.
+     */
+    public void addSubtitleSource(InputStream is, MediaFormat format) {
+        // always signal unsupported message for now
+        try {
+            if (is != null) {
+                is.close();
+            }
+        } catch (IOException e) {
+        }
+
+        if (mMediaPlayer == null) {
+            ++mPendingSubtitleTracks;
+        } else {
+            mInfoListener.onInfo(
+                    mMediaPlayer, MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBTITLE, 0);
+        }
+    }
+
+    private int mPendingSubtitleTracks;
+
     public void stopPlayback() {
         if (mMediaPlayer != null) {
             mMediaPlayer.stop();
@@ -253,7 +309,7 @@
             mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
             mMediaPlayer.setOnCompletionListener(mCompletionListener);
             mMediaPlayer.setOnErrorListener(mErrorListener);
-            mMediaPlayer.setOnInfoListener(mOnInfoListener);
+            mMediaPlayer.setOnInfoListener(mInfoListener);
             mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
             mCurrentBufferPercentage = 0;
             mMediaPlayer.setDataSource(mContext, mUri, mHeaders);
@@ -261,6 +317,12 @@
             mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
             mMediaPlayer.setScreenOnWhilePlaying(true);
             mMediaPlayer.prepareAsync();
+
+            for (int ix = 0; ix < mPendingSubtitleTracks; ix++) {
+                mInfoListener.onInfo(
+                        mMediaPlayer, MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBTITLE, 0);
+            }
+
             // we don't set the target state here either, but preserve the
             // target state that was there before.
             mCurrentState = STATE_PREPARING;
@@ -277,6 +339,8 @@
             mTargetState = STATE_ERROR;
             mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
             return;
+        } finally {
+            mPendingSubtitleTracks = 0;
         }
     }
 
@@ -386,6 +450,16 @@
         }
     };
 
+    private MediaPlayer.OnInfoListener mInfoListener =
+        new MediaPlayer.OnInfoListener() {
+        public  boolean onInfo(MediaPlayer mp, int arg1, int arg2) {
+            if (mOnInfoListener != null) {
+                mOnInfoListener.onInfo(mp, arg1, arg2);
+            }
+            return true;
+        }
+    };
+
     private MediaPlayer.OnErrorListener mErrorListener =
         new MediaPlayer.OnErrorListener() {
         public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
@@ -530,6 +604,7 @@
             mMediaPlayer.reset();
             mMediaPlayer.release();
             mMediaPlayer = null;
+            mPendingSubtitleTracks = 0;
             mCurrentState = STATE_IDLE;
             if (cleartargetstate) {
                 mTargetState  = STATE_IDLE;
@@ -702,4 +777,101 @@
         }
         return mAudioSession;
     }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        super.onLayout(changed, left, top, right, bottom);
+
+        // Layout overlay views, if necessary.
+        if (changed && mOverlays != null && !mOverlays.isEmpty()) {
+            measureAndLayoutOverlays();
+        }
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        super.draw(canvas);
+
+        final int count = mOverlays.size();
+        for (int i = 0; i < count; i++) {
+            final View overlay = mOverlays.get(i);
+            overlay.draw(canvas);
+        }
+    }
+
+    /**
+     * Adds a view to be overlaid on top of this video view. During layout, the
+     * view will be forced to match the bounds, less padding, of the video view.
+     * <p>
+     * Overlays are drawn in the order they are added. The last added overlay
+     * will be drawn on top.
+     *
+     * @param overlay the view to overlay
+     * @see #removeOverlay(View)
+     */
+    private void addOverlay(View overlay) {
+        if (mOverlays == null) {
+            mOverlays = new ArrayList<View>(1);
+        }
+
+        if (mOverlayLayoutListener == null) {
+            mOverlayLayoutListener = new OnLayoutChangeListener() {
+                @Override
+                public void onLayoutChange(View v, int left, int top, int right, int bottom,
+                        int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                    invalidate();
+                }
+            };
+        }
+
+        if (mOverlays.isEmpty()) {
+            setWillNotDraw(false);
+        }
+
+        mOverlays.add(overlay);
+        overlay.addOnLayoutChangeListener(mOverlayLayoutListener);
+        measureAndLayoutOverlays();
+    }
+
+    /**
+     * Removes a view previously added using {@link #addOverlay}.
+     *
+     * @param overlay the view to remove
+     * @see #addOverlay(View)
+     */
+    private void removeOverlay(View overlay) {
+        if (mOverlays == null) {
+            return;
+        }
+
+        overlay.removeOnLayoutChangeListener(mOverlayLayoutListener);
+        mOverlays.remove(overlay);
+
+        if (mOverlays.isEmpty()) {
+            setWillNotDraw(true);
+        }
+
+        invalidate();
+    }
+
+    /**
+     * Forces a measurement and layout pass for all overlaid views.
+     *
+     * @see #addOverlay(View)
+     */
+    private void measureAndLayoutOverlays() {
+        final int left = getPaddingLeft();
+        final int top = getPaddingTop();
+        final int right = getWidth() - left - getPaddingRight();
+        final int bottom = getHeight() - top - getPaddingBottom();
+        final int widthSpec = MeasureSpec.makeMeasureSpec(right - left, MeasureSpec.EXACTLY);
+        final int heightSpec = MeasureSpec.makeMeasureSpec(bottom - top, MeasureSpec.EXACTLY);
+
+        final int count = mOverlays.size();
+        for (int i = 0; i < count; i++) {
+            final View overlay = mOverlays.get(i);
+            overlay.measure(widthSpec, heightSpec);
+            overlay.layout(left, top, right, bottom);
+        }
+    }
 }
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index aa94728..8819237 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -22,11 +22,13 @@
 
 import android.app.ActivityManager;
 import android.app.ActivityManagerNative;
+import android.app.AppGlobals;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ActivityInfo;
+import android.content.pm.IPackageManager;
 import android.content.pm.LabeledIntent;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -45,7 +47,6 @@
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
 import android.widget.Button;
-import android.widget.GridView;
 import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.TextView;
@@ -71,13 +72,13 @@
     private PackageManager mPm;
     private boolean mAlwaysUseOption;
     private boolean mShowExtended;
-    private GridView mGrid;
+    private ListView mListView;
     private Button mAlwaysButton;
     private Button mOnceButton;
     private int mIconDpi;
     private int mIconSize;
     private int mMaxColumns;
-    private int mLastSelected = GridView.INVALID_POSITION;
+    private int mLastSelected = ListView.INVALID_POSITION;
 
     private boolean mRegistered;
     private final PackageMonitor mPackageMonitor = new PackageMonitor() {
@@ -139,17 +140,15 @@
             finish();
             return;
         } else if (count > 1) {
-            ap.mView = getLayoutInflater().inflate(R.layout.resolver_grid, null);
-            mGrid = (GridView) ap.mView.findViewById(R.id.resolver_grid);
-            mGrid.setAdapter(mAdapter);
-            mGrid.setOnItemClickListener(this);
-            mGrid.setOnItemLongClickListener(new ItemLongClickListener());
+            ap.mView = getLayoutInflater().inflate(R.layout.resolver_list, null);
+            mListView = (ListView) ap.mView.findViewById(R.id.resolver_list);
+            mListView.setAdapter(mAdapter);
+            mListView.setOnItemClickListener(this);
+            mListView.setOnItemLongClickListener(new ItemLongClickListener());
 
             if (alwaysUseOption) {
-                mGrid.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+                mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
             }
-
-            resizeGrid();
         } else if (count == 1) {
             startActivity(mAdapter.intentForPosition(0));
             mPackageMonitor.unregister();
@@ -172,11 +171,11 @@
                 mAlwaysUseOption = false;
             }
         }
-    }
-
-    void resizeGrid() {
-        final int itemCount = mAdapter.getCount();
-        mGrid.setNumColumns(Math.min(itemCount, mMaxColumns));
+        final int initialHighlight = mAdapter.getInitialHighlight();
+        if (initialHighlight >= 0) {
+            mListView.setItemChecked(initialHighlight, true);
+            onItemClick(null, null, initialHighlight, 0); // Other entries are not used
+        }
     }
 
     Drawable getIcon(Resources res, int resId) {
@@ -247,26 +246,26 @@
     protected void onRestoreInstanceState(Bundle savedInstanceState) {
         super.onRestoreInstanceState(savedInstanceState);
         if (mAlwaysUseOption) {
-            final int checkedPos = mGrid.getCheckedItemPosition();
-            final boolean enabled = checkedPos != GridView.INVALID_POSITION;
+            final int checkedPos = mListView.getCheckedItemPosition();
+            final boolean enabled = checkedPos != ListView.INVALID_POSITION;
             mLastSelected = checkedPos;
             mAlwaysButton.setEnabled(enabled);
             mOnceButton.setEnabled(enabled);
             if (enabled) {
-                mGrid.setSelection(checkedPos);
+                mListView.setSelection(checkedPos);
             }
         }
     }
 
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        final int checkedPos = mGrid.getCheckedItemPosition();
-        final boolean hasValidSelection = checkedPos != GridView.INVALID_POSITION;
+        final int checkedPos = mListView.getCheckedItemPosition();
+        final boolean hasValidSelection = checkedPos != ListView.INVALID_POSITION;
         if (mAlwaysUseOption && (!hasValidSelection || mLastSelected != checkedPos)) {
             mAlwaysButton.setEnabled(hasValidSelection);
             mOnceButton.setEnabled(hasValidSelection);
             if (hasValidSelection) {
-                mGrid.smoothScrollToPosition(checkedPos);
+                mListView.smoothScrollToPosition(checkedPos);
             }
             mLastSelected = checkedPos;
         } else {
@@ -276,7 +275,7 @@
 
     public void onButtonClick(View v) {
         final int id = v.getId();
-        startSelected(mGrid.getCheckedItemPosition(), id == R.id.button_always);
+        startSelected(mListView.getCheckedItemPosition(), id == R.id.button_always);
         dismiss();
     }
 
@@ -288,7 +287,7 @@
     }
 
     protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) {
-        if (alwaysCheck) {
+        if (mAlwaysUseOption) {
             // Build a reasonable intent filter, based on what matched.
             IntentFilter filter = new IntentFilter();
 
@@ -374,8 +373,19 @@
                             r.activityInfo.name);
                     if (r.match > bestMatch) bestMatch = r.match;
                 }
-                getPackageManager().addPreferredActivity(filter, bestMatch, set,
-                        intent.getComponent());
+                if (alwaysCheck) {
+                    getPackageManager().addPreferredActivity(filter, bestMatch, set,
+                            intent.getComponent());
+                } else {
+                    try {
+                        AppGlobals.getPackageManager().setLastChosenActivity(intent,
+                                intent.resolveTypeIfNeeded(getContentResolver()),
+                                PackageManager.MATCH_DEFAULT_ONLY,
+                                filter, bestMatch, intent.getComponent());
+                    } catch (RemoteException re) {
+                        Log.d(TAG, "Error calling setLastChosenActivity\n" + re);
+                    }
+                }
             }
         }
 
@@ -410,11 +420,13 @@
     private final class ResolveListAdapter extends BaseAdapter {
         private final Intent[] mInitialIntents;
         private final List<ResolveInfo> mBaseResolveList;
+        private ResolveInfo mLastChosen;
         private final Intent mIntent;
         private final int mLaunchedFromUid;
         private final LayoutInflater mInflater;
 
         private List<DisplayResolveInfo> mList;
+        private int mInitialHighlight = -1;
 
         public ResolveListAdapter(Context context, Intent intent,
                 Intent[] initialIntents, List<ResolveInfo> rList, int launchedFromUid) {
@@ -436,14 +448,24 @@
             if (newItemCount == 0) {
                 // We no longer have any items...  just finish the activity.
                 finish();
-            } else if (newItemCount != oldItemCount) {
-                resizeGrid();
             }
         }
 
+        public int getInitialHighlight() {
+            return mInitialHighlight;
+        }
+
         private void rebuildList() {
             List<ResolveInfo> currentResolveList;
 
+            try {
+                mLastChosen = AppGlobals.getPackageManager().getLastChosenActivity(
+                        mIntent, mIntent.resolveTypeIfNeeded(getContentResolver()),
+                        PackageManager.MATCH_DEFAULT_ONLY);
+            } catch (RemoteException re) {
+                Log.d(TAG, "Error calling setLastChosenActivity\n" + re);
+            }
+
             mList.clear();
             if (mBaseResolveList != null) {
                 currentResolveList = mBaseResolveList;
@@ -556,6 +578,12 @@
             // Process labels from start to i
             int num = end - start+1;
             if (num == 1) {
+                if (mLastChosen != null
+                        && mLastChosen.activityInfo.packageName.equals(
+                                ro.activityInfo.packageName)
+                        && mLastChosen.activityInfo.name.equals(ro.activityInfo.name)) {
+                    mInitialHighlight = mList.size();
+                }
                 // No duplicate labels. Use label for entry at start
                 mList.add(new DisplayResolveInfo(ro, roLabel, null, null));
             } else {
@@ -585,6 +613,12 @@
                 }
                 for (int k = start; k <= end; k++) {
                     ResolveInfo add = rList.get(k);
+                    if (mLastChosen != null
+                            && mLastChosen.activityInfo.packageName.equals(
+                                    add.activityInfo.packageName)
+                            && mLastChosen.activityInfo.name.equals(add.activityInfo.name)) {
+                        mInitialHighlight = mList.size();
+                    }
                     if (usePkg) {
                         // Use application name for all entries from start to end-1
                         mList.add(new DisplayResolveInfo(add, roLabel,
diff --git a/core/java/com/android/internal/app/RestrictionsPinActivity.java b/core/java/com/android/internal/app/RestrictionsPinActivity.java
index f8ce108..2112474 100644
--- a/core/java/com/android/internal/app/RestrictionsPinActivity.java
+++ b/core/java/com/android/internal/app/RestrictionsPinActivity.java
@@ -16,9 +16,7 @@
 
 package com.android.internal.app;
 
-import android.app.AlertDialog;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.os.Bundle;
 import android.os.UserManager;
 import android.text.Editable;
@@ -26,7 +24,8 @@
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.WindowManager;
+import android.view.View.OnClickListener;
+import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;
 import android.widget.TextView.OnEditorActionListener;
@@ -38,14 +37,15 @@
  * challenge for an existing PIN. The PIN is maintained by UserManager.
  */
 public class RestrictionsPinActivity extends AlertActivity
-        implements DialogInterface.OnClickListener, TextWatcher, OnEditorActionListener {
+        implements OnClickListener, TextWatcher, OnEditorActionListener {
 
     protected UserManager mUserManager;
     protected boolean mHasRestrictionsPin;
 
     protected EditText mPinText;
     protected TextView mPinErrorMessage;
-    protected TextView mPinMessage;
+    private Button mOkButton;
+    private Button mCancelButton;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -59,19 +59,20 @@
 
     protected void initUi() {
         AlertController.AlertParams ap = mAlertParams;
-        ap.mTitle = getString(R.string.restr_pin_enter_pin);
-        ap.mPositiveButtonText = getString(R.string.ok);
-        ap.mNegativeButtonText = getString(R.string.cancel);
-        ap.mPositiveButtonListener = this;
-        ap.mNegativeButtonListener = this;
+        ap.mTitle = getString(R.string.restr_pin_enter_admin_pin);
         LayoutInflater inflater =
                 (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         ap.mView = inflater.inflate(R.layout.restrictions_pin_challenge, null);
 
-        mPinMessage = (TextView) ap.mView.findViewById(R.id.pin_message);
-        mPinText = (EditText) ap.mView.findViewById(R.id.pin_text);
         mPinErrorMessage = (TextView) ap.mView.findViewById(R.id.pin_error_message);
+        mPinText = (EditText) ap.mView.findViewById(R.id.pin_text);
+        mOkButton = (Button) ap.mView.findViewById(R.id.pin_ok_button);
+        mCancelButton = (Button) ap.mView.findViewById(R.id.pin_cancel_button);
+
         mPinText.addTextChangedListener(this);
+
+        mOkButton.setOnClickListener(this);
+        mCancelButton.setOnClickListener(this);
     }
 
     protected boolean verifyingPin() {
@@ -84,8 +85,7 @@
         setPositiveButtonState(false);
         boolean hasPin = mUserManager.hasRestrictionsPin();
         if (hasPin) {
-            mPinMessage.setVisibility(View.GONE);
-            mPinErrorMessage.setVisibility(View.GONE);
+            mPinErrorMessage.setVisibility(View.INVISIBLE);
             mPinText.setOnEditorActionListener(this);
             updatePinTimer(-1);
         } else if (verifyingPin()) {
@@ -94,39 +94,37 @@
         }
     }
 
-    private void setPositiveButtonState(boolean enabled) {
-        mAlert.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(enabled);
+    protected void setPositiveButtonState(boolean enabled) {
+        mOkButton.setEnabled(enabled);
     }
 
-    private void updatePinTimer(int pinTimerMs) {
+    private boolean updatePinTimer(int pinTimerMs) {
         if (pinTimerMs < 0) {
             pinTimerMs = mUserManager.checkRestrictionsPin(null);
         }
+        boolean enableInput;
         if (pinTimerMs >= 200) {
-            final int seconds = (pinTimerMs + 200) / 1000;
-            final String formatString = getResources().getQuantityString(
-                    R.plurals.restr_pin_countdown,
-                    seconds);
-            mPinErrorMessage.setText(String.format(formatString, seconds));
+            // Do the count down timer for less than a minute, otherwise just say try again later.
+            if (pinTimerMs <= 60000) {
+                final int seconds = (pinTimerMs + 200) / 1000;
+                final String formatString = getResources().getQuantityString(
+                        R.plurals.restr_pin_countdown,
+                        seconds);
+                mPinErrorMessage.setText(String.format(formatString, seconds));
+            } else {
+                mPinErrorMessage.setText(R.string.restr_pin_try_later);
+            }
+            enableInput = false;
             mPinErrorMessage.setVisibility(View.VISIBLE);
-            mPinText.setEnabled(false);
             mPinText.setText("");
-            setPositiveButtonState(false);
             mPinText.postDelayed(mCountdownRunnable, Math.min(1000, pinTimerMs));
         } else {
-            mPinErrorMessage.setVisibility(View.INVISIBLE);
-            mPinText.setEnabled(true);
-            mPinText.setText("");
+            enableInput = true;
+            mPinErrorMessage.setText(R.string.restr_pin_incorrect);
         }
-    }
-
-    public void onClick(DialogInterface dialog, int which) {
-        setResult(RESULT_CANCELED);
-        if (which == AlertDialog.BUTTON_POSITIVE) {
-            performPositiveButtonAction();
-        } else if (which == AlertDialog.BUTTON_NEGATIVE) {
-            finish();
-        }
+        mPinText.setEnabled(enableInput);
+        setPositiveButtonState(enableInput);
+        return enableInput;
     }
 
     protected void performPositiveButtonAction() {
@@ -135,7 +133,10 @@
             setResult(RESULT_OK);
             finish();
         } else if (result >= 0) {
+            mPinErrorMessage.setText(R.string.restr_pin_incorrect);
+            mPinErrorMessage.setVisibility(View.VISIBLE);
             updatePinTimer(result);
+            mPinText.setText("");
         }
     }
 
@@ -161,7 +162,20 @@
 
     private Runnable mCountdownRunnable = new Runnable() {
         public void run() {
-            updatePinTimer(-1);
+            if (updatePinTimer(-1)) {
+                // If we are no longer counting down, clear the message.
+                mPinErrorMessage.setVisibility(View.INVISIBLE);
+            }
         }
     };
+
+    @Override
+    public void onClick(View v) {
+        if (v == mOkButton) {
+            performPositiveButtonAction();
+        } else if (v == mCancelButton) {
+            setResult(RESULT_CANCELED);
+            finish();
+        }
+    }
 }
diff --git a/core/java/com/android/internal/app/RestrictionsPinSetupActivity.java b/core/java/com/android/internal/app/RestrictionsPinSetupActivity.java
index 1d09292..f7fc6c6 100644
--- a/core/java/com/android/internal/app/RestrictionsPinSetupActivity.java
+++ b/core/java/com/android/internal/app/RestrictionsPinSetupActivity.java
@@ -16,9 +16,7 @@
 
 package com.android.internal.app;
 
-import android.app.AlertDialog;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.os.UserManager;
 import android.text.Editable;
 import android.text.TextUtils;
@@ -44,17 +42,13 @@
         ap.mTitle = getString(R.string.restr_pin_enter_pin);
         ap.mPositiveButtonText = getString(R.string.ok);
         ap.mNegativeButtonText = getString(R.string.cancel);
-        ap.mPositiveButtonListener = this;
-        ap.mNegativeButtonListener = this;
         LayoutInflater inflater =
                 (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         ap.mView = inflater.inflate(R.layout.restrictions_pin_setup, null);
 
         mPinText = (EditText) ap.mView.findViewById(R.id.pin_text);
-        mPinMessage = (TextView) ap.mView.findViewById(R.id.pin_message);
         mNewPinText = (EditText) ap.mView.findViewById(R.id.pin_new_text);
         mConfirmPinText = (EditText) ap.mView.findViewById(R.id.pin_confirm_text);
-        mPinErrorMessage = (TextView) ap.mView.findViewById(R.id.pin_error_message);
         mNewPinText.addTextChangedListener(this);
         mConfirmPinText.addTextChangedListener(this);
 
@@ -72,19 +66,7 @@
         return false;
     }
 
-    private void setPositiveButtonState(boolean enabled) {
-        mAlert.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(enabled);
-    }
-
-    public void onClick(DialogInterface dialog, int which) {
-        setResult(RESULT_CANCELED);
-        if (which == AlertDialog.BUTTON_POSITIVE) {
-            performPositiveButtonAction();
-        } else if (which == AlertDialog.BUTTON_NEGATIVE) {
-            finish();
-        }
-    }
-
+    @Override
     protected void performPositiveButtonAction() {
         if (mHasRestrictionsPin) {
             int result = mUserManager.checkRestrictionsPin(mPinText.getText().toString());
@@ -115,7 +97,6 @@
         boolean showError = !TextUtils.isEmpty(pin1) && !TextUtils.isEmpty(pin2);
         // TODO: Check recovery email address as well
         setPositiveButtonState(match);
-        mPinErrorMessage.setVisibility((match || !showError) ? View.INVISIBLE : View.VISIBLE);
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/AutoScrollHelper.java b/core/java/com/android/internal/widget/AutoScrollHelper.java
index f728e6a..afa4103 100644
--- a/core/java/com/android/internal/widget/AutoScrollHelper.java
+++ b/core/java/com/android/internal/widget/AutoScrollHelper.java
@@ -32,7 +32,8 @@
  * scrolling to Views.
  * <p>
  * <b>Note:</b> Implementing classes are responsible for overriding the
- * {@link #onScrollBy} method to scroll the target view. See
+ * {@link #scrollTargetBy}, {@link #canTargetScrollHorizontally}, and
+ * {@link #canTargetScrollVertically} methods. See
  * {@link AbsListViewAutoScroller} for an {@link android.widget.AbsListView}
  * -specific implementation.
  * <p>
@@ -60,12 +61,14 @@
  * {@link #setMaximumEdges}. Default value is {@link #NO_MAX}.
  * </ul>
  * <h1>Scrolling</h1> When automatic scrolling is active, the helper will
- * repeatedly call {@link #onScrollBy} to apply new scrolling offsets.
+ * repeatedly call {@link #scrollTargetBy} to apply new scrolling offsets.
  * <p>
  * The following scrolling properties may be configured:
  * <ul>
  * <li>Acceleration ramp-up duration, see {@link #setRampUpDuration}. Default
- * value is 2.5 seconds.
+ * value is 2500 milliseconds.
+ * <li>Acceleration ramp-down duration, see {@link #setRampDownDuration}.
+ * Default value is 500 milliseconds.
  * <li>Target velocity relative to view size, see {@link #setRelativeVelocity}.
  * Default value is 100% per second for both vertical and horizontal.
  * <li>Minimum velocity used to constrain relative velocity, see
@@ -163,25 +166,22 @@
     private float[] mMaximumVelocity = new float[] { NO_MAX, NO_MAX };
 
     /** Whether to start activation immediately. */
-    private boolean mSkipDelay;
+    private boolean mAlreadyDelayed;
 
     /** Whether to reset the scroller start time on the next animation. */
-    private boolean mResetScroller;
+    private boolean mNeedsReset;
 
-    /** Whether the auto-scroller is active. */
-    private boolean mActive;
+    /** Whether to send a cancel motion event to the target view. */
+    private boolean mNeedsCancel;
 
-    /** Whether the auto-scroller is scrolling. */
-    private boolean mScrolling;
+    /** Whether the auto-scroller is actively scrolling. */
+    private boolean mAnimating;
 
     /** Whether the auto-scroller is enabled. */
     private boolean mEnabled;
 
     /** Whether the auto-scroller consumes events when scrolling. */
-    private boolean mExclusiveEnabled;
-
-    /** Down time of the most recent down touch event. */
-    private long mDownTime;
+    private boolean mExclusive;
 
     // Default values.
     private static final int DEFAULT_EDGE_TYPE = EDGE_TYPE_INSIDE_EXTEND;
@@ -192,7 +192,7 @@
     private static final float DEFAULT_RELATIVE_VELOCITY = 1f;
     private static final int DEFAULT_ACTIVATION_DELAY = ViewConfiguration.getTapTimeout();
     private static final int DEFAULT_RAMP_UP_DURATION = 2500;
-    // TODO: RAMP_DOWN_DURATION of 500ms?
+    private static final int DEFAULT_RAMP_DOWN_DURATION = 500;
 
     /**
      * Creates a new helper for scrolling the specified target view.
@@ -220,8 +220,7 @@
         setRelativeVelocity(DEFAULT_RELATIVE_VELOCITY, DEFAULT_RELATIVE_VELOCITY);
         setActivationDelay(DEFAULT_ACTIVATION_DELAY);
         setRampUpDuration(DEFAULT_RAMP_UP_DURATION);
-
-        mEnabled = true;
+        setRampDownDuration(DEFAULT_RAMP_DOWN_DURATION);
     }
 
     /**
@@ -232,8 +231,8 @@
      * @return The scroll helper, which may used to chain setter calls.
      */
     public AutoScrollHelper setEnabled(boolean enabled) {
-        if (!enabled) {
-            stop(true);
+        if (mEnabled && !enabled) {
+            requestStop();
         }
 
         mEnabled = enabled;
@@ -255,13 +254,13 @@
      * When enabled, {@link #onTouch} will return true if the helper is
      * currently scrolling and false otherwise.
      *
-     * @param enabled True to exclusively handle touch events during scrolling,
+     * @param exclusive True to exclusively handle touch events during scrolling,
      *            false to allow the target view to receive all touch events.
-     * @see #isExclusiveEnabled()
-     * @see #onTouch(View, MotionEvent)
+     * @return The scroll helper, which may used to chain setter calls.
      */
-    public void setExclusiveEnabled(boolean enabled) {
-        mExclusiveEnabled = enabled;
+    public AutoScrollHelper setExclusive(boolean exclusive) {
+        mExclusive = exclusive;
+        return this;
     }
 
     /**
@@ -270,10 +269,10 @@
      *
      * @return True if exclusive handling of touch events during scrolling is
      *         enabled, false otherwise.
-     * @see #setExclusiveEnabled(boolean)
+     * @see #setExclusive(boolean)
      */
-    public boolean isExclusiveEnabled() {
-        return mExclusiveEnabled;
+    public boolean isExclusive() {
+        return mExclusive;
     }
 
     /**
@@ -424,7 +423,22 @@
      * @return The scroll helper, which may used to chain setter calls.
      */
     public AutoScrollHelper setRampUpDuration(int durationMillis) {
-        mScroller.setDuration(durationMillis);
+        mScroller.setRampUpDuration(durationMillis);
+        return this;
+    }
+
+    /**
+     * Sets the amount of time after de-activation of auto-scrolling that is
+     * takes to slow to a stop.
+     * <p>
+     * Specifying a duration greater than zero prevents sudden jumps in
+     * velocity.
+     *
+     * @param durationMillis The ramp-down duration in milliseconds.
+     * @return The scroll helper, which may used to chain setter calls.
+     */
+    public AutoScrollHelper setRampDownDuration(int durationMillis) {
+        mScroller.setRampDownDuration(durationMillis);
         return this;
     }
 
@@ -432,7 +446,7 @@
      * Handles touch events by activating automatic scrolling, adjusting scroll
      * velocity, or stopping.
      * <p>
-     * If {@link #isExclusiveEnabled()} is false, always returns false so that
+     * If {@link #isExclusive()} is false, always returns false so that
      * the host view may handle touch events. Otherwise, returns true when
      * automatic scrolling is active and false otherwise.
      */
@@ -445,52 +459,135 @@
         final int action = event.getActionMasked();
         switch (action) {
             case MotionEvent.ACTION_DOWN:
-                mDownTime = event.getDownTime();
+                mNeedsCancel = true;
+                mAlreadyDelayed = false;
+                // $FALL-THROUGH$
             case MotionEvent.ACTION_MOVE:
-                final float xValue = getEdgeValue(mRelativeEdges[HORIZONTAL], v.getWidth(),
-                        mMaximumEdges[HORIZONTAL], event.getX());
-                final float yValue = getEdgeValue(mRelativeEdges[VERTICAL], v.getHeight(),
-                        mMaximumEdges[VERTICAL], event.getY());
-                final float maxVelX = constrain(mRelativeVelocity[HORIZONTAL] * mTarget.getWidth(),
-                        mMinimumVelocity[HORIZONTAL], mMaximumVelocity[HORIZONTAL]);
-                final float maxVelY = constrain(mRelativeVelocity[VERTICAL] * mTarget.getHeight(),
-                        mMinimumVelocity[VERTICAL], mMaximumVelocity[VERTICAL]);
-                mScroller.setTargetVelocity(xValue * maxVelX, yValue * maxVelY);
+                final float xTargetVelocity = computeTargetVelocity(
+                        HORIZONTAL, event.getX(), v.getWidth(), mTarget.getWidth());
+                final float yTargetVelocity = computeTargetVelocity(
+                        VERTICAL, event.getY(), v.getHeight(), mTarget.getHeight());
+                mScroller.setTargetVelocity(xTargetVelocity, yTargetVelocity);
 
-                if ((xValue != 0 || yValue != 0) && !mActive) {
-                    mActive = true;
-                    mResetScroller = true;
-                    if (mRunnable == null) {
-                        mRunnable = new AutoScrollRunnable();
-                    }
-                    if (mSkipDelay) {
-                        mTarget.postOnAnimation(mRunnable);
-                    } else {
-                        mSkipDelay = true;
-                        mTarget.postOnAnimationDelayed(mRunnable, mActivationDelay);
-                    }
+                // If the auto scroller was not previously active, but it should
+                // be, then update the state and start animations.
+                if (!mAnimating && shouldAnimate()) {
+                    startAnimating();
                 }
                 break;
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
-                stop(true);
+                requestStop();
                 break;
         }
 
-        return mExclusiveEnabled && mScrolling;
+        return mExclusive && mAnimating;
     }
 
     /**
-     * Override this method to scroll the target view by the specified number
-     * of pixels.
-     * <p>
-     * Returns whether the target view was able to scroll the requested amount.
-     *
-     * @param deltaX The amount to scroll in the X direction, in pixels.
-     * @param deltaY The amount to scroll in the Y direction, in pixels.
-     * @return true if the target view was able to scroll the requested amount.
+     * @return whether the target is able to scroll in the requested direction
      */
-    public abstract boolean onScrollBy(int deltaX, int deltaY);
+    private boolean shouldAnimate() {
+        final ClampedScroller scroller = mScroller;
+        final int verticalDirection = scroller.getVerticalDirection();
+        final int horizontalDirection = scroller.getHorizontalDirection();
+
+        return verticalDirection != 0 && canTargetScrollVertically(verticalDirection)
+                || horizontalDirection != 0 && canTargetScrollHorizontally(horizontalDirection);
+    }
+
+    /**
+     * Starts the scroll animation.
+     */
+    private void startAnimating() {
+        if (mRunnable == null) {
+            mRunnable = new ScrollAnimationRunnable();
+        }
+
+        mAnimating = true;
+        mNeedsReset = true;
+
+        if (!mAlreadyDelayed && mActivationDelay > 0) {
+            mTarget.postOnAnimationDelayed(mRunnable, mActivationDelay);
+        } else {
+            mRunnable.run();
+        }
+
+        // If we start animating again before the user lifts their finger, we
+        // already know it's not a tap and don't need an activation delay.
+        mAlreadyDelayed = true;
+    }
+
+    /**
+     * Requests that the scroll animation slow to a stop. If there is an
+     * activation delay, this may occur between posting the animation and
+     * actually running it.
+     */
+    private void requestStop() {
+        if (mNeedsReset) {
+            // The animation has been posted, but hasn't run yet. Manually
+            // stopping animation will prevent it from running.
+            mAnimating = false;
+        } else {
+            mScroller.requestStop();
+        }
+    }
+
+    private float computeTargetVelocity(
+            int direction, float coordinate, float srcSize, float dstSize) {
+        final float relativeEdge = mRelativeEdges[direction];
+        final float maximumEdge = mMaximumEdges[direction];
+        final float value = getEdgeValue(relativeEdge, srcSize, maximumEdge, coordinate);
+        if (value == 0) {
+            // The edge in this direction is not activated.
+            return 0;
+        }
+
+        final float relativeVelocity = mRelativeVelocity[direction];
+        final float minimumVelocity = mMinimumVelocity[direction];
+        final float maximumVelocity = mMaximumVelocity[direction];
+        final float targetVelocity = relativeVelocity * dstSize;
+
+        // Target velocity is adjusted for interpolated edge position, then
+        // clamped to the minimum and maximum values. Later, this value will be
+        // adjusted for time-based acceleration.
+        if (value > 0) {
+            return constrain(value * targetVelocity, minimumVelocity, maximumVelocity);
+        } else {
+            return -constrain(-value * targetVelocity, minimumVelocity, maximumVelocity);
+        }
+    }
+
+    /**
+     * Override this method to scroll the target view by the specified number of
+     * pixels.
+     *
+     * @param deltaX The number of pixels to scroll by horizontally.
+     * @param deltaY The number of pixels to scroll by vertically.
+     */
+    public abstract void scrollTargetBy(int deltaX, int deltaY);
+
+    /**
+     * Override this method to return whether the target view can be scrolled
+     * horizontally in a certain direction.
+     *
+     * @param direction Negative to check scrolling left, positive to check
+     *            scrolling right.
+     * @return true if the target view is able to horizontally scroll in the
+     *         specified direction.
+     */
+    public abstract boolean canTargetScrollHorizontally(int direction);
+
+    /**
+     * Override this method to return whether the target view can be scrolled
+     * vertically in a certain direction.
+     *
+     * @param direction Negative to check scrolling up, positive to check
+     *            scrolling down.
+     * @return true if the target view is able to vertically scroll in the
+     *         specified direction.
+     */
+    public abstract boolean canTargetScrollVertically(int direction);
 
     /**
      * Returns the interpolated position of a touch point relative to an edge
@@ -531,10 +628,10 @@
             case EDGE_TYPE_INSIDE:
             case EDGE_TYPE_INSIDE_EXTEND:
                 if (current < leading) {
-                    if (current > 0) {
+                    if (current >= 0) {
                         // Movement up to the edge is scaled.
                         return 1f - current / leading;
-                    } else if (mActive && (mEdgeType == EDGE_TYPE_INSIDE_EXTEND)) {
+                    } else if (mAnimating && (mEdgeType == EDGE_TYPE_INSIDE_EXTEND)) {
                         // Movement beyond the edge is always maximum.
                         return 1f;
                     }
@@ -551,6 +648,16 @@
         return 0;
     }
 
+    private static int constrain(int value, int min, int max) {
+        if (value > max) {
+            return max;
+        } else if (value < min) {
+            return min;
+        } else {
+            return value;
+        }
+    }
+
     private static float constrain(float value, float min, float max) {
         if (value > max) {
             return max;
@@ -562,72 +669,48 @@
     }
 
     /**
-     * Stops auto-scrolling immediately, optionally reseting the auto-scrolling
-     * delay.
-     *
-     * @param reset Whether to reset the auto-scrolling delay.
-     */
-    private void stop(boolean reset) {
-        mActive = false;
-        mScrolling = false;
-        mSkipDelay = !reset;
-
-        if (mRunnable != null) {
-            mTarget.removeCallbacks(mRunnable);
-        }
-    }
-
-    /**
      * Sends a {@link MotionEvent#ACTION_CANCEL} event to the target view,
      * canceling any ongoing touch events.
      */
     private void cancelTargetTouch() {
+        final long eventTime = SystemClock.uptimeMillis();
         final MotionEvent cancel = MotionEvent.obtain(
-                mDownTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0);
-        cancel.setAction(MotionEvent.ACTION_CANCEL);
+                eventTime, eventTime, MotionEvent.ACTION_CANCEL, 0, 0, 0);
         mTarget.onTouchEvent(cancel);
         cancel.recycle();
     }
 
-    private class AutoScrollRunnable implements Runnable {
+    private class ScrollAnimationRunnable implements Runnable {
         @Override
         public void run() {
-            if (!mActive) {
+            if (!mAnimating) {
                 return;
             }
 
-            if (mResetScroller) {
-                mResetScroller = false;
+            if (mNeedsReset) {
+                mNeedsReset = false;
                 mScroller.start();
             }
 
-            final View target = mTarget;
             final ClampedScroller scroller = mScroller;
+            if (scroller.isFinished() || !shouldAnimate()) {
+                mAnimating = false;
+                return;
+            }
+
+            if (mNeedsCancel) {
+                mNeedsCancel = false;
+                cancelTargetTouch();
+            }
+
             scroller.computeScrollDelta();
 
             final int deltaX = scroller.getDeltaX();
             final int deltaY = scroller.getDeltaY();
-            if ((deltaX != 0 || deltaY != 0 || !scroller.isFinished())
-                    && onScrollBy(deltaX, deltaY)) {
-                // Update whether we're actively scrolling.
-                final boolean scrolling = (deltaX != 0 || deltaY != 0);
-                if (mScrolling != scrolling) {
-                    mScrolling = scrolling;
+            scrollTargetBy(deltaX,  deltaY);
 
-                    // If we just started actively scrolling, make sure any down
-                    // or move events send to the target view are canceled.
-                    if (mExclusiveEnabled && scrolling) {
-                        cancelTargetTouch();
-                    }
-                }
-
-                // Keep going until the scroller has permanently stopped or the
-                // view can't scroll any more. If the user moves their finger
-                // again, we'll repost the animation.
-                target.postOnAnimation(this);
-            } else {
-                stop(false);
-            }
+            // Keep going until the scroller has permanently stopped.
+            mTarget.postOnAnimation(this);
         }
     }
 
@@ -637,27 +720,39 @@
      * interpolated 1f value after a specified duration.
      */
     private static class ClampedScroller {
-        private final Interpolator mInterpolator = new AccelerateInterpolator();
-
-        private int mDuration;
+        private int mRampUpDuration;
+        private int mRampDownDuration;
         private float mTargetVelocityX;
         private float mTargetVelocityY;
 
         private long mStartTime;
+
         private long mDeltaTime;
         private int mDeltaX;
         private int mDeltaY;
 
+        private long mStopTime;
+        private float mStopValue;
+        private int mEffectiveRampDown;
+
         /**
          * Creates a new ramp-up scroller that reaches full velocity after a
          * specified duration.
          */
         public ClampedScroller() {
-            reset();
+            mStartTime = Long.MIN_VALUE;
+            mStopTime = -1;
+            mDeltaTime = 0;
+            mDeltaX = 0;
+            mDeltaY = 0;
         }
 
-        public void setDuration(int durationMillis) {
-            mDuration = durationMillis;
+        public void setRampUpDuration(int durationMillis) {
+            mRampUpDuration = durationMillis;
+        }
+
+        public void setRampDownDuration(int durationMillis) {
+            mRampDownDuration = durationMillis;
         }
 
         /**
@@ -665,35 +760,53 @@
          */
         public void start() {
             mStartTime = AnimationUtils.currentAnimationTimeMillis();
+            mStopTime = -1;
             mDeltaTime = mStartTime;
-        }
-
-        /**
-         * Returns whether the scroller is finished, which means that its
-         * acceleration is zero.
-         *
-         * @return Whether the scroller is finished.
-         */
-        public boolean isFinished() {
-            if (mTargetVelocityX == 0 && mTargetVelocityY == 0) {
-                return true;
-            }
-            final long currentTime = AnimationUtils.currentAnimationTimeMillis();
-            final long elapsedSinceStart = currentTime - mStartTime;
-            return elapsedSinceStart > mDuration;
-        }
-
-        /**
-         * Stops the scroller and resets its values.
-         */
-        public void reset() {
-            mStartTime = -1;
-            mDeltaTime = -1;
+            mStopValue = 0.5f;
             mDeltaX = 0;
             mDeltaY = 0;
         }
 
         /**
+         * Stops the scroller at the current animation time.
+         */
+        public void requestStop() {
+            final long currentTime = AnimationUtils.currentAnimationTimeMillis();
+            mEffectiveRampDown = constrain((int) (currentTime - mStartTime), 0, mRampDownDuration);
+            mStopValue = getValueAt(currentTime);
+            mStopTime = currentTime;
+        }
+
+        public boolean isFinished() {
+            return mStopTime > 0
+                    && AnimationUtils.currentAnimationTimeMillis() > mStopTime + mEffectiveRampDown;
+        }
+
+        private float getValueAt(long currentTime) {
+            if (currentTime < mStartTime) {
+                return 0f;
+            } else if (mStopTime < 0 || currentTime < mStopTime) {
+                final long elapsedSinceStart = currentTime - mStartTime;
+                return 0.5f * constrain(elapsedSinceStart / (float) mRampUpDuration, 0, 1);
+            } else {
+                final long elapsedSinceEnd = currentTime - mStopTime;
+                return (1 - mStopValue) + mStopValue
+                        * constrain(elapsedSinceEnd / (float) mEffectiveRampDown, 0, 1);
+            }
+        }
+
+        /**
+         * Interpolates the value along a parabolic curve corresponding to the equation
+         * <code>y = -4x * (x-1)</code>.
+         *
+         * @param value The value to interpolate, between 0 and 1.
+         * @return the interpolated value, between 0 and 1.
+         */
+        private float interpolateValue(float value) {
+            return -4 * value * value + 4 * value;
+        }
+
+        /**
          * Computes the current scroll deltas. This usually only be called after
          * starting the scroller with {@link #start()}.
          *
@@ -701,18 +814,13 @@
          * @see #getDeltaY()
          */
         public void computeScrollDelta() {
-            final long currentTime = AnimationUtils.currentAnimationTimeMillis();
-            final long elapsedSinceStart = currentTime - mStartTime;
-            final float value;
-            if (mStartTime < 0) {
-                value = 0f;
-            } else if (elapsedSinceStart < mDuration) {
-                value = (float) elapsedSinceStart / mDuration;
-            } else {
-                value = 1f;
+            if (mDeltaTime == 0) {
+                throw new RuntimeException("Cannot compute scroll delta before calling start()");
             }
 
-            final float scale = mInterpolator.getInterpolation(value);
+            final long currentTime = AnimationUtils.currentAnimationTimeMillis();
+            final float value = getValueAt(currentTime);
+            final float scale = interpolateValue(value);
             final long elapsedSinceDelta = currentTime - mDeltaTime;
 
             mDeltaTime = currentTime;
@@ -731,6 +839,14 @@
             mTargetVelocityY = y;
         }
 
+        public int getHorizontalDirection() {
+            return (int) (mTargetVelocityX / Math.abs(mTargetVelocityX));
+        }
+
+        public int getVerticalDirection() {
+            return (int) (mTargetVelocityY / Math.abs(mTargetVelocityY));
+        }
+
         /**
          * The distance traveled in the X-coordinate computed by the last call
          * to {@link #computeScrollDelta()}.
@@ -749,20 +865,60 @@
     }
 
     /**
-     * Implementation of {@link AutoScrollHelper} that knows how to scroll
-     * generic {@link AbsListView}s.
+     * An implementation of {@link AutoScrollHelper} that knows how to scroll
+     * through an {@link AbsListView}.
      */
     public static class AbsListViewAutoScroller extends AutoScrollHelper {
         private final AbsListView mTarget;
 
         public AbsListViewAutoScroller(AbsListView target) {
             super(target);
+
             mTarget = target;
         }
 
         @Override
-        public boolean onScrollBy(int deltaX, int deltaY) {
-            return mTarget.scrollListBy(deltaY);
+        public void scrollTargetBy(int deltaX, int deltaY) {
+            mTarget.scrollListBy(deltaY);
+        }
+
+        @Override
+        public boolean canTargetScrollHorizontally(int direction) {
+            // List do not scroll horizontally.
+            return false;
+        }
+
+        @Override
+        public boolean canTargetScrollVertically(int direction) {
+            final AbsListView target = mTarget;
+            final int itemCount = target.getCount();
+            final int childCount = target.getChildCount();
+            final int firstPosition = target.getFirstVisiblePosition();
+            final int lastPosition = firstPosition + childCount;
+
+            if (direction > 0) {
+                // Are we already showing the entire last item?
+                if (lastPosition >= itemCount) {
+                    final View lastView = target.getChildAt(childCount - 1);
+                    if (lastView.getBottom() <= target.getHeight()) {
+                        return false;
+                    }
+                }
+            } else if (direction < 0) {
+                // Are we already showing the entire first item?
+                if (firstPosition <= 0) {
+                    final View firstView = target.getChildAt(0);
+                    if (firstView.getTop() >= 0) {
+                        return false;
+                    }
+                }
+            } else {
+                // The behavior for direction 0 is undefined and we can return
+                // whatever we want.
+                return false;
+            }
+
+            return true;
         }
     }
 }
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index fd9fbae..eea9ee1 100644
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -5,6 +5,7 @@
 #include "GraphicsJNI.h"

 #include "SkDither.h"

 #include "SkUnPreMultiply.h"

+#include "SkStream.h"

 

 #include <binder/Parcel.h>

 #include "android_os_Parcel.h"

diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index c433874..16beb02 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -202,7 +202,7 @@
 // since we "may" create a purgeable imageref, we require the stream be ref'able
 // i.e. dynamically allocated, since its lifetime may exceed the current stack
 // frame.
-static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding,
+static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding,
         jobject options, bool allowPurgeable, bool forcePurgeable = false) {
 
     int sampleSize = 1;
@@ -459,26 +459,17 @@
         jobject padding, jobject options) {
 
     jobject bitmap = NULL;
-    SkStream* stream = CreateJavaInputStreamAdaptor(env, is, storage, 0);
+    SkAutoTUnref<SkStreamRewindable> stream(GetRewindableStream(env, is, storage));
 
-    if (stream) {
+    if (stream.get()) {
         // for now we don't allow purgeable with java inputstreams
+        // FIXME: GetRewindableStream may have made a copy, in which case
+        // purgeable should be allowed.
         bitmap = doDecode(env, stream, padding, options, false, false);
-        stream->unref();
     }
     return bitmap;
 }
 
-static ssize_t getFDSize(int fd) {
-    off64_t curr = ::lseek64(fd, 0, SEEK_CUR);
-    if (curr < 0) {
-        return 0;
-    }
-    size_t size = ::lseek(fd, 0, SEEK_END);
-    ::lseek64(fd, curr, SEEK_SET);
-    return size;
-}
-
 static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fileDescriptor,
         jobject padding, jobject bitmapFactoryOptions) {
 
@@ -512,44 +503,16 @@
     return doDecode(env, stream, padding, bitmapFactoryOptions, weOwnTheFD);
 }
 
-/*  make a deep copy of the asset, and return it as a stream, or NULL if there
-    was an error.
- */
-static SkStream* copyAssetToStream(Asset* asset) {
-    // if we could "ref/reopen" the asset, we may not need to copy it here
-    off64_t size = asset->seek(0, SEEK_SET);
-    if ((off64_t)-1 == size) {
-        SkDebugf("---- copyAsset: asset rewind failed\n");
-        return NULL;
-    }
-
-    size = asset->getLength();
-    if (size <= 0) {
-        SkDebugf("---- copyAsset: asset->getLength() returned %d\n", size);
-        return NULL;
-    }
-
-    SkStream* stream = new SkMemoryStream(size);
-    void* data = const_cast<void*>(stream->getMemoryBase());
-    off64_t len = asset->read(data, size);
-    if (len != size) {
-        SkDebugf("---- copyAsset: asset->read(%d) returned %d\n", size, len);
-        delete stream;
-        stream = NULL;
-    }
-    return stream;
-}
-
 static jobject nativeDecodeAsset(JNIEnv* env, jobject clazz, jint native_asset,
         jobject padding, jobject options) {
 
-    SkStream* stream;
+    SkStreamRewindable* stream;
     Asset* asset = reinterpret_cast<Asset*>(native_asset);
     bool forcePurgeable = optionsPurgeable(env, options);
     if (forcePurgeable) {
         // if we could "ref/reopen" the asset, we may not need to copy it here
         // and we could assume optionsShareable, since assets are always RO
-        stream = copyAssetToStream(asset);
+        stream = CopyAssetToStream(asset);
         if (stream == NULL) {
             return NULL;
         }
@@ -559,7 +522,7 @@
         stream = new AssetStreamAdaptor(asset);
     }
     SkAutoUnref aur(stream);
-    return doDecode(env, stream, padding, options, true, forcePurgeable);
+    return doDecode(env, stream, padding, options, forcePurgeable, forcePurgeable);
 }
 
 static jobject nativeDecodeByteArray(JNIEnv* env, jobject, jbyteArray byteArray,
@@ -572,7 +535,7 @@
      */
     bool purgeable = optionsPurgeable(env, options) && !optionsJustBounds(env, options);
     AutoJavaByteArray ar(env, byteArray);
-    SkStream* stream = new SkMemoryStream(ar.ptr() + offset, length, purgeable);
+    SkMemoryStream* stream = new SkMemoryStream(ar.ptr() + offset, length, purgeable);
     SkAutoUnref aur(stream);
     return doDecode(env, stream, NULL, options, purgeable);
 }
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index 8867a11..ee47ac4 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -76,27 +76,6 @@
     int fHeight;
 };
 
-static SkMemoryStream* buildSkMemoryStream(SkStream *stream) {
-    size_t bufferSize = 4096;
-    size_t streamLen = 0;
-    size_t len;
-    char* data = (char*)sk_malloc_throw(bufferSize);
-
-    while ((len = stream->read(data + streamLen,
-                    bufferSize - streamLen)) != 0) {
-        streamLen += len;
-        if (streamLen == bufferSize) {
-            bufferSize *= 2;
-            data = (char*)sk_realloc_throw(data, bufferSize);
-        }
-    }
-    data = (char*)sk_realloc_throw(data, streamLen);
-
-    SkMemoryStream* streamMem = new SkMemoryStream();
-    streamMem->setMemoryOwned(data, streamLen);
-    return streamMem;
-}
-
 static jobject createBitmapRegionDecoder(JNIEnv* env, SkStream* stream) {
     SkImageDecoder* decoder = SkImageDecoder::Factory(stream);
     int width, height;
@@ -161,14 +140,12 @@
                                   jbyteArray storage, // byte[]
                                   jboolean isShareable) {
     jobject brd = NULL;
-    SkStream* stream = CreateJavaInputStreamAdaptor(env, is, storage, 1024);
+    // for now we don't allow shareable with java inputstreams
+    SkStreamRewindable* stream = CopyJavaInputStream(env, is, storage);
 
     if (stream) {
-        // for now we don't allow shareable with java inputstreams
-        SkMemoryStream* mStream = buildSkMemoryStream(stream);
-        brd = createBitmapRegionDecoder(env, mStream);
-        SkSafeUnref(mStream); // the decoder now holds a reference
-        stream->unref();
+        brd = createBitmapRegionDecoder(env, stream);
+        stream->unref(); // the decoder now holds a reference
     }
     return brd;
 }
@@ -176,14 +153,14 @@
 static jobject nativeNewInstanceFromAsset(JNIEnv* env, jobject clazz,
                                  jint native_asset, // Asset
                                  jboolean isShareable) {
-    SkStream* stream, *assStream;
     Asset* asset = reinterpret_cast<Asset*>(native_asset);
-    assStream = new AssetStreamAdaptor(asset);
-    stream = buildSkMemoryStream(assStream);
-    assStream->unref();
+    SkAutoTUnref<SkMemoryStream> stream(CopyAssetToStream(asset));
+    if (NULL == stream.get()) {
+        return NULL;
+    }
 
-    jobject brd = createBitmapRegionDecoder(env, stream);
-    SkSafeUnref(stream); // the decoder now holds a reference
+    jobject brd = createBitmapRegionDecoder(env, stream.get());
+    // The decoder now holds a reference to stream.
     return brd;
 }
 
diff --git a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
index aa4cbde..d264392 100644
--- a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
+++ b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
@@ -1,28 +1,83 @@
 #include "CreateJavaOutputStreamAdaptor.h"
+#include "JNIHelp.h"
+#include "SkData.h"
+#include "SkRefCnt.h"
+#include "SkStream.h"
+#include "SkTypes.h"
+#include "Utils.h"
+#include <androidfw/Asset.h>
 
 #define RETURN_NULL_IF_NULL(value) \
     do { if (!(value)) { SkASSERT(0); return NULL; } } while (false)
 
+#define RETURN_ZERO_IF_NULL(value) \
+    do { if (!(value)) { SkASSERT(0); return 0; } } while (false)
+
 static jmethodID    gInputStream_resetMethodID;
 static jmethodID    gInputStream_markMethodID;
-static jmethodID    gInputStream_availableMethodID;
+static jmethodID    gInputStream_markSupportedMethodID;
 static jmethodID    gInputStream_readMethodID;
 static jmethodID    gInputStream_skipMethodID;
 
+class RewindableJavaStream;
+
+/**
+ *  Non-rewindable wrapper for a Java InputStream.
+ */
 class JavaInputStreamAdaptor : public SkStream {
 public:
     JavaInputStreamAdaptor(JNIEnv* env, jobject js, jbyteArray ar)
         : fEnv(env), fJavaInputStream(js), fJavaByteArray(ar) {
         SkASSERT(ar);
-        fCapacity   = env->GetArrayLength(ar);
+        fCapacity = env->GetArrayLength(ar);
         SkASSERT(fCapacity > 0);
-        fBytesRead  = 0;
+        fBytesRead = 0;
+        fIsAtEnd = false;
     }
 
-	virtual bool rewind() {
+    virtual size_t read(void* buffer, size_t size) {
+        JNIEnv* env = fEnv;
+        if (NULL == buffer) {
+            if (0 == size) {
+                return 0;
+            } else {
+                /*  InputStream.skip(n) can return <=0 but still not be at EOF
+                    If we see that value, we need to call read(), which will
+                    block if waiting for more data, or return -1 at EOF
+                 */
+                size_t amountSkipped = 0;
+                do {
+                    size_t amount = this->doSkip(size - amountSkipped);
+                    if (0 == amount) {
+                        char tmp;
+                        amount = this->doRead(&tmp, 1);
+                        if (0 == amount) {
+                            // if read returned 0, we're at EOF
+                            fIsAtEnd = true;
+                            break;
+                        }
+                    }
+                    amountSkipped += amount;
+                } while (amountSkipped < size);
+                return amountSkipped;
+            }
+        }
+        return this->doRead(buffer, size);
+    }
+
+    virtual bool isAtEnd() const {
+        return fIsAtEnd;
+    }
+
+private:
+    // Does not override rewind, since a JavaInputStreamAdaptor's interface
+    // does not support rewinding. RewindableJavaStream, which is a friend,
+    // will be able to call this method to rewind.
+    bool doRewind() {
         JNIEnv* env = fEnv;
 
         fBytesRead = 0;
+        fIsAtEnd = false;
 
         env->CallVoidMethod(fJavaInputStream, gInputStream_resetMethodID);
         if (env->ExceptionCheck()) {
@@ -53,6 +108,7 @@
             }
 
             if (n < 0) { // n == 0 should not be possible, see InputStream read() specifications.
+                fIsAtEnd = true;
                 break;  // eof
             }
 
@@ -92,58 +148,19 @@
         return (size_t)skipped;
     }
 
-    size_t doSize() {
-        JNIEnv* env = fEnv;
-        jint avail = env->CallIntMethod(fJavaInputStream,
-                                        gInputStream_availableMethodID);
-        if (env->ExceptionCheck()) {
-            env->ExceptionDescribe();
-            env->ExceptionClear();
-            SkDebugf("------- available threw an exception\n");
-            avail = 0;
-        }
-        return avail;
-    }
-
-	virtual size_t read(void* buffer, size_t size) {
-        JNIEnv* env = fEnv;
-        if (NULL == buffer) {
-            if (0 == size) {
-                return this->doSize();
-            } else {
-                /*  InputStream.skip(n) can return <=0 but still not be at EOF
-                    If we see that value, we need to call read(), which will
-                    block if waiting for more data, or return -1 at EOF
-                 */
-                size_t amountSkipped = 0;
-                do {
-                    size_t amount = this->doSkip(size - amountSkipped);
-                    if (0 == amount) {
-                        char tmp;
-                        amount = this->doRead(&tmp, 1);
-                        if (0 == amount) {
-                            // if read returned 0, we're at EOF
-                            break;
-                        }
-                    }
-                    amountSkipped += amount;
-                } while (amountSkipped < size);
-                return amountSkipped;
-            }
-        }
-        return this->doRead(buffer, size);
-    }
-
-private:
     JNIEnv*     fEnv;
     jobject     fJavaInputStream;   // the caller owns this object
     jbyteArray  fJavaByteArray;     // the caller owns this object
     size_t      fCapacity;
     size_t      fBytesRead;
+    bool        fIsAtEnd;
+
+    // Allows access to doRewind and fBytesRead.
+    friend class RewindableJavaStream;
 };
 
 SkStream* CreateJavaInputStreamAdaptor(JNIEnv* env, jobject stream,
-                                       jbyteArray storage, int markSize) {
+                                       jbyteArray storage) {
     static bool gInited;
 
     if (!gInited) {
@@ -154,8 +171,8 @@
                                                            "reset", "()V");
         gInputStream_markMethodID       = env->GetMethodID(inputStream_Clazz,
                                                            "mark", "(I)V");
-        gInputStream_availableMethodID  = env->GetMethodID(inputStream_Clazz,
-                                                           "available", "()I");
+        gInputStream_markSupportedMethodID = env->GetMethodID(inputStream_Clazz,
+                                                              "markSupported", "()Z");
         gInputStream_readMethodID       = env->GetMethodID(inputStream_Clazz,
                                                            "read", "([BII)I");
         gInputStream_skipMethodID       = env->GetMethodID(inputStream_Clazz,
@@ -163,18 +180,168 @@
 
         RETURN_NULL_IF_NULL(gInputStream_resetMethodID);
         RETURN_NULL_IF_NULL(gInputStream_markMethodID);
-        RETURN_NULL_IF_NULL(gInputStream_availableMethodID);
+        RETURN_NULL_IF_NULL(gInputStream_markSupportedMethodID);
         RETURN_NULL_IF_NULL(gInputStream_readMethodID);
         RETURN_NULL_IF_NULL(gInputStream_skipMethodID);
 
         gInited = true;
     }
 
-    if (markSize) {
-        env->CallVoidMethod(stream, gInputStream_markMethodID, markSize);
+    return new JavaInputStreamAdaptor(env, stream, storage);
+}
+
+
+static SkMemoryStream* adaptor_to_mem_stream(SkStream* adaptor) {
+    SkASSERT(adaptor != NULL);
+    SkDynamicMemoryWStream wStream;
+    const int bufferSize = 256 * 1024; // 256 KB, same as ViewStateSerializer.
+    uint8_t buffer[bufferSize];
+    do {
+        size_t bytesRead = adaptor->read(buffer, bufferSize);
+        wStream.write(buffer, bytesRead);
+    } while (!adaptor->isAtEnd());
+    SkAutoTUnref<SkData> data(wStream.copyToData());
+    return new SkMemoryStream(data.get());
+}
+
+SkStreamRewindable* CopyJavaInputStream(JNIEnv* env, jobject stream,
+                                        jbyteArray storage) {
+    SkAutoTUnref<SkStream> adaptor(CreateJavaInputStreamAdaptor(env, stream, storage));
+    if (NULL == adaptor.get()) {
+        return NULL;
+    }
+    return adaptor_to_mem_stream(adaptor.get());
+}
+
+/**
+ *  Wrapper for a Java InputStream which is rewindable and
+ *  has a length.
+ */
+class RewindableJavaStream : public SkStreamRewindable {
+public:
+    // RewindableJavaStream takes ownership of adaptor.
+    RewindableJavaStream(JavaInputStreamAdaptor* adaptor, size_t length)
+        : fAdaptor(adaptor)
+        , fLength(length) {
+        SkASSERT(fAdaptor != NULL);
     }
 
-    return new JavaInputStreamAdaptor(env, stream, storage);
+    virtual ~RewindableJavaStream() {
+        fAdaptor->unref();
+    }
+
+    virtual bool rewind() {
+        return fAdaptor->doRewind();
+    }
+
+    virtual size_t read(void* buffer, size_t size) {
+        return fAdaptor->read(buffer, size);
+    }
+
+    virtual bool isAtEnd() const {
+        return fAdaptor->isAtEnd();
+    }
+
+    virtual size_t getLength() const {
+        return fLength;
+    }
+
+    virtual bool hasLength() const {
+        return true;
+    }
+
+    virtual SkStreamRewindable* duplicate() const {
+        // Duplicating this stream requires rewinding and
+        // reading, which modify this Stream (and could
+        // fail, leaving this one invalid).
+        SkASSERT(false);
+        return NULL;
+    }
+
+private:
+    JavaInputStreamAdaptor* fAdaptor;
+    const size_t            fLength;
+};
+
+/**
+ *  If jstream is a ByteArrayInputStream, return its remaining length. Otherwise
+ *  return 0.
+ */
+static size_t get_length_from_byte_array_stream(JNIEnv* env, jobject jstream) {
+    static jclass byteArrayInputStream_Clazz;
+    static jfieldID countField;
+    static jfieldID posField;
+
+    byteArrayInputStream_Clazz = env->FindClass("java/io/ByteArrayInputStream");
+    RETURN_ZERO_IF_NULL(byteArrayInputStream_Clazz);
+
+    countField = env->GetFieldID(byteArrayInputStream_Clazz, "count", "I");
+    RETURN_ZERO_IF_NULL(byteArrayInputStream_Clazz);
+    posField = env->GetFieldID(byteArrayInputStream_Clazz, "pos", "I");
+    RETURN_ZERO_IF_NULL(byteArrayInputStream_Clazz);
+
+    if (env->IsInstanceOf(jstream, byteArrayInputStream_Clazz)) {
+        // Return the remaining length, to keep the same behavior of using the rest of the
+        // stream.
+        return env->GetIntField(jstream, countField) - env->GetIntField(jstream, posField);
+    }
+    return 0;
+}
+
+/**
+ *  If jstream is a class that has a length, return it. Otherwise
+ *  return 0.
+ *  Only checks for a set of subclasses.
+ */
+static size_t get_length_if_supported(JNIEnv* env, jobject jstream) {
+    size_t len = get_length_from_byte_array_stream(env, jstream);
+    if (len > 0) {
+        return len;
+    }
+    return 0;
+}
+
+SkStreamRewindable* GetRewindableStream(JNIEnv* env, jobject stream,
+                                        jbyteArray storage) {
+    SkAutoTUnref<SkStream> adaptor(CreateJavaInputStreamAdaptor(env, stream, storage));
+    if (NULL == adaptor.get()) {
+        return NULL;
+    }
+
+    const size_t length = get_length_if_supported(env, stream);
+    if (length > 0 && env->CallBooleanMethod(stream, gInputStream_markSupportedMethodID)) {
+        // Set the readLimit for mark to the end of the stream, so it can
+        // be rewound regardless of how much has been read.
+        env->CallVoidMethod(stream, gInputStream_markMethodID, length);
+        // RewindableJavaStream will unref adaptor when it is destroyed.
+        return new RewindableJavaStream(static_cast<JavaInputStreamAdaptor*>(adaptor.detach()),
+                                        length);
+    }
+
+    return adaptor_to_mem_stream(adaptor.get());
+}
+
+android::AssetStreamAdaptor* CheckForAssetStream(JNIEnv* env, jobject jstream) {
+    static jclass assetInputStream_Clazz;
+    static jmethodID getAssetIntMethodID;
+
+    assetInputStream_Clazz = env->FindClass("android/content/res/AssetManager$AssetInputStream");
+    RETURN_NULL_IF_NULL(assetInputStream_Clazz);
+
+    getAssetIntMethodID = env->GetMethodID(assetInputStream_Clazz, "getAssetInt", "()I");
+    RETURN_NULL_IF_NULL(getAssetIntMethodID);
+
+    if (!env->IsInstanceOf(jstream, assetInputStream_Clazz)) {
+        return NULL;
+    }
+
+    jint jasset = env->CallIntMethod(jstream, getAssetIntMethodID);
+    android::Asset* a = reinterpret_cast<android::Asset*>(jasset);
+    if (NULL == a) {
+        jniThrowNullPointerException(env, "NULL native asset");
+        return NULL;
+    }
+    return new android::AssetStreamAdaptor(a);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.h b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.h
index c34c96a..fcc0c9a 100644
--- a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.h
+++ b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.h
@@ -3,11 +3,68 @@
 
 //#include <android_runtime/AndroidRuntime.h>
 #include "jni.h"
-#include "SkStream.h"
 
+namespace android {
+    class AssetStreamAdaptor;
+}
+
+class SkMemoryStream;
+class SkStream;
+class SkStreamRewindable;
+class SkWStream;
+
+/**
+ *  Return an adaptor from a Java InputStream to an SkStream.
+ *  @param env JNIEnv object.
+ *  @param stream Pointer to Java InputStream.
+ *  @param storage Java byte array for retrieving data from the
+ *      Java InputStream.
+ *  @return SkStream Simple subclass of SkStream which supports its
+ *      basic methods like reading. Only valid until the calling
+ *      function returns, since the Java InputStream is not managed
+ *      by the SkStream.
+ */
 SkStream* CreateJavaInputStreamAdaptor(JNIEnv* env, jobject stream,
-                                       jbyteArray storage, int markSize = 0);
+                                       jbyteArray storage);
+
+/**
+ *  Copy a Java InputStream.
+ *  @param env JNIEnv object.
+ *  @param stream Pointer to Java InputStream.
+ *  @param storage Java byte array for retrieving data from the
+ *      Java InputStream.
+ *  @return SkStreamRewindable The data in stream will be copied
+ *      to a new SkStreamRewindable.
+ */
+SkStreamRewindable* CopyJavaInputStream(JNIEnv* env, jobject stream,
+                                        jbyteArray storage);
+
+/**
+ *  Get a rewindable stream from a Java InputStream.
+ *  @param env JNIEnv object.
+ *  @param stream Pointer to Java InputStream.
+ *  @param storage Java byte array for retrieving data from the
+ *      Java InputStream.
+ *  @return SkStreamRewindable Either a wrapper around the Java
+ *      InputStream, if possible, or a copy which is rewindable.
+ *      Since it may be a wrapper, must not be used after the
+ *      caller returns, like the result of CreateJavaInputStreamAdaptor.
+ */
+SkStreamRewindable* GetRewindableStream(JNIEnv* env, jobject stream,
+                                        jbyteArray storage);
+
+/**
+ *  If the Java InputStream is an AssetInputStream, return an adaptor.
+ *  This should not be used after the calling function returns, since
+ *  the caller may close the asset. Returns NULL if the stream is
+ *  not an AssetInputStream.
+ *  @param env JNIEnv object.
+ *  @param stream Pointer to Java InputStream.
+ *  @return AssetStreamAdaptor representing the InputStream, or NULL.
+ *      Must not be held onto.
+ */
+android::AssetStreamAdaptor* CheckForAssetStream(JNIEnv* env, jobject stream);
+
 SkWStream* CreateJavaOutputStreamAdaptor(JNIEnv* env, jobject stream,
                                          jbyteArray storage);
-
 #endif
diff --git a/core/jni/android/graphics/Movie.cpp b/core/jni/android/graphics/Movie.cpp
index 4f64ff8..2eae841 100644
--- a/core/jni/android/graphics/Movie.cpp
+++ b/core/jni/android/graphics/Movie.cpp
@@ -1,8 +1,10 @@
+#include "ScopedLocalRef.h"
 #include "SkMovie.h"
 #include "SkStream.h"
 #include "GraphicsJNI.h"
 #include "SkTemplates.h"
 #include "SkUtils.h"
+#include "Utils.h"
 #include "CreateJavaOutputStreamAdaptor.h"
 
 #include <androidfw/Asset.h>
@@ -83,9 +85,14 @@
 
     NPE_CHECK_RETURN_ZERO(env, istream);
 
-    // what is the lifetime of the array? Can the skstream hold onto it?
-    jbyteArray byteArray = env->NewByteArray(16*1024);
-    SkStream* strm = CreateJavaInputStreamAdaptor(env, istream, byteArray);
+    SkStreamRewindable* strm = CheckForAssetStream(env, istream);
+    jbyteArray byteArray = NULL;
+    ScopedLocalRef<jbyteArray> scoper(env, NULL);
+    if (NULL == strm) {
+        byteArray = env->NewByteArray(16*1024);
+        scoper.reset(byteArray);
+        strm = GetRewindableStream(env, istream, byteArray);
+    }
     if (NULL == strm) {
         return 0;
     }
diff --git a/core/jni/android/graphics/Picture.cpp b/core/jni/android/graphics/Picture.cpp
index 9c02219..fcf22b8 100644
--- a/core/jni/android/graphics/Picture.cpp
+++ b/core/jni/android/graphics/Picture.cpp
@@ -20,6 +20,7 @@
 
 #include "SkCanvas.h"
 #include "SkPicture.h"
+#include "SkStream.h"
 #include "SkTemplates.h"
 #include "CreateJavaOutputStreamAdaptor.h"
 
diff --git a/core/jni/android/graphics/Utils.cpp b/core/jni/android/graphics/Utils.cpp
index cf6977e..b7d1f3a 100644
--- a/core/jni/android/graphics/Utils.cpp
+++ b/core/jni/android/graphics/Utils.cpp
@@ -28,12 +28,28 @@
     return true;
 }
 
+size_t AssetStreamAdaptor::getLength() const {
+    return fAsset->getLength();
+}
+
+bool AssetStreamAdaptor::isAtEnd() const {
+    return fAsset->getRemainingLength() == 0;
+}
+
+SkStreamRewindable* AssetStreamAdaptor::duplicate() const {
+    SkASSERT(false);
+    // Cannot create a duplicate, since each AssetStreamAdaptor
+    // would be modifying the Asset.
+    //return new AssetStreamAdaptor(fAsset);
+    return NULL;
+}
+
 size_t AssetStreamAdaptor::read(void* buffer, size_t size) {
     ssize_t amount;
 
     if (NULL == buffer) {
-        if (0 == size) {  // caller is asking us for our total length
-            return fAsset->getLength();
+        if (0 == size) {
+            return 0;
         }
         // asset->seek returns new total offset
         // we want to return amount that was skipped
@@ -62,6 +78,34 @@
     return amount;
 }
 
+SkMemoryStream* android::CopyAssetToStream(Asset* asset) {
+    if (NULL == asset) {
+        return NULL;
+    }
+
+    off64_t size = asset->seek(0, SEEK_SET);
+    if ((off64_t)-1 == size) {
+        SkDebugf("---- copyAsset: asset rewind failed\n");
+        return NULL;
+    }
+
+    size = asset->getLength();
+    if (size <= 0) {
+        SkDebugf("---- copyAsset: asset->getLength() returned %d\n", size);
+        return NULL;
+    }
+
+    SkMemoryStream* stream = new SkMemoryStream(size);
+    void* data = const_cast<void*>(stream->getMemoryBase());
+    off64_t len = asset->read(data, size);
+    if (len != size) {
+        SkDebugf("---- copyAsset: asset->read(%d) returned %d\n", size, len);
+        delete stream;
+        stream = NULL;
+    }
+    return stream;
+}
+
 jobject android::nullObjectReturn(const char msg[]) {
     if (msg) {
         SkDebugf("--- %s\n", msg);
diff --git a/core/jni/android/graphics/Utils.h b/core/jni/android/graphics/Utils.h
index 75ceaa2..a1ac72a 100644
--- a/core/jni/android/graphics/Utils.h
+++ b/core/jni/android/graphics/Utils.h
@@ -26,16 +26,27 @@
 
 namespace android {
 
-class AssetStreamAdaptor : public SkStream {
+class AssetStreamAdaptor : public SkStreamRewindable {
 public:
     AssetStreamAdaptor(Asset* a) : fAsset(a) {}
     virtual bool rewind();
     virtual size_t read(void* buffer, size_t size);
+    virtual bool hasLength() const { return true; }
+    virtual size_t getLength() const;
+    virtual bool isAtEnd() const;
 
+    virtual SkStreamRewindable* duplicate() const;
 private:
     Asset*  fAsset;
 };
 
+/**
+ *  Make a deep copy of the asset, and return it as a stream, or NULL if there
+ *  was an error.
+ *  FIXME: If we could "ref/reopen" the asset, we may not need to copy it here.
+ */
+
+SkMemoryStream* CopyAssetToStream(Asset*);
 
 /** Restore the file descriptor's offset in our destructor
  */
diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp
index ae0113b..4290a6e 100644
--- a/core/jni/android_hardware_SensorManager.cpp
+++ b/core/jni/android_hardware_SensorManager.cpp
@@ -31,6 +31,7 @@
 static struct {
     jclass clazz;
     jmethodID dispatchSensorEvent;
+    jmethodID dispatchFlushCompleteEvent;
 } gBaseEventQueueClassInfo;
 
 namespace android {
@@ -46,6 +47,8 @@
     jfieldID    resolution;
     jfieldID    power;
     jfieldID    minDelay;
+    jfieldID    fifoReservedEventCount;
+    jfieldID    fifoMaxEventCount;
 } gSensorOffsets;
 
 
@@ -67,6 +70,9 @@
     sensorOffsets.resolution  = _env->GetFieldID(sensorClass, "mResolution","F");
     sensorOffsets.power       = _env->GetFieldID(sensorClass, "mPower",     "F");
     sensorOffsets.minDelay    = _env->GetFieldID(sensorClass, "mMinDelay",  "I");
+    sensorOffsets.fifoReservedEventCount =
+            _env->GetFieldID(sensorClass, "mFifoReservedEventCount",  "I");
+    sensorOffsets.fifoMaxEventCount = _env->GetFieldID(sensorClass, "mFifoMaxEventCount",  "I");
 }
 
 static jint
@@ -78,7 +84,7 @@
     size_t count = mgr.getSensorList(&sensorList);
     if (size_t(next) >= count)
         return -1;
-    
+
     Sensor const* const list = sensorList[next];
     const SensorOffsets& sensorOffsets(gSensorOffsets);
     jstring name = env->NewStringUTF(list->getName().string());
@@ -92,7 +98,9 @@
     env->SetFloatField(sensor, sensorOffsets.resolution, list->getResolution());
     env->SetFloatField(sensor, sensorOffsets.power,      list->getPowerUsage());
     env->SetIntField(sensor, sensorOffsets.minDelay,     list->getMinDelay());
-    
+    env->SetIntField(sensor, sensorOffsets.fifoReservedEventCount,
+                     list->getFifoReservedEventCount());
+    env->SetIntField(sensor, sensorOffsets.fifoMaxEventCount, list->getFifoMaxEventCount());
     next++;
     return size_t(next) < count ? next : 0;
 }
@@ -150,12 +158,20 @@
                     env->SetFloatArrayRegion(mScratch, 0, 16, buffer[i].data);
                 }
 
-                env->CallVoidMethod(mReceiverObject,
-                        gBaseEventQueueClassInfo.dispatchSensorEvent,
-                        buffer[i].sensor,
-                        mScratch,
-                        buffer[i].vector.status,
-                        buffer[i].timestamp);
+                if (buffer[i].type == SENSOR_TYPE_META_DATA) {
+                    // This is a flush complete sensor event. Call dispatchFlushCompleteEvent
+                    // method.
+                    env->CallVoidMethod(mReceiverObject,
+                                        gBaseEventQueueClassInfo.dispatchFlushCompleteEvent,
+                                        buffer[i].meta_data.sensor);
+                } else {
+                    env->CallVoidMethod(mReceiverObject,
+                                        gBaseEventQueueClassInfo.dispatchSensorEvent,
+                                        buffer[i].sensor,
+                                        mScratch,
+                                        buffer[i].vector.status,
+                                        buffer[i].timestamp);
+                }
 
                 if (env->ExceptionCheck()) {
                     ALOGE("Exception dispatching input event.");
@@ -186,9 +202,11 @@
     return jint(receiver.get());
 }
 
-static jint nativeEnableSensor(JNIEnv *env, jclass clazz, jint eventQ, jint handle, jint us) {
+static jint nativeEnableSensor(JNIEnv *env, jclass clazz, jint eventQ, jint handle, jint rate_us,
+                               jint maxBatchReportLatency, jint reservedFlags) {
     sp<Receiver> receiver(reinterpret_cast<Receiver *>(eventQ));
-    return receiver->getSensorEventQueue()->enableSensor(handle, us);
+    return receiver->getSensorEventQueue()->enableSensor(handle, rate_us, maxBatchReportLatency,
+                                                         reservedFlags);
 }
 
 static jint nativeDisableSensor(JNIEnv *env, jclass clazz, jint eventQ, jint handle) {
@@ -202,6 +220,10 @@
     receiver->decStrong((void*)nativeInitSensorEventQueue);
 }
 
+static jint nativeFlushSensor(JNIEnv *env, jclass clazz, jint eventQ, jint handle) {
+    sp<Receiver> receiver(reinterpret_cast<Receiver *>(eventQ));
+    return receiver->getSensorEventQueue()->flushSensor(handle);
+}
 
 //----------------------------------------------------------------------------
 
@@ -221,7 +243,7 @@
             (void*)nativeInitSensorEventQueue },
 
     {"nativeEnableSensor",
-            "(III)I",
+            "(IIIII)I",
             (void*)nativeEnableSensor },
 
     {"nativeDisableSensor",
@@ -231,6 +253,10 @@
     {"nativeDestroySensorEventQueue",
             "(I)V",
             (void*)nativeDestroySensorEventQueue },
+
+    {"nativeFlushSensor",
+            "(II)I",
+            (void*)nativeFlushSensor },
 };
 
 }; // namespace android
@@ -260,5 +286,9 @@
             gBaseEventQueueClassInfo.clazz,
             "dispatchSensorEvent", "(I[FIJ)V");
 
+    GET_METHOD_ID(gBaseEventQueueClassInfo.dispatchFlushCompleteEvent,
+                  gBaseEventQueueClassInfo.clazz,
+                  "dispatchFlushCompleteEvent", "(I)V");
+
     return 0;
 }
diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
index a3ce2a5..50b3302 100644
--- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
@@ -351,9 +351,9 @@
                 "Make sure the SurfaceTexture is valid");
         return 0;
     }
-    
+
     sp<IGraphicBufferProducer> producer(SurfaceTexture_getProducer(_env, native_window));
-    window = new Surface(producer);
+    window = new Surface(producer, true);
     if (window == NULL)
         goto not_valid_surface;
 
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index faf6e63..49945f0 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -207,6 +207,7 @@
     <protected-broadcast android:name="android.intent.action.DREAMING_STARTED" />
     <protected-broadcast android:name="android.intent.action.DREAMING_STOPPED" />
     <protected-broadcast android:name="android.intent.action.ANY_DATA_STATE" />
+    <protected-broadcast android:name="android.intent.action.DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN" />
 
     <protected-broadcast android:name="com.android.server.WifiManager.action.START_SCAN" />
     <protected-broadcast android:name="com.android.server.WifiManager.action.DELAYED_DRIVER_STOP" />
@@ -246,9 +247,13 @@
 
     <protected-broadcast android:name="android.location.GPS_ENABLED_CHANGE" />
     <protected-broadcast android:name="android.location.PROVIDERS_CHANGED" />
+    <protected-broadcast android:name="android.location.MODE_CHANGED" />
     <protected-broadcast android:name="android.location.GPS_FIX_CHANGE" />
     <protected-broadcast android:name="android.net.proxy.PAC_REFRESH" />
 
+    <protected-broadcast
+        android:name="com.android.server.connectivityservice.CONNECTED_TO_PROVISIONING_NETWORK_ACTION" />
+
     <!-- ====================================== -->
     <!-- Permissions for things that cost money -->
     <!-- ====================================== -->
@@ -1915,13 +1920,10 @@
         android:description="@string/permdesc_bindNfcService"
         android:protectionLevel="signature" />
 
-    <!-- Allows an application to call APIs that give it access to all print jobs
-         on the device. Usually an app can access only the print jobts it created.
-         This permission is not available to third party applications.
-         @hide -->
-    <permission android:name="android.permission.ACCESS_ALL_PRINT_JOBS"
-        android:label="@string/permlab_accessAllPrintJobs"
-        android:description="@string/permdesc_accessAllPrintJobs"
+    <!-- Must be required by the PrintSpooler to ensure that only the system can bind to it. -->
+    <permission android:name="android.permission.BIND_PRINT_SPOOLER_SERVICE"
+        android:label="@string/permlab_bindPrintSpoolerService"
+        android:description="@string/permdesc_bindPrintSpoolerService"
         android:protectionLevel="signature" />
 
     <!-- Must be required by a TextService (e.g. SpellCheckerService)
diff --git a/core/res/res/drawable-hdpi/stat_sys_secure.png b/core/res/res/drawable-hdpi/stat_sys_secure.png
deleted file mode 100644
index 5e979db..0000000
--- a/core/res/res/drawable-hdpi/stat_sys_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_sys_secure.png b/core/res/res/drawable-ldpi/stat_sys_secure.png
deleted file mode 100644
index 096aa95..0000000
--- a/core/res/res/drawable-ldpi/stat_sys_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_secure.png b/core/res/res/drawable-mdpi/stat_sys_secure.png
deleted file mode 100644
index da3e318..0000000
--- a/core/res/res/drawable-mdpi/stat_sys_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_sys_secure.png b/core/res/res/drawable-xhdpi/stat_sys_secure.png
deleted file mode 100644
index bef2fd7..0000000
--- a/core/res/res/drawable-xhdpi/stat_sys_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/stat_sys_secure.png b/core/res/res/drawable-xxhdpi/stat_sys_secure.png
deleted file mode 100755
index 07c27cb..0000000
--- a/core/res/res/drawable-xxhdpi/stat_sys_secure.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/layout/resolve_list_item.xml b/core/res/res/layout/resolve_list_item.xml
index 61cecae..28c5b74 100644
--- a/core/res/res/layout/resolve_list_item.xml
+++ b/core/res/res/layout/resolve_list_item.xml
@@ -18,40 +18,40 @@
 */
 -->
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:gravity="center"
-              android:orientation="vertical"
+              android:orientation="horizontal"
               android:layout_height="wrap_content"
               android:layout_width="match_parent"
-              android:background="@android:drawable/activity_picker_bg"
-              android:padding="16dp">
-
-    <!-- Extended activity info to distinguish between duplicate activity names -->
-    <TextView android:id="@android:id/text2"
-              android:textAppearance="?android:attr/textAppearance"
-              android:layout_width="wrap_content"
-              android:layout_height="wrap_content"
-              android:gravity="center"
-              android:minLines="2"
-              android:maxLines="2"
-              android:paddingStart="4dip"
-              android:paddingEnd="4dip" />
+              android:background="@android:drawable/activity_picker_bg">
 
     <!-- Activity icon when presenting dialog
          Size will be filled in by ResolverActivity -->
     <ImageView android:id="@+id/icon"
                android:layout_width="0dp"
                android:layout_height="0dp"
+               android:layout_marginStart="12dp"
+               android:padding="4dp"
                android:scaleType="fitCenter" />
 
-    <!-- Activity name -->
-    <TextView android:id="@android:id/text1"
-              android:textAppearance="?android:attr/textAppearanceSmall"
-              android:layout_width="wrap_content"
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:gravity="start|center_vertical"
+              android:orientation="vertical"
               android:layout_height="wrap_content"
-              android:gravity="center"
-              android:minLines="2"
-              android:maxLines="2"
-              android:paddingStart="4dip"
-              android:paddingEnd="4dip" />
+              android:layout_width="wrap_content"
+              android:layout_gravity="start|center_vertical"
+              android:layout_marginStart="12dp">
+        <!-- Activity name -->
+        <TextView android:id="@android:id/text1"
+                  android:textAppearance="?android:attr/textAppearanceMedium"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:maxLines="2" />
+        <!-- Extended activity info to distinguish between duplicate activity names -->
+        <TextView android:id="@android:id/text2"
+                  android:textAppearance="?android:attr/textAppearanceSmall"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:maxLines="2"
+                  android:paddingTop="4dip" />
+    </LinearLayout>
 </LinearLayout>
 
diff --git a/core/res/res/layout/resolver_grid.xml b/core/res/res/layout/resolver_list.xml
similarity index 88%
rename from core/res/res/layout/resolver_grid.xml
rename to core/res/res/layout/resolver_list.xml
index d271c1a..f88ced1 100644
--- a/core/res/res/layout/resolver_grid.xml
+++ b/core/res/res/layout/resolver_list.xml
@@ -23,20 +23,18 @@
               android:divider="?android:attr/dividerHorizontal"
               android:showDividers="middle"
               android:dividerPadding="0dip">
+
     <FrameLayout android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:layout_weight="1">
-        <GridView
-            android:layout_gravity="center"
-            android:layout_width="wrap_content"
+
+        <ListView
+            android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:id="@+id/resolver_grid"
-            android:numColumns="4"
-            android:columnWidth="128dp"
-            android:padding="16dp"
-            android:clipToPadding="false"
-            android:scrollbarStyle="outsideOverlay" />
+            android:id="@+id/resolver_list" />
+
     </FrameLayout>
+
     <LinearLayout
         android:id="@+id/button_bar"
         android:visibility="gone"
diff --git a/core/res/res/layout/restrictions_pin_challenge.xml b/core/res/res/layout/restrictions_pin_challenge.xml
index 954af92..f41924c 100644
--- a/core/res/res/layout/restrictions_pin_challenge.xml
+++ b/core/res/res/layout/restrictions_pin_challenge.xml
@@ -18,42 +18,73 @@
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:layout_marginTop="48dp"
-    android:layout_marginBottom="48dp"
     android:overScrollMode="ifContentScrolls">
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:padding="8dip"
         android:orientation="vertical">
-
-        <TextView android:id="@+id/pin_message"
-            style="?android:attr/textAppearanceMedium"
-            android:layout_marginTop="16dp"
-            android:layout_marginBottom="16dp"
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="@string/restr_pin_create_pin"
-            android:textColor="?android:attr/textColorSecondary" />
+            android:padding="8dip"
+            android:orientation="vertical">
 
-        <EditText android:id="@+id/pin_text"
-            style="?android:attr/textAppearanceMedium"
-            android:layout_marginBottom="16dp"
+            <EditText android:id="@+id/pin_text"
+                android:layout_marginLeft="8dip"
+                android:layout_marginStart="8dip"
+                android:layout_marginRight="8dip"
+                android:layout_marginEnd="8dip"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:inputType="numberPassword"
+                android:textColor="?android:attr/textColorPrimary" />
+
+            <TextView android:id="@+id/pin_error_message"
+                android:layout_marginTop="8dp"
+                android:layout_marginBottom="8dp"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/restr_pin_incorrect"
+                android:gravity="center"/>
+        </LinearLayout>
+
+        <LinearLayout android:id="@+id/buttonPanel"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:hint="@string/restr_pin_enter_pin"
-            android:inputType="numberPassword"
-            android:textColor="?android:attr/textColorPrimary" />
-
-        <TextView android:id="@+id/pin_error_message"
-            style="?android:attr/textAppearanceSmall"
-            android:layout_marginBottom="16dp"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/restr_pin_error_doesnt_match"
-            android:textColor="#FFFF0000" />
-
+            android:minHeight="@dimen/alert_dialog_button_bar_height"
+            android:orientation="vertical"
+            android:divider="?android:attr/dividerHorizontal"
+            android:showDividers="beginning"
+            android:dividerPadding="0dip">
+            <LinearLayout
+                style="?android:attr/buttonBarStyle"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:layoutDirection="locale"
+                android:measureWithLargestChild="true">
+                <Button android:id="@+id/pin_cancel_button"
+                    android:layout_width="wrap_content"
+                    android:layout_gravity="start"
+                    android:layout_weight="1"
+                    android:maxLines="2"
+                    android:minHeight="@dimen/alert_dialog_button_bar_height"
+                    style="?android:attr/buttonBarButtonStyle"
+                    android:textSize="14sp"
+                    android:layout_height="wrap_content"
+                    android:text="@string/cancel" />
+                <Button android:id="@+id/pin_ok_button"
+                    android:layout_width="wrap_content"
+                    android:layout_gravity="end"
+                    android:layout_weight="1"
+                    android:maxLines="2"
+                    style="?android:attr/buttonBarButtonStyle"
+                    android:textSize="14sp"
+                    android:minHeight="@dimen/alert_dialog_button_bar_height"
+                    android:layout_height="wrap_content"
+                    android:text="@string/ok" />
+            </LinearLayout>
+        </LinearLayout>
     </LinearLayout>
-
 </ScrollView>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 7abdc6d..575bf55 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Dit laat die houer toe om aan die top-koppelvlak van \'n toeganklikheidsdiens te verbind. Behoort nooit vir gewone programme nodig te wees nie."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"verbind aan \'n drukdiens"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Laat die houer toe om aan die top-koppelvlak van \'n drukdiens te verbind. Behoort nooit vir gewone programme nodig te wees nie."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"kry toegang tot alle druktake"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Gee die houer toegang tot druktake wat deur \'n ander program geskep is. Behoort nooit vir normale programme nodig te wees nie."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"verbind aan \'n drukdatabufferdiens"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Laat die houer toe om aan die top-koppelvlak van \'n drukdatabufferdiens te verbind. Behoort nooit vir gewone programme nodig te wees nie."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"verbind aan NFC-diens"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Laat die houer toe om te verbind aan programme wat NFC-kaarte nastrewe. Behoort nooit vir normale programme nodig te wees nie."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"bind aan \'n teksdiens"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Gekanselleer"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Kon nie inhoud skryf nie"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"onbekend"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Voer PIN in"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Huidige PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nuwe PIN"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index ce827f9..0425180 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ያዢው ወደ የአንድ ተደራሽነት አገልግሎት ከፍተኛ-ደረጃ በይነገጽ እንዲያስር ይፈቅድለታል። ለመደበኛ መተግበሪያዎች መቼም ቢሆን ሊያስፈልግ አይገባም።"</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"ከአንድ የህትመት አገልግሎት ጋር ማያያዝ"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"ያዢው የህትመት አገልግሎቱን ወደ ከፍተኛ-ደረጃ በይነገጽ እንዲጠርዝ ይፈቅድለታል። ለመደበኛ መተግበሪያዎች በጭራሽ አያስፈልግም።"</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"ሁሉንም የህትመት ስራዎችን መድረስ"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"ያዢው በሌላ መተግበሪያ የተፈጠሩ የህትመት ስራዎች እንዲደርስባቸው ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ አያስፈልግም።"</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"ከአንድ የህትመት አስተላላፊ አገልግሎት ጋር ይሰሩ"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"ያዢው የህትመት አስተላላፊ አገልግሎቱን ከከፍተኛ-ደረጃ በይነገጽ ጋር እንዲያስር ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ አያስፈልግም።"</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"ከNFC አገልግሎት ጋር ይሰሩ"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"ያዢው የNFC ካርዶችን የሚያስመስሉ መተግበሪያዎችን እንዲያስር ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።"</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"ለፅሁፍ አገልግሎት አሰረ"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"ታብሎይድ"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ተትቷል"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"ይዘት መጻፍ ላይ ስህተት"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"አይታወቅም"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"ፒን ያስገቡ"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"የአሁኑ ፒን"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"አዲስ ፒን"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 81b3464..dbd270c 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة إمكانية الدخول. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"الالتزام بخدمة طباعة"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة الطباعة. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"الدخول إلى جميع وظائف الطباعة"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"للسماح للمالك بالدخول إلى وظائف الطباعة التي أنشأها تطبيق آخر. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"الالتزام بخدمة التخزين المؤقت للطباعة"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"للسماح للمالك بالالتزام بواجهة المستوى العلوي لخدمة التخزين المؤقت للطباعة. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"الربط بخدمة NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"للسماح لحامل البطاقة بالربط بالتطبيقات التي تحاكي بطاقات NFC. لا يتوجب استخدامه على الإطلاق للتطبيقات العادية."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"الالتزام بخدمة إدخال النصوص"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ملغاة"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"حدث خطأ أثناء كتابة المحتوى"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"غير معروف"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"إدخال رقم التعريف الشخصي"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"رقم التعريف الشخصي الحالي"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"رقم التعريف الشخصي الجديد"</string>
diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..e6d8c9b
--- /dev/null
+++ b/core/res/res/values-az-rAZ/strings.xml
@@ -0,0 +1,1585 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort" msgid="8340973892742019101">"B"</string>
+    <string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
+    <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
+    <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
+    <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
+    <string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
+    <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+    <string name="untitled" msgid="4638956954852782576">"Başlıqsız"</string>
+    <string name="ellipsis" msgid="7899829516048813237">"..."</string>
+    <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+    <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefon nömrəsi yoxdur)"</string>
+    <string name="unknownName" msgid="2277556546742746522">"(Naməlum)"</string>
+    <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Səsli poçt"</string>
+    <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+    <string name="mmiError" msgid="5154499457739052907">"Bağlantı problemi və ya yalnış MM kodu."</string>
+    <string name="mmiFdnError" msgid="5224398216385316471">"Əməliyyat yalnız sabit nömrələrə yığımla məhdudlaşıb."</string>
+    <string name="serviceEnabled" msgid="8147278346414714315">"Servis işə salındı."</string>
+    <string name="serviceEnabledFor" msgid="6856228140453471041">"Xidmət aktiv edilmişdir:"</string>
+    <string name="serviceDisabled" msgid="1937553226592516411">"Xidmət deaktiv edilib."</string>
+    <string name="serviceRegistered" msgid="6275019082598102493">"Qeydiyyat uğurlu oldu."</string>
+    <string name="serviceErased" msgid="1288584695297200972">"Silinmə uğurlu olmuşdur."</string>
+    <string name="passwordIncorrect" msgid="7612208839450128715">"Yanlış parol"</string>
+    <string name="mmiComplete" msgid="8232527495411698359">"MMI tamamdır."</string>
+    <string name="badPin" msgid="9015277645546710014">"Daxil etdiyiniz köhnə PİN düzgün deyil."</string>
+    <string name="badPuk" msgid="5487257647081132201">"Daxil etdiyiniz PUK düzgün deyil."</string>
+    <string name="mismatchPin" msgid="609379054496863419">"Daxil etdiyiniz PİN kodlar uyğun gəlmir."</string>
+    <string name="invalidPin" msgid="3850018445187475377">"4-dən 8-ə qədər rəqəmi olan PIN yazın."</string>
+    <string name="invalidPuk" msgid="8761456210898036513">"8 və daha çox rəqəmi olan PUK yazın."</string>
+    <string name="needPuk" msgid="919668385956251611">"Sizin SİM kart PUK ilə kilidlənib. Onu açmaq üçün PUK kodu yazın."</string>
+    <string name="needPuk2" msgid="4526033371987193070">"SIM kartın kilidini açmaq üçün PUK2 yazın"</string>
+    <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+    <string name="meid" msgid="4841221237681254195">"MEID"</string>
+    <string name="ClipMmi" msgid="6952821216480289285">"Daxil olan zəng edənin ID\'si"</string>
+    <string name="ClirMmi" msgid="7784673673446833091">"Gedən Zəng ID"</string>
+    <string name="CfMmi" msgid="5123218989141573515">"Zəng yönləndirmə"</string>
+    <string name="CwMmi" msgid="9129678056795016867">"Zəng gözləyir"</string>
+    <string name="BaMmi" msgid="455193067926770581">"Zəng qadağası"</string>
+    <string name="PwdMmi" msgid="7043715687905254199">"Parolu dəyiş"</string>
+    <string name="PinMmi" msgid="3113117780361190304">"PİN dəyişmək"</string>
+    <string name="CnipMmi" msgid="3110534680557857162">"Hazırdakı nömrəyə zəng edilir"</string>
+    <string name="CnirMmi" msgid="3062102121430548731">"Zənglərin sayı məhdudlaşdırılıb"</string>
+    <string name="ThreeWCMmi" msgid="9051047170321190368">"Üç yollu zəng"</string>
+    <string name="RuacMmi" msgid="7827887459138308886">"Xoşagəlməz zənglərdən imtina"</string>
+    <string name="CndMmi" msgid="3116446237081575808">"Çatdırılma zəngi"</string>
+    <string name="DndMmi" msgid="1265478932418334331">"Narahat etməyin"</string>
+    <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Adətən zəng edənin ID\'si məhdudlaşdırılır. Növbəti zəng: Məhdudlaşdırılıb"</string>
+    <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Adətən zəng edənin ID\'si məhdudlaşdırılır. Növbəti zəng: Məhdudlaşdırılmayıb"</string>
+    <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Adətən zəng edənin ID\'si məhdudlaşdırılmır. Növbəti zəng: Məhdudlaşdırılıb"</string>
+    <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Adətən zəng edənin ID\'si məhdudlaşdırılmır. Növbəti zəng: Məhdudlaşdırılmayıb"</string>
+    <string name="serviceNotProvisioned" msgid="8614830180508686666">"Xidmət təmin edilməyib."</string>
+    <string name="CLIRPermanent" msgid="3377371145926835671">"Siz zəng edənin ID nizamlarını dəyişə bilməzsiz."</string>
+    <string name="RestrictedChangedTitle" msgid="5592189398956187498">"Məhdudlaşdırılmış keçid dəyişdi"</string>
+    <string name="RestrictedOnData" msgid="8653794784690065540">"Data xidmət bağlıdır."</string>
+    <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Təcili xidmət bağlıdır."</string>
+    <string name="RestrictedOnNormal" msgid="4953867011389750673">"Səs xidməti bağlıdır."</string>
+    <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"Bütün Səs xidmətləri bağlıdır"</string>
+    <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS xidməti bloklanıb."</string>
+    <string name="RestrictedOnVoiceData" msgid="996636487106171320">"Səs/data xidmətləri bloklanıb."</string>
+    <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"Səs/SMS xidmətləri bloklanıb."</string>
+    <string name="RestrictedOnAll" msgid="5643028264466092821">"Bütün səs/data/SMS xidmətləri bağlıdır."</string>
+    <string name="serviceClassVoice" msgid="1258393812335258019">"Səs"</string>
+    <string name="serviceClassData" msgid="872456782077937893">"Məlumat"</string>
+    <string name="serviceClassFAX" msgid="5566624998840486475">"FAKS"</string>
+    <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+    <string name="serviceClassDataAsync" msgid="4523454783498551468">"Async"</string>
+    <string name="serviceClassDataSync" msgid="7530000519646054776">"Sinx"</string>
+    <string name="serviceClassPacket" msgid="6991006557993423453">"Paket"</string>
+    <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+    <string name="roamingText0" msgid="7170335472198694945">"Rominq göstəricisi işləkdir"</string>
+    <string name="roamingText1" msgid="5314861519752538922">"Rominq göstəricisi işlək deyil"</string>
+    <string name="roamingText2" msgid="8969929049081268115">"Rominq göstəricisi yanır"</string>
+    <string name="roamingText3" msgid="5148255027043943317">"Qonşuluqdan Kənar"</string>
+    <string name="roamingText4" msgid="8808456682550796530">"Binadan kənar"</string>
+    <string name="roamingText5" msgid="7604063252850354350">"Rominq - Arzuolunan sistem"</string>
+    <string name="roamingText6" msgid="2059440825782871513">"Rominq - Mümkün sistem"</string>
+    <string name="roamingText7" msgid="7112078724097233605">"Rominq - Alyans partnyoru"</string>
+    <string name="roamingText8" msgid="5989569778604089291">"Rominq - Premium partnyor"</string>
+    <string name="roamingText9" msgid="7969296811355152491">"Rouminq - Tam Xidmət Funksionallığı"</string>
+    <string name="roamingText10" msgid="3992906999815316417">"Rouminq - Qismən Xidmət Funksionallığı"</string>
+    <string name="roamingText11" msgid="4154476854426920970">"Rouminq Banneri Açıqdır"</string>
+    <string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
+    <string name="roamingTextSearching" msgid="8360141885972279963">"Xidmət axtarılır"</string>
+    <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
+    <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> saniyə sonra"</string>
+    <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
+    <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönləndirilmədi"</string>
+    <string name="fcComplete" msgid="3118848230966886575">"Özəllik kodu tamamlandı."</string>
+    <string name="fcError" msgid="3327560126588500777">"Əlaqə problemi və ya yanlış funksiya kodu."</string>
+    <string name="httpErrorOk" msgid="1191919378083472204">"OK"</string>
+    <string name="httpError" msgid="7956392511146698522">"Şəbəkə xətası var idi."</string>
+    <string name="httpErrorLookup" msgid="4711687456111963163">"URL tapıla bilmədi."</string>
+    <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Sayt autentifikasiya sxemi dəstəklənmir."</string>
+    <string name="httpErrorAuth" msgid="1435065629438044534">"Təsdiq edilə bilmədi."</string>
+    <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Proksi server vasitəsilə təsdiqlənmə uğursuz oldu."</string>
+    <string name="httpErrorConnect" msgid="8714273236364640549">"Serverə qoşula bilmədi."</string>
+    <string name="httpErrorIO" msgid="2340558197489302188">"Serverlə əlaqə alınmadı. Sonra cəhd edin."</string>
+    <string name="httpErrorTimeout" msgid="4743403703762883954">"Server ilə olan əlaqə zaman aşımına məruz qaldı."</string>
+    <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Bu səhifədə həddindən çox server yönləndirilmələri var."</string>
+    <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"Protokol dəstəklənmir."</string>
+    <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"Güvənli bağlantı yaradıla bilmədi."</string>
+    <string name="httpErrorBadUrl" msgid="3636929722728881972">"URL yanlış olduğu üçün səhifəni açmaq mümkün olmadı."</string>
+    <string name="httpErrorFile" msgid="2170788515052558676">"Fayla giriş baş tutmadı."</string>
+    <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Tələb olunan fayl tapılmadı."</string>
+    <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Həddindən çox sorğu işlənilir. Daha sonra yoxlayın."</string>
+    <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> üçün giriş xətası"</string>
+    <string name="contentServiceSync" msgid="8353523060269335667">"Sinxronlaşdırma"</string>
+    <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinxronlaşdırma"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Həddindən çox <xliff:g id="CONTENT_TYPE">%s</xliff:g> silinmələri var."</string>
+    <string name="low_memory" product="tablet" msgid="6494019234102154896">"Planşetin yaddaşı doludur. Boş yer üçün bəzi faylları silin."</string>
+    <string name="low_memory" product="default" msgid="3475999286680000541">"Telefonun yaddaşı doludur. Boş yer üçün bəzi faylları silin."</string>
+    <string name="me" msgid="6545696007631404292">"Mən"</string>
+    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Planşet seçimləri"</string>
+    <string name="power_dialog" product="default" msgid="1319919075463988638">"Telefon seçimləri"</string>
+    <string name="silent_mode" msgid="7167703389802618663">"Səssiz rejim"</string>
+    <string name="turn_on_radio" msgid="3912793092339962371">"Simsizi işə salın"</string>
+    <string name="turn_off_radio" msgid="8198784949987062346">"Simsiz rabitəni söndürün"</string>
+    <string name="screen_lock" msgid="799094655496098153">"Ekran kilidi"</string>
+    <string name="power_off" msgid="4266614107412865048">"Söndür"</string>
+    <string name="silent_mode_silent" msgid="319298163018473078">"Zəng deaktivdir"</string>
+    <string name="silent_mode_vibrate" msgid="7072043388581551395">"Zəng vibrasiyadadır"</string>
+    <string name="silent_mode_ring" msgid="8592241816194074353">"Zəngvuran açıqdır"</string>
+    <string name="shutdown_progress" msgid="2281079257329981203">"Söndürülür..."</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planşetiniz sönəcək."</string>
+    <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonunuz sönəcək."</string>
+    <string name="shutdown_confirm_question" msgid="2906544768881136183">"Söndürmək istəyirsiz?"</string>
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Təhlükəsiz rejimdə yenidən başlayın"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Təhlükəsiz rejimdə yenidən başlamaq istəyirsiniz mi? Bu, quraşdırdığınız bütün üçüncü tərəf tətbiqlərini deaktiv edəcək."</string>
+    <string name="recent_tasks_title" msgid="3691764623638127888">"Son"</string>
+    <string name="no_recent_tasks" msgid="8794906658732193473">"Heç bir son tətbiq yoxdur."</string>
+    <string name="global_actions" product="tablet" msgid="408477140088053665">"Planşet seçimləri"</string>
+    <string name="global_actions" product="default" msgid="2406416831541615258">"Telefon seçimləri"</string>
+    <string name="global_action_lock" msgid="2844945191792119712">"Ekran kilidi"</string>
+    <string name="global_action_power_off" msgid="4471879440839879722">"Söndür"</string>
+    <string name="global_action_bug_report" msgid="7934010578922304799">"Baq hesabatı"</string>
+    <string name="bugreport_title" msgid="2667494803742548533">"Baqı xəbər verin"</string>
+    <string name="bugreport_message" msgid="398447048750350456">"Bu, sizin hazırkı cihaz durumu haqqında məlumat toplayacaq ki, elektron məktub şəklində göndərsin. Baq raportuna başlamaq üçün bir az vaxt lazım ola bilər, bir az səbr edin."</string>
+    <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Səssiz rejim"</string>
+    <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Səs qapalıdır"</string>
+    <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Səs Aktivdir"</string>
+    <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Təyyarə rejimi"</string>
+    <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uçuş rejimi açıqdır"</string>
+    <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Təyyarə rejimi qapalıdır"</string>
+    <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+    <string name="safeMode" msgid="2788228061547930246">"Təhlükəsiz rejim"</string>
+    <string name="android_system_label" msgid="6577375335728551336">"Android sistemi"</string>
+    <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Ödənişli xidmətlər"</string>
+    <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Xərc tutulacaq əməliyyatlar edir"</string>
+    <string name="permgrouplab_messages" msgid="7521249148445456662">"Sizin mesajlarınız"</string>
+    <string name="permgroupdesc_messages" msgid="7821999071003699236">"SMS, elektron poçt və digər mesajları oxuyur və yazır."</string>
+    <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Şəxsi məlumatınız"</string>
+    <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"Kontakt kartınızda saxlanılan məlumatlarınıza birbaşa giriş."</string>
+    <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Sosial məlumatınız"</string>
+    <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Kontaktlarınız və sosial əlaqələriniz haqqında məlumata birbaşa giriş."</string>
+    <string name="permgrouplab_location" msgid="635149742436692049">"Yerləşməniz"</string>
+    <string name="permgroupdesc_location" msgid="5704679763124170100">"Fiziki adresinizi monitorinq edir."</string>
+    <string name="permgrouplab_network" msgid="5808983377727109831">"Şəbəkə kommunikasiyası"</string>
+    <string name="permgroupdesc_network" msgid="4478299413241861987">"Müxtəlif şəbəkə xüsusiyyətlərinə daxil ol."</string>
+    <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+    <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Bluetooth üzərindən cihazlara və şəbəkələrə daxil ol."</string>
+    <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Audio Ayarlar"</string>
+    <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Audio ayarları dəyişin."</string>
+    <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Batareyaya təsir edir"</string>
+    <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Batareyanızın tez qurtarmasına səbəb olan funksiyalar istifadə edir"</string>
+    <string name="permgrouplab_calendar" msgid="5863508437783683902">"Təqvim"</string>
+    <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Təqvimə və tədbirlərə birbaşa giriş."</string>
+    <string name="permgrouplab_dictionary" msgid="4148597128843641379">"İstifadəçi Lüğətini Oxu"</string>
+    <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"İstifadəçi lüğətindəki sözləri oxuyur."</string>
+    <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"İstifadəçi Lüğətini Yaz"</string>
+    <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"İstifadəçi lüğətinə sözlər əlavə edin."</string>
+    <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Əlfəcinlər və Tarixçə"</string>
+    <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Əlfəcinlərə və brauzer tarixinə birbaşa icazə."</string>
+    <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Zəng"</string>
+    <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"Alarm qur."</string>
+    <string name="permgrouplab_voicemail" msgid="4162237145027592133">"Səsli poçt"</string>
+    <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"Səs poçtuna birbaşa çıxış."</string>
+    <string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
+    <string name="permgroupdesc_microphone" msgid="7106618286905738408">"Audio yazmaq üçün mikrofona birbaşa giriş."</string>
+    <string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
+    <string name="permgroupdesc_camera" msgid="2933667372289567714">"Şəkil və ya video çəkmək üçün kameraya birbaşa çıxış."</string>
+    <string name="permgrouplab_screenlock" msgid="8275500173330718168">"Ekran kilidi"</string>
+    <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"Cihazınızdakı kilid ekranının hərəkətinə təsir etmə bacarığı"</string>
+    <string name="permgrouplab_appInfo" msgid="8028789762634147725">"Tətbiq məlumatlarınız"</string>
+    <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Cihazınızdakı digər tətbiqlərin davranışına təsir etmək bacarığı."</string>
+    <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"Divar kağızı"</string>
+    <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"Cihazın divar kağızı ayarlarını dəyişin."</string>
+    <string name="permgrouplab_systemClock" msgid="406535759236612992">"Saat"</string>
+    <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"Cihazın vaxt və zaman zolağını dəyişir."</string>
+    <string name="permgrouplab_statusBar" msgid="2095862568113945398">"Status paneli"</string>
+    <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"Cihazın status paneli ayarlarınızı dəyişir."</string>
+    <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"Sinx Ayarları"</string>
+    <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"Sinxronizasiya nizamlarına çıxış."</string>
+    <string name="permgrouplab_accounts" msgid="3359646291125325519">"Hesablarınız"</string>
+    <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Əlçatımlı hesablara daxil olun."</string>
+    <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Hardware kontrolları"</string>
+    <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Dəstəkdəki avadanlığa birbaşa giriş."</string>
+    <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Telefon zəngləri"</string>
+    <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"Telefon zənglərinə nəzarət edin, qeydə alın və idarə edin."</string>
+    <string name="permgrouplab_systemTools" msgid="4652191644082714048">"Sistem alətləri"</string>
+    <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Aşağı səviyyəli çıxış və sistem idarəetməsi."</string>
+    <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"İnkişaf alətləri"</string>
+    <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Özəlliklər yalnız tətbiq developerləri üçün lazımdır."</string>
+    <string name="permgrouplab_display" msgid="4279909676036402636">"Digər tətbiq İstifadəçi İnterfeysi"</string>
+    <string name="permgroupdesc_display" msgid="6051002031933013714">"Digər tətbiqlərin İstifadəçi İnterfeysinə təsir edir."</string>
+    <string name="permgrouplab_storage" msgid="1971118770546336966">"Yaddaş"</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB yaddaşa daxil ol."</string>
+    <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD karta daxil ol."</string>
+    <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Əlçatımlılıq funksiyaları"</string>
+    <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Yardımçı texnologiya tələb edə biləcəyi funksiyalar."</string>
+    <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pəncərənin məzmununu əldə edin"</string>
+    <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Əlaqədə olduğunuz pəncərənin məzmununu nəzərdən keçirin."</string>
+    <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Toxunaraq Kəşf et funksiyasını yandırın"</string>
+    <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Toxunulan hissələr səsləndiriləcək və ekran jestlərlə idarə oluna biləcək."</string>
+    <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"İnkişaf etmiş veb əlçatımlılığı yandırın"</string>
+    <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Skriptlər tətbiq məzmununun daha əlçatımlı olması üçün quraşdırıla bilər."</string>
+    <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Yazdığınız mətni izləyin"</string>
+    <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kredit kartı nömrələri və parollar kimi şəxsi məlumatlar daxildir."</string>
+    <string name="permlab_statusBar" msgid="7417192629601890791">"status panelini deaktivləşdir və ya dəyişdir"</string>
+    <string name="permdesc_statusBar" msgid="8434669549504290975">"Tətbiqə status panelini deaktiv etməyə və ya sistem ikonalarını əlavə etmək və ya silmək imkanı verir."</string>
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"status paneli"</string>
+    <string name="permdesc_statusBarService" msgid="716113660795976060">"Tətbiqə status paneli olmağa imkan verir."</string>
+    <string name="permlab_expandStatusBar" msgid="1148198785937489264">"status panelini genişlətmək və ya yığmaq"</string>
+    <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Tətbiqə status panelini genişləndirməyə və ya yox etməyə imkan verir."</string>
+    <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"gedən zənglərin marşrutunu dəyişmək"</string>
+    <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Tətbiqə zəng etməyə və zəng edilən nömrəni dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək gedən zəngləri izləyə, yönləndirə və ya qarşısını ala bilər."</string>
+    <string name="permlab_receiveSms" msgid="8673471768947895082">"SMS qəbul etmək"</string>
+    <string name="permdesc_receiveSms" msgid="6424387754228766939">"Tətbiqə MMS mesajlarını almaq və emal etmək icazəsi verir. Bu o deməkdir ki, tətbiq sizin mesajlarınızı sizə göstərmədən monitorinq edə və ya silə bilər."</string>
+    <string name="permlab_receiveMms" msgid="1821317344668257098">"mətn mesajlarını qəbul edir (MMS)"</string>
+    <string name="permdesc_receiveMms" msgid="533019437263212260">"Tətbiqə MMS mesajlarını qəbul və emal üçün imkan verir. Bu o deməkdir ki, bu tətbiq sizə göstərmədən cihazınıza göndərilən mesajları silə bilər."</string>
+    <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"təcili yayımları qəbul edir"</string>
+    <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Tətbiqə təcili yayım mesajlarını qəbul və emal etmək icazəsi verir. Bu icazə ancaq sistem tətbiqləri üçün mümkündür."</string>
+    <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"mobil yayım mesajlarını oxuyur"</string>
+    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Tətbiqə sizin telefonunuz tərəfindən alınmış yayım mesajlarını oxuma icazəsi verir. Telefon yayımı bəzi məkanlarda olan fövqəladə hadisələrlə bağlı sizi xəbərdar etmək üçün qəbul edilir. Zərərli tətbiqlər fövqəladə mobil yayım qəbul edildiyi zaman telefonunun performansına və əməliyyatına müdaxilə edə bilər."</string>
+    <string name="permlab_sendSms" msgid="5600830612147671529">"SMS mesajlarını göndərir"</string>
+    <string name="permdesc_sendSms" msgid="7094729298204937667">"Tətbiqə SMS mesajı göndərmə icazəsi verir. Bu gözlənilməyən ödənişlərə səbəb ola bilər. Zərərli tətbiqlər sizin təsdiqiniz olmadan mesaj göndərməklə sizə ödənişə səbəb ola bilərlər."</string>
+    <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"mesajla cavab verilməli tədbirlər göndərmək"</string>
+    <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Tətbiqə zənglər üçün \"mesajla cavabla\" hadisələrini idarə etmək üçün digər mesajlaşma tətbiqlərinə sorğuların göndərilməsi icazəsi verir."</string>
+    <string name="permlab_readSms" msgid="8745086572213270480">"tekst mesajlarınızı oxuyur (SMS və ya MMS)"</string>
+    <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Tətbiqə planşetinizdə və ya SIM kartınızda saxlanan SMS mesajları oxumağa imkan verir. Bu bütün SMS mesajların, onların məzmunundan və konfidensiallığından asılı olmadan oxunması imkanı deməkdir."</string>
+    <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Tətbiqə telefonunuzda və ya SIM kartınızda saxlanan SMS mesajları oxumağa imkan verir. Bu bütün SMS mesajların, onların məzmunundan və konfidensiallığından asılı olmadan oxunması imkanı deməkdir."</string>
+    <string name="permlab_writeSms" msgid="3216950472636214774">"mətn mesajlarınızı redaktə edir (SMS və ya MMS)"</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Tətbiqə telefonunuzda və ya SİM kartınızda yerləşən SMS mesajlara yazma icazəsi verir. Zərərli tətbiqlər sizin mesajlarınızı silə bilər."</string>
+    <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Tətbiqə telefonunuzda və ya SİM kartınızda yerləşən SMS mesajlara yazma icazəsi verir. Zərərli tətbiqlər sizin mesajlarınızı silə bilər."</string>
+    <string name="permlab_receiveWapPush" msgid="5991398711936590410">"mətn mesajları qəbul etmək (WAP)"</string>
+    <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Tətbiqə WAP mesajlar göndərmək və ya qəbul etmək imkanı verir. Buna mesajları izləmək və Sizə xəbər vermədən silmək imkanları da daxildir."</string>
+    <string name="permlab_getTasks" msgid="6466095396623933906">"işlənən tətbiqlər əldə etmək"</string>
+    <string name="permdesc_getTasks" msgid="7454215995847658102">"Tətbiqə hazırda və az öncə işləyən tapşırıqlar haqqında ətraflı məlumat əldə etməyə imkan verir. Bu da cihazda hansı tətbiqlərin istifadə olunması haqqında məlumatların əldə edilməsinə imkan verir."</string>
+    <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"istifadəçilər arasında əlaqə qurur"</string>
+    <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Tətbiqə bu cihazdakı digər istifadəçilərlə müxtəlif işləri görməyə icazə verir. Zərərli tətbiqlər bundan istifadəçilər arasındakı qorunmanı pozmaq üçün istifadə edə bilər."</string>
+    <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"bütün istifadəçilər ilə əlaqə saxlamaq üçün tam hüquq"</string>
+    <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"İstifadəçilər arasında bütün mümkün əlaqələrə imkan verir."</string>
+    <string name="permlab_manageUsers" msgid="1676150911672282428">"istifadəçiləri idarə edir"</string>
+    <string name="permdesc_manageUsers" msgid="8409306667645355638">"Tətbiqlərə cihazda olan istifadəçiləri, habelə sorğu göndərmə, yaratma və silmə izni verir."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"işlənən tətbiqlərin detallarını əldə etmək"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Tətbiqə hazırda və az öncə işləyən tapşırıqlar haqqında ətraflı məlumat əldə etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək şəxsi məlumatları oğurlaya bilər."</string>
+    <string name="permlab_reorderTasks" msgid="2018575526934422779">"işlənən tətbiqlərin sırasını dəyişmək"</string>
+    <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Tətbiqə tapşırıqları ön plandan arxa plana keçirməyə imkan verir. Tətbiq bunu Sizin daxiletməniz olmadan da edə bilər."</string>
+    <string name="permlab_removeTasks" msgid="6821513401870377403">"işlək tətbiqləri dayandırır"</string>
+    <string name="permdesc_removeTasks" msgid="1394714352062635493">"Tətbiqə tapşırıqları silməyə və onların tətbiqlərini məhv etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək digər tətbiqlərin işlərini dayandıra bilər."</string>
+    <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"fəaliyyət toplularını idarə edin"</string>
+    <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Tətbiqə digər tətbiqlərin fəaliyyəti daxilində fəaliyyət toplularını əlavə etmək, silmək və dəyişmək imkanı verir."</string>
+    <string name="permlab_startAnyActivity" msgid="2918768238045206456">"hər hansı bir fəaliyyət başlat"</string>
+    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"İcazə qorunması və ya eksport edilmiş statusdan asılı olmayaraq, tətbiqə hər hansı fəaliyyəti başlatmağa imkan verir."</string>
+    <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"ekran uyğunluğunu yerləşdirir"</string>
+    <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Tətbiqə digər tətbiqlərin ekran uyğunluğunu yoxlamaq imkanı verir. Zərərli tətbiqlər digər tətbiqlərin fəaliyyətini poza bilər."</string>
+    <string name="permlab_setDebugApp" msgid="3022107198686584052">"tətbiq sazlanmasını aktiv edir"</string>
+    <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Tətbiqə digər bir tətbiq üçün sazlamanı açmaq üçün imkan verir. Zərərli tətbiqlər bunu digər tətbiqləri yox etmək üçün istifadə edə bilər."</string>
+    <string name="permlab_changeConfiguration" msgid="4162092185124234480">"sistem ekran nizamlarını dəyiş"</string>
+    <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Tətbiqə yerli parametrlər və ya şriftin ölçüsü kimi cari konfiqurasiyanı dəyişməyə imkan verir."</string>
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"avtomobil rejimini aktivləşdirir"</string>
+    <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Tətbiqə avtomobil rejimini aktivləşdirməyə imkan verir."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"digər tətbiqləri qapatmaq"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Tətbiqə başqa tətbiqlərin arxafon proseslərini dayandırmaq icazəsi verir. Bu digər tətbiqlərin dayanmasına səbəb ola bilər."</string>
+    <string name="permlab_forceStopPackages" msgid="2329627428832067700">"Digər tətbiqləri dayanmağa məcbur et"</string>
+    <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Tətbiqə digər tətbiqləri məcburi şəkildə dayandırmağa imkan verir."</string>
+    <string name="permlab_forceBack" msgid="652935204072584616">"tətbiqi qapanmağa məcbur etmək"</string>
+    <string name="permdesc_forceBack" msgid="3892295830419513623">"Tətbiqə ön planda olan istənilən tətbiqi bağlayaraq geriyə dönməyə imkan verir. Normal tətbiqlər tərəfindən heç vaxt istifadə olunmamalıdır."</string>
+    <string name="permlab_dump" msgid="1681799862438954752">"sistemin daxili durumunu bərpa et"</string>
+    <string name="permdesc_dump" msgid="1778299088692290329">"Tətbiqə sistemin daxili statusunu bərpa etməyə imkan verir. Zərərli tətbiqlər lazım olmadığı halda müxtəlif şəxsi və güvənli məlumatları bərpa edə bilər."</string>
+    <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"ekran kontentini bərpa edir"</string>
+    <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Tətbiqə aktiv pəncərənin məzmununu əldə etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək pəncərə məzmununu ələ keçirib parollları oxuya bilər."</string>
+    <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"giriş imkanını müvəqqəti açmaq"</string>
+    <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Tətbiqə cihaza girişi müvəqqəti olaraq aktivləşdirməyə imkan verir. Zərərli tətbiqlər istifadəçi razılığı olmadan girişi aktivləşdirə bilər."</string>
+    <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"pəncərə infosunu bərpa edir"</string>
+    <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Tətbiqə pəncərə idarəçisindən gələn windows haqqında olan məlumatı bərpa etməyə imkan verir. Zərərli tətbiqlər daxili sistem istifadəsi üçün nəzərdə tutulan məlumatı bərpa edə bilər."</string>
+    <string name="permlab_filter_events" msgid="8675535648807427389">"tədbirləri filtr edir"</string>
+    <string name="permdesc_filter_events" msgid="8006236315888347680">"Tətbiqə daxiletmə filtrini qeydiyyat etdirməyə imkan verir, bu filtr bütün istifadəçi tədbirlərini göndərilməmişdən əvvəl filtrdən keçirir. Zərərli tətbiq istifadəçi müdaxiləsi olmadan İstifadəçi İnterfeysi sisteminə nəzarət edə bilər."</string>
+    <string name="permlab_magnify_display" msgid="5973626738170618775">"ekranı böyüdür"</string>
+    <string name="permdesc_magnify_display" msgid="7121235684515003792">"Tətbiqə ekran kontentini böyütmək icazəsi verir. Zərərli tətbiqlər bundan istifadə edərək ekranda kontenti böyüdərək cihazın qeyri-stabilliyinə səbəb ola bilər."</string>
+    <string name="permlab_shutdown" msgid="7185747824038909016">"qismən söndürür"</string>
+    <string name="permdesc_shutdown" msgid="7046500838746291775">"Aktivlik idarəçiliyini qapanmış hala gətirir. Tam qapanmanı həyata keçirmir."</string>
+    <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"tətbiqdən tətbiqə keçidin qarşısını almaq"</string>
+    <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"İstifadəçinin başqa tətbiqə keçməsinin qarşısını alır."</string>
+    <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"cari tətbiq informasiyası əldə etmək"</string>
+    <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Sahibə ekran önündə cari tətbiq və xidmətlər haqqında şəxsi məlumat əldə etməyə imkan verir."</string>
+    <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"işə salınan bütün tətbiqləri izləyir və idarə edir"</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Tətbiqə sistemin fəaliyyətləri necə başlatdığını nəzarət və kontrol etməyə imkan verir. Zərərli tətbiqlər sistemi tamamilə kompromis edə bilər. Bu icazə yalnız inkişaf üçündür, heç vaxt normal istifadə üçün deyil."</string>
+    <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"qaldırılmış yayım paketini göndər"</string>
+    <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Tətbiqə tətbiq paketinin silinməsi haqqında bildiriş translasiya etmə icazəsi verir. Zərərli tətbiqlər bundan digər işlək tətbiqləri dayandırmaq üçün istifadə edə bilər."</string>
+    <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS tərəfindən qəbul edilən yayım göndər"</string>
+    <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Tətbiqə mesaj gəlməsi haqqında bildirişi yayımlamaq imkanı verir. Zərərli tətbiqlər bundan gələn SMS mesajlarını saxtalaşdırmaq üçün istifadə edə bilər."</string>
+    <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH tərəfindən qəbul edilən yayım göndər"</string>
+    <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Tətbiqə WAP PUSH mesajın alındığı haqda bildiriş translasiya etməyə icazə verir. Zərərli tətbiqlər bundan istifadə edərək saxta MMS mesaj alışı və ya səssizcə istənilən veb səhifəni zərərverici variantlarla dəyişmək üçün istifadə edə bilər."</string>
+    <string name="permlab_setProcessLimit" msgid="2451873664363662666">"çalışan proseslərin sayını məhdudlaşdırır"</string>
+    <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Tətbiqə işlədiləcək maksimum proses sayını idarə etmə izni verir. Normal tətbiqlər tərəfindən tələb olunmur."</string>
+    <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"arxafon tətbiqlərini dayanmağa məcbur edir"</string>
+    <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Tətbiqə aktivitilərin arxa fona getdiyi zaman bitməsini yoxlayır. Normal tətbiqlər tərəfindən tələn olunmur."</string>
+    <string name="permlab_batteryStats" msgid="2789610673514103364">"batareya statistikalarını oxumaq"</string>
+    <string name="permdesc_batteryStats" msgid="5897346582882915114">"Tətbiqə cari aşağı səviyyəli data sitifadəsini oxumaq imkanı verir. Tətbiqə hansı tətbiqi istifadə etdiyiniz haqqında ətraflı məlumat tapmağa imkan verə bilər."</string>
+    <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"batareya statistikalarını dəyişmək"</string>
+    <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Tətbiqə yığılmış batareya statistikasını redaktə etmə icazəsi verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"tətbiq əməliyyat statistikalarını əldə etmək"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Toplanmış tətbiq əməliyyat statistikalarının bərpa edilməsinə imkan verir. Normal tətbiqlər tərəfindən istifadə üçün deyil."</string>
+    <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"tətbiq əməliyyat statistikasını dəyişmək"</string>
+    <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Tətbiqə toplanmış tətbiq əməliyyat statistikasını dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+    <string name="permlab_backup" msgid="470013022865453920">"sistem yedəkləməsi və bərpasını idarə edir"</string>
+    <string name="permdesc_backup" msgid="6912230525140589891">"Tətbiqə sistemi rezerv etməyə və mexanizmi bərpa etməyə imkan verir. Normal tətbiqlər tərəfindən istifadə edilmək üçün nəzərdə tutulmayıb.."</string>
+    <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"tam rezervi təsdiq etmək və ya əməliyyatı bərpa etmək"</string>
+    <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Tətbiqə İstifadəçi İnterfeysi tam rezerv təsdiqini işə salmağa imkan verir. Heç bir tətbiq tərəfindən istifadə olunmamalıdır."</string>
+    <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"icazəsiz pəncərələri görüntüləyir"</string>
+    <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Tətbiqə daxili sistem interfeysi tərəfindən istifadə edilməsi üçün nəzərdə tutulmuş pəncərələri yaratmağa icazə verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+    <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"digər tətbiqlər üzərində çəkmək"</string>
+    <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Tətbiqə digər tətbiqlərin və ya onların hissələrinin yuxarısında şəkil çəkməyə imkan verir. Onlar istənilən tətbiqin interfeysinin istifadəsinə müdaxilə edə və ya digər tətbiqlərdə axtardıqlarınızı dəyişə bilər."</string>
+    <string name="permlab_setAnimationScale" msgid="2805103241153907174">"qlobal animasiya sürətini dəyişir"</string>
+    <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Tətbiqə istənilən vaxt qlobal animasiya sürətini (sürətli və ya yavaş animasiyalar) dəyişdirmək imkanı verir."</string>
+    <string name="permlab_manageAppTokens" msgid="1286505717050121370">"tətbiq nişanlarını idarə etmək"</string>
+    <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Tətbiqlərə onların normal Z-orderinqi keçərək markerlərini yaratma və idarəetmə icazəsi verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+    <string name="permlab_freezeScreen" msgid="4708181184441880175">"ekranı dondurur"</string>
+    <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Tətbiqə tam ekranlı yayım üçün ekranı müvəqqəti olaraq dondurma icazəsi verir."</string>
+    <string name="permlab_injectEvents" msgid="1378746584023586600">"düymələri və idarəetmə düymələrini basır"</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Tətbiqə özünün daxiletmə tədbirlərini digər tətbiqlərə çatdırmağa imkan verir. Zərərli tətbiqlər planşeti ələ keçirmək üçün bundan istifadə edə bilər."</string>
+    <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Tətbiqə özünün daxiletmə tədbirlərini digər tətbiqlərə çatdırmağa imkan verir. Zərərli tətbiqlər telefonu ələ keçirmək üçün bundan istifadə edə bilər."</string>
+    <string name="permlab_readInputState" msgid="469428900041249234">"yazdıqlarınızı və etdiklərinizi izləyir"</string>
+    <string name="permdesc_readInputState" msgid="8387754901688728043">"Tətbiqə basdığınız düymələri izləmək imkanı verilir. Buna parolların və kredit kartı nömrələrinin yazılması da aiddir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+    <string name="permlab_bindInputMethod" msgid="3360064620230515776">"daxiletmə metoduna bağlanır"</string>
+    <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Sahibinə daxiletmə metodunun ən üst səviyyə interfeysinə bağlamaq imkanı verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+    <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"giriş xidmətinə bağlı qal"</string>
+    <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Sahibə giriş xidmətin ən üst səviyyə interfeysi bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+    <string name="permlab_bindPrintService" msgid="8462815179572748761">"çap servisini qoşma"</string>
+    <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Sahibinə bir çap xidmətinin ən üst səviyə araüzünü bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"çap spuler servisinə qoş"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Sahibinə çap spuler xidmətinin ən üst səviyyə interfeysinə bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+    <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC xidmətlərinə qoşun"</string>
+    <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Sahibinə NFC kartlarını emulyasiya edən tətbiqləri bir-birinə qoşmağa icazə verin. Normal tətbiqlər üçün lazım deyil."</string>
+    <string name="permlab_bindTextService" msgid="7358378401915287938">"mətn servisini qoşma"</string>
+    <string name="permdesc_bindTextService" msgid="8151968910973998670">"Sahibinə bir mətn xidmətinin ən üst səviyyə araüzünü bağlamağa imkan verir(məsələn, SpellCheckerService). Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+    <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN xidmətə əlaqələndirmək"</string>
+    <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Sahibinə bir Vpn xidmətinin ən üst səviyyə araüzünü bağlamağa imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+    <string name="permlab_bindWallpaper" msgid="8716400279937856462">"divar kağızına bağlanır"</string>
+    <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Cihaz sahibinə yuxarı səviyyəli divar kağızı interfeysini cildləməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmamalıdır."</string>
+    <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"widget servisini qoşma"</string>
+    <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Sahibinə vidcet servisin yüksək səviyyəli interfeysi ilə əlaqə saxlamaq icazəsi verir. Normal tətbiqlər tərəfindən heç vaxt istənilməməlidir."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"cihaz admini ilə ünsiyyət qurmaq"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Sahibinə bir cihaz idarəçisinə planlar göndərmək üçün imkan verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+    <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"cihaz admini əlavə edin və ya silin"</string>
+    <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Sahibinə aktiv cihaz administratorlarını əlavə etməyə və ya silməyə icazə verir. Normal tətbiqlər üçün tələb olunmamalıdır."</string>
+    <string name="permlab_setOrientation" msgid="3365947717163866844">"ekran oriyentasiyasını dəyişir"</string>
+    <string name="permdesc_setOrientation" msgid="3046126619316671476">"Tətbiqə istənilən zaman ekranın vəziyyətini dəyişmə icazəsi verir. Normal tətbiqlər tərəfindən tələb olunmur."</string>
+    <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"kursor sürətini dəyişmək"</string>
+    <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Tətbiqə mausun və ya trekpedin kursor sürətini istənilən zaman dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmamalıdır."</string>
+    <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"klaviatura sxemini dəyişir"</string>
+    <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Tətbiqə klaviatura sxemini dəyişmək imkanı verir. Normal tətbiqlər tərəfindən tələb olunmur."</string>
+    <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"tətbiqlərə Linux siqnalları göndərir"</string>
+    <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Tətbiqə bütün davamlı proseslərə siqnal soğrusu göndərməyə imkan verir."</string>
+    <string name="permlab_persistentActivity" msgid="8841113627955563938">"təbiqi həmişə çalışdır"</string>
+    <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tətbiqə öz komponentlərini yaddaşda saxlama icazəsi verir. Bu planşetin sürətini zəiflətməklə, digər tətbiqlər üçün mövcud olan yaddaşı limitləyə bilər."</string>
+    <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Tətbiqə öz komponentlərini yaddaşda saxlama icazəsi verir. Bu digər tətbiqlər üçün mövcud olan yaddaşı limitləyə bilər."</string>
+    <string name="permlab_deletePackages" msgid="184385129537705938">"tətbiqləri sil"</string>
+    <string name="permdesc_deletePackages" msgid="7411480275167205081">"Tətbiqə Android paketləri silmə icazəsi verir. Zərərli tətbiqlər bundan digər vacib tətbiqləri silmək üçün istifadə edə bilər."</string>
+    <string name="permlab_clearAppUserData" msgid="274109191845842756">"digər tətbiqlərin məlumatını silir"</string>
+    <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Tətbiqə istifadəçi datasını təmizləməyə imkan verir."</string>
+    <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"digər tətbiqlərin keşini sil"</string>
+    <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Tətbiqə keş faylları silmə icazəsi verir."</string>
+    <string name="permlab_getPackageSize" msgid="7472921768357981986">"tətbiq saxlama yaddaşını ölçmək"</string>
+    <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Tətbiqə özünün kodunu, məlumatını və keş ölçüsünü alma icazəsi verir."</string>
+    <string name="permlab_installPackages" msgid="2199128482820306924">"birbaşa tətbiqlər quraşdırmaq"</string>
+    <string name="permdesc_installPackages" msgid="5628530972548071284">"Tətbiqə yeni və ya güncəllənmiş Android paketlərini quraşdırmağa imkan verir. Zərərli tətbiqlər bundan istifadə edərək güclü səlahiyyətlərə malik tətbiqləri endirə bilər."</string>
+    <string name="permlab_clearAppCache" msgid="7487279391723526815">"bütün tətbiq keş datasını silir"</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Tətbiqə planşetin yaddaşını boşaltmaq üçün digər tətbiqlərin keş fayllarını silmək imkanı verir. Bu da digər tətbiqlərin dataları yenidən əldə etmələri səbəbindən daha yavaş işləmələrinə səbəb ola bilər."</string>
+    <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Tətbiqə digər tətbiqlərin keş qovluğunu təmizləyərək telefonun yaddaşını boşaltmaq icazəsi verir. Bu digər tətbiqlərin məlumatlarını yenidən əldə etməli olduqlarına görə daha yavaş başlamasına səbəb olur."</string>
+    <string name="permlab_movePackage" msgid="3289890271645921411">"tətbiq resurslarının yerini dəyişir"</string>
+    <string name="permdesc_movePackage" msgid="319562217778244524">"Tətbiqə tətbiq resurslarını daxili mediadan xarici mediaya və əksinə daşımağa imkan verir."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"məxfi loq datasını oxuyur"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Tətbiqə sistemin müxtəlif jurnal fayllarını oxumağa imkan verir. Bu da Sizin planşetdə etdikləriniz haqqında məlumatlar, həmçinin şəxsi və konfidensial məlumatlar ola bilər."</string>
+    <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Tətbiqə sistemin müxtəlif jurnal fayllarını oxumağa imkan verir. Bu da Sizin planşetdə etdikləriniz haqqında məlumatlar, həmçinin şəxsi və konfidensial məlumatlar ola bilər."</string>
+    <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"oxutmaq üçün istənilən media dekoderi istifadə edir"</string>
+    <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Tətbiqə playback\'i deşifrə etmək üçün hər hansı bir quraşdırılmış media deşifrələyicisini istifadə etmık imkanı verir."</string>
+    <string name="permlab_manageCaCertificates" msgid="1678391896786882014">"etibarlı etimadnamələri idarə et"</string>
+    <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Tətbiqə etibarlı etimadnamələr kimi CA sertifikatlarını quraşdırmaq və sistemdən silməyə icazə verir."</string>
+    <string name="permlab_diagnostic" msgid="8076743953908000342">"diaga məxsus olan mənbələri yaz/oxu"</string>
+    <string name="permdesc_diagnostic" msgid="6608295692002452283">"Tətbiqə diag qrupa məsus olan resursları yazmaq və oxumaq icazəsi verir; məsələn  /dev qovluğundakı fayllar. Bu sistemin stabilliyinə və təhlükəsizliyinə təsir edə bilər. Bu ancaq istehsalçı və ya operator tərəfindən avadanlığa xas diaqnostika üçün olmalıdır."</string>
+    <string name="permlab_changeComponentState" msgid="6335576775711095931">"tətbiq komponentlərini aktivləşdirmə və ya deaktivləşdirmə"</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Tətbiqə digər tətbiq komponentinin aktiv olub-olmadığını dəyişmək imkanı verir. Zərərli tətbiqlər bundan əhəmiyyətli planşet imkanlarını deaktiv etmək üçün istifadə edə bilər. Bu icazə ilə ehtiyatlı olmaq lazımdır, çünki tətbiq komponentləri yararsız, ziddiyyətli, və ya qeyri-sabit statusa çevrilə bilər."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Tətbiqə digər tətbiq komponentinin aktiv olub-olmadığını dəyişmək imkanı verir. Zərərli tətbiqlər bundan əhəmiyyətli telefon imkanlarını deaktiv etmək üçün istifadə edə bilər. Bu icazə ilə ehtiyatlı olmaq lazımdır, çünki tətbiq komponentləri yararsız, ziddiyyətli, və ya qeyri-sabit statusa çevrilə bilər."</string>
+    <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"icazələr vermək və ya ləğv etmək"</string>
+    <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Tətbiqə bu və ya digər tətbiqlərə xüsusi iznlər verməyə icazə verir. Zərərli tətbiqlər  bundan izin vermədiyiniz özəllikləri özlərinə vermək üçün istifadə edə bilər."</string>
+    <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"tərcih edilən tətbiqlər qur"</string>
+    <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Tətbiqə tərcih etdiyiniz tətbiqləri dəyişmək imkanı verir. Zərərli tətbiqlər şəxsi məlumatlarınızı toplamaq üçün cari tətbiqlərinizi aldadaraq işləyən tətbiqləri xəbərsiz dəyişə bilər."</string>
+    <string name="permlab_writeSettings" msgid="2226195290955224730">"sistem ayarlarında dəyişiklik etmək"</string>
+    <string name="permdesc_writeSettings" msgid="7775723441558907181">"Tətbiqə sistem ayarları datasını redaktə etmə icazəsi verir. Zərərli tətbiqlər sistem ayarlarını korlaya bilər."</string>
+    <string name="permlab_writeSecureSettings" msgid="204676251876718288">"təhlükəsiz sistem nizamlarını dəyişir"</string>
+    <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Tətbiqə sistemin təhlükəsiz ayarlar datasını dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə üçün deyil."</string>
+    <string name="permlab_writeGservices" msgid="2149426664226152185">"Google xidmətlər xəritəsini dəyişdir"</string>
+    <string name="permdesc_writeGservices" msgid="1287309437638380229">"Tətbiqə Google xidmətlər xəritəsini dəyişdirmək imkanı verir. Normal tətbiqlərin istifadəsi üçün deyil."</string>
+    <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"başlanğıcda işləyir"</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Tətbiqə sistem yükləməni bitirdiyi zaman dərhal özünü başlatmağa imkan verir. Bu planşeti başlatmağın uzun çəkməsinə səbəb ola bilər və tətbiqə həmişə çalışdıraraq bütün planşeti yavaşlatmağa imkan verir."</string>
+    <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Tətbiqə sistem bootinqi bitirdikdən dərhal sonra özünü başlatmaq icazəsi verir. Bu telefonun açılmasını ləngidə və daima işlək qalaraq telefonun sürətini aşağı sala bilər."</string>
+    <string name="permlab_broadcastSticky" msgid="7919126372606881614">"daimi siqnal göndərmək"</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Tətbiqə yayım bitdikdən sonra da qalan çətin yayımlar göndərməyə imkan verir. Hədsiz istifadə çox yaddaş istifadəsinə səbəb olmaqla planşeti yavaş və qeyri-stabil edə bilər."</string>
+    <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Tətbiqə yayım bitdikdən sonra da qalan çətin yayımlar göndərməyə imkan verir. Hədsiz istifadə çox yaddaş istifadəsinə səbəb olmaqla telefonu yavaş və qeyri-stabil edə bilər."</string>
+    <string name="permlab_readContacts" msgid="8348481131899886131">"kontakrlatınızı oxumaq"</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tətbiqə planşetinizdə yerləşən kontaktları oxumaq icazəsi verir, tez-tez zəng elədiyiniz, emailləşdiyiniz və ya əlaqə saxladığınız xüsusi individuallar daxil olmaqla. Bu icazə tətbiqlərə kontakt məlumatlarınızı saxlamağa və zərərli tətbiqlərə kontakt məlumatlarını sizin bilginiz olmada paylaşma imkanı yaradır."</string>
+    <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tətbiqə tez-tez zəng elədiyiniz, e-məktub göndərdiyiniz və ya əlaqə saxladığınız xüsusi individuallar daxil olmaqla telefonunuzda yerləşən kontaktları oxumaq icazəsi verir. Bu icazə tətbiqlərə kontakt məlumatlarınızı saxlamağa və zərərli tətbiqlərə kontakt məlumatlarını sizin xəbəriniz olmada paylaşma imkanı yaradır."</string>
+    <string name="permlab_writeContacts" msgid="5107492086416793544">"kontaktlarınızı dəyişdirir"</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tətbiqə planşetinizdəki zəng etmək tezliyiniz, elektron poçtlarınız, ünsiyyətləriniz haqqında məlumatları dəyişməyə imkan verir. Bu icazə kontakt məlumatlarının silinməsinə də imkan verir."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tətbiqə Sizin zəng etmək tezliyiniz, elektron poçtlarınız, ünsiyyətləriniz haqqında məlumatları dəyişməyə imkan verir. Buna kontaktların silinməsi imkanı də daxildir."</string>
+    <string name="permlab_readCallLog" msgid="3478133184624102739">"zəng qeydiyyatını oxu"</string>
+    <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Tətbiqə gələn və gedən zənglər haqqında olan data daxil olmaqla bərabər planşetinizin zəng qeydiyyatını oxumağa imkan verir. Bu icazə tətbiqlərə zəng qeydiyyatınızı saxlamağa imkan verir və zərərli tətbiqlər zəng qeydiyyat datasını sizdən xəbərsiz paylaşa bilər."</string>
+    <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Tətbiqə telefon jurnalınızı oxumağa imkan verir, buna gələn və gedən zənglər haqqında məlumatlar da daxildir. Bu icazə tətbiqə zəng jurnalı datasını saxlamağa imkan verir ki, Zərərli tətbiqlər bundan istifadə edərək Sizdən xəbərsiz bütün məlumatlarnızı paylaşa bilər."</string>
+    <string name="permlab_writeCallLog" msgid="8552045664743499354">"zəng loqu yazır"</string>
+    <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Tətbiqə planşetinizdəki zəng jurnalını, həmçinin gedən və gələn zənglərin siyahısını dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək, zəng jurnalınıza dəyişiklik edə bilər."</string>
+    <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Tətbiqə sizin daxil olan və gedən zənglər daxil olmaqla telefon zəngi loqlarınızı redaktə etmək icazəsi verir. Zərərli tətbiqlər bundan telefon loqlarınızı silmək və ya redaktə etmək üçün istifadə edə bilər."</string>
+    <string name="permlab_readProfile" msgid="4701889852612716678">"öz kontakt kartınızı oxuyun"</string>
+    <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Tətbiqə cihazınızda yerləşən adınız və kontakt məlumatlarınız kimi şəxsi profil məlumatlarını oxuma icazəsi verir. Bu o deməkdir ki, tətbiq sizi tanıya və sizin profil məlumatlarınızı başqalarına göndərə bilər."</string>
+    <string name="permlab_writeProfile" msgid="907793628777397643">"sizin kontakt kartınızda dəyişiklik etmək"</string>
+    <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Tətbiqə cihazınızda yerləşən adınız və kontakt məlumatlarınız kimi şəxsi profil məlumatlarını dəyişmək və ya əlavə etmək icazəsi verir. Bu o deməkdir ki, tətbiq sizi tanıya və sizin profil məlumatlarınızı başqalarına göndərə bilər."</string>
+    <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"sosial lentinizi oxuyur"</string>
+    <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Tətbiqə Sizin və dostlarınızın sosial güncəllərini əldə etmək və sinxronizə etmək icazəsi verir. Məlumat paylaşarkən diqqətli olun - konfidensiallıqdan asılı olmayaraq bu, Siz və dostlarınız arasında sosial şəbəkələrdəki danışığı oxumaq imkanı verir. Qeyd: bu icazə bütün sosial şəbəkələrdə icra edilə bilməz."</string>
+    <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"sosial axınınıza yazır"</string>
+    <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Tətbiqə dostlarınızdan sosial yenilənmələri göstərmə icazəsi verir. Məlumat paylaşarkən diqqətli olun - bu dostlarınızdan gələn mesajı emal etməyə izn verir. Qeyd: bu icazə bütün sosial şəbəkələrə şamil olunmaya bilər."</string>
+    <string name="permlab_readCalendar" msgid="5972727560257612398">"təqvim tədbirlərini və konfidensial məlumatları oxuyur"</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Tətbiqə dostlarınızın və əməkdaşlarınızın planşetinizdə yerləşən kalendar tədbirlərini oxumağa icazə verir. Bu tətbiqə konfidensiallıq və ya həssaslıqdan asılı olmayaraq sizin kalendar məlumatlarınızı paylaşmaq və ya saxlamağa imkan yaradır."</string>
+    <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Tətbiqə dost və əməkdaşlara məxsus olanlar daxil olmaqla planşetdə yerləşən bütün kalendar tətbiqlərini oxumaq icazəsi verir. Bu tətbiqə konfidensiallıq və ya həssaslıqdan asılı olmayaraq, Sizin kalendar məlumatlarınızı paylaşmaq və ya saxlamaq imkanı yaradır."</string>
+    <string name="permlab_writeCalendar" msgid="8438874755193825647">"cihaz sahibinin icazəsi olmadan təqvim tədbirləri əlavə etmək və ya dəyişmək, bunun haqqında bildirişlər göndərmək"</string>
+    <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Tətbiqə planşetinizdəki tədbirləri dəyişməyə, tədbir əlavə etməyə və ya silməyə imkan verir. Buna Sizin dostlarınızla və həmkarlarınızla birlikdə hazırladığınız tədbirlər də daxildir. Bu, tədbirə Sizin adınızdan və Sizdən xəbərsiz, təqvim sahibi kimi mesaj göndərmək imkanını verir."</string>
+    <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Dostlarınız və həmkarlarınıza məxsus olanlar da daxil olmaqla, tətbiqə telefonunuzdakı tədbirləri dəyişməyə, tədbir əlavə etməyə və ya silməyə imkan verir. Bu, tədbirə Sizin adınızdan və Sizdən xəbərsiz, təqvim sahibi kimi mesaj göndərmək imkanı verir."</string>
+    <string name="permlab_accessMockLocation" msgid="8688334974036823330">"test üçün saxta məkan mənbələri"</string>
+    <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Test üçün saxta məkan mənbələri yaradın və ya yeni məkan provayderi quraşdırın. Bu tətbiqlərə GPS və məkan provayderləri kimi məkan mənbələrindən alınan məkan və/ya statusları yenidən yazmağa icazə verir."</string>
+    <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"əlavə məkan provayderi əmrlərinə çıxış"</string>
+    <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Tətbiqə əlavə məkan provayderi əmrlərinə daxil olmaq imkanı verir. Bu tətbiqə GPS əməliyyatına və ya digər məkan mənbələrinə mane olmaq imkanı verə bilər."</string>
+    <string name="permlab_installLocationProvider" msgid="6578101199825193873">"Məkan provayderini quraşdırmaq icazəsi"</string>
+    <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Yeni yerləşmə təchizatçısını test etmək və ya quraşdırmaq üçün mock yerləşmə mənbələri yarat. Bu tətbiqə yerləşmənin və/ya digər yerləşmə mənbələrindən GPS və ya yerləşmə təchizatçıları qayıtmış statusların ləğv etməsinə imkan verir."</string>
+    <string name="permlab_accessFineLocation" msgid="1191898061965273372">"dəqiq yeri (GPS və şəbəkə-əsaslı)"</string>
+    <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Qlobal Pozisiya Sistemini və ya şəbəkə qüllələri və Wi-Fi kimi şəbəkə məkanını istifadə edərək tətbiqə Sizin dəqiq yerinizi təyin etməyə imkan verir. Bu məkan xidmətləri aktivləşdirilməlidirlər ki, Siz tətbiqi istifadə edən zaman tətbiq onları istifadə edə bilsin. Tətbiqlər Sizin harada olmağınızı bunun vasitəsilə təyin edəcək, eyni zamanda, bu xidmət əlavə batareya enerjisi apara bilər."</string>
+    <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"təxmini məkan (şəbəkə əsaslı)"</string>
+    <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Tətbiqə təxmini yerinizi almaq üçün imkan verir. Bu yer, yerləşmə xidmətləri tərəfindən mobil qüllələr və Wi-Fi kimi şəbəkə yerləşmə mənbələrdən istifadə etməklə əldə edilir. Bu yerləşmə xidmətləri tətbiqin onlardan istifadəsi üçün açıq və cihazınızın onları istifadəsi üçün mövcud olmalıdır. Tətbiqlər bundan sizin təxminən harada olduğunuzu müəyyənləşdirmək üçün istifadə edə bilər."</string>
+    <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger\'ə daxil olmaq"</string>
+    <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Tətbiqə aşağı səviyyəli SurfaceFnger özəlliklərini istifadə etməyə icazə verir."</string>
+    <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"freym buferi oxuyur"</string>
+    <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Tətbiqə freym buferinin kontentini oxumaq icazəsi verir."</string>
+    <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi görüntülərini quraşdır"</string>
+    <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Tətbiqə Wifi görüntülərini quraşdırmağa və onlara qoşulmağa imkan verir."</string>
+    <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"WiFi görüntülərini dəyişir"</string>
+    <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Tətbiqə Wifi displeylərinin aşağı səviyyəli funksiyalarını idarə etmək imkanı verir."</string>
+    <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"audio çıxışı alın"</string>
+    <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Tətbiqə audio çıxışı almaq və yenidən yönləndirmək imkanı verir."</string>
+    <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"video çıxışı alın"</string>
+    <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Tətbiqə video çıxışı almaq və yenidən yönləndirmək imkanı verir."</string>
+    <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"təhlükəsiz video çıxışı alın"</string>
+    <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Tətbiqə güvənli video çıxışı almaq və yenidən yönləndirmək imkanı verir."</string>
+    <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"audio ayarlarınızı dəyişir"</string>
+    <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Tətbiqə səs və hansı spikerin çıxış üçün istifadə olunduğu kimi qlobal səs ayarlarını dəyişdirməyə imkan verir."</string>
+    <string name="permlab_recordAudio" msgid="3876049771427466323">"səs yaz"</string>
+    <string name="permdesc_recordAudio" msgid="4906839301087980680">"Tətbiqə mikrofonla audio yazmaq icazəsi verir. İcazə tətbiqə sizin təsdiqiniz olmadan istənilən zaman səs yazma izni verir."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"şəkil və video çəkmək"</string>
+    <string name="permdesc_camera" msgid="8497216524735535009">"Tətbiqə kamera ilə şəkil və video çəkməyə imkan yaradır. Bu icazə tətbiqə sizin təsdiqiniz olmadan kameradan istifadə icazəsi verir."</string>
+    <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"kamera istifadə edildikdə LED göstərici ötürülməsini deaktiv edir"</string>
+    <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Öncədən quraşdırılmış sistem tətbiqinə kamera tərəfindən istifadə edilən LED indikatorunu söndürmək icazəsi verir."</string>
+    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"planşeti daimi olaraq aradan qaldır"</string>
+    <string name="permlab_brick" product="default" msgid="8337817093326370537">"telefonu həmişəlik deaktiv etmək"</string>
+    <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Tətbiqə planşeti birdəfəlik deaktiv etməyə imkan verir. Bu da çox təhlükəlidir."</string>
+    <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Tətbiqə bütün telefonu birdəfəlik deaktivləşdirməyə imkan verir. Bu çox təhlükəlidir."</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"planşeti yenidən yüklənməyə məcbur edir"</string>
+    <string name="permlab_reboot" product="default" msgid="2898560872462638242">"telefonu yenidən yüklənməyə məcbur edir"</string>
+    <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Tətbiqə planşeti yenidən yükləməyə məcbur etmək imkanı verir."</string>
+    <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Tətbiqə telefonu yenidən yükləməyə məcbur etmək üçün imkan verir."</string>
+    <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB yaddaş fayl sisteminə daxil olmaq"</string>
+    <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD Kart fayl sisteminə daxil olmaq"</string>
+    <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Tətbiqə silinəbilən yaddaşları və ya fayl sistemini quraşdırma və ayırma icazəsi verir."</string>
+    <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB yaddaşı silir"</string>
+    <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD kartı silir"</string>
+    <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Tətbiqə çıxarıla bilən yaddaşı format etməyə imkan verir."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"daxili yaddaşınız haqqında məlumat əldə etmək"</string>
+    <string name="permdesc_asec_access" msgid="3094563844593878548">"Tətbiqə daxili yaddaş haqqında məlumat almağa imkan verir."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"daxili yaddaş yaratmaq"</string>
+    <string name="permdesc_asec_create" msgid="4558869273585856876">"Tətbiqə daxili yaddaş yaratmaq üçün imkan verir."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"daxili yaddaşı məhv etmə"</string>
+    <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Tətbiqə daxili yaddaşı məhv etmə icazəsi verir."</string>
+    <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"daxili yaddaşı montaj və ya demontaj etmək"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Tətbiqə daxili yaddaşı quraşdırma/ayırma icazəsi verir."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"daxili yaddaşın adını dəyiş"</string>
+    <string name="permdesc_asec_rename" msgid="1794757588472127675">"Tətbiqə daxili yaddaşın adını dəyişmək imkanı verir."</string>
+    <string name="permlab_vibrate" msgid="7696427026057705834">"vibrasiyaya nəzarət edir"</string>
+    <string name="permdesc_vibrate" msgid="6284989245902300945">"Tətbiqə vibratoru idarə etmə icazəsi verir."</string>
+    <string name="permlab_flashlight" msgid="2155920810121984215">"Flash işığını idarə edir"</string>
+    <string name="permdesc_flashlight" msgid="6522284794568368310">"Tətbiqə siqnal işığı na nəzarət etməyə imkan verir."</string>
+    <string name="permlab_manageUsb" msgid="1113453430645402723">"USB cihazlar üçün tərcihləri və icazələri idarə etmək"</string>
+    <string name="permdesc_manageUsb" msgid="7776155430218239833">"Tətbiqə USB cihazlar üçün olan tərcihləri və icazələri idarə etməyə imkan verir."</string>
+    <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP protokol həyata keçirmək"</string>
+    <string name="permdesc_accessMtp" msgid="6532961200486791570">"Kernel MTP drayverə girişə imkan verir ki, MTP USB protokolunu həyata keçirsin."</string>
+    <string name="permlab_hardware_test" msgid="4148290860400659146">"avadanlığı sınaq edir"</string>
+    <string name="permdesc_hardware_test" msgid="6597964191208016605">"Tətbiqə avadanlığı yoxlamaq üçün müxtəlif periferiyaları kontrol etməyə imkan verir."</string>
+    <string name="permlab_callPhone" msgid="3925836347681847954">"telefon nömrələrinə birbaşa zəng edir"</string>
+    <string name="permdesc_callPhone" msgid="3740797576113760827">"Tətbiqə Sizin müdaxiləniz olmadan telefon zəngləri etməyə imkan verir. Zərərli tətbiqlər Sizdən xəbərsiz şəkildə müxtəlif zənglər edərək, Sizə maddi ziyan vura bilər. Qeyd: Bu, tətbiqlərə təcili nömrələrə zəng etməyə icazə vermir."</string>
+    <string name="permlab_callPrivileged" msgid="4198349211108497879">"istənilən nömrəyə birbaşa zəng edir"</string>
+    <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Tətbiqə Sizin müdaxiləniz olmadan, təcili zənglər də daxil olmaqla, istənilən telefon zəngini etməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək, təcili nömrələrə qanunsuz zəng vurmaqla Sizin üçün hüquqi problemlər yarada bilər."</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA planşet ayarlarına birbaşa başlamaq"</string>
+    <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA telefon quraşdırmalarına birbaşa başlamaq"</string>
+    <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Tətbiqə CDMA hazırlığını başlatma icazəsi verir. Zərərli tətbiqlər ehtiyac olmadıqda CDMA hazırlığını başlada bilərlər."</string>
+    <string name="permlab_locationUpdates" msgid="7785408253364335740">"məkan güncəlləmə bildirişlərini idarə edir"</string>
+    <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Tətbiqə radiodan gələn məkan güncəllənmələrini aktiv və ya deaktiv etməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+    <string name="permlab_checkinProperties" msgid="7855259461268734914">"qeydiyyat xüsusiyyətlərini əldə edir"</string>
+    <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Tətbiqə giriş qeydi servisi tərəfindən yüklənmiş mülkiyyətə girişi oxumaq/yazmaq imkanl verir. Normal tətbiqlər üçün nəzərdə tutulmayıb."</string>
+    <string name="permlab_bindGadget" msgid="776905339015863471">"vidcetlər seç"</string>
+    <string name="permdesc_bindGadget" msgid="8261326938599049290">"Tətbiqə sistemə hansı vidcetin hansı tətbiq tərəfindən istifadə edilə bilməsini deməyə icazə verir. Bu icazəli tətbiqlər şəxsi məlumatlara və digər tətbiqlərə çıxış verə bilər. Normal tətbiqlər tərəfindən istifadə üçün deyil."</string>
+    <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"telefon statusunu dəyişmək"</string>
+    <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Tətbiqə cihazın telefon funksiyalarını idarə etmək imkanı verir. Belə icazəli tətbiq Sizi xəbərdar etmədən şəbəkələri qoşa, telefon radiosunu yandırıb-söndürə bilər."</string>
+    <string name="permlab_readPhoneState" msgid="9178228524507610486">"telefon statusunu və identifikasiyanı oxuyur"</string>
+    <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Tətbiqə cihazın telefon funksiyalarına giriş icazəsi verir. Belə icazəli tətbiq bu telefonun nömrəsini və cihaz İD\'ni, zəngin aktiv olub-olmadığını və zəng edilən nömrəni müəyyən edə bilər."</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"planşetin yuxu rejiminin qarşısını almaq"</string>
+    <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"telefonun yuxu rejiminə keçməsini əngəllə"</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Tətbiqə planşetin yuxu rejimini qadağan etməyə imkan verir."</string>
+    <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Tətbiqə telefonun yuxu rejimini qadağan etmək imkanı verir."</string>
+    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"planşeti yandırma və ya söndürmə"</string>
+    <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"telefonu yandırmaq və ya söndürmək"</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Tətbiqə planşeti yandırmağa və söndürməyə imkan verir."</string>
+    <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Tətbiqə telefonu yandırıb söndürmə icazəsi verir."</string>
+    <string name="permlab_factoryTest" msgid="3715225492696416187">"zavod test rejimində işləyir"</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Planşet avadanlığına tam girişə imkan verməklə aşağı səviyyəli istehsalçı sınağı kimi işləyir. Yalnız planşet istehsalçı sınaq rejimində olduqda işləyir."</string>
+    <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Bir aşağı səviyyəli istehsalçı testi kimi çalışdırın, telefon hardware üçün tam giriş imkanı verir. Ancaq telefon, istehsalçı test rejimində çalışdığı zaman aktivdir."</string>
+    <string name="permlab_setWallpaper" msgid="6627192333373465143">"divar kağızı yerləşdirir"</string>
+    <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Tətbiqə sistemə divar kağızı yerləşdirmək icazəsi verir."</string>
+    <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"divar kağızı ölçüsünü verir"</string>
+    <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Tətbiqə sistem divar kağızı ölçüsü göstərişlərini müəyyən etməyə imkan verir."</string>
+    <string name="permlab_masterClear" msgid="2315750423139697397">"fabrik defoltuna sıfırlamaq"</string>
+    <string name="permdesc_masterClear" msgid="3665380492633910226">"Tətbiqə bütün məlumatları, nizamları və quraşdırılmış tətbiqləri silərək sistemi fabrik nizamlarına qaytarmaq imkanı verir."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"vaxtı təyin edir"</string>
+    <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Tətbiqə planşetin saat vaxtını dəyişməyə imkan verir."</string>
+    <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Tətbiqə telefonun saat vaxtını dəyişməyə imkan verir."</string>
+    <string name="permlab_setTimeZone" msgid="2945079801013077340">"vaxt zonasını quraşdırır"</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Tətbiqə planşetin vaxt zonasını dəyişmə icazəsi verir."</string>
+    <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Tətbiqə telefon saat zolağını dəyişmək üçün imkan verir."</string>
+    <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService kimi davranır"</string>
+    <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Tətbiqə AccountAuthenticators\'ə zəng etməyə imkan verir."</string>
+    <string name="permlab_getAccounts" msgid="1086795467760122114">"cihazda hesabları tapır"</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Tətbiqə planşet tərəfindən bilinən hesabların siyahısını alma icazəsi verir. Bu quraşdırdığınız tətbiqlər tərəfindən yaradılmış istənilən hesab ola bilər."</string>
+    <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Tətbiqə telefonda olan hesabların siyahısını əldə etməyə imkan verir. Buna quraşdırdığınız istənilən tətbiq tərəfindən yaradılan hesablar da aiddir."</string>
+    <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"hesablar yaradır və parollar təyin edir"</string>
+    <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Tətbiqə AccountManager\'in hesab yaratmaq və parol almaq və açmaq daxil olmaqla bərabər, hesab təsdiqləyici imkanlarını istifadə etməyə icazə verir."</string>
+    <string name="permlab_manageAccounts" msgid="4983126304757177305">"hesabları əlavə edir və ya silir"</string>
+    <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Tətbiqə hesabların əlavə olunması və ya silinməsi, həmçinin onların parollarının silinməsi kimi əməliyyatları icra etməyə imkan verir."</string>
+    <string name="permlab_useCredentials" msgid="235481396163877642">"cihazda hesablar istifadə etmək"</string>
+    <string name="permdesc_useCredentials" msgid="7984227147403346422">"Tətbiqə autentifikasiya tokenləri sorğularını göndərməyə icazə verir."</string>
+    <string name="permlab_accessNetworkState" msgid="4951027964348974773">"şəbəkə bağlantılarına baxmaq"</string>
+    <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Tətbiqə mövcud olan və qoşulan şəbəkələr kimi qoşulmalar haqqında məlumatı görməyə icazə verir."</string>
+    <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"tam şəbəkə girişi"</string>
+    <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Tətbiqə şəbəkə soketlərini yaratmağa və fərdi şəbəkə protokollarını istifadə etməyə imkan verir. Brauzer və digər tətbiqlər datanın internetə ötürülməsini təmin edən vəsaitlər verir, ona görə də datanın internetə gönrədilməsi üçün bu icazə tələb olunmur."</string>
+    <string name="permlab_writeApnSettings" msgid="505660159675751896">"şəbəkə nizamlarını və trafiki dəyişdirir/qarşısını alır"</string>
+    <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Tətbiqə şəbəkə trafikinin qarşısını almaq üçün şəbəkə nizamlarını dəyişmə icazəsi verir, məsələn proksini və ya istənilən APN-in portunu. Zərərli tətbiqlər şəbəkə paketlərini sizin bilginiz olmadan monitorinq edə, yönləndirə və ya redaktə edə bilər."</string>
+    <string name="permlab_changeNetworkState" msgid="958884291454327309">"şəbəkə bağlantısını dəyişir"</string>
+    <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Tətbiqə şəbəkə vəziyyətini dəyişməyə icazə verir."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"Sərhədli bağlantını dəyişir"</string>
+    <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Tətbiqə birləşilmiş şəbəkə bağlantısının statusunu dəyişməyə imkan verir."</string>
+    <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"arxafon data istifadəsi ayarını dəyişir"</string>
+    <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Tətbiqə fon rejimi nizamlarını dəyişməyə icazə verir."</string>
+    <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi bağlantılarına baxmaq"</string>
+    <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Tətbiqə Wi-Fi şəbəkələri haqqında məlumatı görməyə icazə verir, məsələn, Wi-Fi mövcudluğu və qoşulmuş Wi-Fi cihazlarının adları."</string>
+    <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi şəbəkəsinə qoşulmaq və ya ayrılmaq"</string>
+    <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Tətbiqə Wi-Fi çıxış nöqtəsinə qoşulmaq və ondan ayrılmaq və cihazın Wi-Fi şəbəkə nizamlarını dəyişməyə icazə verir."</string>
+    <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi Multicast qəbuluna icazə ver"</string>
+    <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Tətbiqə Wi-Fi şəbəkədə sizin planşetdən başqa digər multikast adreslərə yönləndirilmiş paketləri almaq icazəsi verir. Bu qeyri-çoxadresli rejimdən fəqli olaraq daha çox enerji işlədir."</string>
+    <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Tətbiqə qrup ünvanlar istifadə etməklə, Wi-Fi şəbəkəsində olan bütün cihazlara göndərilmiş paketləri qəbul etməyə imkan verir. Buna daha çox enerji sərf olunur."</string>
+    <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth ayarlarını əldə edir"</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Tətbiqə yerli Bluetooth planşetinin konfiqurasiyasını görməyə və məsafədən cihazları tapmağa və cütləməyə imkan verir."</string>
+    <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Tətbiqə lokal Bluetooth telefonunu konfiqurə etməyə və uzaq cihazları kəşf etmək və onlara qoşulmaq icazəsi verir."</string>
+    <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX\'a qoşul və bağlantını kəs"</string>
+    <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Tətbiqə WiMAX mövcudluğu və qoşulmuş WiMAX şəbəkələrini təyin etməyə icazə verir."</string>
+    <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX vəziyyətini dəyişir"</string>
+    <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Tətbiqə planşeti WiMAX şəbəkələrinə qoşmaq və onlardan ayırmaq icazəsi verir."</string>
+    <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Tətbiqə telefonu WiMAX şəbəkəsinə qoşmağa və ya WiMAX şəbəkəsindən ayırmağa imkan verir."</string>
+    <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth cihazları ilə cütləndirmək"</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Tətbiqə yerli Bluetooth planşetinin konfiqurasiyasını görməyə və cütlənmiş cihazlarla bağlantılar etməyə və qəbul etməyə imkan verir."</string>
+    <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Tətbiqə Bluetooth və ya telefon konfiqurasiyalarını görməyə və qoşulmuş cihazlarla əlaqə qurmağa və qəbul etməyə icazə verir."</string>
+    <string name="permlab_nfc" msgid="4423351274757876953">"Near Field Communication\'ı kontrol et"</string>
+    <string name="permdesc_nfc" msgid="7120611819401789907">"Tətbiqə Yaxın Məsafə Kommunikasiyası (NFC) teqləri, kartları və oxuyucuları ilə əlaqə qurmağa icazə verir."</string>
+    <string name="permlab_disableKeyguard" msgid="3598496301486439258">"Ekran kilidini deaktiv edir"</string>
+    <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Tətbiqə kilid açarını və təhlükəsizlik parolunu deaktiv etməyə imkan verir. Qanuni misal budur ki, telefon zəng qəbul edən zaman kilidi açır və zəng qurtarandan sonra kilidi bağlayır."</string>
+    <string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx ayarlarını oxu"</string>
+    <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tətbiqə hesablar üçün sinxronizasiya nizamlarını oxuma icazəsi verir. Məsələn, bu Şəxslər tətbiqinin sinxronizə olunub-olunmadığını təyin edə bilər."</string>
+    <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinxronizasiyaya davam edir və onu söndürür"</string>
+    <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Tətbiqə hesab üçün sinxronizasiya nizamlarını dəyişməyə icazə verir. Məsələn, bu istifadəçi hesablı Şəxslər tətbiqinin sinxronizasiyasını başlamaq üçün istifadə edilə bilər."</string>
+    <string name="permlab_readSyncStats" msgid="7396577451360202448">"sinxronizasiya statistikasını oxumaq"</string>
+    <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Tətbiqə sync tədbirlərinin tarixçəsi və nə qədər datanın sinx olduğu da daxil olmaqla bərabər, hər hansı bir hesab üçün olan sinx statlarını oxumağa imkan verir."</string>
+    <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"abunə olunmuş xəbərləri oxuyur"</string>
+    <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Tətbiqə hazırda sinxron lentlər haqqında ətraflı məlumat almaq üçün imkan verir."</string>
+    <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"abunə olunmuş xəbərləri yazır"</string>
+    <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Tətbiqə cari sinxronlaşmış lentlərinizə dəyişiklik etmək imkanı verir. Zərərli tətbiqlər sixronlaşmış lentlərinizi dəyişə bilər."</string>
+    <string name="permlab_readDictionary" msgid="4107101525746035718">"lüğətə əlavə etdiyiniz şərtləri oxumaq"</string>
+    <string name="permdesc_readDictionary" msgid="659614600338904243">"Tətbiqə istifadəçinin lüğətdə saxladığı bütün sözləri, adları və frazaları oxumaq icazəsi verir."</string>
+    <string name="permlab_writeDictionary" msgid="2183110402314441106">"istifadəçi lüğətinə sözlər əlavə etmək"</string>
+    <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Tətbiqə istifadəçi lüğətinə yeni sözlər yazmağa imkan verir."</string>
+    <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"qorunmuş yaddaşa daxil olmağa cəhd etmək"</string>
+    <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"qorunmuş yaddaşa daxil olmağa cəhd etmək"</string>
+    <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Tətbiqə gələcək cihazlarda əlçatımlı olacaq USB yaddaş üçün icazə testi etməyə imkan verir."</string>
+    <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Tətbiqə gələcək cihazlarda mövcud olacaq SD kart üçün icazəni test etmək üçün imkan verir."</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB yaddaşınızın məzmununu dəyişmək və ya silmək"</string>
+    <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kart kontentlərini dəyişir və ya silir"</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Tətbiqə USB yaddaşa yazmağa imkan verir."</string>
+    <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Tətbiqə SD karta yazma icazəsi verir."</string>
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"daxili media yaddaşı kontentini dəyişir/silir"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Tətbiqə daxili media yaddaşdakı kontenti redaktə etmək icazəsi verir."</string>
+    <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"sənəd yaddaşını nizamlayır"</string>
+    <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Tətbiqə sənəd yaddaşını idarə etməyə imkan verir."</string>
+    <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"bütün istifadəçilərin xarici yaddaşına daxil ol"</string>
+    <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Tətbiqə bütün istifadəçilər üçün olan xarici yaddaşa giriş imkanı verir."</string>
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"keş fayl sisteminə girmək"</string>
+    <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Tətbiqə keş fayl sistemini oxumağa və yazmağa icazə verir."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"İnternet zəngləri etmək və ya qəbul etmək"</string>
+    <string name="permdesc_use_sip" msgid="4717632000062674294">"Tətbiqə internet zənglərinin göndərilməsi və qəbul edilməsi üçün SIP servisindən istifadə icazəsi verir."</string>
+    <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"tarixi şəbəkə istifadəsini oxu"</string>
+    <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Tətbiqə xüsusi şəbəkələr və tətbiqlər üçün tarixi şəbəkə istifadəsini oxumağa icazə verir."</string>
+    <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"şəbəkə siyasətini idarə etmək"</string>
+    <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Tətbiqə şəbəkə qanunlarını və tətbiqin xüsusi qaydalarını idarə etmək imkanı verir."</string>
+    <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"şəbəkə istifadə hesabını dəyişmək"</string>
+    <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Tətbiqə şəbəkə istifadəsinin tətbiqlərə qarşı nizamlarını redaktə etməyə icazə verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+    <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"soket işarələrini dəyişin"</string>
+    <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"Tətbiqə araşdırma üçün soket işarələrini dəyişmək imkanı verir"</string>
+    <string name="permlab_accessNotifications" msgid="7673416487873432268">"bildirişlərə daxil ol"</string>
+    <string name="permdesc_accessNotifications" msgid="458457742683431387">"Tətbiqə bildirişləri əldə etməyə, sınamağa və təmizləməyə imkan verir, buna digər tətbiqlər tərəfindən verilmiş bildirişlər də daxildir."</string>
+    <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"bildiriş dinləmə xidmətinə bağlanır"</string>
+    <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Sahibinə yüksək səviyyəli bildiriş dinləmə servisi ilə əlaqə saxlamağa icazə verir. Normal tətbiqlər tərəfindən heç vaxt istənilməməlidir."</string>
+    <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"operator xidmətli konfiurasiya tətbiqinə müraciət edin"</string>
+    <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Sahibinə operator xidmətli tətbiq konfiqurasiyasına  müraciət imkanı verir. Normal tətbiqlər üçün tələb olunmamalıdır."</string>
+    <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"şəbəkə şəraiti haqqında müşahidələr üçün qulaq asmaq"</string>
+    <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Tətbiqə şəbəkə şəraiti üzrə müşahidələr üçün qulaq asmaq imkanı verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Parol qaydalarını təyin edin"</string>
+    <string name="policydesc_limitPassword" msgid="3252114203919510394">"Ekran kilidini açan şifrələrin uzunluğunu və onlardakı icazə verilən işarələrə nəzarət edir."</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Ekran kilidi cəhdlərini monitorinq et"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Ekan kilidini açarkən daxil edilmiş yanlış parollara baxın və əgər həddindən çox yanlış parollar daxil edilibsə, planşeti kilidləyin və ya bütün planşet datasını silin."</string>
+    <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Ekan kilidini açarkən daxil edilmiş yanlış parollara baxın və əgər həddindən çox yanlış parollar daxil edilibsə, telefonu kilidləyin və ya bütün telefon datasını silin."</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Ekran kilid parolunu dəyişin"</string>
+    <string name="policydesc_resetPassword" msgid="605963962301904458">"Ekran kilidini açan şifrəni dəyişdirin."</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Ekranı kilidləyin"</string>
+    <string name="policydesc_forceLock" msgid="1141797588403827138">"Ekranın nə vaxt və necə kilidlənməsinə nəzarət edir."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Bütün məlumatları silin"</string>
+    <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Planşetin datasını xəbərdarlıq olmadan, zavod data sıfırlaması ilə silin."</string>
+    <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Telefonun datasını xəbərdarlıq olmadan, zavod data sıfırlaması ilə silin"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Cihazın qlobal proksisini ayarlayın"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Siyasət aktiv olarkən cihazın qlobal proksisini istifadə üçün qurun. Yalnız ilk cihaz admini effektiv qlobal proksini təyin edir."</string>
+    <string name="policylab_expirePassword" msgid="885279151847254056">"Ekran kilidi şifrəsinə son zaman seç"</string>
+    <string name="policydesc_expirePassword" msgid="1729725226314691591">"Ekran kilidi parolunun nə qədər tez-tez dəyişməsini kontrol edin."</string>
+    <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Yaddaş şifrələnməsini ayarlayın"</string>
+    <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Tətbiq məlumatlarının şifrələnməsini tələb edir."</string>
+    <string name="policylab_disableCamera" msgid="6395301023152297826">"Kameraları dekativ edin"</string>
+    <string name="policydesc_disableCamera" msgid="2306349042834754597">"Bütün cihaz kameralarının istifadəsini əngəllə."</string>
+    <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Klaviatura kilidində funksiyaları deaktiv edin"</string>
+    <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"Klaviatura kilidində bəzi funksiyaların qarşısını alın."</string>
+  <string-array name="phoneTypes">
+    <item msgid="8901098336658710359">"Əsas səhifə"</item>
+    <item msgid="869923650527136615">"Mobil"</item>
+    <item msgid="7897544654242874543">"İş"</item>
+    <item msgid="1103601433382158155">"İş Faksı"</item>
+    <item msgid="1735177144948329370">"Ev Faksı"</item>
+    <item msgid="603878674477207394">"Peycer"</item>
+    <item msgid="1650824275177931637">"Digər"</item>
+    <item msgid="9192514806975898961">"Şəxsi"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item msgid="8073994352956129127">"Ana səhifə"</item>
+    <item msgid="7084237356602625604">"İş"</item>
+    <item msgid="1112044410659011023">"Digər"</item>
+    <item msgid="2374913952870110618">"Fərdi"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item msgid="6880257626740047286">"Əsas səhifə"</item>
+    <item msgid="5629153956045109251">"İş"</item>
+    <item msgid="4966604264500343469">"Digər"</item>
+    <item msgid="4932682847595299369">"Düzənləyin"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item msgid="1738585194601476694">"Əsas səhifə"</item>
+    <item msgid="1359644565647383708">"İş"</item>
+    <item msgid="7868549401053615677">"Digər"</item>
+    <item msgid="3145118944639869809">"Fərdi"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item msgid="7546335612189115615">"İş"</item>
+    <item msgid="4378074129049520373">"Digər"</item>
+    <item msgid="3455047468583965104">"Fərdi"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item msgid="8595261363518459565">"AIM"</item>
+    <item msgid="7390473628275490700">"Windows Live"</item>
+    <item msgid="7882877134931458217">"Yahoo"</item>
+    <item msgid="5035376313200585242">"Skype"</item>
+    <item msgid="7532363178459444943">"QQ"</item>
+    <item msgid="3713441034299660749">"Google Söhbət"</item>
+    <item msgid="2506857312718630823">"ICQ"</item>
+    <item msgid="1648797903785279353">"Jabber"</item>
+  </string-array>
+    <string name="phoneTypeCustom" msgid="1644738059053355820">"Şəxsi"</string>
+    <string name="phoneTypeHome" msgid="2570923463033985887">"Ev"</string>
+    <string name="phoneTypeMobile" msgid="6501463557754751037">"Mobil"</string>
+    <string name="phoneTypeWork" msgid="8863939667059911633">"İş"</string>
+    <string name="phoneTypeFaxWork" msgid="3517792160008890912">"İş Faksı"</string>
+    <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Ev Faksı"</string>
+    <string name="phoneTypePager" msgid="7582359955394921732">"Peycer"</string>
+    <string name="phoneTypeOther" msgid="1544425847868765990">"Digər"</string>
+    <string name="phoneTypeCallback" msgid="2712175203065678206">"Geriyə zəng"</string>
+    <string name="phoneTypeCar" msgid="8738360689616716982">"Avtomobil"</string>
+    <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Şirkət"</string>
+    <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+    <string name="phoneTypeMain" msgid="6766137010628326916">"Əsas"</string>
+    <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Digər faks"</string>
+    <string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string>
+    <string name="phoneTypeTelex" msgid="3367879952476250512">"Teleks"</string>
+    <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+    <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Mobil iş telefonu"</string>
+    <string name="phoneTypeWorkPager" msgid="649938731231157056">"İş Peyceri"</string>
+    <string name="phoneTypeAssistant" msgid="5596772636128562884">"Köməkçi"</string>
+    <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Fərdi"</string>
+    <string name="eventTypeBirthday" msgid="2813379844211390740">"Doğum günü"</string>
+    <string name="eventTypeAnniversary" msgid="3876779744518284000">"İldönümü"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Digər"</string>
+    <string name="emailTypeCustom" msgid="8525960257804213846">"Fərdi"</string>
+    <string name="emailTypeHome" msgid="449227236140433919">"Əsas səhifə"</string>
+    <string name="emailTypeWork" msgid="3548058059601149973">"İş"</string>
+    <string name="emailTypeOther" msgid="2923008695272639549">"Digər"</string>
+    <string name="emailTypeMobile" msgid="119919005321166205">"Mobil"</string>
+    <string name="postalTypeCustom" msgid="8903206903060479902">"Fərdi"</string>
+    <string name="postalTypeHome" msgid="8165756977184483097">"Əsas səhifə"</string>
+    <string name="postalTypeWork" msgid="5268172772387694495">"İş"</string>
+    <string name="postalTypeOther" msgid="2726111966623584341">"Digər"</string>
+    <string name="imTypeCustom" msgid="2074028755527826046">"Fərdi"</string>
+    <string name="imTypeHome" msgid="6241181032954263892">"Ana səhifə"</string>
+    <string name="imTypeWork" msgid="1371489290242433090">"İş"</string>
+    <string name="imTypeOther" msgid="5377007495735915478">"Digər"</string>
+    <string name="imProtocolCustom" msgid="6919453836618749992">"Şəxsi"</string>
+    <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+    <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+    <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+    <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+    <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+    <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Görüşlər"</string>
+    <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+    <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+    <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+    <string name="orgTypeWork" msgid="29268870505363872">"İş"</string>
+    <string name="orgTypeOther" msgid="3951781131570124082">"Digər"</string>
+    <string name="orgTypeCustom" msgid="225523415372088322">"Fərdi"</string>
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Şəxsi"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Köməkçi"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Qardaş"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Uşaq"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Ev yoldaşı"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Ata"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Dost"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Müdir"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Ana"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Valideyn"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Ortaq"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Dəvət edən"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Qohum"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Bacı"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Həyat yoldaşı"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Fərdi"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Əsas səhifə"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"İş"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Digər"</string>
+    <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PİN kodu daxil edin"</string>
+    <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK və yeni PİN kod daxil edin"</string>
+    <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kod"</string>
+    <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Yeni PIN kodu"</string>
+    <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Şifrə daxil etmək üçün toxunun"</font></string>
+    <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Kilidi açmaq üçün parol yazın"</string>
+    <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Kilidi açmaq üçün PIN daxil edin"</string>
+    <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Yanlış PIN kodu."</string>
+    <string name="keyguard_label_text" msgid="861796461028298424">"Kilidi açmaq üçün Menyu, sonra 0 basın."</string>
+    <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Təcili nömrə"</string>
+    <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Xidmət yoxdur."</string>
+    <string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ekran kilidlənib."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Təcili zəng kilidini açmaq və ya yerləşdirmək üçün Menyu düyməsinə basın."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Kilidi açmaq üçün Menyu düyməsinə basın."</string>
+    <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Kilidi açmaq üçün model çəkin"</string>
+    <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Təcili zəng"</string>
+    <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Zəngə qayıt"</string>
+    <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Düzdür!"</string>
+    <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Bir də cəhd edin"</string>
+    <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Bir daha cəhd et"</string>
+    <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Sifət kilidi cəhdləriniz bitdi"</string>
+    <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Batareya yığılır, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="lockscreen_charged" msgid="321635745684060624">"Dolub"</string>
+    <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="lockscreen_low_battery" msgid="1482873981919249740">"Elektrikə qoşun."</string>
+    <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM kart yoxdur."</string>
+    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Planşetdə SIM kart yoxdur."</string>
+    <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Telefonda SİM kart yoxdur."</string>
+    <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SİM kart daxil edin."</string>
+    <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SİM kart yoxdur və ya oxuna bilinmir. SİM kart daxil edin."</string>
+    <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Yararsız SIM kart."</string>
+    <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"Sizin SİM kartınız daimi olaraq deaktivləşib.\n Başqa SİM kart üçün simsiz xidmət provayderinizə müraciət edin."</string>
+    <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Əvvəlki trek düyməsi"</string>
+    <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Növbəti trek düyməsi"</string>
+    <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Pauza düyməsi"</string>
+    <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Oxutma düyməsi"</string>
+    <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Dayandırma düyməsi"</string>
+    <string name="emergency_calls_only" msgid="6733978304386365407">"Yalnız təcili zənglər"</string>
+    <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Şəbəkə kilidlidir"</string>
+    <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM kart PUK ilə kilidlənib."</string>
+    <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"İstifadəçi Təlimatlarına baxın və ya Müştəri Xidmətlərinə müraciət edin."</string>
+    <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM kart kilidlənib."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SİM kartın kilidi açılır..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Siz kilid modelini <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış çəkdiniz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə içində yenidən sınayın."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Şifrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Siz PIN nömrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz. \n \n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə içində təkrar sınayın."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetin kilidini Google hesabınıza daxil olmaqla açmağınız istəniləcək.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetin kilidini Google hesabınıza daxil olmaqla açmağınız tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+    <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, planşet fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+    <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Siz telefon kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, telefon zavod ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+    <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Siz planşetin kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> yanlış cəhd etmisiniz. Planşet artıq defolt zavod halına sıfırlanacaq."</string>
+    <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Siz telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə səhv cəhd etdiniz. Telefonunuz indi zavod nizamlarına yenilənəcək."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> saniyə ərzində bir daha cəhd edin."</string>
+    <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Şablonu unutdunuz?"</string>
+    <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Hesab kilid açma"</string>
+    <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Həddindən çox cəhd edildi!"</string>
+    <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"Kilidi açmaq üçün Google hesabınız ilə daxil olun."</string>
+    <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"İstifadəçi adı (e-poçt)"</string>
+    <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Şifrə"</string>
+    <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Daxil olun"</string>
+    <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Yanlış istifadəçi adı və parol."</string>
+    <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"İstifadəçi adınızı və ya parolunuzu unutmusunuz?\n "<b>"google.com/accounts/recovery"</b>" linkinə daxil olun."</string>
+    <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Yoxlanır..."</string>
+    <string name="lockscreen_unlock_label" msgid="737440483220667054">"Kilidi aç"</string>
+    <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Səs açıqdır"</string>
+    <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Səs sönülüdür"</string>
+    <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Model başlandı"</string>
+    <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Model təmizləndi"</string>
+    <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Xana əlavə edildi"</string>
+    <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Model tamamlandı"</string>
+    <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string>
+    <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget əlavə edin."</string>
+    <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Boş"</string>
+    <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Kilidi açma sahəsi genişləndi."</string>
+    <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Kilidi açma sahəsi çökdü."</string>
+    <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vidcet."</string>
+    <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"İstifadəçi selektoru"</string>
+    <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Status"</string>
+    <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
+    <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media kontrolları"</string>
+    <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Yenidən sıralama vidceti başladıldı."</string>
+    <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidcetin təkrar sifarişi sona çatdı."</string>
+    <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Vidcet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> silindi."</string>
+    <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kilidi açma sahəsini genişləndir."</string>
+    <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Sürüşdürmə kilidi."</string>
+    <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kild açma modeli."</string>
+    <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sifət Kilidi"</string>
+    <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin kilid açması."</string>
+    <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Şifrə kilidi."</string>
+    <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Model sahəsi."</string>
+    <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sürüşdürmə sahəsi."</string>
+    <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+    <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
+    <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+    <string name="granularity_label_character" msgid="7336470535385009523">"simvol"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"söz"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"xətt"</string>
+    <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <string name="factorytest_failed" msgid="5410270329114212041">"Zavod testi alınmadı"</string>
+    <string name="factorytest_not_system" msgid="4435201656767276723">"Bu FACTORY_TEST fəaliyyəti yalnızca/sistemdə/tətbiqdə quraşdırılmış paketlər üçün dəstəklənir."</string>
+    <string name="factorytest_no_action" msgid="872991874799998561">"FACTORY_TEST əməliyyatını təsdiqləyən heç bir paket tapılmadı."</string>
+    <string name="factorytest_reboot" msgid="6320168203050791643">"Yenidən yükləyin"</string>
+    <string name="js_dialog_title" msgid="1987483977834603872">"\"<xliff:g id="TITLE">%s</xliff:g>\"dakı səhifədə deyilir:"</string>
+    <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
+    <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Naviqasiyanı Təsdiq edin"</string>
+    <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Bu Səhifəni Tərk edin"</string>
+    <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Bu səhifədə qalın"</string>
+    <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nBu səhifədən kənara naviqasiya etmək istədiyinizə əminsiniz mi?"</string>
+    <string name="save_password_label" msgid="6860261758665825069">"Təsdiqlə"</string>
+    <string name="double_tap_toast" msgid="4595046515400268881">"Məsləhət: Böyütmək və kiçiltmək üçün iki dəfə tıklayın."</string>
+    <string name="autofill_this_form" msgid="4616758841157816676">"Avtodoldurma"</string>
+    <string name="setup_autofill" msgid="7103495070180590814">"AvtoDoldurmanı ayarla"</string>
+    <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+    <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+    <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+    <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+    <string name="autofill_province" msgid="2231806553863422300">"Vilayət"</string>
+    <string name="autofill_postal_code" msgid="4696430407689377108">"Poçt kodu"</string>
+    <string name="autofill_state" msgid="6988894195520044613">"Dövlət"</string>
+    <string name="autofill_zip_code" msgid="8697544592627322946">"Poçt indeksi"</string>
+    <string name="autofill_county" msgid="237073771020362891">"Ölkə"</string>
+    <string name="autofill_island" msgid="4020100875984667025">"Ada"</string>
+    <string name="autofill_district" msgid="8400735073392267672">"Sahə"</string>
+    <string name="autofill_department" msgid="5343279462564453309">"Departament"</string>
+    <string name="autofill_prefecture" msgid="2028499485065800419">"Prefektura"</string>
+    <string name="autofill_parish" msgid="8202206105468820057">"Pariş"</string>
+    <string name="autofill_area" msgid="3547409050889952423">"Sahə"</string>
+    <string name="autofill_emirate" msgid="2893880978835698818">"Əmirlik"</string>
+    <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"Veb əlfəcinlərinizi və tarixçələrinizi oxumaq"</string>
+    <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Tətbiqə Brauzerin daxil olduğu bütün linkləri və bütün Brauzer əlfəcinlərini oxumaq imkanı verir. Qeyd: bu icazə veb brauzer imkanları olan üçüncü tərəf brazuerləri və digər tətbiqlər tərəfindən yerinə yetirilə bilməz."</string>
+    <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"veb əlfəcinləri və tarixçəsi yazmaq"</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Tətbiqə planşetinizdəki brauzer tarixini və əlfəcinləri redaktə etmək icazəsi verir. Bu tətbizə brauzer məlumatlarını silmək və ya redaktə etmək imkanı verə bilər. Qeyd: Bu icazə 3-cü partiya brauzerlərə və ya veb brauzing xüsusiyyətli digər tətbiqlərə şamil olunmaya bilər."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Tətbiqə Brauzer tarixçəsi və telefonunuzda saxlanılan əlfəcinlərə dəyişiklik etmək imkanı verir. Bununla tətbiqlə Brauzer datanızı silə və ya dəyişdirə bilər. Qeyd: bu icazə veb brauzer imkanları olan üçüncü tərəf brazuerləri və digər tətbiqlər tərəfindən yerinə yetirilə bilməz."</string>
+    <string name="permlab_setAlarm" msgid="1379294556362091814">"siqnal qurur"</string>
+    <string name="permdesc_setAlarm" msgid="316392039157473848">"Tətbiqə quraşdırlmış zəngli saata alarm ayarlamağa imkan verir. Bəzi zəngli saat tətbiqləri bu özəlliyi dəstəkləməyə bilər."</string>
+    <string name="permlab_addVoicemail" msgid="5525660026090959044">"Səsli poçt əlavə et"</string>
+    <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Tətbiqə səsli poçt qutunuza mesaj əlavə etməyə imkan verir."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"Brauzerin geolokasiya icazələrini dəyişir"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Tətbiqə Brauzerin geolokasiya icazələrini dəyişməyə imkan verir. Zərərli tətbiqlər bundan istifadə edərək məkan məlumatlarını təsadüfi saytlara göndərə bilər."</string>
+    <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"paketləri təsdiqlə"</string>
+    <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Tətbiqə paketin quraşdırılabilən olmasını yoxlamağa imkan verir."</string>
+    <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"paket doğrulayıcıya bağlanır"</string>
+    <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Sahibinə paket yoxlayıcılarına sorğu göndərmək icazəsi verir. Normal tətbiqlər tərəfindən heç vaxt istənilməməlidir."</string>
+    <string name="permlab_serialPort" msgid="546083327654631076">"serial porta çıxır"</string>
+    <string name="permdesc_serialPort" msgid="2991639985224598193">"Sahibinə SerialManager API vasitəsilə serial portlara icazə izni verir."</string>
+    <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"xarici kontent provayderlərinə giriş"</string>
+    <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Məzmun provayderlərinə örtükdən daxil olmaq üçün cihaz sahibinə imkan verir. Normal tətbiqlər üçün lazım deyil."</string>
+    <string name="permlab_updateLock" msgid="3527558366616680889">"avtomatik cihaz yenilənmələrini pozur"</string>
+    <string name="permdesc_updateLock" msgid="1655625832166778492">"Sahibinə yeni versiyaya yenilənmək üçün nə vaxt qeyri-interaktiv reboot məlumatını sistemə təklif etmə icazəsi verir."</string>
+    <string name="save_password_message" msgid="767344687139195790">"Brauzerin bu şifrəni yadda saxlamasını istəyirsiz?"</string>
+    <string name="save_password_notnow" msgid="6389675316706699758">"İndi yox"</string>
+    <string name="save_password_remember" msgid="6491879678996749466">"Yadda saxla"</string>
+    <string name="save_password_never" msgid="8274330296785855105">"Heç vaxt"</string>
+    <string name="open_permission_deny" msgid="7374036708316629800">"Bu səhifəni açmaq üçün icazəniz yoxdur."</string>
+    <string name="text_copied" msgid="4985729524670131385">"Mətn panoya kopyalandı."</string>
+    <string name="more_item_label" msgid="4650918923083320495">"Daha çox"</string>
+    <string name="prepend_shortcut_label" msgid="2572214461676015642">"Menyu+"</string>
+    <string name="menu_space_shortcut_label" msgid="2410328639272162537">"boşluq"</string>
+    <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"daxil olun"</string>
+    <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"sil"</string>
+    <string name="search_go" msgid="8298016669822141719">"Axtar"</string>
+    <string name="searchview_description_search" msgid="6749826639098512120">"Axtarış"</string>
+    <string name="searchview_description_query" msgid="5911778593125355124">"Axtarış sorğusu"</string>
+    <string name="searchview_description_clear" msgid="1330281990951833033">"Sorğunu təmizlə"</string>
+    <string name="searchview_description_submit" msgid="2688450133297983542">"Sorğunu göndərin"</string>
+    <string name="searchview_description_voice" msgid="2453203695674994440">"Səsli axtarış"</string>
+    <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Toxunaraq Kəşf et funksiyası aktiv edilsin?"</string>
+    <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> Toxunaraq Kəşf Et rejimini aktivləşdirmək istəyir. Toxunaraq Kəşf Et açıldığı zaman, barmağınızın altında nə olduğu haqda olan təsvirləri eşidə və ya görə bilərsiniz və yaplanşetdə insanlarla əlaqəyə keçmək üçün jestlər həyata keçirə bilərsiniz."</string>
+    <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> Toxunaraq Kəşf Et rejimini aktivləşdirmək istəyir. Toxunaraq Kəşf Et açıldığı zaman, barmağınızın altında nə olduğu haqda olan təsvirləri eşidə və ya görə bilərsiniz və ya telefonda insanlarla əlaqəyə keçmək üçün jestlər həyata keçirə bilərsiniz"</string>
+    <string name="oneMonthDurationPast" msgid="7396384508953779925">"1 ay öncə"</string>
+    <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 ay əvvəl"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one" msgid="4869870056547896011">"1 saniyə əvvəl"</item>
+    <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> saniyə əvvəl"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="3306787433088810191">"1 dəqiqə əvvəl"</item>
+    <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə əvvəl"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="9150797944610821849">"1 saat əvvəl"</item>
+    <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> saat əvvəl"</item>
+  </plurals>
+  <plurals name="last_num_days">
+    <item quantity="other" msgid="3069992808164318268">"Son <xliff:g id="COUNT">%d</xliff:g> gün"</item>
+  </plurals>
+    <string name="last_month" msgid="3959346739979055432">"Keçən ay"</string>
+    <string name="older" msgid="5211975022815554840">"Köhnə"</string>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="861358534398115820">"dünən"</item>
+    <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> gün əvvəl"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one" msgid="2729745560954905102">"1 saniyə ərzində"</item>
+    <item quantity="other" msgid="1241926116443974687">"<xliff:g id="COUNT">%d</xliff:g> saniyə içində"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one" msgid="8793095251325200395">"1 dəqiqə içində"</item>
+    <item quantity="other" msgid="3330713936399448749">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə ərzində"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one" msgid="7164353342477769999">"1 saata"</item>
+    <item quantity="other" msgid="547290677353727389">"<xliff:g id="COUNT">%d</xliff:g> saata"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one" msgid="5413088743009839518">"sabah"</item>
+    <item quantity="other" msgid="5109449375100953247">"<xliff:g id="COUNT">%d</xliff:g> gün ərzində"</item>
+  </plurals>
+  <plurals name="abbrev_num_seconds_ago">
+    <item quantity="one" msgid="1849036840200069118">"1 saniyə əvvəl"</item>
+    <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> san əvvəl"</item>
+  </plurals>
+  <plurals name="abbrev_num_minutes_ago">
+    <item quantity="one" msgid="6361490147113871545">"1 dəqiqə əvvəl"</item>
+    <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə əvvəl"</item>
+  </plurals>
+  <plurals name="abbrev_num_hours_ago">
+    <item quantity="one" msgid="4796212039724722116">"1 saat əvvəl"</item>
+    <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> saat əvvəl"</item>
+  </plurals>
+  <plurals name="abbrev_num_days_ago">
+    <item quantity="one" msgid="8463161711492680309">"dünən"</item>
+    <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> gün əvvəl"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_seconds">
+    <item quantity="one" msgid="5842225370795066299">"1 san ərzində"</item>
+    <item quantity="other" msgid="5495880108825805108">"<xliff:g id="COUNT">%d</xliff:g> san ərzində"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_minutes">
+    <item quantity="one" msgid="562786149928284878">"1 dəq ərzində"</item>
+    <item quantity="other" msgid="4216113292706568726">"<xliff:g id="COUNT">%d</xliff:g> dəqiqəyə"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_hours">
+    <item quantity="one" msgid="3274708118124045246">"1 saat ərzində"</item>
+    <item quantity="other" msgid="3705373766798013406">"<xliff:g id="COUNT">%d</xliff:g> saata"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_days">
+    <item quantity="one" msgid="2178576254385739855">"sabah"</item>
+    <item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> günə"</item>
+  </plurals>
+    <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> tarixində"</string>
+    <string name="preposition_for_time" msgid="5506831244263083793">"saat <xliff:g id="TIME">%s</xliff:g>"</string>
+    <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> ilində"</string>
+    <string name="day" msgid="8144195776058119424">"gün"</string>
+    <string name="days" msgid="4774547661021344602">"günlər"</string>
+    <string name="hour" msgid="2126771916426189481">"saat"</string>
+    <string name="hours" msgid="894424005266852993">"saatlar"</string>
+    <string name="minute" msgid="9148878657703769868">"dəq."</string>
+    <string name="minutes" msgid="5646001005827034509">"dəqiqə"</string>
+    <string name="second" msgid="3184235808021478">"sn"</string>
+    <string name="seconds" msgid="3161515347216589235">"san"</string>
+    <string name="week" msgid="5617961537173061583">"həftə"</string>
+    <string name="weeks" msgid="6509623834583944518">"həftə"</string>
+    <string name="year" msgid="4001118221013892076">"il"</string>
+    <string name="years" msgid="6881577717993213522">"il"</string>
+  <plurals name="duration_seconds">
+    <item quantity="one" msgid="6962015528372969481">"1 saniyə"</item>
+    <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> saniyə"</item>
+  </plurals>
+  <plurals name="duration_minutes">
+    <item quantity="one" msgid="4915414002546085617">"1 dəqiqə"</item>
+    <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> dəqiqə"</item>
+  </plurals>
+  <plurals name="duration_hours">
+    <item quantity="one" msgid="8917467491248809972">"1 saat"</item>
+    <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> saat"</item>
+  </plurals>
+    <string name="VideoView_error_title" msgid="3534509135438353077">"Video problemi"</string>
+    <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Bu video bu cihaza strim olunmaq üçün uyğun deyil."</string>
+    <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Bu video oxumur"</string>
+    <string name="VideoView_error_button" msgid="2822238215100679592">"OK"</string>
+    <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+    <string name="noon" msgid="7245353528818587908">"günorta"</string>
+    <string name="Noon" msgid="3342127745230013127">"Günorta"</string>
+    <string name="midnight" msgid="7166259508850457595">"gecəyarı"</string>
+    <string name="Midnight" msgid="5630806906897892201">"Gecəyarı"</string>
+    <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll" msgid="6876518925844129331">"Hamısını seç"</string>
+    <string name="cut" msgid="3092569408438626261">"Kəs"</string>
+    <string name="copy" msgid="2681946229533511987">"Kopyala"</string>
+    <string name="paste" msgid="5629880836805036433">"Yerləşdir"</string>
+    <string name="replace" msgid="5781686059063148930">"Əvəz et..."</string>
+    <string name="delete" msgid="6098684844021697789">"Sil"</string>
+    <string name="copyUrl" msgid="2538211579596067402">"URL kopyala"</string>
+    <string name="selectTextMode" msgid="1018691815143165326">"Mətn seçin"</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Mətn seçimi"</string>
+    <string name="addToDictionary" msgid="4352161534510057874">"Lüğətə əlavə et"</string>
+    <string name="deleteText" msgid="6979668428458199034">"Sil"</string>
+    <string name="inputMethod" msgid="1653630062304567879">"Daxiletmə metodu"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Mətn əməliyyatları"</string>
+    <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Yaddaş yeri bitir"</string>
+    <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Bəzi sistem funksiyaları işləməyə bilər"</string>
+    <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> işlənir"</string>
+    <string name="app_running_notification_text" msgid="4653586947747330058">"Daha çox məlumat üçün və ya tətbiqi dayandırmaq üçün toxunun."</string>
+    <string name="ok" msgid="5970060430562524910">"OK"</string>
+    <string name="cancel" msgid="6442560571259935130">"Ləğv et"</string>
+    <string name="yes" msgid="5362982303337969312">"OK"</string>
+    <string name="no" msgid="5141531044935541497">"Ləğv et"</string>
+    <string name="dialog_alert_title" msgid="2049658708609043103">"Diqqət"</string>
+    <string name="loading" msgid="7933681260296021180">"Yüklənir…"</string>
+    <string name="capital_on" msgid="1544682755514494298">"AÇIQ"</string>
+    <string name="capital_off" msgid="6815870386972805832">"QAPALI"</string>
+    <string name="whichApplication" msgid="4533185947064773386">"Əməliyyatı tamamlayın:"</string>
+    <string name="alwaysUse" msgid="4583018368000610438">"Bu fəaliyyət üçün defolt istifadə edin"</string>
+    <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Sistem ayarlarında, Tətbiqlərdə və Endirilmişlərdə defoltu təmizləyin."</string>
+    <string name="chooseActivity" msgid="7486876147751803333">"Fəaliyyət seçin"</string>
+    <string name="chooseUsbActivity" msgid="6894748416073583509">"USB cihaz üçün tətbiq seçin"</string>
+    <string name="noApplications" msgid="2991814273936504689">"Heç bir tətbiq bu əməliyyatı apara bilmir."</string>
+    <string name="aerr_title" msgid="1905800560317137752"></string>
+    <string name="aerr_application" msgid="932628488013092776">"Təəssüf ki, <xliff:g id="APPLICATION">%1$s</xliff:g> dayandı."</string>
+    <string name="aerr_process" msgid="4507058997035697579">"Təəssüf ki, <xliff:g id="PROCESS">%1$s</xliff:g> prosesi dayandı."</string>
+    <string name="anr_title" msgid="4351948481459135709"></string>
+    <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> cavab vermir.\n\nOnu bağlamaq istəyirsiniz?"</string>
+    <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> aktivitisi cavab vermir. \n\nOnu bağlamaq istəyirsiniz?"</string>
+    <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> cavab vermir. Onu bağlamaq istəyirsiniz?"</string>
+    <string name="anr_process" msgid="6513209874880517125">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> cavab vermir. \n \n Onu bağlamaq istəyirsiniz?"</string>
+    <string name="force_close" msgid="8346072094521265605">"OK"</string>
+    <string name="report" msgid="4060218260984795706">"Şikayət edin"</string>
+    <string name="wait" msgid="7147118217226317732">"Gözlə"</string>
+    <string name="webpage_unresponsive" msgid="3272758351138122503">"Bu səhifə yararsızlaşıb.\n\nBağlamaq istəyirsiz?"</string>
+    <string name="launch_warning_title" msgid="1547997780506713581">"Tətbiq yönləndirildi"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> indi çalışır."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilk başladıldı."</string>
+    <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Miqyas"</string>
+    <string name="screen_compat_mode_show" msgid="4013878876486655892">"Həmişə göstər"</string>
+    <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Bunları Sistem ayarlarında yenidən aktivləşdir Yüklənmiş &gt; Tətbiqlər &gt;."</string>
+    <string name="smv_application" msgid="3307209192155442829">"Tətbiq <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) StrictMode siyasətini pozdu."</string>
+    <string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> prosesi StrictMode siyasətini pozdu."</string>
+    <string name="android_upgrading_title" msgid="1584192285441405746">"Android təkmilləşdirilir..."</string>
+    <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> əddədən <xliff:g id="NUMBER_0">%1$d</xliff:g> tətbiq optimallaşır."</string>
+    <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Tətbiqlər başladılır."</string>
+    <string name="android_upgrading_complete" msgid="1405954754112999229">"Yükləmə başa çatır."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışır"</string>
+    <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Tətbiqə keçmək üçün toxunun"</string>
+    <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Tətbiqlərə keçilsin?"</string>
+    <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Bir tətbiq artıq işləyir. Digərini başlatmaq üçün onu dayandırmalısınız."</string>
+    <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> bölməsinə qayıdın"</string>
+    <string name="old_app_description" msgid="2082094275580358049">"Yeni tətbiqi başlatmayın."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> tətbiqini başladın"</string>
+    <string name="new_app_description" msgid="1932143598371537340">"Köhnə tətbiqi yadda saxlamadan dayandırın."</string>
+    <string name="sendText" msgid="5209874571959469142">"Mətn üçün əməliyyat seçin"</string>
+    <string name="volume_ringtone" msgid="6885421406845734650">"Zəngin səs gücü"</string>
+    <string name="volume_music" msgid="5421651157138628171">"Media həcmi"</string>
+    <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth vasitəsilə oynadılır"</string>
+    <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Səssiz zəng"</string>
+    <string name="volume_call" msgid="3941680041282788711">"Daxili zəng səsi"</string>
+    <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth zəng həcmi"</string>
+    <string name="volume_alarm" msgid="1985191616042689100">"Siqnal səsi"</string>
+    <string name="volume_notification" msgid="2422265656744276715">"Bildiriş səsi"</string>
+    <string name="volume_unknown" msgid="1400219669770445902">"Həcm"</string>
+    <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth həcmi"</string>
+    <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Zəng səsi gücü"</string>
+    <string name="volume_icon_description_incall" msgid="8890073218154543397">"Zəng həcmi"</string>
+    <string name="volume_icon_description_media" msgid="4217311719665194215">"Media həcmi"</string>
+    <string name="volume_icon_description_notification" msgid="7044986546477282274">"Bildiriş səsi"</string>
+    <string name="ringtone_default" msgid="3789758980357696936">"Defolt rinqton"</string>
+    <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Defolt rinqton (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent" msgid="7937634392408977062">"Heç biri"</string>
+    <string name="ringtone_picker_title" msgid="3515143939175119094">"Zəng səsləri"</string>
+    <string name="ringtone_unknown" msgid="5477919988701784788">"Naməlum rinqton"</string>
+  <plurals name="wifi_available">
+    <item quantity="one" msgid="6654123987418168693">"Wi-Fi şəbəkəsi mövcuddur"</item>
+    <item quantity="other" msgid="4192424489168397386">"Wi-Fi şəbəkələri mövcuddur"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one" msgid="1634101450343277345">"Wi-Fi şəbəkəni açın"</item>
+    <item quantity="other" msgid="7915895323644292768">"Açıq Wi-Fi şəbəkələri mövcuddur"</item>
+  </plurals>
+    <string name="wifi_available_sign_in" msgid="4029489716605255386">"Wi-Fi şəbəkəsinə daxil ol"</string>
+    <string name="network_available_sign_in" msgid="8495155593358054676">"Şəbəkəyə daxil olun"</string>
+    <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+    <skip />
+    <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi\'a qoşulmaq alınmadı"</string>
+    <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" internet bağlantısı keyfiyyətsizdir."</string>
+    <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
+    <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Direct əməliyyatını başlat. Bu Wi-Fi müştəri/hotspotu bağlayacaq."</string>
+    <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Wi-Fi Direct başladıla bilmədi."</string>
+    <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct aktivdir"</string>
+    <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Ayarlar üçün toxunun"</string>
+    <string name="accept" msgid="1645267259272829559">"Qəbul edin"</string>
+    <string name="decline" msgid="2112225451706137894">"İmtina edin"</string>
+    <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Dəvətnamə göndərildi"</string>
+    <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Qoşulmaq üçün dəvət"</string>
+    <string name="wifi_p2p_from_message" msgid="570389174731951769">"Kimdən:"</string>
+    <string name="wifi_p2p_to_message" msgid="248968974522044099">"Kimə:"</string>
+    <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Tələb olunan PİN kodu daxil edin:"</string>
+    <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PİN:"</string>
+    <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Bu planşet <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazına qoşulan zaman Wi-Fi şəbəkəsindən müvəqqəti ayrılmış olacaq"</string>
+    <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Bu telefon <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazına qoşulan zaman Wi-Fi şəbəkəsindən müvəqqəti ayrılmış olacaq"</string>
+    <string name="select_character" msgid="3365550120617701745">"Simvol daxil edin"</string>
+    <string name="sms_control_title" msgid="7296612781128917719">"SMS mesaj göndərilir"</string>
+    <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; çox sayda SMS mesaj göndərir. Bu tətbiqin mesaj göndərməyə davam etməsinə icazə verirsiniz?"</string>
+    <string name="sms_control_yes" msgid="3663725993855816807">"İcazə verin"</string>
+    <string name="sms_control_no" msgid="625438561395534982">"Rədd edin"</string>
+    <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; ünvanına mesaj göndərmək istəyir."</string>
+    <string name="sms_short_code_details" msgid="3492025719868078457">"Bu, mobil hesabınıza "<font fgcolor="#ffffb060">"əlavə tariflərin tətbiq olunması"</font>" ilə nəticələnə bilər."</string>
+    <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"Bu mobil hesabınızda ödənişlərə səbəb olacaq."</font></string>
+    <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Göndər"</string>
+    <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Ləğv et"</string>
+    <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Mənim seçimimi yadda saxla"</string>
+    <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"Bunu sonra Ayarlarda dəyişə bilərsiniz &gt; Tətbiqlər"</string>
+    <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Həmişə icazə ver"</string>
+    <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Heç vaxt icazə verməyin"</string>
+    <string name="sim_removed_title" msgid="6227712319223226185">"SIM kart çıxarıldı"</string>
+    <string name="sim_removed_message" msgid="2333164559970958645">"Cihazınızı etibarlı SIM kart ilə başladana kimi mobil şəbəkə əlçatmaz olacaq."</string>
+    <string name="sim_done_button" msgid="827949989369963775">"Bitdi"</string>
+    <string name="sim_added_title" msgid="3719670512889674693">"SİM kart əlavə edildi"</string>
+    <string name="sim_added_message" msgid="6599945301141050216">"Mobil şəbəkəyə qoşulmaq üçün cihazınızı yenidən başladın."</string>
+    <string name="sim_restart_button" msgid="4722407842815232347">"Yenidən başlat"</string>
+    <string name="time_picker_dialog_title" msgid="8349362623068819295">"Vaxt ayarlayın"</string>
+    <string name="date_picker_dialog_title" msgid="5879450659453782278">"Tarixi quraşdır"</string>
+    <string name="date_time_set" msgid="5777075614321087758">"Ayarlayın"</string>
+    <string name="date_time_done" msgid="2507683751759308828">"Hazırdır"</string>
+    <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"YENİ: "</font></string>
+    <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> tərəfindən təmin edilib."</string>
+    <string name="no_permissions" msgid="7283357728219338112">"Heç bir icazə tələb olunmur"</string>
+    <string name="perm_costs_money" msgid="4902470324142151116">"bununla sizdən xərc tutula bilər"</string>
+    <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB toplu yaddaş"</string>
+    <string name="usb_storage_title" msgid="5901459041398751495">"USB qoşuludur"</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"Siz USB vasitəsilə kompütere bağlandınız. Kompüter və Androidinizin USB yaddaşı arasında faylları kopyalamaq istəyirsinizsə, aşağıdakı düyməyə toxunun."</string>
+    <string name="usb_storage_message" product="default" msgid="805351000446037811">"Kompüterinizə USB ilə qoşulmusunuz. Faylları Androidinizin SD kartı ilə kompüteriniz arasında kopyalamaq istəyirsinizsə aşağıdakı düyməyə toxunun."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB yaddaşı aktivləşdirin"</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB yaddaşınızı USB kütləvi yaddaşı üçün istifadə edən zaman problem yarandı."</string>
+    <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"SD kartınızı USB kütləvi yaddaşı üçün istifadə edən zaman problem yarandı."</string>
+    <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB qoşuludur"</string>
+    <string name="usb_storage_notification_message" msgid="939822783828183763">"Faylları kompüterinizə kopyalamaq və ya kompüterinizdən kopyalamaq üçün toxunun."</string>
+    <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB yaddaşı söndürün"</string>
+    <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB yaddaşı söndürmək üçün toxunun."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB yaddaş istifadə olunur"</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB yaddaşı söndürmədən öncə Android\'in USB yaddaşını kompüterdən demontaj etdiyinizə (çıxardığınıza) əmin olun."</string>
+    <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB yaddaşı söndürmədən öncə Android\'in USB yaddaşını kompüterdən demontaj etdiyinizə (çıxardığınıza) əmin olun."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB yaddaşını söndür"</string>
+    <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB yaddaşı söndürən zaman problem oldu. USB hostu demontaj etmənizi yoxlayın və yenidən cəhd edin."</string>
+    <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB yaddaşı aktivləşdirin"</string>
+    <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"USB yaddaşı aktivləşdirsəniz, istifadə etdiyiniz bəzi tətbiqlər dayana bilər və USB yaddaş deaktiv edilənə qədər işləməyə bilər."</string>
+    <string name="dlg_error_title" msgid="7323658469626514207">"USB əməliyyatı uğursuzdur"</string>
+    <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
+    <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Media cihazı kimi qoşuldu"</string>
+    <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Kamera kimi bağlanıldı"</string>
+    <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Quraşdırıcı kimi qoşulub"</string>
+    <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB aksesuara qoşuldu"</string>
+    <string name="usb_notification_message" msgid="2290859399983720271">"Digər USB seçimləri üçün toxunun."</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB yaddaşına format atılsın?"</string>
+    <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD kart format edilsin?"</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"USB yaddaşınızda yerləşdirilmiş bütün fayllar silinəcək. Bu addım geri dönülməzdir."</string>
+    <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Kartınızdakı bütün məlumatlar itəcək."</string>
+    <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
+    <string name="adb_active_notification_title" msgid="6729044778949189918">"USB sazlama qoşuludur"</string>
+    <string name="adb_active_notification_message" msgid="1016654627626476142">"USB debaqı deaktivasiya etmək üçün toxunun."</string>
+    <string name="select_input_method" msgid="4653387336791222978">"Daxiletmə metodunu seçin"</string>
+    <string name="configure_input_methods" msgid="9091652157722495116">"Daxiletmə üsullarını ayarlayın"</string>
+    <string name="use_physical_keyboard" msgid="6203112478095117625">"Fiziki klaviatura"</string>
+    <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+    <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Klaviatura sxemi seçin"</string>
+    <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Klaviatura tərtibatı seçmək üçün toxunun."</string>
+    <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCÇDEƏFGĞHXIİJKQLMNOÖPRSŞTUÜVYZ"</string>
+    <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCÇDEƏFGĞHİIJKLMNOÖPQRSŞTUÜVWXYZ"</string>
+    <string name="candidates_style" msgid="4333913089637062257"><u>"namizədlər"</u></string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB yaddaş hazırlanır"</string>
+    <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD kart hazırlanır"</string>
+    <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Səhvlər yoxlanılır."</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Boş USB yaddaşı"</string>
+    <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Boş SD kart"</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB yaddaş boşdur və ya sistem tərəfindən dəstəklənməyən fayl sisteminə malikdir."</string>
+    <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD kart boşdur və ya sistem tərəfindən dəstəklənməyən fayl sisteminə malikdir."</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Zədəli USB yaddaş"</string>
+    <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Zədəli SD kart"</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"SD yaddaş zədələnib. Onu format etməyə çalışın."</string>
+    <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD kart zədələnib. Onu format etməyə çalışın."</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB yaddaşı gözlənilmədən çıxarıldı"</string>
+    <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD kart gözlənilmədən çıxarıldı"</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Məlumat itkisinin qarşısını almaq üçün USB yaddaşı çıxarmazdan əvvəl onu demontaj edin."</string>
+    <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Data itkisinin qarşısını almaq üçün SD kartı çıxarmadan öncə demontaj edin."</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB yaddaş çıxarmaq üçün təhlükəsizdir"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD kart təhlükəsiz çıxarıla bilər"</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Siz USB yaddaşı təhlükəsiz çıxara bilərsiniz."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Siz SD kartı təhlükəsiz çıxara bilərsiniz."</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Silinmiş USB yaddaş"</string>
+    <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SD kart çıxarıldı"</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB yaddaş çıxarıldı. Yeni media əlavə edin."</string>
+    <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD kart çıxarıldı. Yenisini daxil edin."</string>
+    <string name="activity_list_empty" msgid="1675388330786841066">"Uyğun gələn fəaliyyət tapılmadı."</string>
+    <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"komponent istifadəsi statistikasını güncəlləyir"</string>
+    <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Tətbiqə toplanmış istifadə statistikasını dəyişməyə imkan verir. Normal tətbiqlər tərəfindən istifadə olunmur."</string>
+    <string name="permlab_copyProtectedData" msgid="4341036311211406692">"məzmunu kopyala"</string>
+    <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Tətbiqə kontenti kopyalamaq üçün defolt konteyner servisini çağırmaq icazəsi verir. Normal tətbiqlər tərəfindən istifadə edilmir."</string>
+    <string name="permlab_route_media_output" msgid="1642024455750414694">"Media çıxışını yönləndirir"</string>
+    <string name="permdesc_route_media_output" msgid="4932818749547244346">"Tətbiqə media çıxışını digər xarici cihazlara yönləndirmək imkanı verir."</string>
+    <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Keyguard təhlükəsiz yaddaşa çıxış"</string>
+    <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Tətbiqə keguard təhlükəsiz yaddaşa çatmağa icazə verir."</string>
+    <string name="permlab_control_keyguard" msgid="172195184207828387">"Klaviatura kilidinin görülməsini və gizlədilməsini idarə edir"</string>
+    <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Tətbiqə keguardı idarə etmək icazəsi verir."</string>
+    <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Zoom nəzarəti üçün iki dəfə toxunun"</string>
+    <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Widget əlavə edilə bilmədi."</string>
+    <string name="ime_action_go" msgid="8320845651737369027">"Get"</string>
+    <string name="ime_action_search" msgid="658110271822807811">"Axtar"</string>
+    <string name="ime_action_send" msgid="2316166556349314424">"Göndər"</string>
+    <string name="ime_action_next" msgid="3138843904009813834">"Növbəti"</string>
+    <string name="ime_action_done" msgid="8971516117910934605">"Tamam"</string>
+    <string name="ime_action_previous" msgid="1443550039250105948">"Əvvəlki"</string>
+    <string name="ime_action_default" msgid="2840921885558045721">"İcra edin"</string>
+    <string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> istifadə etməklə\nnömrə yığın"</string>
+    <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>istifadə edərək kontakt yaradın\n"</string>
+    <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Aşağıdakı bir və ya daha çox tətbiqlər indi və gələcəkdə hesabınıza daxil olmaq üçün icazə istəyir."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Bu istəyə izn vermək istəyirsiniz?"</string>
+    <string name="grant_permissions_header_text" msgid="6874497408201826708">"Giriş sorğusu"</string>
+    <string name="allow" msgid="7225948811296386551">"İcazə verin"</string>
+    <string name="deny" msgid="2081879885755434506">"Rədd et"</string>
+    <string name="permission_request_notification_title" msgid="6486759795926237907">"İcazə tələb olunur"</string>
+    <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">\n" hesabı üçün<xliff:g id="ACCOUNT">%s</xliff:g> icazə sorğusu göndərildi."</string>
+    <string name="input_method_binding_label" msgid="1283557179944992649">"Daxiletmə metodu"</string>
+    <string name="sync_binding_label" msgid="3687969138375092423">"Sinxronizasiya"</string>
+    <string name="accessibility_binding_label" msgid="4148120742096474641">"Əlçatımlılıq"</string>
+    <string name="wallpaper_binding_label" msgid="1240087844304687662">"Divar kağızı"</string>
+    <string name="chooser_wallpaper" msgid="7873476199295190279">"Divar kağızını dəyişin"</string>
+    <string name="notification_listener_binding_label" msgid="2014162835481906429">"Bildiriş dinləyən"</string>
+    <string name="vpn_title" msgid="19615213552042827">"VPN aktivləşdirildi"</string>
+    <string name="vpn_title_long" msgid="6400714798049252294">"VPN <xliff:g id="APP">%s</xliff:g> tərəfindən aktivləşdirilib"</string>
+    <string name="vpn_text" msgid="3011306607126450322">"Şəbəkəni idarə etmək üçün toxunun."</string>
+    <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g> sessiyaya qoşuludur. Şəbəkəni idarə etmək üçün toxunun."</string>
+    <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Həmişə aktiv VPN bağlanır..."</string>
+    <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN bağlantısı həmişə aktiv"</string>
+    <string name="vpn_lockdown_error" msgid="6009249814034708175">"Həmişə aktiv VPN xətası"</string>
+    <string name="vpn_lockdown_config" msgid="6415899150671537970">"Konfiqurə etmək üçün toxun"</string>
+    <string name="upload_file" msgid="2897957172366730416">"Fayl seçin"</string>
+    <string name="no_file_chosen" msgid="6363648562170759465">"Heç bir fayl seçilməyib"</string>
+    <string name="reset" msgid="2448168080964209908">"Sıfırlayın"</string>
+    <string name="submit" msgid="1602335572089911941">"Göndər"</string>
+    <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Avtomobil rejimi aktivdir"</string>
+    <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Avtomobil rejimindən çıxmaq üçün toxunun."</string>
+    <string name="tethered_notification_title" msgid="3146694234398202601">"Tezerinq və ya hotspot aktivdir"</string>
+    <string name="tethered_notification_message" msgid="6857031760103062982">"Quraşdırmaq üçün toxunun."</string>
+    <string name="back_button_label" msgid="2300470004503343439">"Geri"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Növbəti"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Keç"</string>
+    <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Yüksək mobil data istifadəsi"</string>
+    <string name="throttle_warning_notification_message" msgid="3340822228599337743">"Mobil data istifadəsi haqqında daha çox öyrənmək üçün toxunun."</string>
+    <string name="throttled_notification_title" msgid="6269541897729781332">"Mobil data limiti keçildi"</string>
+    <string name="throttled_notification_message" msgid="5443457321354907181">"Mobil data istifadəsi haqqında daha çox öyrənmək üçün toxunun."</string>
+    <string name="no_matches" msgid="8129421908915840737">"Uyğunluq yoxdur"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Səhifədə tap"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 uyğunluq"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> ədəddən <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Hazırdır"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB yaddaşı qaldırılır..."</string>
+    <string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD kart demontaj edilir..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB yaddaş silinir..."</string>
+    <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD kart silinir..."</string>
+    <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB yaddaşı silinə bilmədi."</string>
+    <string name="format_error" product="default" msgid="7315248696644510935">"SD kartı silmək mümkün olmadı."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"SD kart demontaj edilmədən öncə çıxarıldı."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB yaddaş hazırda yoxlanılır."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"SD kart hazırda yoxlanılır."</string>
+    <string name="media_removed" msgid="7001526905057952097">"SD kart çıxarılıb."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"SD kart hazırda kompüter tərəfindən istifadə edilir."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"SD kart hal-hazırda kompüter tərəfindən istifadə edilir."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Naməlum vəziyyətdə xarici media."</string>
+    <string name="share" msgid="1778686618230011964">"Paylaşın"</string>
+    <string name="find" msgid="4808270900322985960">"Tapın"</string>
+    <string name="websearch" msgid="4337157977400211589">"Veb Axtarış"</string>
+    <string name="find_next" msgid="5742124618942193978">"Sonrakını tap"</string>
+    <string name="find_previous" msgid="2196723669388360506">"Əvvəlkini tap"</string>
+    <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> tərəfindən məkan sorğusu"</string>
+    <string name="gpsNotifTitle" msgid="5446858717157416839">"Məkan sorğusu"</string>
+    <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) tərəfindən tələb edilib"</string>
+    <string name="gpsVerifYes" msgid="2346566072867213563">"Bəli"</string>
+    <string name="gpsVerifNo" msgid="1146564937346454865">"Xeyr"</string>
+    <string name="sync_too_many_deletes" msgid="5296321850662746890">"Limiti keçəni silin"</string>
+    <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g> üçün <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> silinmiş fayl var, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> hesabı. Nə etmək istəyirsiniz?"</string>
+    <string name="sync_really_delete" msgid="2572600103122596243">"Elementləri sil"</string>
+    <string name="sync_undo_deletes" msgid="2941317360600338602">"Silinənləri geri qaytar"</string>
+    <string name="sync_do_nothing" msgid="3743764740430821845">"İndilik heç nə etmə"</string>
+    <string name="choose_account_label" msgid="5655203089746423927">"Hesab seçin"</string>
+    <string name="add_account_label" msgid="2935267344849993553">"Hesab əlavə et"</string>
+    <string name="add_account_button_label" msgid="3611982894853435874">"Hesab əlavə edin"</string>
+    <string name="number_picker_increment_button" msgid="2412072272832284313">"Artır"</string>
+    <string name="number_picker_decrement_button" msgid="476050778386779067">"Azaldın"</string>
+    <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> toxunun və basaraq saxlayın."</string>
+    <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Artırmaq üçün yuxarı, azaltmaq üçün aşağı sürüşdürün."</string>
+    <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Dəqiqə artırın"</string>
+    <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Dəqiqəni azalt"</string>
+    <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Saatı artırın"</string>
+    <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Saatı azaldın"</string>
+    <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM qurun"</string>
+    <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM qurun"</string>
+    <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Artma ayı"</string>
+    <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Ayı azaldın"</string>
+    <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Artma günü"</string>
+    <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"Azalma günü"</string>
+    <string name="date_picker_increment_year_button" msgid="6318697384310808899">"Artım ili"</string>
+    <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"Azalma ili"</string>
+    <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+    <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Ləğv et"</string>
+    <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Sil"</string>
+    <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Hazırdır"</string>
+    <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Rejim dəyişikliyi"</string>
+    <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
+    <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Daxil olun"</string>
+    <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Tətbiq seçin"</string>
+    <string name="shareactionprovider_share_with" msgid="806688056141131819">"Bununla paylaşın"</string>
+    <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ilə paylaşın"</string>
+    <string name="content_description_sliding_handle" msgid="415975056159262248">"Sürüşən qulp. Toxunaraq basılı tutun."</string>
+    <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün yuxarı sürüşdürün."</string>
+    <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün aşağı sürüşdürün."</string>
+    <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sola sürüşdür."</string>
+    <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sağa sürüşdür."</string>
+    <string name="description_target_unlock" msgid="2228524900439801453">"Kilidi aç"</string>
+    <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+    <string name="description_target_silent" msgid="893551287746522182">"Səssiz"</string>
+    <string name="description_target_soundon" msgid="30052466675500172">"Səs açıqdır"</string>
+    <string name="description_target_search" msgid="3091587249776033139">"Axtar"</string>
+    <string name="description_target_unlock_tablet" msgid="3833195335629795055">"Kilidi açmaq üçün vurun."</string>
+    <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Parolların səsləndirilməsi üçün qulaqlıqları taxın."</string>
+    <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Nöqtə."</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Evə gedin"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Yuxarı gedin"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Əlavə seçimlər"</string>
+    <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+    <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+    <string name="storage_internal" msgid="4891916833657929263">"Daxili yaddaş"</string>
+    <string name="storage_sd_card" msgid="3282948861378286745">"SD kart"</string>
+    <string name="storage_usb" msgid="3017954059538517278">"USB yaddaş"</string>
+    <string name="extract_edit_menu_button" msgid="8940478730496610137">"Redaktə et"</string>
+    <string name="data_usage_warning_title" msgid="1955638862122232342">"Data istifadə xəbərdarlığı"</string>
+    <string name="data_usage_warning_body" msgid="2814673551471969954">"İstifadə və ayarları görmək üçün toxunun"</string>
+    <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G data deaktivdir"</string>
+    <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G data deaktiv edildi"</string>
+    <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Mobil data deaktivdir"</string>
+    <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi data deaktiv edildi"</string>
+    <string name="data_usage_limit_body" msgid="3317964706973601386">"Aktivləşdirmək üçün toxunun."</string>
+    <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G data limiti aşılıb"</string>
+    <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G data limiti keçildi"</string>
+    <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobil data limiti keçildi"</string>
+    <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi data limiti keçildi"</string>
+    <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> müəyyən edilmiş limit aşır."</string>
+    <string name="data_usage_restricted_title" msgid="5965157361036321914">"Arxaplan datası məhdudlaşdırıldı"</string>
+    <string name="data_usage_restricted_body" msgid="6741521330997452990">"Məhdudiyyəti aradan qaldırmaq üçün toxunun"</string>
+    <string name="ssl_certificate" msgid="6510040486049237639">"Təhlükəsizlik sertifikatı"</string>
+    <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Bu sertifikat etibarlıdır."</string>
+    <string name="issued_to" msgid="454239480274921032">"Verilib:"</string>
+    <string name="common_name" msgid="2233209299434172646">"Ümumi ad:"</string>
+    <string name="org_name" msgid="6973561190762085236">"Təşkilat:"</string>
+    <string name="org_unit" msgid="7265981890422070383">"Təşkilati vahid:"</string>
+    <string name="issued_by" msgid="2647584988057481566">"Tərəfindən verilib:"</string>
+    <string name="validity_period" msgid="8818886137545983110">"Keçərlilik:"</string>
+    <string name="issued_on" msgid="5895017404361397232">"Dərc olunub:"</string>
+    <string name="expires_on" msgid="3676242949915959821">"Bitmə vaxtı:"</string>
+    <string name="serial_number" msgid="758814067660862493">"Seriya nömrəsi:"</string>
+    <string name="fingerprints" msgid="4516019619850763049">"Barmaq izləri:"</string>
+    <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 barmaq izi:"</string>
+    <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 barmaq izi:"</string>
+    <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Hamısını seçın"</string>
+    <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Fəaliyyəti seçin"</string>
+    <string name="share_action_provider_share_with" msgid="5247684435979149216">"Bununla paylaşın"</string>
+    <string name="status_bar_device_locked" msgid="3092703448690669768">"Cihaz kilidləndi."</string>
+    <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+    <string name="sending" msgid="3245653681008218030">"Göndərilir..."</string>
+    <string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer işə salınsın?"</string>
+    <string name="SetupCallDefault" msgid="5834948469253758575">"Zəngi qəbul edək?"</string>
+    <string name="activity_resolver_use_always" msgid="8017770747801494933">"Həmişə"</string>
+    <string name="activity_resolver_use_once" msgid="2404644797149173758">"Sadəcə bir dəfə"</string>
+    <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Planşet"</string>
+    <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"Telefon"</string>
+    <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"Qulaqlıq"</string>
+    <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"Dok spikerlər"</string>
+    <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+    <string name="default_audio_route_category_name" msgid="3722811174003886946">"Sistem"</string>
+    <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth audio"</string>
+    <string name="wireless_display_route_description" msgid="9070346425023979651">"Simsiz ekran"</string>
+    <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Hazırdır"</string>
+    <string name="media_route_button_content_description" msgid="5758553567065145276">"Media çıxışı"</string>
+    <string name="media_route_status_scanning" msgid="7279908761758293783">"Skan edilir..."</string>
+    <string name="media_route_status_connecting" msgid="6422571716007825440">"Qoşulur..."</string>
+    <string name="media_route_status_available" msgid="6983258067194649391">"Əlçatımlı"</string>
+    <string name="media_route_status_not_available" msgid="6739899962681886401">"Əlçatımlı deyil"</string>
+    <string name="media_route_status_in_use" msgid="4533786031090198063">"İstifadə olunur"</string>
+    <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Daxili ekran"</string>
+    <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI Ekran"</string>
+    <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Örtük #<xliff:g id="ID">%1$d</xliff:g>"</string>
+    <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+    <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", təhlükəsiz"</string>
+    <string name="wifi_display_notification_title" msgid="2223050649240326557">"Simsiz ekran qoşulub"</string>
+    <string name="wifi_display_notification_message" msgid="4498802012464170685">"Bu ekran digər cihazda göstərir"</string>
+    <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Bağlantını kəsin"</string>
+    <string name="kg_emergency_call_label" msgid="684946192523830531">"Təcili zəng"</string>
+    <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Şablonu unutmuşam"</string>
+    <string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Model"</string>
+    <string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifrə"</string>
+    <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN səhvdir"</string>
+    <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> saniyə sonra yenidən cəhd edin."</string>
+    <string name="kg_pattern_instructions" msgid="398978611683075868">"Şablonunuzu çəkin"</string>
+    <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN kodu daxil edin"</string>
+    <string name="kg_pin_instructions" msgid="2377242233495111557">"PİN kodu daxil edin"</string>
+    <string name="kg_password_instructions" msgid="5753646556186936819">"Parol daxil edin"</string>
+    <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM indi deaktivdir. Davam etmək üçün PUK kodu daxil edin. Əlavə məlumat üçün operatora müraciət edin."</string>
+    <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"İstədiyiniz PİN kodu daxil edin"</string>
+    <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"İstədiyiniz PIN kodu təsdiqləyin"</string>
+    <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SİM kartın kilidi açılır..."</string>
+    <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Yanlış PİN kod."</string>
+    <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-dən 8-ə qədər rəqəmi olan PIN yazın."</string>
+    <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK kod 8 rəqəm və ya daha çox olmalıdır."</string>
+    <string name="kg_invalid_puk" msgid="3638289409676051243">"Düzgün PUK kodu yenidən daxil edin. Təkrarlanan cəhdlər SIM\'i birdəfəlik sıradan çıxaracaq."</string>
+    <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodları uyğun deyil"</string>
+    <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Həddindən çox cəhd edildi!"</string>
+    <string name="kg_login_instructions" msgid="1100551261265506448">"Kilidi açmaq üçün Google hesabınız ilə daxil olun."</string>
+    <string name="kg_login_username_hint" msgid="5718534272070920364">"İstifadəçi adı (e-poçt)"</string>
+    <string name="kg_login_password_hint" msgid="9057289103827298549">"Şifrə"</string>
+    <string name="kg_login_submit_button" msgid="5355904582674054702">"Daxil ol"</string>
+    <string name="kg_login_invalid_input" msgid="5754664119319872197">"Yanlış istifadəçi adı və ya parol."</string>
+    <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"İstifadəçi adınızı və ya parolunuzu unutmusunuz?\n "<b>"google.com/accounts/recovery"</b>" linkinə daxil olun."</string>
+    <string name="kg_login_checking_password" msgid="1052685197710252395">"Hesab yoxlanılır..."</string>
+    <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodunuzu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+    <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Şifrənizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etdiniz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın."</string>
+    <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Modelinizi <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış çəkmisiniz.\n\n <xliff:g id="NUMBER_1">%d</xliff:g> saniyə ərzində yenidən yoxlayın"</string>
+    <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, planşet fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+    <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Siz telefon kilidini açmaq üçün <xliff:g id="NUMBER_0">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. <xliff:g id="NUMBER_1">%d</xliff:g> dəfə də uğursuz cəhd etsəniz, telefon fabrik ayarlarına sıfırlanacaq və bütün məlumatlarınız itəcək."</string>
+    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Siz planşet kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə uğursuz cəhd etmisiniz. Planşet fabrik ayarlarına sıfırlanacaq."</string>
+    <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Siz telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> yanlış cəhd etmisiniz. Telefon artıq defolt zavod halına sıfırlanacaq."</string>
+    <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Siz kilidi açmaq üçün şablonu <xliff:g id="NUMBER_0">%d</xliff:g> dəfə səhv çəkdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> daha uğursuz cəhddən sonra planşetinizin kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində bir daha yoxlayın."</string>
+    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Siz artıq modeli <xliff:g id="NUMBER_0">%d</xliff:g> dəfə yanlış daxil etmisiniz.<xliff:g id="NUMBER_1">%d</xliff:g> dəfə də yanlış daxil etsəniz, telefonun kilidinin açılması üçün elektron poçt ünvanınız tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniyə ərzində yenidən cəhd edin."</string>
+    <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
+    <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Yığışdır"</string>
+    <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Səs gücü tövsiyə edilən səviyyədən artırılsın?\nUzun müddət yüksək səs gücü ilə dinləmə Sizin eşitmə qabiliyyətinizə mənfi təsir edə bilər."</string>
+    <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Əlçatımlığı aktivləşdirmək üçün iki barmağınızı basılı saxlayın."</string>
+    <string name="accessibility_enabled" msgid="1381972048564547685">"Əlçatımlılıq aktivləşdirildi"</string>
+    <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Giriş imkanı ləğv edilib."</string>
+    <string name="user_switched" msgid="3768006783166984410">"Cari istifadəçi <xliff:g id="NAME">%1$s</xliff:g>."</string>
+    <string name="owner_name" msgid="2716755460376028154">"Sahib"</string>
+    <string name="error_message_title" msgid="4510373083082500195">"Xəta"</string>
+    <string name="app_no_restricted_accounts" msgid="5739463249673727736">"Bu tətbiq məhdud profillər üçün hesabları dəstəkləmir."</string>
+    <string name="app_not_found" msgid="3429141853498927379">"Bu əməliyyatı idarə etmək üçün heç bir tətbiq tapılmadı."</string>
+    <string name="revoke" msgid="5404479185228271586">"Ləğv edin"</string>
+    <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+    <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+    <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+    <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+    <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+    <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+    <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+    <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+    <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+    <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+    <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+    <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+    <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+    <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+    <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+    <string name="mediaSize_iso_b4" msgid="5749404165888526034">"B4 ISO"</string>
+    <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+    <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+    <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+    <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+    <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+    <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+    <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+    <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+    <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+    <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+    <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+    <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+    <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+    <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+    <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+    <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+    <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+    <string name="mediaSize_na_letter" msgid="4191805615829472953">"Məktub"</string>
+    <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"Hökumət Məktubu"</string>
+    <string name="mediaSize_na_legal" msgid="6697982988283823150">"Hüquqi"</string>
+    <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Kiçik Hüquq"</string>
+    <string name="mediaSize_na_ledger" msgid="281871464896601236">"Qovluq"</string>
+    <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Qısa"</string>
+    <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Ləğv edildi"</string>
+    <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Kontent yazmna xətası"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"naməlum"</string>
+    <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN daxil edin"</string>
+    <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Cari PIN"</string>
+    <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Yeni PIN"</string>
+    <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Yeni PIN\'i təsdiq edin"</string>
+    <string name="restr_pin_create_pin" msgid="8017600000263450337">"Dəyişmə məhdudiyyətləri üçün PİN yaradın"</string>
+    <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PİN uyğun gəlmir. Yenidən cəhd edin."</string>
+    <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PİN çox qısadır. Ən azı 4 rəqəm olmalıdır."</string>
+  <plurals name="restr_pin_countdown">
+    <item quantity="one" msgid="4835639969503729874">"Yanlış PİN. 1 saniyə sonra təkrar sınayın."</item>
+    <item quantity="other" msgid="8030607343223287654">"Yanlış PİN. <xliff:g id="COUNT">%d</xliff:g> saniyə sonra təkrar sınayın."</item>
+  </plurals>
+    <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Paneli göstərmək üçün ekranın küncünü sürüşdürün"</string>
+    <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sistem panelini göstərmək üçün ekranın küncündən sürüşdürün"</string>
+</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index e04c6e6..d3782e0 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -365,9 +365,9 @@
     <skip />
     <!-- no translation found for permdesc_bindPrintService (7960067623209111135) -->
     <skip />
-    <!-- no translation found for permlab_accessAllPrintJobs (1120792468465711159) -->
+    <!-- no translation found for permlab_bindPrintSpoolerService (6807762783744125954) -->
     <skip />
-    <!-- no translation found for permdesc_accessAllPrintJobs (2978185311041864762) -->
+    <!-- no translation found for permdesc_bindPrintSpoolerService (3680552285933318372) -->
     <skip />
     <!-- no translation found for permlab_bindNfcService (2752731300419410724) -->
     <skip />
@@ -1637,6 +1637,8 @@
     <skip />
     <!-- no translation found for write_fail_reason_cannot_write (8132505417935337724) -->
     <skip />
+    <!-- no translation found for reason_unknown (6048913880184628119) -->
+    <skip />
     <!-- no translation found for restr_pin_enter_pin (3395953421368476103) -->
     <skip />
     <!-- no translation found for restr_pin_enter_old_pin (1462206225512910757) -->
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 46f211e..3bb818b 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Разрешава на притежателя да се обвърже с интерфейса от най-високото ниво на услуга за достъпност. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"обвързване с услуга за отпечатване"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Разрешава на притежателя да се обвърже с интерфейса от най-високото ниво на услуга за отпечатване. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"достъп до всички задания за отпечатване"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Разрешава на притежателя да осъществява достъп до създадените от друго приложение задания за отпечатване. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"обвързване с услуга за спулер за отпечатване"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Разрешава на притежателя да се обвърже с интерфейса от най-високото ниво на услуга за спулер за отпечатване. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"обвързване с услуга за КБП"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Разрешава на притежателя да се обвързва с приложения, които емулират карти за КБП. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"обвързване с текстова услуга"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Анулирано"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Грешка при записване на съдържанието"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"неизвестно"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Въведете ПИН кода"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Текущ ПИН код"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Нов ПИН код"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index a6fd663..3d6315f 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permet vincular amb la interfície de nivell superior d\'un servei d\'accessibilitat. Les aplicacions normals no haurien de necessitar-ho."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"vincula amb un servei d\'impressió"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permet que el titular vinculi a la interfície de nivell superior d\'un servei d\'impressió. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"accedeix a totes les tasques d\'impressió"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Permet que el propietari accedeixi a les tasques d\'impressió creades per una altra aplicació. Les aplicacions normals no l\'haurien de necessitar mai."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"vincula amb un servei de gestor de cues d\'impressió"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permet que el titular vinculi a la interfície de nivell superior d\'un servei de gestor de cues d\'impressió. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"vincula al servei NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permet que el titular es vinculi a les aplicacions que emulen les targetes de NFC. No hauria de ser mai necessari per a les aplicacions normals."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"vincula a un servei de text"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloide"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancel·lada"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error en escriure el contingut"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"desconegut"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Introdueix el PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN actual"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN nou"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 98e1783..0d0e95c 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Umožňuje držiteli navázat se na nejvyšší úroveň rozhraní služby usnadnění přístupu. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"navázat se na tiskovou službu"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Umožňuje navázání na nejvyšší úroveň tiskové služby. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"přístup ke všem tiskovým úlohám"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Umožňuje přístup k tiskovým úlohám vytvořeným jinou aplikací. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"navázat se na službu zařazování tisku"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Umožňuje držiteli navázat se na nejvyšší úroveň služby zařazování tisku. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"navázat se na službu NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Umožňuje držiteli navázat se na aplikace, které emulují karty NFC. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"navázat se na textovou službu"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Zrušeno"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Při zápisu obsahu došlo k chybě"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"neznámé"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Zadejte kód PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuální kód PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nový kód PIN"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 5f100cf..36272ab 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Tillader, at brugeren binder sig til en grænseflade for en tilgængelighedstjeneste på øverste niveau. Bør aldrig være nødvendigt til almindelige apps."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"forbinde til en udskriftstjeneste"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Tillader, at brugeren forbinder til grænsefladen for en udskriftstjeneste på øverste niveau. Dette bør aldrig være nødvendigt for almindelige apps."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"få adgang til alle udskriftsjob"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Tillader, at brugeren får adgang til udskriftsjob, der er oprettet af en anden app. Dette bør aldrig være nødvendigt for almindelige apps."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"forbinde til en udskriftsspoolertjeneste"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Tillader, at brugeren forbinder til grænsefladen for en udskriftsspoolertjeneste på øverste niveau. Dette bør aldrig være nødvendigt for almindelige apps."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"Knyt til NFC-tjeneste"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Tillader, at indehaveren opretter tilknytninger til applikationer, der efterligner NFC-kort. Dette bør aldrig være nødvendigt for normale apps."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"forpligte sig til en sms-tjeneste"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Amerikansk \"Tabloid\""</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Annulleret"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Fejl ved skrivning af indhold"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"ukendt"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Indtast pinkode"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuel pinkode:"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Ny pinkode"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 0170f2e..863c2c0 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Ermöglicht dem Halter, sich an die Oberfläche einer Bedienungshilfe auf oberster Ebene zu binden. Sollte nie für normale Apps benötigt werden."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"An einen Druckdienst binden"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Ermöglicht dem Inhaber, sich an die Oberfläche eines Druckdienstes auf oberster Ebene zu binden. Sollte für normale Apps nie benötigt werden."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"Auf alle Druckaufträge zugreifen"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Ermöglicht dem Inhaber den Zugriff auf von einer anderen App erstellte Druckaufträge. Sollte für normale Apps nie benötigt werden."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"An Druck-Spooler-Dienst binden"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Ermöglicht dem Inhaber, sich an die Oberfläche eines Druck-Spooler-Dienstes auf oberster Ebene zu binden. Sollte für normale Apps nie benötigt werden."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"An NFC-Dienst binden"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Ermöglicht dem Inhaber die Bindung an Apps, die NFC-Karten emulieren. Dies sollte für normale Apps niemals notwendig sein."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"An einen Textdienst binden"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Abgebrochen"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Fehler beim Schreiben von Inhalten"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"Unbekannt"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN eingeben"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuelle PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Neue PIN"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index b172f2b..be12c74 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανώτατου επιπέδου μιας υπηρεσίας προσβασιμότητας. Δεν απαιτείται σε κανονικές εφαρμογές."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"δέσμευση σε υπηρεσία εκτύπωσης"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας εκτύπωσης. Δεν απαιτείται για κανονικές εφαρμογές."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"πρόσβαση σε όλες τις εργασίες εκτύπωσης"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Επιτρέπει στον κάτοχο να αποκτά πρόσβαση σε εργασίες εκτύπωσης από άλλες εφαρμογές. Δεν απαιτείται για κανονικές εφαρμογές."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"σύνδεση με μια υπηρεσία εκτύπωσης σε ουράς"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Επιτρέπει στον κάτοχο τη σύνδεση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας εκτύπωσης σε ουρά. Δεν απαιτείται για κανονικές εφαρμογές."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"σύνδεση με υπηρεσία NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Δίνει στον κάτοχο τη δυνατότητα σύνδεσης με εφαρμογές που προσομοιώνουν κάρτες NFC. Δεν ζητείται ποτέ για κανονικές εφαρμογές."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"δέσμευση σε υπηρεσία ανταλλαγής μηνυμάτων"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Ακυρώθηκε"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Σφάλμα κατά την εγγραφή περιεχομένου"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"άγνωστο"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Εισαγωγή PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Ισχύων κωδικός PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Νέος κωδικός PIN"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 63004a8..5b431fd 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Allows the holder to bind to the top-level interface of an accessibility service. Should never be needed for normal apps."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"bind to a print service"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Allows the holder to bind to the top-level interface of a print service. Should never be needed for normal apps."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"access all print jobs"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Allows the holder to access print jobs created by another app. Should never be needed for normal apps."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"bind to a print spooler service"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Allows the holder to bind to the top-level interface of a print spooler service. Should never be needed for normal apps."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"bind to NFC service"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Allows the holder to bind to applications that are emulating NFC cards. Should never be needed for normal apps."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"bind to a text service"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelled"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error writing content"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"unknown"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Enter PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Current PIN:"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"New PIN"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 63004a8..5b431fd 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Allows the holder to bind to the top-level interface of an accessibility service. Should never be needed for normal apps."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"bind to a print service"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Allows the holder to bind to the top-level interface of a print service. Should never be needed for normal apps."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"access all print jobs"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Allows the holder to access print jobs created by another app. Should never be needed for normal apps."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"bind to a print spooler service"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Allows the holder to bind to the top-level interface of a print spooler service. Should never be needed for normal apps."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"bind to NFC service"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Allows the holder to bind to applications that are emulating NFC cards. Should never be needed for normal apps."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"bind to a text service"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelled"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error writing content"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"unknown"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Enter PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Current PIN:"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"New PIN"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index b0737e5..ee051db 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite al propietario vincularse a la interfaz de nivel superior de un servicio de accesibilidad. Las aplicaciones normales no deberían necesitar este permiso."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"vincular a un servicio de impresión"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permite al propietario vincularse a la interfaz de nivel superior de un servicio de impresión. Las aplicaciones normales no deberían necesitar este permiso."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"acceder a todos los trabajos de impresión"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Permite al propietario acceder a trabajos de impresión creados con otra aplicación. Las aplicaciones normales no deberían necesitar este permiso."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"Vincular a un servicio de administrador de trabajos de impresión"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permite al propietario vincularse con la interfaz de nivel superior de un servicio de administrador de trabajos de impresión. Las aplicaciones normales no deberían necesitar este permiso."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"Vincular con servicio NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permite vincular con aplicaciones que emulen tarjetas NFC. Las aplicaciones normales no deberían necesitar este permiso."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"vincular a un servicio de texto"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloide"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelada"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error al escribir contenido"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"desconocido"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ingresar PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN actual"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN nuevo"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 170abd2..844412d 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite enlazar con la interfaz de nivel superior de un servicio de accesibilidad. Las aplicaciones normales no deberían necesitar este permiso."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"enlazar con un servicio de impresión"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permite enlazar con la interfaz de nivel superior de un servicio de impresión. No debe ser necesario para las aplicaciones normales."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"acceder a todos los trabajos de impresión"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Permite acceder a trabajos de impresión creados con otra aplicación. No debe ser necesario para aplicaciones normales."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"enlazar con un servicio de cola de impresión"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permite enlazar con la interfaz de nivel superior de un servicio de cola de impresión. No debe ser necesario para las aplicaciones normales."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"enlazar con servicio NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permite enlazar con aplicaciones que emulen tarjetas NFC. No debe ser necesario para las aplicaciones normales."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"enlazar con un servicio de texto"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloide"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelado"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error al escribir contenido"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"desconocido"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Introducir PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN actual"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN nuevo"</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index b58bf7b..f99f774 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Lubab omanikul luua sideme juurdepääsuteenuse ülataseme liidesega. Tavarakenduste puhul ei tohiks seda kunagi vaja minna."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"sidumine printimisteenusega"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Lubab omanikul siduda printimisteenuse ülataseme liidesega. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"juurdepääs kõikidele printimistöödele"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Lubab omanikule juurdepääsu teise rakenduse loodud printimistöödele. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"seo printimise spuulerteenusega"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Lubab omanikul siduda printimise spuulerteenuse ülataseme liidesega. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC-teenusega sidumine"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Lubab õiguste omajal luua seosed rakendustega, mis emuleerivad NFC-kaarte. Pole kunagi vajalik tavaliste rakenduste korral."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"tekstiteenusega sidumine"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Tühistatud"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Viga sisu kirjutamisel"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"teadmata"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Sisestage PIN-kood"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Praegune PIN-kood"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Uus PIN-kood"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 65f26aa..0135830 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"به دارنده اجازه می‌دهد که به رابط سطح بالای سرویس دسترسی متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"اتصال به یک سرویس چاپ"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"به برنامه اجازه می‌دهد که به رابط سطح بالای سرویس چاپ متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"دسترسی به تمام کارهای چاپ"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"به دارنده اجازه دسترسی به کارهای چاپی ایجاد شده توسط برنامه‌ای دیگر را می‌دهد.هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"اتصال به سرویس هماهنگ‌کننده چاپ"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"به دارنده اجازه می‌دهد که به واسط سطح بالای سرویس هماهنگ‌کننده چاپ متصل شود. هرگز برای برنامه‌های معمولی مورد نیاز نیست."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"اتصال به سرویس NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"به دارنده اجازه می‌دهد به برنامه‌هایی متصل شود که مشابه با کارت‌های NFC عمل می‌کنند. هرگز نباید برای برنامه‌های عادی مورد نیاز باشد."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"اتصال به یک سرویس متنی"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"لغو شد"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"خطا هنگام نوشتن محتوا"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"نامعلوم"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"پین را وارد کنید"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"پین کنونی"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"پین جدید"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 524128dc..fd11b88 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Antaa sovelluksen sitoutua esteettömyyspalvelun ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"Tulostuspalveluun sitoutuminen"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Antaa sovelluksen sitoutua tulostuspalvelun ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"Kaikkien tulostustöiden käyttäminen"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Antaa luvanhaltijan käyttää toisen sovelluksen luomia tulostustöitä. Ei tavallisten sovelluksien käyttöön."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"tulostuspalveluun sitoutuminen"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Antaa sovelluksen sitoutua tulostuspalvelun ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"luo sidos NFC-palveluun"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Sallii oikeuden haltijan luoda sidoksia sovelluksiin, jotka jäljittelevät NFC-kortteja. Tämän ei pitäisi olla tarpeen tavallisille sovelluksille."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"tekstipalveluun sitoutuminen"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Peruutettu"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Sisällön kirjoittamisessa tapahtui virhe"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"tuntematon"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Anna PIN-koodi"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Nykyinen PIN-koodi"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Uusi PIN-koodi"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 2b48342..051fea1 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service d\'accessibilité. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"lier à un service d\'impression"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service de widget. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"accéder à tous les travaux d\'impression"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Permet à l\'application d\'accéder aux travaux d\'impression créés par une autre application. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"s\'associer à un service d\'impression désynchronisée"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permet à l\'application autorisée de s\'associer à l\'interface de niveau supérieur d\'un service d\'impression désynchronisée. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"s\'associer au service NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permet à l\'application autorisée de s\'associer aux applications qui reproduisent le fonctionnement des cartes NFC. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"s\'associer à un service de texte"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Annulé"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Erreur lors de l\'écriture du contenu"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"inconnu"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Saisissez le NIP"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"NIP actuel"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nouveau NIP"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 3017dd2..379bc13 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service d\'accessibilité. Les applications standards ne doivent jamais avoir recours à cette fonctionnalité."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"s\'associer à un service d\'impression"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permet à l\'application autorisée de s\'associer à l\'interface de niveau supérieur d\'un service d\'impression. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"accéder à l\'ensemble des tâches d\'impression"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Permet à l\'application autorisée d\'accéder aux tâches d\'impression créées via une autre application. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"s\'associer à un service de spouleur d\'impression"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permet à l\'application autorisée de s\'associer à l\'interface de niveau supérieur d\'un service de spouleur d\'impression. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"s\'associer au service NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permet à l\'application autorisée de s\'associer aux applications qui reproduisent le fonctionnement des cartes NFC. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"associer à un service de texte"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloïd"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Tâche annulée."</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Erreur lors de la modification du contenu."</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"inconnu"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Saisir le code PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Code PIN actuel"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nouveau code PIN"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index e8e10a0..b88f663d 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -109,7 +109,7 @@
     <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: अग्रेषित नहीं किया गया"</string>
     <string name="fcComplete" msgid="3118848230966886575">"सुविधा कोड पूर्ण."</string>
     <string name="fcError" msgid="3327560126588500777">"कनेक्‍शन समस्‍या या अमान्‍य सुविधा कोड."</string>
-    <string name="httpErrorOk" msgid="1191919378083472204">"ठीक"</string>
+    <string name="httpErrorOk" msgid="1191919378083472204">"ठीक है"</string>
     <string name="httpError" msgid="7956392511146698522">"कोई नेटवर्क त्रुटि हुई थी."</string>
     <string name="httpErrorLookup" msgid="4711687456111963163">"URL नहीं मिल सका."</string>
     <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"साइट प्रमाणीकरण योजना समर्थित नहीं है."</string>
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"धारक को किसी पहुंच-योग्यता सेवा के शीर्ष-स्‍तर इंटरफ़ेस से आबद्ध होने देता है. सामान्‍य एप्‍लिकेशन के लिए कभी भी आवश्‍यक नहीं होना चाहिए."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"प्रिंट सेवा से आबद्ध करें"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"धारक को किसी प्रिंट सेवा के शीर्ष-स्‍तर इंटरफ़ेस से आबद्ध होने देता है. सामान्‍य एप्‍लिकेशन के लिए कभी भी आवश्‍यक नहीं होना चाहिए."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"सभी प्रिंट कार्य एक्सेस करें"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"धारक को अन्य एप्लिकेशन के द्वारा बनाए गए प्रिंट कार्य एक्सेस करने देता है. सामान्य एप्लिकेशन के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"प्रिंट स्पूलर सेवा से आबद्ध करें"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"धारक को प्रिंट स्पूलर सेवा के शीर्ष-स्‍तर इंटरफ़ेस से आबद्ध होने देता है. सामान्‍य एप्‍लिकेशन के लिए कभी भी आवश्‍यक नहीं होना चाहिए."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC सेवा से आबद्ध रहें"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"धारक को ऐसे एप्लिकेशन से आबद्ध रहने देता है जो NFC कार्ड का अनुकरण कर रहे हैं. सामान्य एप्लिकेशन के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"किसी पाठ सेवा पर बने रहें"</string>
@@ -1062,7 +1062,7 @@
     <string name="VideoView_error_title" msgid="3534509135438353077">"वीडियो समस्‍याएं"</string>
     <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"यह वीडियो इस उपकरण पर स्ट्रीमिंग के लिए मान्‍य नहीं है."</string>
     <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"यह वीडियो नहीं चलाया जा सकता."</string>
-    <string name="VideoView_error_button" msgid="2822238215100679592">"ठीक"</string>
+    <string name="VideoView_error_button" msgid="2822238215100679592">"ठीक है"</string>
     <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
     <string name="noon" msgid="7245353528818587908">"अपराह्न"</string>
     <string name="Noon" msgid="3342127745230013127">"अपराह्न"</string>
@@ -1087,9 +1087,9 @@
     <string name="low_internal_storage_view_text" msgid="6640505817617414371">"हो सकता है कुछ सिस्टम फ़ंक्शन कार्य न करें"</string>
     <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> चल रहा है"</string>
     <string name="app_running_notification_text" msgid="4653586947747330058">"अधिक जानकारी के लिए या एप्लिकेशन रोकने के लिए स्पर्श करें."</string>
-    <string name="ok" msgid="5970060430562524910">"ठीक"</string>
+    <string name="ok" msgid="5970060430562524910">"ठीक है"</string>
     <string name="cancel" msgid="6442560571259935130">"रद्द करें"</string>
-    <string name="yes" msgid="5362982303337969312">"ठीक"</string>
+    <string name="yes" msgid="5362982303337969312">"ठीक है"</string>
     <string name="no" msgid="5141531044935541497">"रद्द करें"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"ध्यानाकर्षण"</string>
     <string name="loading" msgid="7933681260296021180">"लोड हो रहे हैं..."</string>
@@ -1109,7 +1109,7 @@
     <string name="anr_activity_process" msgid="5776209883299089767">"गतिविधि <xliff:g id="ACTIVITY">%1$s</xliff:g> प्रतिसाद नहीं दे रही है.\n\nक्या आप इसे बंद करना चाहते हैं?"</string>
     <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> प्रतिसाद नहीं दे रहा है. क्या आप इसे बंद करना चाहते हैं?"</string>
     <string name="anr_process" msgid="6513209874880517125">"प्रक्रिया <xliff:g id="PROCESS">%1$s</xliff:g> प्रतिसाद नहीं दे रही है.\n\nक्‍या आप इसे बंद करना चाहते हैं?"</string>
-    <string name="force_close" msgid="8346072094521265605">"ठीक"</string>
+    <string name="force_close" msgid="8346072094521265605">"ठीक है"</string>
     <string name="report" msgid="4060218260984795706">"रिपोर्ट करें"</string>
     <string name="wait" msgid="7147118217226317732">"प्रतीक्षा करें"</string>
     <string name="webpage_unresponsive" msgid="3272758351138122503">"पृष्ठ प्रतिसाद नहीं दे रहा है.\n\nक्‍या आप इसे बंद करना चाहते हैं?"</string>
@@ -1229,7 +1229,7 @@
     <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB संग्रहण चालू करें"</string>
     <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"यदि आप USB संग्रहण चालू करते हैं, तो आपके द्वारा उपयोग किए जा रहे कुछ एप्‍लिकेशन रुक जाएंगे और हो सकता है कि वे तब तक अनुपलब्‍ध रहें जब तक कि आप USB संग्रहण बंद नहीं कर देते."</string>
     <string name="dlg_error_title" msgid="7323658469626514207">"USB कार्यवाही विफल"</string>
-    <string name="dlg_ok" msgid="7376953167039865701">"ठीक"</string>
+    <string name="dlg_ok" msgid="7376953167039865701">"ठीक है"</string>
     <string name="usb_mtp_notification_title" msgid="3699913097391550394">"किसी मीडिया उपकरण के रूप में कनेक्‍ट किया गया"</string>
     <string name="usb_ptp_notification_title" msgid="1960817192216064833">"कैमरे के रूप में कनेक्‍ट करें"</string>
     <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"किसी इंस्‍टॉलर के रूप में कनेक्‍ट किया गया"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"टेबलॉइड"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"रद्द कर दी गई"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामग्री लिखने में त्रुटि"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"अज्ञात"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN डालें"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"वर्तमान पिन"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"नया पिन"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 9a3c50c..136b704 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Nositelju omogućuje vezanje uz sučelje najviše razine usluge dostupnosti. Ne bi smjelo biti potrebno za normalne aplikacije."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"veži se uz uslugu ispisa"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Dopušta nositelju vezanje uza sučelje usluge ispisa najviše razine. Ne bi smjelo biti potrebno za uobičajene aplikacije."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"pristupi svim zadacima ispisa"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Dopušta nositelju pristup zadacima ispisa koje je izradila neka druga aplikacija. Ne bi smjelo biti potrebno za uobičajene aplikacije."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"veži se uz uslugu predmemoriranja ispisa"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Dopušta nositelju vezanje uza sučelje usluge predmemoriranja ispisa najviše razine. Ne bi smjelo biti potrebno za uobičajene aplikacije."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"povezivanje s NFC uslugom"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Omogućuje nositelju povezivanje s aplikacijama koje emuliraju NFC kartice. Nikada ne bi trebalo biti potrebno za uobičajene aplikacije."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"vezanje na tekstualnu uslugu"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Otkazano"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Pogreška prilikom pisanja sadržaja"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"nepoznato"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Unesite PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Trenutačni PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Novi PIN"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 2ef6d9b..8351c56 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Lehetővé teszi a használó számára, hogy csatlakozzon egy kisegítő szolgáltatás legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"csatlakozás egy nyomtatási szolgáltatáshoz"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Lehetővé teszi a használó számára, hogy csatlakozzon egy nyomtatási szolgáltatás legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"hozzáférés valamennyi nyomtatási feladathoz"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Lehetővé teszi a használó számára, hogy megtekintsen más alkalmazások által létrehozott nyomtatási feladatokat. A normál alkalmazásoknak erre soha nincs szükségük."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"csatlakozás egy nyomtatásisor-kezelő szolgáltatáshoz"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Lehetővé teszi a használó számára, hogy csatlakozzon egy nyomtatásisor-kezelő legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"csatlakozás NFC-szolgáltatáshoz"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Az eszköz kezelője csatlakozhat NFC-kártyákat emuláló alkalmazásokhoz. A normál alkalmazásoknak nincs rá szükségük."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"csatlakozás szövegszolgáltatáshoz"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"„Tabloid” méret"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Törölve"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Hiba történt a tartalomírás közben"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"ismeretlen"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN kód megadása"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Jelenlegi PIN kód"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Új PIN kód"</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 337027c..232add4 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Թույլ է տալիս սեփականատիրոջը միանալ հասանելիության ծառայության վերին մակարդակի ինտերֆեյսին: Սովորական հավելվածների համար երբևէ չպետք է անհրաժեշտ լինի:"</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"միանալ տպման ծառայությանը"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Թույլ է տալիս սեփականատիրոջը միանալ տպման ծառայության վերին մակարդակի ինտերֆեյսին: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"մուտքի գործել բոլոր տպման աշխատանքներ"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Թույլ է տալիս սեփականատիրոջը մուտք ունենալ մեկ այլ ծրագրի կողմից ստեղծված տպման աշխատանքներ: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"միանալ տպման կարգավարի ծառայությանը"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Թույլ է տալիս սեփականատիրոջը միանալ տպման կարգավարի ծառայության վերին մակարդակի ինտերֆեյսին: Սովորական ծրագրերի համար երբևէ  անհրաժեշտ չպետք է լինի:"</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"կապվել NFC ծառայությանը"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Թույլ է տալիս տիրոջը կապվել ծրագրերին, որոնք օգտագործում են NFC քարտեր: Սովորական ծրագրերի համար երբեք անհրաժեշտ չէ:"</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"միանալ տեքստային ծառայությանը"</string>
@@ -1093,8 +1093,8 @@
     <string name="no" msgid="5141531044935541497">"Չեղարկել"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Ուշադրություն"</string>
     <string name="loading" msgid="7933681260296021180">"Բեռնում..."</string>
-    <string name="capital_on" msgid="1544682755514494298">"Միացնել"</string>
-    <string name="capital_off" msgid="6815870386972805832">"Անջատել"</string>
+    <string name="capital_on" msgid="1544682755514494298">"I"</string>
+    <string name="capital_off" msgid="6815870386972805832">"O"</string>
     <string name="whichApplication" msgid="4533185947064773386">"ավարտել գործողությունը` օգտագործելով"</string>
     <string name="alwaysUse" msgid="4583018368000610438">"Օգտագործել լռելյայն այս գործողության համար:"</string>
     <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Մաքրել լռելյայնը Համակարգի կարգավորումներ &gt; Ծրագրեր &gt;Ներբեռնված էջից:"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Չեղարկված է"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Բովանդակության գրելու սխալ"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"անհայտ"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Մուտքագրեք PIN-ը"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Ընթացիկ PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Նոր PIN"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 3b9a280..d69e121 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Mengizinkan pemegang untuk mengikat antarmuka tingkat tinggi dari suatu layanan. Tidak pernah diperlukan oleh aplikasi normal."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"mengikat ke layanan pencetakan"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Memungkinkan pemegang mengikat antarmuka tingkat tinggi dari suatu layanan pencetakan. Tidak pernah diperlukan oleh aplikasi normal."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"mengakses semua tugas pencetakan"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Memungkinkan pemegang mengakses tugas pencetakan yang dibuat oleh aplikasi lain. Tidak pernah diperlukan aplikasi normal."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"mengikat ke layanan penampung pencetakan"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Memungkinkan pemegang mengikat antarmuka tingkat tinggi dari layanan penampung pencetakan. Tidak pernah diperlukan oleh aplikasi normal."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"mengikat ke layanan NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Memungkinkan pemegang mengikat ke aplikasi yang meniru kartu NFC. Tidak pernah dibutuhkan untuk aplikasi normal."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"mengikat ke layanan SMS"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Dibatalkan"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Terjadi kesalahan saat menulis konten"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"tak diketahui"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Masukkan PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN Saat Ini"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN Baru"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 1195923..0a1dad1 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Consente al titolare di collegarsi all\'interfaccia di primo livello di un servizio di accessibilità. Non dovrebbe essere mai necessaria per le normali applicazioni."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"collegamento a un servizio di stampa"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Consente al titolare di collegarsi all\'interfaccia di primo livello di un servizio di stampa. Non dovrebbe essere mai necessaria per le normali applicazioni."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"accesso a tutti i processi di stampa"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Consente al titolare di accedere ai processi di stampa creati da un\'altra app. Non dovrebbe essere mai necessaria per le normali applicazioni."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"collegamento a un servizio spooler di stampa"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Consente al titolare di collegarsi all\'interfaccia di primo livello di un servizio spooler di stampa. Non dovrebbe essere mai necessaria per le normali app."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"associazione a servizio NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Consente al titolare di collegarsi alle applicazioni che emulano carte NFC. Non dovrebbe mai essere necessario per le normali applicazioni."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"associazione a un servizio di testo"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Annullato"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Errore nella scrittura dei contenuti"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"sconosciuto"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Inserisci PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN corrente"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nuovo PIN"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 5d2b391..ba52642 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"מתיר לבעלים להכפיף לממשק ברמה העליונה של שירות זמינות. הרשאה זו אף פעם אינה אמורה להיות נחוצה ליישומים רגילים."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"איגוד לשירות הדפסה"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"ההרשאה הזו מאפשרת לבעלים לבצע איגוד לממשק הרמה העליונה של שירות הדפסה. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"גישה אל כל עבודות ההדפסה"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"ההרשאה הזו מאפשרת לבעלים לגשת לעבודות הדפסה שנוצרו על ידי אפליקציה אחרת. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"איגוד לשירות הדפסה"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"מאפשרת לבעלים לבצע איגוד לממשק ברמה העליונה של שירות הדפסה. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"איגוד לשירות NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"מאפשרת לבעלים לאגד את האפליקציות המחקות כרטיסיות NFC. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"הכפפה לשירות טקסט"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"בוטלה"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"שגיאה בכתיבת תוכן"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"לא ידוע"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"הזן מספר PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"מספר PIN נוכחי"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"מספר PIN חדש"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index b86ba32..7d38f88 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ユーザー補助サービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"印刷サービスへのバインド"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"印刷サービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"すべての印刷ジョブへのアクセス"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"別のアプリが作成した印刷ジョブにアクセスすることを所有者に許可します。通常のアプリでは不要です。"</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"印刷スプーラサービスへのバインド"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"印刷スプーラサービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFCサービスへのバインド"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"NFCカードをエミュレートしているアプリにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"テキストサービスにバインド"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"タブロイド"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"キャンセルされました"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"コンテンツの書き込み中にエラーが発生しました"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"不明"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PINを入力"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"現在のPIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"新しいPIN"</string>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 43f0be6..b2c1c3d 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"აპს შეეძლება გამარტივებული წვდომის სერვისის ზედა დონის ინტერფეისთან დაკავშირება. არასდროს გამოიყენება ჩვეულებრივ აპებში."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"ბეჭდვის სევისზე მიბმა"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"მფლობელს შეეძლება მიებას ბეჭდვის სერვისების ზედა დონის ინტერფეისს. ჩვეულებრივ აპს ეს წესით არასოდეს არ უნდა დაჭირდეს."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"ბეჭდვის ყველა დავალებაზე წვდომა"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"საშუალებას აძლევს მფლობელს იქონიოს წვდომა სხვა აპის მიერ შექმნილ ბეჭდვის დავალებებზე. ჩვეულებრივ აპს ეს წესით არასოდეს არ უნდა დაჭირდეს."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"ბეჭდვის spooler სევისზე მიბმა"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"მფლობელს შეეძლება მიებას ბეჭდვის spooler სერვისების ზედა დონის ინტერფეისს. ჩვეულებრივ აპს ეს წესით არასოდეს არ უნდა დაჭირდეს."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC სერვისთან შეკავშირება"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"საშუალებას აძლევს მფლობელს შეკავშირდეს აპლიკაციებთან, რომლებიც NFC ბარათების სიმულაციას ახდენს. ჩვეულებრივ აპებს უმეტეს შემთხვევაში არ დაჭირდება."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"ტექსტ სერვისთან დაკავშირება"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"გაუქმებული"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"შეცდომა კონტენტის ჩაწერისას"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"უცნობი"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"შეიყვანეთ PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"ამჟამინდელი PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"ახალი PIN"</string>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index fee8e66..4feebe5 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ឲ្យ​​ម្ចាស់​ចង​ចំណុច​ប្រទាក់​កម្រិត​កំពូល​នៃ​សេវាកម្ម​ភាព​ងាយស្រួល។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មតា​ទេ។"</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"ចង​សេវាកម្ម​​បោះពុម្ព"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"ឲ្យ​ម្ចាស់​ចង​ចំណុច​ប្រទាក់​កម្រិត​កំពូល​នៃ​សេវាកម្ម​ធាតុ​ក្រាហ្វិក។ មិន​គួរ​​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មតា​ទេ។"</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"ចូល​ដំណើរការ​​ការងារ​បោះពុម្ព​ទាំងអស់"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"អនុញ្ញាត​ឲ្យ​ម្ចាស់​អាច​បោះពុម្ព​ការងារ​ដែល​បាន​បង្កើត​ដោយ​កម្មវិធី​ផ្សេង។ មិន​គួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មតា​ទេ។"</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"ភ្ជាប់​ទៅ​សេវាកម្ម print spooler"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"អនុញ្ញាត​ឲ្យ​ម្ចាស់​ភ្ជាប់​ទៅ​ចំណុច​ប្រទាក់​កម្រិត​កំពូល​នៃ​សេវាកម្ម print spooler ។ មិន​គួរ​ទាមទារ​សម្រាប់​កម្មវិធី​ធម្មតា​ទេ។"</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"ភ្ជាប់​ជាមួយ​សេវាកម្ម NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"អនុញ្ញាត​ឲ្យ​​ភ្ជាប់​​​បញ្ជី​ជាមួយ​​កម្មវិធី​ដែល​ត្រូវ​បាន​ត្រាប់​តាម​​កាត NFC ។ មិន​គួរ​ត្រូវ​​ការ​សម្រាប់​កម្មវិធី​ធម្មតា​។"</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"ចង​សេវា​កម្ម​អត្ថបទ"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"បាន​បោះ​បង់"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"កំហុស​ក្នុង​ការ​សរសេរ​មាតិកា"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"មិន​ស្គាល់"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"បញ្ចូល​​កូដ PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"កូដ PIN បច្ចុប្បន្ន"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"កូដ PIN ថ្មី"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 23fbda9..cdbf256 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"권한을 가진 프로그램이 접근성 서비스에 대한 최상위 인터페이스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"인쇄 서비스 사용"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"권한을 가진 프로그램이 인쇄 서비스에 대한 최상위 인터페이스를 사용하도록 합니다. 일반 앱에는 필요하지 않습니다."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"모든 인쇄 작업에 액세스"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"권한을 가진 프로그램이 다른 앱에서 생성한 인쇄 작업에 액세스하도록 합니다. 일반 앱에는 필요하지 않습니다."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"인쇄 스풀러 서비스 사용"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"권한을 가진 프로그램이 인쇄 스풀러 서비스에 대한 최상위 인터페이스를 사용하도록 합니다. 일반 앱에는 필요하지 않습니다."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC 서비스 사용"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"권한을 가진 프로그램이 NFC 카드를 에뮬레이션하는 애플리케이션을 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"텍스트 서비스 연결"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"타블로이드"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"취소됨"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"콘텐츠 작성 중 오류"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"알 수 없음"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN 입력"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"현재 PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"새 PIN"</string>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 37770d4..d55a2c8 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງ ເຊື່ອມໂຍງສ່ວນຕິດຕໍ່ລະດັບເທິງສຸດ ຂອງບໍລິການການເຂົ້າເຖິງ. ແອັບຯທົ່ວໄປບໍ່ຄວນຈຳເປັນຕ້ອງໃຊ້."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"ຜູກ​ມັດ​ກັບ​ການ​ບໍ​ລິ​ການ​ພິມ"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງຜູກກັບສ່ວນຕິດຕໍ່ຜູ່ໃຊ້ຂອງການບໍລິການການພິມ. ບໍ່ໜ້າຈະຕ້ອງການສຳລັບແອັບຯທົ່ວໄປ."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"ເຂົ້າເຖິງວຽກການພິມທັງໝົດ"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງເຂົ້າເຖິງວຽກການພິມທີ່ຖືກສ້າງໂດຍແອັບຯອື່ນ. ບໍ່ໜ້າຈະຕ້ອງການສຳລັບແອັບຯທົ່ວໄປ."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"ຜູກ​ມັດ​ກັບບໍລິການການພິມແບບ spooler"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງຜູກກັບສ່ວນຕິດຕໍ່ຜູ່ໃຊ້ຂອງການບໍລິການການພິມ. ບໍ່ໜ້າຈະຕ້ອງການສຳລັບແອັບຯທົ່ວໄປ."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"ເຊື່ອມໂຍງກັບບໍລິການ NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"ອະນຸຍາດໃຫ້ຜູ່ຖືອຸປະກອນໃຫ້ສາມາດເຊື່ອມໂຍງແອັບພລິເຄຊັນ ທີ່ຄ້າຍກັບບັດ NFC. ມັນບໍ່ຈຳເປັນຕ້ອງໃຊ້ໃນແອັບຯທຳມະດາ."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"ເຊື່ອມໂຍງໄປຫາບໍລິການສົ່ງຂໍ້ຄວາມ"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"ແຖບບລອຍ"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ຍົກເລີກແລ້ວ"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"ເນື້ອ​ໃນ​ການຂຽນຜິດພາດ"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"ບໍ່ຮູ້ຈັກ"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"ໃສ່ລະຫັດ PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN ປະ​ຈຸ​ບັນ"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"ລະຫັດ PIN ໃໝ່"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 4548ebe..ca810ae 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Savininkui leidžiama susisaistyti su aukščiausio lygio pasiekiamumo paslaugos sąsaja. Įprastoms programoms to neturėtų prireikti."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"susisaistyti su spausdinimo paslauga"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Turėtojui leidžiama susisaistyti su spausdinimo paslaugos aukščiausio lygio sąsaja. Įprastoms programoms to neturėtų prireikti."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"pasiekti visas spausdinimo užduotis"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Turėtojui leidžiama pasiekti spausdinimo užduotis, sukurtas naudojant kitą programą. Įprastoms programoms to neturėtų prireikti."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"susaistyti su spausdinimo kaupimo paslauga"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Turėtojui leidžiama susaistyti programą su spausdinimo kaupimo paslaugos aukščiausio lygio sąsaja. Įprastoms programoms to neturėtų prireikti."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"susaistyti su ALR paslauga"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Savininkui leidžiama susaistyti programas, kurios kopijuoja ALR korteles. Neturėtų prireikti įprastoms programoms."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"priskirti teksto paslaugą"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Bulvarinė spauda"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Atšaukta"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Klaida rašant turinį"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"nežinoma"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Įveskite PIN kodą"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Dabartinis PIN kodas"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Naujas PIN kodas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index f0314cf..529e763 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Ļauj īpašniekam izveidot saiti ar pieejamības pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm šī atļauja nav nepieciešama."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"Savienojuma izveide ar drukāšanas pakalpojumu"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Ļauj īpašniekam izveidot savienojumu ar drukāšanas pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"Piekļuve visiem drukas darbiem"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Ļauj īpašniekam piekļūt drukas darbiem, kas izveidoti citā lietotnē. Parastām lietotnēm tas nekad nav nepieciešams."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"izveidot savienojumu ar drukas spolētāja pakalpojumu"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Ļauj īpašniekam izveidot savienojumu ar drukas spolētāja pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"Saistīt ar TDLS pakalpojumu"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Ļauj īpašniekam saistīt lietojumprogrammas, kas emulē TDLS kartes. Parastajām lietotnēm šī atļauja nav nepieciešama."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"saistīt ar īsziņu pakalpojumu"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Atcelts"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Rakstot saturu, radās kļūda."</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"nezināms"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ievadiet PIN."</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Pašreizējais PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Jaunais PIN"</string>
diff --git a/core/res/res/values-mcc208-mnc26/config.xml b/core/res/res/values-mcc208-mnc26/config.xml
new file mode 100644
index 0000000..31d2d0f
--- /dev/null
+++ b/core/res/res/values-mcc208-mnc26/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>20801</item>
+        <item>20810</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc214-mnc04/config.xml b/core/res/res/values-mcc214-mnc04/config.xml
new file mode 100644
index 0000000..71301d5
--- /dev/null
+++ b/core/res/res/values-mcc214-mnc04/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>21407</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc234-mnc30/config.xml b/core/res/res/values-mcc234-mnc30/config.xml
new file mode 100644
index 0000000..eabdf9a
--- /dev/null
+++ b/core/res/res/values-mcc234-mnc30/config.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>23430</item>
+        <item>23431</item>
+        <item>23432</item>
+        <item>23433</item>
+        <item>23434</item>
+        <item>23486</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc234-mnc31/config.xml b/core/res/res/values-mcc234-mnc31/config.xml
new file mode 100644
index 0000000..eabdf9a
--- /dev/null
+++ b/core/res/res/values-mcc234-mnc31/config.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>23430</item>
+        <item>23431</item>
+        <item>23432</item>
+        <item>23433</item>
+        <item>23434</item>
+        <item>23486</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc234-mnc32/config.xml b/core/res/res/values-mcc234-mnc32/config.xml
new file mode 100644
index 0000000..eabdf9a
--- /dev/null
+++ b/core/res/res/values-mcc234-mnc32/config.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>23430</item>
+        <item>23431</item>
+        <item>23432</item>
+        <item>23433</item>
+        <item>23434</item>
+        <item>23486</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc234-mnc33/config.xml b/core/res/res/values-mcc234-mnc33/config.xml
index d79d212..175f76e 100644
--- a/core/res/res/values-mcc234-mnc33/config.xml
+++ b/core/res/res/values-mcc234-mnc33/config.xml
@@ -35,4 +35,14 @@
          "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type"
          note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
     <string translatable="false" name="config_tether_apndata">Consumer Broadband,consumerbroadband,,,,,,,,,234,33,,DUN</string>
+
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>23430</item>
+        <item>23431</item>
+        <item>23432</item>
+        <item>23433</item>
+        <item>23434</item>
+        <item>23486</item>
+    </string-array>
 </resources>
diff --git a/core/res/res/values-mcc234-mnc34/config.xml b/core/res/res/values-mcc234-mnc34/config.xml
new file mode 100644
index 0000000..eabdf9a
--- /dev/null
+++ b/core/res/res/values-mcc234-mnc34/config.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>23430</item>
+        <item>23431</item>
+        <item>23432</item>
+        <item>23433</item>
+        <item>23434</item>
+        <item>23486</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc234-mnc86/config.xml b/core/res/res/values-mcc234-mnc86/config.xml
new file mode 100644
index 0000000..eabdf9a
--- /dev/null
+++ b/core/res/res/values-mcc234-mnc86/config.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>23430</item>
+        <item>23431</item>
+        <item>23432</item>
+        <item>23433</item>
+        <item>23434</item>
+        <item>23486</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc302-mnc610/config.xml b/core/res/res/values-mcc302-mnc610/config.xml
new file mode 100644
index 0000000..706570c
--- /dev/null
+++ b/core/res/res/values-mcc302-mnc610/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>302</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc302-mnc640/config.xml b/core/res/res/values-mcc302-mnc640/config.xml
new file mode 100644
index 0000000..706570c
--- /dev/null
+++ b/core/res/res/values-mcc302-mnc640/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>302</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mcc302-mnc780/config.xml b/core/res/res/values-mcc302-mnc780/config.xml
index 42d4956..b03d14e 100644
--- a/core/res/res/values-mcc302-mnc780/config.xml
+++ b/core/res/res/values-mcc302-mnc780/config.xml
@@ -37,4 +37,8 @@
          note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
     <string translatable="false" name="config_tether_apndata">SaskTel Tethering,inet.stm.sk.ca,,,,,,,,,302,780,,DUN</string>
 
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>302</item>
+    </string-array>
 </resources>
diff --git a/core/res/res/values-mcc425-mnc07/config.xml b/core/res/res/values-mcc425-mnc07/config.xml
index 890420e..51a9934 100644
--- a/core/res/res/values-mcc425-mnc07/config.xml
+++ b/core/res/res/values-mcc425-mnc07/config.xml
@@ -37,4 +37,8 @@
          note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
     <string translatable="false" name="config_tether_apndata">PC HOT mobile,pc.hotm,,,,,,,,,425,07,,DUN</string>
 
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>42503</item>
+    </string-array>
 </resources>
diff --git a/core/res/res/values-mcc425-mnc08/config.xml b/core/res/res/values-mcc425-mnc08/config.xml
new file mode 100644
index 0000000..8470b86
--- /dev/null
+++ b/core/res/res/values-mcc425-mnc08/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Don't use roaming icon for considered operators -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+        <item>42502</item>
+    </string-array>
+</resources>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..25a4f1b
--- /dev/null
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -0,0 +1,1585 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort" msgid="8340973892742019101">"B"</string>
+    <string name="kilobyteShort" msgid="5973789783504771878">"КБ"</string>
+    <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
+    <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
+    <string name="terabyteShort" msgid="231613018159186962">"TБ"</string>
+    <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
+    <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
+    <string name="untitled" msgid="4638956954852782576">"&lt;Гарчиггүй&gt;"</string>
+    <string name="ellipsis" msgid="7899829516048813237">"…"</string>
+    <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
+    <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Утасны дугаар байхгүй)"</string>
+    <string name="unknownName" msgid="2277556546742746522">"(Тодорхойгүй)"</string>
+    <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"дуут шуудан"</string>
+    <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
+    <string name="mmiError" msgid="5154499457739052907">"Холболтын асуудал эсвэл буруу MMI код."</string>
+    <string name="mmiFdnError" msgid="5224398216385316471">"Ажиллагаа зөвөх тогтсон дугаараар хязгаарлагдсан."</string>
+    <string name="serviceEnabled" msgid="8147278346414714315">"Үйлчилгээ идэвхжсэн."</string>
+    <string name="serviceEnabledFor" msgid="6856228140453471041">"Дараах үйлчилгээ идэвхтэй болсон:"</string>
+    <string name="serviceDisabled" msgid="1937553226592516411">"Үйлчилгээ идэвхгүй болсон."</string>
+    <string name="serviceRegistered" msgid="6275019082598102493">"Амжилттай бүртгэв."</string>
+    <string name="serviceErased" msgid="1288584695297200972">"Амжилттай арилгалаа."</string>
+    <string name="passwordIncorrect" msgid="7612208839450128715">"Буруу нууц үг"</string>
+    <string name="mmiComplete" msgid="8232527495411698359">"MMI дууссан."</string>
+    <string name="badPin" msgid="9015277645546710014">"Таны бичсэн хуучин PIN буруу байна."</string>
+    <string name="badPuk" msgid="5487257647081132201">"Таны бичсэн PUК буруу байна."</string>
+    <string name="mismatchPin" msgid="609379054496863419">"Таны оруулсан PIN таарахгүй байна."</string>
+    <string name="invalidPin" msgid="3850018445187475377">"4-8 тооноос бүтэх PIN-г бичнэ үү."</string>
+    <string name="invalidPuk" msgid="8761456210898036513">"8-с цөөнгүй тооноос бүтэх PUK-г бичнэ үү."</string>
+    <string name="needPuk" msgid="919668385956251611">"SIM картны PUK-түгжигдсэн. Тайлах бол PUK кодыг бичнэ үү."</string>
+    <string name="needPuk2" msgid="4526033371987193070">"SIM картын хаалтыг болиулах бол PUK2-г бичнэ үү."</string>
+    <string name="imei" msgid="2625429890869005782">"IMEI"</string>
+    <string name="meid" msgid="4841221237681254195">"MEID"</string>
+    <string name="ClipMmi" msgid="6952821216480289285">"Дуудлага хийгчийн ID"</string>
+    <string name="ClirMmi" msgid="7784673673446833091">"Гарч байгаа дуудлага хийгчийн ID"</string>
+    <string name="CfMmi" msgid="5123218989141573515">"Дуудлага дамжуулах"</string>
+    <string name="CwMmi" msgid="9129678056795016867">"дуудлага хүлээлгэх"</string>
+    <string name="BaMmi" msgid="455193067926770581">"Дуудлага хориглох"</string>
+    <string name="PwdMmi" msgid="7043715687905254199">"Нууц үг солих"</string>
+    <string name="PinMmi" msgid="3113117780361190304">"PIN солих"</string>
+    <string name="CnipMmi" msgid="3110534680557857162">"Дуудсан дугаар харуулах"</string>
+    <string name="CnirMmi" msgid="3062102121430548731">"Дуудлага хийгчийн дугаар хязгаарлагдсан"</string>
+    <string name="ThreeWCMmi" msgid="9051047170321190368">"Гурван чиглэлт дуудлага"</string>
+    <string name="RuacMmi" msgid="7827887459138308886">"Хүсээгүй тааламжгүй дуудлагаас татгалзах"</string>
+    <string name="CndMmi" msgid="3116446237081575808">"Дуудлага хийгчийн дугаарыг дамжуулах"</string>
+    <string name="DndMmi" msgid="1265478932418334331">"Бүү саад бол"</string>
+    <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Дуудлага хийгчийн ID хязгаарлагдсан. Дараагийн дуудлага: Хязгаарлагдсан"</string>
+    <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Дуудлага хийгчийн ID хязгаарлагдсан. Дараагийн дуудлага: Хязгаарлагдаагүй"</string>
+    <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Дуудлага хийгчийн ID хязгаарлагдаагүй. Дараагийн дуудлага: Хязгаарлагдсан"</string>
+    <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Дуудлага хийгчийн ID хязгаарлагдсан. Дараагийн дуудлага: Хязгаарлагдсан"</string>
+    <string name="serviceNotProvisioned" msgid="8614830180508686666">"Үйлчилгээ провишн хийгдээгүй ."</string>
+    <string name="CLIRPermanent" msgid="3377371145926835671">"Та дуудлага хийгчийн ID тохиргоог солиж чадахгүй."</string>
+    <string name="RestrictedChangedTitle" msgid="5592189398956187498">"Хязгаарлагдсан хандалт өөрчлөгдөв"</string>
+    <string name="RestrictedOnData" msgid="8653794784690065540">"Дата үйлчилгээ хаагдсан."</string>
+    <string name="RestrictedOnEmergency" msgid="6581163779072833665">"Яаралтай үйлчилгээ хаагдсан."</string>
+    <string name="RestrictedOnNormal" msgid="4953867011389750673">"Дуут үйлчилгээ хориглогдсон."</string>
+    <string name="RestrictedOnAllVoice" msgid="3396963652108151260">"Бүх дуут үйлчилгээнүүд хориглогдсон."</string>
+    <string name="RestrictedOnSms" msgid="8314352327461638897">"SMS үйлчилгээ хаагдсан."</string>
+    <string name="RestrictedOnVoiceData" msgid="996636487106171320">"Дуут/дата үйлчилгээ хаагдсан."</string>
+    <string name="RestrictedOnVoiceSms" msgid="1888588152792023873">"Дуут/SMS үйлчилгээнүүд хориглогдсон."</string>
+    <string name="RestrictedOnAll" msgid="5643028264466092821">"Бүх дуут/дата/SMS үйлчилгээнүүд хориглогдсон."</string>
+    <string name="serviceClassVoice" msgid="1258393812335258019">"Дуу"</string>
+    <string name="serviceClassData" msgid="872456782077937893">"Дата"</string>
+    <string name="serviceClassFAX" msgid="5566624998840486475">"Факс"</string>
+    <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string>
+    <string name="serviceClassDataAsync" msgid="4523454783498551468">"Синхрон бус"</string>
+    <string name="serviceClassDataSync" msgid="7530000519646054776">"Синк"</string>
+    <string name="serviceClassPacket" msgid="6991006557993423453">"Пакет"</string>
+    <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
+    <string name="roamingText0" msgid="7170335472198694945">"Роуминг заагч ассан"</string>
+    <string name="roamingText1" msgid="5314861519752538922">"Роуминг заагч унтарсан"</string>
+    <string name="roamingText2" msgid="8969929049081268115">"Роуминг заагч анивчиж байна"</string>
+    <string name="roamingText3" msgid="5148255027043943317">"Хөрш дотор"</string>
+    <string name="roamingText4" msgid="8808456682550796530">"Барилгын гадна"</string>
+    <string name="roamingText5" msgid="7604063252850354350">"Роуминг - Сонгогдсон Систем"</string>
+    <string name="roamingText6" msgid="2059440825782871513">"Роуминг- Боломжтой Систем"</string>
+    <string name="roamingText7" msgid="7112078724097233605">"Роуминг- Холбоотон Түнш"</string>
+    <string name="roamingText8" msgid="5989569778604089291">"Роуминг- Урамшууллын Түнш"</string>
+    <string name="roamingText9" msgid="7969296811355152491">"Рүүминг - Үйлчилгээний Ажиллагаа Бүрэн"</string>
+    <string name="roamingText10" msgid="3992906999815316417">"Рүүминг - Хэсэгчилсэн үйлчилгээний функционал"</string>
+    <string name="roamingText11" msgid="4154476854426920970">"Рүүминг Баннер Асаалттай"</string>
+    <string name="roamingText12" msgid="1189071119992726320">"Баннергүй рүүминг"</string>
+    <string name="roamingTextSearching" msgid="8360141885972279963">"Үйлчилгээг хайж байна…"</string>
+    <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: дамжуулагдаагүй"</string>
+    <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> <xliff:g id="TIME_DELAY">{2}</xliff:g> секундын дараа"</string>
+    <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: дамжуулагдаагүй"</string>
+    <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: дамжуулагдаагүй"</string>
+    <string name="fcComplete" msgid="3118848230966886575">"Онцлог код дуусав."</string>
+    <string name="fcError" msgid="3327560126588500777">"Холболтын асуудал эсвэл буруу функцын код."</string>
+    <string name="httpErrorOk" msgid="1191919378083472204">"Тийм"</string>
+    <string name="httpError" msgid="7956392511146698522">"Сүлжээний алдаа гарав."</string>
+    <string name="httpErrorLookup" msgid="4711687456111963163">"URL олдсонгүй."</string>
+    <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Сайт гэрчлэлийн схем дэмжигдэхгүй."</string>
+    <string name="httpErrorAuth" msgid="1435065629438044534">"Гэрчлэж чадсангүй."</string>
+    <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Прокси сервер гэрчлэл бүтэлгүйтэв."</string>
+    <string name="httpErrorConnect" msgid="8714273236364640549">"Сервертэй холбогдож чадсангүй."</string>
+    <string name="httpErrorIO" msgid="2340558197489302188">"Сервертэй холбогдож чадсангүй. Дараа дахин оролдоно уу."</string>
+    <string name="httpErrorTimeout" msgid="4743403703762883954">"Сервер холболтын хугацаа хэтрэв."</string>
+    <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Хуудас хэт олон сервер дахин чиглүүлэл агуулж байна."</string>
+    <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"Протокол дэмжигдэхгүй байна."</string>
+    <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"Аюулгүй холбоог үүсгэж чадсангүй."</string>
+    <string name="httpErrorBadUrl" msgid="3636929722728881972">"URL буруу тул хуудсыг нээж чадсангүй."</string>
+    <string name="httpErrorFile" msgid="2170788515052558676">"Файлд хандаж чадсангүй."</string>
+    <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Дуудсан файл олдсонгүй."</string>
+    <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Хэт олон хүсэлтийг боловсруулж байна. Дараа дахин оролдоно уу."</string>
+    <string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>-н нэвтрэлтийн алдаа"</string>
+    <string name="contentServiceSync" msgid="8353523060269335667">"Синк"</string>
+    <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синк"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Хэт олон <xliff:g id="CONTENT_TYPE">%s</xliff:g> устгах."</string>
+    <string name="low_memory" product="tablet" msgid="6494019234102154896">"Таблетийн сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string>
+    <string name="low_memory" product="default" msgid="3475999286680000541">"Утасны сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string>
+    <string name="me" msgid="6545696007631404292">"Би"</string>
+    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Таблетын сонголтууд"</string>
+    <string name="power_dialog" product="default" msgid="1319919075463988638">"Утасны сонголт"</string>
+    <string name="silent_mode" msgid="7167703389802618663">"Чимээгүй горим"</string>
+    <string name="turn_on_radio" msgid="3912793092339962371">"Утасгүй холбоог асаах"</string>
+    <string name="turn_off_radio" msgid="8198784949987062346">"Утасгүй сүлжээг унтраах уу"</string>
+    <string name="screen_lock" msgid="799094655496098153">"Дэлгэцний түгжээ"</string>
+    <string name="power_off" msgid="4266614107412865048">"Унтраах"</string>
+    <string name="silent_mode_silent" msgid="319298163018473078">"Хонх унтраах"</string>
+    <string name="silent_mode_vibrate" msgid="7072043388581551395">"Хонхны чичиргээ."</string>
+    <string name="silent_mode_ring" msgid="8592241816194074353">"Хонх ассан"</string>
+    <string name="shutdown_progress" msgid="2281079257329981203">"Унтрааж байна…"</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Таны таблет унтрах болно."</string>
+    <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Таны утас унтрах болно."</string>
+    <string name="shutdown_confirm_question" msgid="2906544768881136183">"Та унтраах уу?"</string>
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Аюулгүй горимоор дахин асаах"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Та аюулгүй горимоор дахин асаах уу? Энэ нь таны суулгасан гуравдагч талын бүх аппликешныг идэвхгүй болгоно. Та дахин асаах үед тэдгээр нь сэргээгдэнэ."</string>
+    <string name="recent_tasks_title" msgid="3691764623638127888">"Сүүлийн"</string>
+    <string name="no_recent_tasks" msgid="8794906658732193473">"Сүүлийн апп хоосон."</string>
+    <string name="global_actions" product="tablet" msgid="408477140088053665">"Таблет сонголт"</string>
+    <string name="global_actions" product="default" msgid="2406416831541615258">"Утасны сонголтууд"</string>
+    <string name="global_action_lock" msgid="2844945191792119712">"Дэлгэцний түгжээ"</string>
+    <string name="global_action_power_off" msgid="4471879440839879722">"Унтраах"</string>
+    <string name="global_action_bug_report" msgid="7934010578922304799">"Алдаа мэдээллэх"</string>
+    <string name="bugreport_title" msgid="2667494803742548533">"Согог репорт авах"</string>
+    <string name="bugreport_message" msgid="398447048750350456">"Энэ таны төхөөрөмжийн одоогийн статусын талаарх мэдээллийг цуглуулах ба имэйл мессеж болгон илгээнэ. Алдааны мэдэгдлээс эхэлж илгээхэд бэлэн болоход хэсэг хугацаа зарцуулагдана тэвчээртэй байна уу."</string>
+    <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Чимээгүй горим"</string>
+    <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Дуу хаагдсан"</string>
+    <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Дуу асав"</string>
+    <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Нислэгийн горим"</string>
+    <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Нислэгийн горим асав"</string>
+    <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Нислэгийн горим унтарсан"</string>
+    <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
+    <string name="safeMode" msgid="2788228061547930246">"Аюулгүй горим"</string>
+    <string name="android_system_label" msgid="6577375335728551336">"Андройд систем"</string>
+    <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Танаас төлбөр авдаг үйлчилгээнүүд"</string>
+    <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Таны төлбөрт оруулах зүйлийг хийх."</string>
+    <string name="permgrouplab_messages" msgid="7521249148445456662">"Таны мессеж"</string>
+    <string name="permgroupdesc_messages" msgid="7821999071003699236">"Таны SMS, и-мэйл ба бусад мессежийг унших болон бичих."</string>
+    <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Таны хувийн мэдээлэл"</string>
+    <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"Таны харилцагчдын картанд хадгалагдсан таны мэдээлэлд шууд хандах."</string>
+    <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Таны нийтийн мэдээлэл"</string>
+    <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Таны харилцагчид болон нийтийн холбооны тухай мэдээлэлд шууд хандах."</string>
+    <string name="permgrouplab_location" msgid="635149742436692049">"Таны байршил"</string>
+    <string name="permgroupdesc_location" msgid="5704679763124170100">"Таны бодит байршлыг хянах."</string>
+    <string name="permgrouplab_network" msgid="5808983377727109831">"Сүлжээний холбоо"</string>
+    <string name="permgroupdesc_network" msgid="4478299413241861987">"Төрөл бүрийн сүлжээний функцүүдэд хандах"</string>
+    <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Блютүүт"</string>
+    <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Блютүүтээр төхөөрөмж болон сүлжээнд хандах."</string>
+    <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Аудио тохиргоо"</string>
+    <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Аудио тохиргоо солих."</string>
+    <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Батерейд нөлөөлөх"</string>
+    <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Батерей хурдан дуусгах функцийг ашиглах."</string>
+    <string name="permgrouplab_calendar" msgid="5863508437783683902">"Календарь"</string>
+    <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Календар болон үйл явдалд шууд хандах."</string>
+    <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Хэрэглэгчийн толиос унших"</string>
+    <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Хэрэглэгчийн толь бичгээс үг унших."</string>
+    <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Хэрэглэгчийн тольд бичих"</string>
+    <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Хэрэглэгчийн толь бичигт үг нэмэх."</string>
+    <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Хавчуурга болон түүх"</string>
+    <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Хавчуурга болон хөтчийн түүхрүү шууд хандах."</string>
+    <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Сэрүүлэг"</string>
+    <string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"Сэрүүлэг тохируулах."</string>
+    <string name="permgrouplab_voicemail" msgid="4162237145027592133">"Дуут шуудан"</string>
+    <string name="permgroupdesc_voicemail" msgid="2498403969862951393">"Дуут шууданд шууд хандах."</string>
+    <string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
+    <string name="permgroupdesc_microphone" msgid="7106618286905738408">"Аудио бичихийн тулд микрофонд шууд хандах."</string>
+    <string name="permgrouplab_camera" msgid="4820372495894586615">"Камер"</string>
+    <string name="permgroupdesc_camera" msgid="2933667372289567714">"Зураг эвсэл бичлэг хийхээр камерт шууд хандах."</string>
+    <string name="permgrouplab_screenlock" msgid="8275500173330718168">"Дэлгэц түгжих"</string>
+    <string name="permgroupdesc_screenlock" msgid="7067497128925499401">"Таны төхөөрөмжийн дэлгэцийн түгжээнд нөлөөлөх чадвар."</string>
+    <string name="permgrouplab_appInfo" msgid="8028789762634147725">"Таны аппликешны мэдээлэл"</string>
+    <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Таны төхөөрөмжийн бусад аппликешнд нөлөөлөх чадвар."</string>
+    <string name="permgrouplab_wallpaper" msgid="3850280158041175998">"Ханын зураг"</string>
+    <string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"Төхөөрөмжийн ханын зургийн тохиргоог солих."</string>
+    <string name="permgrouplab_systemClock" msgid="406535759236612992">"Цаг"</string>
+    <string name="permgroupdesc_systemClock" msgid="3944359833624094992">"Төхөөрөмжийн цаг эсвэл цагийн бүсийг солих."</string>
+    <string name="permgrouplab_statusBar" msgid="2095862568113945398">"Статус самбар"</string>
+    <string name="permgroupdesc_statusBar" msgid="6242593432226807171">"Төхөөрөмжийн статус самбарын тохиргоог солих."</string>
+    <string name="permgrouplab_syncSettings" msgid="3341990986147826541">"Синк тохиргоо"</string>
+    <string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"Синк тохиргоонд хандах."</string>
+    <string name="permgrouplab_accounts" msgid="3359646291125325519">"Таны акаунт"</string>
+    <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Боломжит акаунтад хандах."</string>
+    <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Хардвер контрол"</string>
+    <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Гар төхөөрөмжийн хардверт шууд хандах."</string>
+    <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Утсаар ярих"</string>
+    <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"Утасны дуудлагыг хянах, бичих болон боловсруулах."</string>
+    <string name="permgrouplab_systemTools" msgid="4652191644082714048">"Системийн багаж"</string>
+    <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Системрүү доод төвшиний хандах болон удирдах."</string>
+    <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Хөгжүүлэх багаж"</string>
+    <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Зөвхөн аппликешн хөгжүүлэгчдэд хэрэгтэй функц."</string>
+    <string name="permgrouplab_display" msgid="4279909676036402636">"Бусад аппликешн UI"</string>
+    <string name="permgroupdesc_display" msgid="6051002031933013714">"Бусад аппликешны UI-д нөлөөлөх."</string>
+    <string name="permgrouplab_storage" msgid="1971118770546336966">"Сан"</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"USB санд хандах."</string>
+    <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"SD картад хандах."</string>
+    <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Хялбар хандах функц"</string>
+    <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Туслах технологиос хүсэлт илгээх боломжтой функц"</string>
+    <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Цонхны контентыг авах"</string>
+    <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Таны харилцан үйлчлэх цонхны контентоос шалгах."</string>
+    <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Хүрч танихыг асаах"</string>
+    <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Хүрсэн зүйлсийг чангаар дуудах ба дохио ашиглан дэлгэцийг таньж болно."</string>
+    <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Сайжруулсан веб хандалтыг асаах"</string>
+    <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Апп контентод илүү хялбар хандуулахын тулд скриптыг суулгана."</string>
+    <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Бичсэн текстээ ажиглах"</string>
+    <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Кредит картын дугаар болон нууц үг зэрэг хувийн датаг агуулж байна."</string>
+    <string name="permlab_statusBar" msgid="7417192629601890791">"статус самбарыг идэвхгүй болгох болон өөрчлөх"</string>
+    <string name="permdesc_statusBar" msgid="8434669549504290975">"Апп нь статус самбарыг идэвхгүй болгох эсвэл систем дүрсийг нэмэх, хасах боломжтой."</string>
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"статус самбар"</string>
+    <string name="permdesc_statusBarService" msgid="716113660795976060">"Апп нь статус самбар болох боломжтой."</string>
+    <string name="permlab_expandStatusBar" msgid="1148198785937489264">"статус самбарыг нээх/хаах"</string>
+    <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Апп нь статус самбарыг дэлгэх болон хаах боломжтой."</string>
+    <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"гарсан дуудлагыг чиглэлийг өөрчлөх"</string>
+    <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Апп нь дуудлага хийх болон залгаж байгаа дугаарыг өөрчлөх боломжтой. Энэ зөвшөөрөл нь апп-г залгасан дуудлагыг хаах, хянах болон дахин чиглүүлэх боломжтой болгодог."</string>
+    <string name="permlab_receiveSms" msgid="8673471768947895082">"текст мессеж(SMS) хүлээж авах"</string>
+    <string name="permdesc_receiveSms" msgid="6424387754228766939">"Апп нь SMS мессежийг хүлээн авах болон гүйцэтгэх боломжтой. Ингэснээр апп нь таны төхөөрөмжрүү илгээсэн мессежийг танд үзүүлэхгүйгээр хянах болон устгаж чадна."</string>
+    <string name="permlab_receiveMms" msgid="1821317344668257098">"текст мессеж(МMS) хүлээж авах"</string>
+    <string name="permdesc_receiveMms" msgid="533019437263212260">"Апп нь MMS мессежийг хүлээн авах болон гүйцэтгэх боломжтой. Ингэснээр апп нь таны төхөөрөмжрүү илгээсэн мессежийг танд үзүүлэхгүйгээр хянах болон устгаж чадна."</string>
+    <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"Яаралтай өргөн дамжууллыг хүлээн авах"</string>
+    <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Апп нь яаралтай өргөн дамжууллын мессежийг хүлээн авах болон гүйцэтгэх боломжтой. Энэ зөвшөөрөл нь зөвхөн систем аппликешнд л боломжтой."</string>
+    <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"үүрэн өргөн дамжууллын мессеж унших"</string>
+    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Апп нь таны төхөөрөмжийн хүлээн авсан үүрэн өргөн дамжуулах мессежийг унших боломжтой. Үүрэн өргөн дамжууллын мэдэгдэл нь яаралтай нөхцөл байдлыг анхааруулах зорилгоор зарим байршлуудад хүрдэг. Хортой апп нь яаралтай үүрэн өргөн дамжууллыг хүлээн авсан үед таны төхөөрөмжийн ажиллагаа болон чадамжид нөлөөлөх боломжтой."</string>
+    <string name="permlab_sendSms" msgid="5600830612147671529">"SMS мессеж илгээх"</string>
+    <string name="permdesc_sendSms" msgid="7094729298204937667">"Апп нь SMS мессеж илгээх боломжтой. Энэ нь санаандгүй төлбөрт оруулж болзошгүй. Хортой апп нь таны зөвшөөрөлгүйгээр мессеж илгээн таныг төлбөрт оруулж болзошгүй."</string>
+    <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"мессежээр хариулах үйл явдалыг илгээх"</string>
+    <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Апп нь дуудлага ирэх үед мессежээр хариу өгөх үйл явдлыг зохицуулахын тулд бусад мессежийн апп-д хүсэлт илгээх боломжтой."</string>
+    <string name="permlab_readSms" msgid="8745086572213270480">"таны текст мессежийг унших(SMS эсвэл MMS)"</string>
+    <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Апп нь таны утас эсвэл SIM картанд хадгалагдсан SMS мессежийг унших боломжтой. Энэ нь апп-д бүх мессежийг контент эсвэл нууц эсэхээс нь үл хамааран унших боломжийг олгоно."</string>
+    <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Апп нь таны утас эсвэл SIM картанд хадгалагдсан SMS мессежийг унших боломжтой. Энэ нь апп-д бүх мессежийг контент эсвэл нууц эсэхээс нь үл хамааран унших боломжийг олгоно."</string>
+    <string name="permlab_writeSms" msgid="3216950472636214774">"Текст мессежийг засах (SMS эсвэл MMS)"</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Апп нь таны таблет эсвэл SIM картанд хадгалагдсан SMS мессежрүү бичих боломжтой. Хортой апп нь таны мессежүүдийг устгах боломжтой."</string>
+    <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Апп нь таны утас эсвэл SIM картанд хадгалагдсан SMS мессежрүү бичих боломжтой. Хортой апп нь таны мессежүүдийг устгах боломжтой."</string>
+    <string name="permlab_receiveWapPush" msgid="5991398711936590410">"текст мессеж(WAP) хүлээн авах"</string>
+    <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Апп нь WAP мессежийг хүлээн авах болон биелүүлэх боломжтой. Энэ зөвшөөрөл нь танд илгээсэн мессежийг танд харуулалгүйгээр хянах эсвэл устгах боломжийг агуулна."</string>
+    <string name="permlab_getTasks" msgid="6466095396623933906">"ажиллаж байгаа апп-г дуудах"</string>
+    <string name="permdesc_getTasks" msgid="7454215995847658102">"Апп нь одоо ажиллаж байгаа болон сүүлд ажилласан даалгаврын талаарх мэдээллийг авах боломжтой. Ингэснээр апп нь төхөөмж дээрх ямар аппликешнүүд ашиглагдсан талаарх мэдээлийг олох боломжтой."</string>
+    <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"хэрэглэгчидтэй харилцан үйлчлэлцэх"</string>
+    <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Апп нь төхөөрөмж дээрх ялгаатай хэрэглэгчдэд үйлдэл гүйцэтгэх боломжтой. Хортой апп нь энийг ашиглан хэрэглэгч хоорондын хамгаалалтыг зөрчих боломжтой."</string>
+    <string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"хэрэглэгчидтэй харилцан үйлчлэлцэх бүрэн зөвшөөрөл"</string>
+    <string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"Бүх хэрэглэгчдэд боломжит бүх харилцан үйлдлийг зөвшөөрнө."</string>
+    <string name="permlab_manageUsers" msgid="1676150911672282428">"хэрэгчлэгч удирдах"</string>
+    <string name="permdesc_manageUsers" msgid="8409306667645355638">"Апп нь төхөөрөмж дээр асуулга, үүсгэлт болон устгалт зэргийг багтаасан хэрэглэгч удирдах боломжтой."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"ажиллаж байгаа апп-н дэлгэрэнгүйг авах"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Апп нь одоо ажиллаж байгаа болон сүүлд ажилласан даалгаврын талаарх дэлгэрэнгүй мэдээллийг авах боломжтой. Хортой апп нь бусад апп-н хувийн мэдээлийг олох боломжтой."</string>
+    <string name="permlab_reorderTasks" msgid="2018575526934422779">"ажиллаж байгаа апп-уудыг дахин эрэмбэлэх"</string>
+    <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Апп нь даалгавруудыг нүүрлүү болон арлуу зөөх боломжтой. Апп нь энийг таны оролцоогүйгээр хийж болзошгүй"</string>
+    <string name="permlab_removeTasks" msgid="6821513401870377403">"ажиллаж байгаа апп-г зогсоох"</string>
+    <string name="permdesc_removeTasks" msgid="1394714352062635493">"Апп нь даалгаврууд устгах болон тэдгээрийн апп-г зогсоох боломжтой. Хортой апп нь бусад апп-н ажиллагааг тасалдуулж болзошгүй."</string>
+    <string name="permlab_manageActivityStacks" msgid="7391191384027303065">"идэвхжилтийн стекүүдийг удирдах"</string>
+    <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Апп-д бусад апп-уудын ажилладаг идэвхжилтийн стекүүдийг нэмэх, хасах буюу өөрчлөх боломж олгоно. Хорлонтой апп-ууд бусад апп-уудын авирт нөлөөлөх боломжтой."</string>
+    <string name="permlab_startAnyActivity" msgid="2918768238045206456">"ямарч активитиг эхлүүлэх"</string>
+    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Апп нь зөвшөөрөл хамгаалалтай эсвэл экспорт хийсэн статусаас үл хамааран ямарч активитиг эхлүүлэх боломжтой."</string>
+    <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"дэлгэцний зохицолыг тохируулах"</string>
+    <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Апп нь бусад аппликешны дэлгэцний тохиромжит горимыг удирдах боломжтой.  Хортой аппликешн нь бусад аппликешны чадамжийг эвдэх боломжтой."</string>
+    <string name="permlab_setDebugApp" msgid="3022107198686584052">"апп дебагыг идэвхжүүлэх"</string>
+    <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Апп нь бусад апп-г дебаг хийхийг асаах боломжтой. Хортой апп нь энийг ашиглан бусад апп-г зогсоох боломжтой."</string>
+    <string name="permlab_changeConfiguration" msgid="4162092185124234480">"системийн дэлгэцний тохиргоог солих"</string>
+    <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Апп нь нутагшил эсвэл фонтын хэмжээ зэрэг одоогийн тохиргоог солих боломжтой."</string>
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"машины горимыг идэвхжүүлэх"</string>
+    <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Апп нь машины горимыг идэвхжүүлэх боломжтой."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"бусад апп-г хаах"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Апп нь бусад апп-н арын процессыг дуусгах боломжтой. Энэ бусад апп-г зогсоох боломжийг олгоно."</string>
+    <string name="permlab_forceStopPackages" msgid="2329627428832067700">"бусад апп-г хүчээр зогсоох"</string>
+    <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Апп нь бусад апп-г хүчээр зогсоох боломжтой."</string>
+    <string name="permlab_forceBack" msgid="652935204072584616">"апп-г хүчээр унтраах"</string>
+    <string name="permdesc_forceBack" msgid="3892295830419513623">"Апп нь нүүрэнд ажиллаж байгаа активитиг хүчээр зогсоох болгон арлуу явуулах боломжтой. Энгийн апп-д хэрэглэхгүй."</string>
+    <string name="permlab_dump" msgid="1681799862438954752">"системийн дотоод статусыг дуудах"</string>
+    <string name="permdesc_dump" msgid="1778299088692290329">"Апп нь системийн дотоод статусыг дуудах боломжтой. Хортой апп нь энийг ашиглах шаардлагагүй аюулгүй байдлын болон хувийн мэдээллийг дуудах боломжтой."</string>
+    <string name="permlab_retrieve_window_content" msgid="8022588608994589938">"Дэлгэцийн контентыг унших"</string>
+    <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Апп нь идэвхтэй цонхны контентыг авах боломжтой. Хортой апп нь цонхны контентыг бүхэлд авах болон нууц үгнээс бусад бүх текстийг шалгаж болзошгүй"</string>
+    <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"Хялбар байдлыг түр идэвхтэй болгох"</string>
+    <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Аппликешн нь төхөөрөмжийн хялбар байдлыг түр зуур идэвхжүүлэх боломжтой. Хортой апп нь хэрэглэгчийн зөвшөөрөлгүйгээр хялбар байдлыг идэвхжүүлж болзошгүй."</string>
+    <string name="permlab_retrieve_window_info" msgid="8532295199112519378">"цонхны мэдээллийг унших"</string>
+    <string name="permdesc_retrieve_window_info" msgid="4998836370424186849">"Аппликешн нь цонхны менежерээс цонхны талаар мэдээллийг дуудах боломжтой. Хортой апп нь дотоод системийн хэрэглээнд зориулагдсан мэдээллийг дуудаж болзошгүй."</string>
+    <string name="permlab_filter_events" msgid="8675535648807427389">"үйл явдлыг шүүх"</string>
+    <string name="permdesc_filter_events" msgid="8006236315888347680">"Аппликешн нь хэрэглэгчийн бүх үйл явдалын илгээгдэхээс өмнөх урсгалыг шүүж байгаа оролтын шүүлтйиг бүртгэх боломжтой. Хортой апп нь хэрэглэгчийн интервэшнгүйгээр системийн UI-г удирдах боломжтой."</string>
+    <string name="permlab_magnify_display" msgid="5973626738170618775">"дэлгэц томруулах"</string>
+    <string name="permdesc_magnify_display" msgid="7121235684515003792">"Аппликешн нь дэлгэцний контентийг өсгөх боломжтой. Хортой апп нь дэлгэцийн контентыг төхөөрөмжнөөс ашиглаж болохгүй болгон хувиргах боломжтой."</string>
+    <string name="permlab_shutdown" msgid="7185747824038909016">"хэсэгчилсэн унтраалт"</string>
+    <string name="permdesc_shutdown" msgid="7046500838746291775">"Активити менежерийг унтраана. Бүрэн унтраалтыг хийхгүй."</string>
+    <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"апп шилжүүлэхийг хориглох"</string>
+    <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Хэрэглэгч бусад апп-руу сэлгэхийг хориглох."</string>
+    <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"одоогийн апп-н мэдээллийг авах"</string>
+    <string name="permdesc_getTopActivityInfo" msgid="8153651434145132505">"Эзэмшигч нь дэлгэцний нүүрэнд байгаа одоогийн аппликешн болон үйлчилгээний талаарх хувийн мэдээллийг унших боломжтой."</string>
+    <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"бүх апп-ын эхлэлийг хянах болон удирдах"</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Апп нь систем активитиг яаж эхлүүлж байгааг хянах болон удирдан боломжтой. Хортой апп нь системд бүрэн нөлөөлж болзошгүй. Энэ эрх нь зөвхөн хөгжүүлэлтийн үед л хэрэгтэй ба энгийн хэрэглээнд огт хэрэггүй."</string>
+    <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"багц хасагдсан өргөн дамжууллыг илгээх"</string>
+    <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Апп нь апп багц устгагдсан талаарх мэдэгдлийг өргөн дамжуулах боломжтой. Хортой апп энийг ашиглан бусад ажиллаж байгаа апп-г зогсоох боломжтой."</string>
+    <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-хүлээн авав өргөн дамжууллыг илгээх"</string>
+    <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Апп нь SMS мессеж хүлээн авсан талаарх мэдэгдлийг өргөн дамжуулах боломжтой. Хортой апп энийг ашиглан ирсэн SMS мессежийг хуурамчаар хийх боломжтой."</string>
+    <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-хүлээн авав өргөн дамжууллыг илгээх"</string>
+    <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Аппликешн нь WAP PUSH мессеж хүлээж авсан мэдэгдлийг өргөн дамжуулах боломжтой. Хортой апп нь энийг ашиглан MMS мессеж хүлээн авсан гэж хуурамчаар мэдэгдэх эсвэл хортой хувьсагч агуулсан веб хуудасны контентыг чимээгүй орлуулах боломжтой."</string>
+    <string name="permlab_setProcessLimit" msgid="2451873664363662666">"ажиллаж байгаа процессийн тоог хязгаарлах"</string>
+    <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Апп нь нэг зэрэг ажиллах процессийн тооны дээд утгыг удирдах боломжтой. Энгийн апп-д хэзээ ч ашиглагдахгүй."</string>
+    <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"арын апп-г хүчээр хаах"</string>
+    <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Апп нь активитинүүд арын болонгуутаа дуусах эсэхийг удирдах боломжтой. Энгийн апп-д хэрэглэгдэхгүй."</string>
+    <string name="permlab_batteryStats" msgid="2789610673514103364">"батерейны статистикийг унших"</string>
+    <string name="permdesc_batteryStats" msgid="5897346582882915114">"Аппликешн нь батерей хэрэглээний доод-төвшиний одоогийн датаг унших боломжтой. Аппликешнд таны ашиглаж байгаа апп-н талаарх дэлгэрэнгүй мэдээллийг олох боломжийг олгоно."</string>
+    <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"батерейн статистикийг өөрчлөх"</string>
+    <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Апп нь батерейн цуглуулагдсан статистикийг өөрчлөх боломжтой. Энгийн апп-д шаардлагагүй."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"апп-н ажиллагааны статистикийг авах"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Апп нь аппликешны ажиллагааны цуглуулсан статистикийг дуудах боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+    <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"апп ажиллагааны статистикийг өөрчлөх"</string>
+    <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Апп нь аппликешны ажиллагааны цуглуулсан статистикийг өөрчлөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+    <string name="permlab_backup" msgid="470013022865453920">"систем нөөшлөлт болон сэргээлтийг удирдах"</string>
+    <string name="permdesc_backup" msgid="6912230525140589891">"Апп нь системийн нөөшлөх болон сэргээх тогтолцоог удирдах боломжтой. Энгийн апп-уудад хэрэглэгдэхгүй."</string>
+    <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"бүтэн нөөшлөлтийг бататгах эсвэл ажиллагааг сэргээх"</string>
+    <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Апп нь бүрэн нөөшлөлтийг баталгаажуулах UI-г эхлүүлэх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+    <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"эрхжүүлэгдээгүй цонхыг үзүүлэх"</string>
+    <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Апп нь дотоод системийн хэрэглэгчийн интерфейст ашиглагдах цонхыг үүсгэх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+    <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"бусад апп-р зурах"</string>
+    <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Апп нь бусад аппликешн эсвэл хэрэглэгчийн интерфейсын дээд талд зурах боломжтой. Эдгээр нь бүх аппликешны интерфейсыг ашиглахад саад болох эсвэл   бусад аппликешн дээр таны харж байгааг солих боломжтой."</string>
+    <string name="permlab_setAnimationScale" msgid="2805103241153907174">"глобал энимешн хурдыг өөрчлөх"</string>
+    <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Апп нь ямар ч үед глобал энимешн хурдыг(хурдан удаан энимешн) солих боломжтой."</string>
+    <string name="permlab_manageAppTokens" msgid="1286505717050121370">"апп бүтвэрийг удирдах"</string>
+    <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Апп нь өөрийн нормал Z эрэмбийг дамжуулах замаар өөрсдийн бүтвэрийг үүсгэх болон удирдах боломжтой. Энгийн апп-д хэрэглэгдэхгүй"</string>
+    <string name="permlab_freezeScreen" msgid="4708181184441880175">"дэлгэцийг хөдөлгөөнгүй болгох"</string>
+    <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Аппликешн нь бүтэн дэлгэцрүү шилжихэд дэлгэцийг хөдөлгөөнгүй болгох боломжтой."</string>
+    <string name="permlab_injectEvents" msgid="1378746584023586600">"товч болон контрол товч дарах"</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Алл нь өөрийн оролтын үйл явдлыг(товч дарагдах г.м) бусад апп-д дамжуулах боломжтой. Хортой апп нь энийг ашиглан таблетыг удирдах боломжтой."</string>
+    <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Алл нь өөрийн оролтын үйл явдлыг(товч дарагдах г.м) бусад апп-д дамжуулах боломжтой. Хортой апп нь энийг ашиглан утсыг удирдах боломжтой."</string>
+    <string name="permlab_readInputState" msgid="469428900041249234">"таны хийж байгаа үйлдэл болон бичиж байгааг бичлэг хийх"</string>
+    <string name="permdesc_readInputState" msgid="8387754901688728043">"Апп нь бусад апп-тай харилцан үйлчилж(нууц үг оруулах) таны дарсан товчийг ажиглах боломжтой. Энгийн апп-д хэрэглэгдэхгүй."</string>
+    <string name="permlab_bindInputMethod" msgid="3360064620230515776">"оролтын аргатай холбох"</string>
+    <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Эзэмшигч нь оруулах аргын дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-д хэрэглэгдэхгүй."</string>
+    <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"хандалтын үйлчилгээнд холбогдох"</string>
+    <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Эзэмшигч нь хандах үйлчилгээний дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+    <string name="permlab_bindPrintService" msgid="8462815179572748761">"хэвлэх үйлчилгээтэй холбох"</string>
+    <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Эзэмшигчид хэвлэх үйлчилгээний дээд-түвшний интерфейстэй холбох боломж олгоно. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"хэвлэгчийн буфер үйлчилгээтэй холбох"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Эзэмшигчид хэвлэх үйлчилгээний дээд-түвшний интерфейстэй холбох боломж олгоно. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string>
+    <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC үйлчилгээтэй холбох"</string>
+    <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Эзэмшигчид NFC картуудыг дуурайлгадаг аппликешнүүдийг холбох боломж олгоно. Энгийн апп-уудад хэзээ ч шаардагдахгүй."</string>
+    <string name="permlab_bindTextService" msgid="7358378401915287938">"текст үйлчилгээтэй холбох"</string>
+    <string name="permdesc_bindTextService" msgid="8151968910973998670">"Эзэмшигч нь текст үйлчилгээний(ж.нь. SpellCheckerService) дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-д хэрэглэгдэхгүй."</string>
+    <string name="permlab_bindVpnService" msgid="4708596021161473255">"VPN үйлчилгээтэй холбох"</string>
+    <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Эзэмшигч нь VPN үйлчилгээний дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+    <string name="permlab_bindWallpaper" msgid="8716400279937856462">"ханын зурагтай холбох"</string>
+    <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Эзэмшигч нь ханын зурагны дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-уудад шаардлагагүй."</string>
+    <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"виджет үйлчилгээтэй холбох"</string>
+    <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Эзэмшигч нь виджет үйлчилгээний дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"төхөөрөмжийн админтай харилцан үйлчлэх"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Эзэмшигч нь төхөөрөмжийн админруу интент илгээх боломжтой. Энгийн апп-д шаардлагагүй."</string>
+    <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"төхөөрөмжийн админ нэмэх, хасах"</string>
+    <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Эзэмшигч нь идэвхтэй төхөөрөмжийн администраторыг нэмэх, хасах боломжтой. Энгийн апп-д шаардлагагүй."</string>
+    <string name="permlab_setOrientation" msgid="3365947717163866844">"дэлгэцний чиглэлийг солих"</string>
+    <string name="permdesc_setOrientation" msgid="3046126619316671476">"Апп нь ямар ч үед дэлгэцний эргэлтийг солих боломжтой. Энгийн аппликешнд хэзээ ч ашиглахгүй."</string>
+    <string name="permlab_setPointerSpeed" msgid="9175371613322562934">"заагчийн хурдыг солих"</string>
+    <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Апп нь хулгана эсвэл хөдлөх самбарын заагчийн хурдыг ямарч үед солих боломжтой. Энгийн апп-д хэрэглэгдэхгүй."</string>
+    <string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"гарын схемийг солих"</string>
+    <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Апп нь гарын схемыг солих боломжтой. Энгийн апп-д хэрэглэгдэхгүй."</string>
+    <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"аппруу Linux дохио илгээх"</string>
+    <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Апп нь бүх байнгын процессруу хангамжийн дохиог илгээх хүсэлтийг хийх боломжтой."</string>
+    <string name="permlab_persistentActivity" msgid="8841113627955563938">"апп-г байнга ажиллуулах"</string>
+    <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Апп нь өөрийн хэсгийн санах ойд байнга байлгах боломжтой. Энэ нь бусад апп-уудын ашиглах санах ойг хязгаарлан таблетыг удаашруулах болно."</string>
+    <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Апп нь өөрийн хэсгийг санах ойд байнга байлгах боломжтой. Энэ нь бусад апп-уудын ашиглах санах ойг хязгаарлан утсыг удаашруулах болно."</string>
+    <string name="permlab_deletePackages" msgid="184385129537705938">"апп устгах"</string>
+    <string name="permdesc_deletePackages" msgid="7411480275167205081">"Апп нь Андройд багцийг устгах боломжтой. Хортой апп нь энийг ашиглан чухал апп-г устгах боломжтой."</string>
+    <string name="permlab_clearAppUserData" msgid="274109191845842756">"бусад апп-н датаг устгах"</string>
+    <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Апп нь хэрэглэгчийн датаг арилгах боломжтой."</string>
+    <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"бусад апп-н кешээс устгах"</string>
+    <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Апп нь кеш файлаас устгах боломжтой."</string>
+    <string name="permlab_getPackageSize" msgid="7472921768357981986">"апп сангийн хэмжээг хэмжих"</string>
+    <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Апп нь өөрийн код, дата болон кеш хэмжээг унших боломжтой"</string>
+    <string name="permlab_installPackages" msgid="2199128482820306924">"апп-г шууд суулгах"</string>
+    <string name="permdesc_installPackages" msgid="5628530972548071284">"Апп нь шинэ эсвэл шинэчлэгдсэн Андройд багцийг суулгах боломжтой. Хортой апп нь энийг ашиглан дурын эрхтэй шинэ апп-г суулгах боломжтой."</string>
+    <string name="permlab_clearAppCache" msgid="7487279391723526815">"бүх апп-н кеш датаг устгах"</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Апп нь бусад аппликешны кеш директороос файл устган таблетын санг чөлөөлөх боломжтой. Энэ  нь бусад аппликешнд нөлөөлж, тэдгээр нь эхлэхдээ шаардлагатай датагаа дахин дуудах тул удааширч болзошгүй."</string>
+    <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Апп нь бусад аппликешны кеш директороос файл устган утасны санг чөлөөлөх боломжтой. Энэ нь бусад аппликешнд нөлөөлж, тэдгээр нь эхлэхдээ шаардлагатай датагаа дахин дуудах тул удааширч болзошгүй."</string>
+    <string name="permlab_movePackage" msgid="3289890271645921411">"апп нөөцийг шилжүүлэх"</string>
+    <string name="permdesc_movePackage" msgid="319562217778244524">"Апп нь апп нөөцийг дотроос гадна медиаруу болон эсрэгээр нь зөөх боломжтой."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"нууц лог дата унших"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Апп нь системийн төрөл бүрийн лог файлыг унших боломжтой. Энэ нь та таблет дээрээ юу хийсэн талаарх хувийн болон нууц мэдээллийг олох боломжтой болгоно."</string>
+    <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Апп нь системийн төрөл бүрийн лог файлыг унших боломжтой. Энэ нь та утсан дээрээ юу хийсэн талаарх хувийн болон нууц мэдээллийг олох боломжтой болгоно."</string>
+    <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"тоглуулахын тулд дурын медиа шифрлэгчийг ашиглах"</string>
+    <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Апп нь тоглуулах үедээ код тайлахдаа суулгагдсан ямарч медиа код тайлагчийг ашиглах боломжтой."</string>
+    <string name="permlab_manageCaCertificates" msgid="1678391896786882014">"итгэмжлэгдсэн жуухуудыг удирдах"</string>
+    <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Апп-д CA сертификатуудыг итгэмжлэгдсэн жуух байдлаар суулгах болон устгахыг зөвшөөрнө."</string>
+    <string name="permlab_diagnostic" msgid="8076743953908000342">"оношлох грүпийн эзэмшдэг нөөцрүү унших/бичих"</string>
+    <string name="permdesc_diagnostic" msgid="6608295692002452283">"Апп нь оношлох грүпийн эзэмшдэг, жишээ нь /dev доторх файлууд, дурын  нөөцийг унших бичих боломжтой.Энэ нь системийн тогвортой байдал болон аюулгүй байдалд бодитоор нөлөөлнө. Энэ нь үйлдвэрлэгч болон операторын хардверт-зориулсан оношлогоонд ашиглагдана."</string>
+    <string name="permlab_changeComponentState" msgid="6335576775711095931">"апп компонентыг идэвхжүүлэх эсвэл идэвхгүй болгох"</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Апп нь өөр апп-н компонент идэвхтэй эсэхийг солих боломжтой. Хортой апп нь энийг ашиглан таблетын чухал чадамжийг идэвхгүй болгож болзошгүй. Зөвшөөрөл нь аппликешн компонентыг тогтворгүй, ашиглаж болохгүй, тохиромжгүй төлөвт оруулах боломжтой тул ашиглахдаа болгоомжтой байх шаардлагатай."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Апп нь өөр апп-н компонент идэвхтэй эсэхийг солих боломжтой. Хортой апп нь энийг ашиглан утасны чухал чадамжийг идэвхгүй болгож болзошгүй. Зөвшөөрөл нь аппликешн компонентыг тогтворгүй, ашиглаж болохгүй, тохиромжгүй төлөвт оруулах боломжтой тул ашиглахдаа болгоомжтой байх шаардлагатай."</string>
+    <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"зөвшөөрөл олгох эсвэл цуцлах"</string>
+    <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Аппликешн нь өөртэй болон бусад аппликешнд тусгай зөвшөөрлийг олгох болон цуцлах боломжтой. Хортой аппликешн нь энийг ашиглан таны олгоогүй эрхэнд хандах боломжтой."</string>
+    <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"үндсэн апп-г тохируулах"</string>
+    <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Апп нь таны тусгай апп-уудыг өөрчлөх боломжтой. Хортой апп нь ажиллаж байгаа апп-г нууцаар өөрчлөн, таны хуучин апп-г таны хувийн датаг цуглуулагч болгон хуурах боломжтой."</string>
+    <string name="permlab_writeSettings" msgid="2226195290955224730">"систем тохиргоог өөрчлөх"</string>
+    <string name="permdesc_writeSettings" msgid="7775723441558907181">"Апп нь системийн тохиргооны датаг өөрчлөх боломжтой. Хортой апп нь таны системийн тохиргоог сүйтгэх боломжтой."</string>
+    <string name="permlab_writeSecureSettings" msgid="204676251876718288">"аюулгүй систем тохиргоог өөрчлөх"</string>
+    <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Апп нь системийн аюулгүй байдлын тохиргооны датаг өөрчлөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+    <string name="permlab_writeGservices" msgid="2149426664226152185">"Google газрын зургийн үйлчилгээг өөрчлөх"</string>
+    <string name="permdesc_writeGservices" msgid="1287309437638380229">"Апп нь Google-н газрын зургийн үйлчилгээг өөрчлөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+    <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"Эхлэхэд ажиллуулах"</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Апп нь систем асаж дуусахад шууд өөрийгөө асаах боломжтой. Ингэснээр таблетыг асахад их хугацаа орох болон байнга ажилладаг апп нь таблетийг бүхэлд нь удаашруулах боломжтой."</string>
+    <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Апп нь систем асаж дуусахад шууд өөрийгөө асаах боломжтой. Ингэснээр утсыг асахад их хугацаа орох болон байнга ажилладаг апп нь утсыг бүхэлд нь удаашруулах боломжтой."</string>
+    <string name="permlab_broadcastSticky" msgid="7919126372606881614">"тасардаггүй өргөн дамжууллыг илгээх"</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Апп нь өргөн дамжуулал дууссаны дараа үлдсэн өргөн дамжуулалыг илгээх боломжтой. Ихээр ашиглах нь хэт их санах ой ашиглан таблетыг удаашруулах болон тогтворгүй болгох боломжтой."</string>
+    <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Апп нь өргөн дамжуулал дууссаны дараа үлдсэн өргөн дамжуулалыг илгээх боломжтой. Ихээр ашиглах нь хэт их санах ой ашиглан утсыг удаашруулах болон тогтворгүй болгох боломжтой."</string>
+    <string name="permlab_readContacts" msgid="8348481131899886131">"өөрийн харилцагчдыг унших"</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Апп нь таны утсаар ярьсан, имэйл илгээсэн давтамж эсвэл тусгай харилцагдчидтайгаа өөр аргаар холбоо барьсан байдал зэргийг агуулсан таблет дээр хадгалагдсан харилцагчдын талаарх датаг унших боломжтой. Энэ зөвшөөрөл нь апп-д таны харилцагчийн датаг хадгалах боломжийг олгох ба хортой апп нь танд мэдэгдэлгүйгээр харилцагчийн датаг хуваалцах боломжтой."</string>
+    <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Апп нь таны утсаар ярьсан, имэйл илгээсэн давтамж эсвэл тусгай харилцагчидтайгаа өөр аргаар холбоо барьсан байдал зэргийг агуулсан таны утсан дээр хадгалагдсан харилцагчдын талаарх датаг унших боломжтой. Энэ зөвшөөрөл нь апп-д таны харилцагчийн датаг хадгалах боломжийг олгох ба хортой апп нь танд мэдэгдэлгүйгээр харилцагчийн датаг хуваалцах боломжтой."</string>
+    <string name="permlab_writeContacts" msgid="5107492086416793544">"таны харилцагчдыг өөрчлөх"</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Апп нь таны утсаар ярьсан, имэйл илгээсэн давтамж эсвэл тусгай харилцагчидтайгаа өөр аргаар холбоо барьсан байдал зэргийг агуулсан таны таблет дээр хадгалагдсан харилцагчдын талаарх датаг өөрчлөх боломжтой. Энэ зөвшөөрөл нь апп-д харилцагчийн датаг устгах боломжийг олгоно."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Апп нь таны утсаар ярьсан, имэйл илгээсэн давтамж эсвэл харилцагдчидтайгаа өөр аргаар холбоо барьсан байдал зэргийг агуулсан утсан дээр хадгалагдсан харилцагчдын талаарх датаг өөрчлөх боломжтой. Энэ зөвшөөрөл нь апп-д харилцагчийн датаг устгах боломжийг олгоно."</string>
+    <string name="permlab_readCallLog" msgid="3478133184624102739">"дуудлагын логийг унших"</string>
+    <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Апп нь таны таблетын ирсэн гарсан дуудлага зэргийг агуулсан дуудлагын логыг унших боломжтой. Энэ зөвшөөрөл нь апп-д таны дуудлагын логын датаг хадгалах боломжийг олгох ба хортой апп нь танд мэдэгдэлгүйгээр дуудлагын лог датаг хуваалцах боломжтой."</string>
+    <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Апп нь таны утасны ирсэн гарсан дуудлага зэргийг агуулсан дуудлагын логыг унших боломжтой. Энэ зөвшөөрөл нь апп-д таны дуудлагын логын датаг хадгалах боломжийг олгох ба хортой апп нь танд мэдэгдэлгүйгээр дуудлагын лог датаг хуваалцах боломжтой."</string>
+    <string name="permlab_writeCallLog" msgid="8552045664743499354">"дуудлагын логруу бичих"</string>
+    <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Апп нь таны таблетын ирсэн гарсан дуудлага зэргийг агуулсан дуудлагын логыг унших боломжтой. Хортой апп нь энийг ашиглан таны дуудлагын логыг өөрчлөх болон арилгах боломжтой."</string>
+    <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Апп нь таны утасны ирсэн гарсан дуудлага зэргийг агуулсан дуудлагын логыг өөрчлөх боломжтой. Хортой апп нь энийг ашиглан таны дуудлагын логыг өөрчлөх болон арилгах боломжтой."</string>
+    <string name="permlab_readProfile" msgid="4701889852612716678">"та өөрийн харилцагчийн картыг унших"</string>
+    <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Апп нь таны нэр болон холбоо барих мэдээлэл зэрэг таны утсан дээр хадгалагдсан хувийн профайл мэдээллийг унших боломжтой. Ингэснээр апп нь танийг таньж чадах ба таны профайл мэдээллийг бусдад илгээх боломжтой."</string>
+    <string name="permlab_writeProfile" msgid="907793628777397643">"та өөрийн харилцагчийн картыг өөрчлөх"</string>
+    <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Апп нь таны нэр болон холбоо барих мэдээлэл зэрэг таны төхөөрөмж дээр хадгалагдсан хувийн профайл мэдээллийг солих эсвэл нэмэх боломжтой. Ингэснээр апп нь танийг таньж чадах ба таны профайл мэдээллийг бусдад илгээх боломжтой."</string>
+    <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"таны нийтийн урсгалаас унших"</string>
+    <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Апп нь та болон таны найзуудын нийтийн шинэчлэлтэд хандах болон синк хийх боломжтой. Мэдээлэл хуваалцахдаа болгоомжтой байна уу - энэ нь апп-д нийтийн сүлжээндэх та болон таны найзууд хоорондын холбоог нууц эсэхээс үл хамааран унших боломжтой. Анхаар: энэ зөвшөөрөл нь бүх нийтийн сүлжээнд ашиглаж боломжгүй."</string>
+    <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"Таны нийтийн урсгалруу бичих"</string>
+    <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Апп нь таны найзуудын нийтийн шинэчлэлтийг дүрслэх боломжтой.Мэдээлэл хуваалцахдаа болгоомжтой байна уу - энэ нь апп-д таны найзаас ирсэн мэт харагдах мессеж хийх боломжийг олгоно. Анхаар: энэ зөвшөөрөл нь бүх нийтийн сүлжээнд ашиглаж боломжгүй."</string>
+    <string name="permlab_readCalendar" msgid="5972727560257612398">"календарийн хуваарийн нууц мэдээллийг унших"</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Апп нь таны таблет дээр хадгалагдсан найзууд болон хамтран ажиллагсдын календарийн бүх хуваарийг унших боломжтой. Энэ нь апп-д таны календарийн датаг нууц эсвэл эмзэг эсэхээс нь үл хамааран хуваалцах эсвэл хадгалах боломжийг олгоно."</string>
+    <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Allows the app to read all calendar events stored on your phone, including those of friends or co-workers. This may allow the app to share or save your calendar data, regardless of confidentiality or sensitivity. Апп нь таны утсан дээр хадгалагдсан найзууд болон хамтран ажиллагсдын календарийн бүх хуваарийг унших боломжтой. Энэ нь апп-д таны календарийн датаг нууц эсвэл эмзэг эсэхээс нь үл хамааран хуваалцах эсвэл хадгалах боломжийг олгоно."</string>
+    <string name="permlab_writeCalendar" msgid="8438874755193825647">"календарын хуваарийг нэмэх эсвэл өөрчлөх болон эзэмшигчид мэдэгдэлгүйгээр зочидруу имэйл илгээх"</string>
+    <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Апп нь таблет дээр та болон таны найзууд, хамтран ажиллагсдын өөрчилж чадах үйл явдлуудыг нэмэх, хасах болон солих боломжтой. Энэ нь апп-д, календарь эзэмшигчээс ирсэн мэт харагдах мессежийг илгээх эсвэл эзэмшигчд нь мэдэгдэлгүйгээр үйл явдлуудыг өөрчлөх боломжийг олгоно."</string>
+    <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Апп нь утсан дээр та болон таны найзууд, хамтран ажиллагсдын өөрчилж чадах үйл явдлуудыг нэмэх, хасах болон солих боломжтой. Энэ нь апп-д, календарь эзэмшигчээс ирсэн мэт харагдах мессежийг илгээх эсвэл эзэмшигчид нь мэдэгдэлгүйгээр үйл явдлуудыг өөрчлөх боломжийг олгоно."</string>
+    <string name="permlab_accessMockLocation" msgid="8688334974036823330">"тест хийх байршлын эх үүсвэрийг үүсгэх"</string>
+    <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Тестэд ашиглах хуурамч байршлын эх үүсвэрийг үүсгэх болон шинэ байршил өгөгчийг суулгах боломжтой. Ингэснээр апп нь GPS эсвэл байршил өгөгч зэрэг бусад байршлын эх үүсвэрээс ирсэн байршил болон статусыг өөрчлөх боломжтой."</string>
+    <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"байршил нийлүүлэгчийн нэмэлт тушаалд хандах"</string>
+    <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Апп нь байршил нийлүүлэгчийн нэмэлт тушаалд хандах боломжтой. Энэ нь апп-д GPS эсвэл бусад байршлын үйлчилгээний ажиллагаанд нөлөөлөх боломжийг олгоно."</string>
+    <string name="permlab_installLocationProvider" msgid="6578101199825193873">"байршил нийлүүлэгчийг суулгах зөвшөөрөх"</string>
+    <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Тестэд ашиглах хуурамч байршлын эх үүсвэрийг үүсгэх болон шинэ байршил өгөгчийг суулгах боломжтой. Ингэснээр апп нь GPS эсвэл байршил өгөгч зэрэг бусад байршлын эх үүсвэрээс ирсэн байршил болон статусыг өөрчлөх боломжтой."</string>
+    <string name="permlab_accessFineLocation" msgid="1191898061965273372">"Тодорхой байршил(GPS болон сүлжээнд суурилсан)"</string>
+    <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Апп нь GPS эсвэл үүрэн цамхаг болон Wi-Fi зэрэг сүлжээний байршлын эх үүсвэрийг ашиглан таны тодорхой байршлыг авах боломжтой. Эдгээр байршлын үйлчилгээнүүд нь асаалттай байх шаардлагатай ба таны төхөөрөмж дээрх апп-ууд ашиглах боломжтой байх шаардлагатай. Апп-ууд энийг ашиглан таныг хаана байгааг тогтоох боломжтой ба батерей зарцуулалт нэмэгдэнэ."</string>
+    <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"ойролцоох байршил(сүлжээнд суурилсан)"</string>
+    <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Апп нь таны ойролцоох байршлыг оло боломжтой. Энэ байршил нь үүрэн цамхаг болон Wi-Fi зэрэг сүлжээний байршлын эх сурвалжийг ашигладаг байршлын үйлчилгээнээс олдоно. Эдгээр байршлын үйлчилгээнүүд нь таны төхөөрөмж дээр асаалттай байх шаардлагатай ба апп-д тэдгээрийг ашиглах боломжтой байх шаардлагатай. Апп-д тэдгээрийг ашиглан таны байршлыг ойролцоогоор олох боломжтой."</string>
+    <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger-т хандах"</string>
+    <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Апп нь SurfaceFlinger доод-төвшиний функцийг ашиглах боломжтой."</string>
+    <string name="permlab_readFrameBuffer" msgid="6690504248178498136">"Фрэйм буферээс унших"</string>
+    <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Апп нь фрэйм буферын контентыг унших боломжтой."</string>
+    <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi дэлгэцийг тохируулах"</string>
+    <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Апп нь Wifi дэлгэцийг тохируулах болон холбогдох боломжтой."</string>
+    <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi дэлгэцийг удирдах"</string>
+    <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Апп нь Wifi дэлгэцний доод-төвшиний функцийг удирдах боломжтой."</string>
+    <string name="permlab_captureAudioOutput" msgid="6857134498402346708">"аудио гаралтыг барих"</string>
+    <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Апп-т аудио гаралтыг барих, дахин чиглүүлэхийг зөвшөөрнө."</string>
+    <string name="permlab_captureVideoOutput" msgid="2246828773589094023">"видео гаралтыг барих"</string>
+    <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Апп-т видео гаралтыг барих, дахин чиглүүлэхийг зөвшөөрнө."</string>
+    <string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"найдвартай видео гаралтыг барих"</string>
+    <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Апп-т найдвартай видео гаралтыг барих, дахин чиглүүлэхийг зөвшөөрнө."</string>
+    <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"Аудио тохиргоо солих"</string>
+    <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Апп нь дууны хэмжээ, спикерын гаралтад ашиглагдах глобал аудио тохиргоог өөрчлөх боломжтой."</string>
+    <string name="permlab_recordAudio" msgid="3876049771427466323">"аудио бичих"</string>
+    <string name="permdesc_recordAudio" msgid="4906839301087980680">"Апп нь микрофоноор аудио бичих боломжтой. Энэ зөвшөөрөл нь апп-д ямар ч үед таны зөвшөөрөлгүйгээр аудио бичих боломжийг олгоно."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"зураг авах болон видео бичих"</string>
+    <string name="permdesc_camera" msgid="8497216524735535009">"Апп нь камераар зураг авах болон видео бичих боломжтой. Энэ зөвшөөрөл нь апп-д ямар ч үед таны зөвшөөрөлгүйгээр камер ашиглах боломжийг олгоно."</string>
+    <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"камер ашиглаж байх үед дамжууллыг заагч LED-г идэвхгүй болгох"</string>
+    <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Урьдчилан суусан систем аппликешн нь камер ашиглалтыг заасан LED-г идэвхгүй болгох боломжтой."</string>
+    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"таблетыг бүрмөсөн идэвхгүй болгох"</string>
+    <string name="permlab_brick" product="default" msgid="8337817093326370537">"утсыг бүрмөсөн идэвхгүй болгох"</string>
+    <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Апп нь таблетыг бүхэлд нь бүрмөсөн идэвхгүй болгох боломжтой. Энэ маш аюултайэ"</string>
+    <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Апп нь утсыг бүхэлд нь бүрмөсөн идэвхгүй болгох боломжтой. Энэ маш аюултай."</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"таблет хүчээр дахин асаах"</string>
+    <string name="permlab_reboot" product="default" msgid="2898560872462638242">"утсыг хүчээр дахин асаах"</string>
+    <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Апп нь таблетыг хүчээр дахин асаах боломжтой."</string>
+    <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Апп нь утсыг хүчээр дахин асаах боломжтой."</string>
+    <string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USB сан файл системд хандах"</string>
+    <string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SD карт файл системд хандах"</string>
+    <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Апп нь сугалдаг санг файл системд залгах болон салгах боломжтой."</string>
+    <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB санг арилгах"</string>
+    <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD картыг арилгах"</string>
+    <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Апп нь зөөврийн санг форматлах боломжтой."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"дотоод сангийн мэдээллийг авах"</string>
+    <string name="permdesc_asec_access" msgid="3094563844593878548">"Апп нь дотоод сангаас мэдээллийг авах боломжтой"</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"дотоод санд үүсгэх"</string>
+    <string name="permdesc_asec_create" msgid="4558869273585856876">"Апп нь дотоод сан үүсгэх боломжтой."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"дотоод сангаас устгах"</string>
+    <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Апп нь дотоод сангаас устгах боломжтой."</string>
+    <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"дотоод санг залгах/салгах"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Апп нь дотоод санг залгах/салгах боломжтой."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"дотоод сангийн нэрийг өөрчлөх"</string>
+    <string name="permdesc_asec_rename" msgid="1794757588472127675">"Апп нь дотоод сангийн нэрийг өөрчлөх боломжтой."</string>
+    <string name="permlab_vibrate" msgid="7696427026057705834">"чичиргээг удирдах"</string>
+    <string name="permdesc_vibrate" msgid="6284989245902300945">"Апп нь чичиргээг удирдах боломжтой."</string>
+    <string name="permlab_flashlight" msgid="2155920810121984215">"гар чийдэн удирдах"</string>
+    <string name="permdesc_flashlight" msgid="6522284794568368310">"Апп нь гар чийдэнг удирдах боломжтой."</string>
+    <string name="permlab_manageUsb" msgid="1113453430645402723">"USB төхөөрөмжийн тохиргоо болон зөвшөөрлийг удирдах"</string>
+    <string name="permdesc_manageUsb" msgid="7776155430218239833">"Апп нь USB төхөөрөмжийн зөвшөөрөл болон тохируулгыг удирдах боломжтой."</string>
+    <string name="permlab_accessMtp" msgid="4953468676795917042">"MTP протоколыг гүйцэтгэх"</string>
+    <string name="permdesc_accessMtp" msgid="6532961200486791570">"MTP USB протокол биелүүлэхээр MTP цөм драйверт хандах боломжтой."</string>
+    <string name="permlab_hardware_test" msgid="4148290860400659146">"хардвер теслэх"</string>
+    <string name="permdesc_hardware_test" msgid="6597964191208016605">"Апп нь хардверийг тестлэх зорилгоор олон төрлийн туслах төхөөрөмжийг удирдах боломжтой."</string>
+    <string name="permlab_callPhone" msgid="3925836347681847954">"утасны дугаарт шууд дуудлага хийх"</string>
+    <string name="permdesc_callPhone" msgid="3740797576113760827">"Апп нь таны оролцоогүйгээр дуудлага хийх боломжтой. Энэ нь төлөвлөгдөөгүй төлбөрт оруулах эсвэл дуудлага хийнэ. Энэ нь апп-г яаралтай дугаарт дуудлага хийхйг зөвшөөрөхгүй. Хортой апп нь таны зөвшөөрөлгүйгээр дуудлага хийж таныг төлбөрт оруулж болзошгүй"</string>
+    <string name="permlab_callPrivileged" msgid="4198349211108497879">"дурны утасны дугаарт шууд дуудлага хийх"</string>
+    <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Апп нь таны оролцоогүйгээр яаралтай тусламжийн дугааруудыг оруулаад ямарч дугаарлуу дуудлага хийх боломжтой. Хортой апп нь шаардлагагүй, хууль бус дуудлагыг яаралтай тусламжийн үйлчилгээрүү хийж болзошгүй."</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA таблет тохиргоог шууд эхлүүлэх"</string>
+    <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA утасны тохиргоог шууд эхлүүлэх"</string>
+    <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Апп нь CDMA провишныг эхлүүлэх боломжтой. Хортой апп нь шаардлагагүй байхад CDMA провишныг эхлүүлж болзошгүй."</string>
+    <string name="permlab_locationUpdates" msgid="7785408253364335740">"байршил шинэчлэх мэдэгдлийг удирдах"</string>
+    <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Апп нь радиогоос ирсэн байршил шинэчлэх мэдэгдлийг идэвхтэй/идэвхгүй болгох боломжтой. Энгийн апп-д хэрэглэглэхгүй."</string>
+    <string name="permlab_checkinProperties" msgid="7855259461268734914">"бүртгэх пропертид хандах"</string>
+    <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Апп нь бүртгэл үйлчилгээгээр байршуулагдсан пропертиг унших/бичих боломжтой. Энгийн апп-д хэрэглэгдэхгүй."</string>
+    <string name="permlab_bindGadget" msgid="776905339015863471">"виджет сонгох"</string>
+    <string name="permdesc_bindGadget" msgid="8261326938599049290">"Апп нь аль апп ямар виджетийг ашиглаж байгаа тухай системд мэдэгдэх боломжтой. Энэ зөвшөөрөлтэй апп нь бусад апп-д хувийн датад хандах эрхийг өгөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+    <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"утасны статусыг өөрчлөх"</string>
+    <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Апп-н төхөөрөмжийн утасны функцийг удирдах боломжтой. Энэ зөвшөөрөлтэй апп  нь танд анхааруулахгүйгээр сүлжээг сэлгэх, утасны радиог асаах, унтраах боломжтой."</string>
+    <string name="permlab_readPhoneState" msgid="9178228524507610486">"утасны статус ба таниулбарыг унших"</string>
+    <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Апп нь төхөөрөмжийн утасны функцд хандах боломжтой. Энэ зөвшөөрөл нь апп-д утасны дугаар болон төхөөрөмжийн ID-г, дуудлага идэвхтэй эсэх, холын дугаар дуудлагаар холбогдсон байгаа эсэхийг тогтоох боломжийг олгоно,"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"таблетыг унтуулахгүй байлгах"</string>
+    <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"утсыг унтуулахгүй байлгах"</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Апп нь таблетыг унтахаас сэргийлэх боломжтой"</string>
+    <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Апп нь утсыг унтахаас сэргийлэх боломжтой"</string>
+    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"таблетыг унтраах эсвэл асаах"</string>
+    <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"утсыг унтраах эсвэл асаах"</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Апп нь таблетыг асаах, унтраах боломжтой."</string>
+    <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Апп нь утсыг асаах, унтраах боломжтой."</string>
+    <string name="permlab_factoryTest" msgid="3715225492696416187">"үйлдвэрийн тест горимд ажиллуулах"</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Доод төвшиний үйлдвэрийн тестийг ажиллуулан таблетын хардверт бүрэн хандах боломжтой. Таблет нь үйлдвэрийн тестийн горимд ажиллах үед л боломжтой."</string>
+    <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Доод төвшиний үйлдвэрийн тестийг ажиллуулан утасны хардверт бүрэн хандах боломжтой. Утас үйлдвэрийн тестийн горимд ажиллах үед л боломжтой."</string>
+    <string name="permlab_setWallpaper" msgid="6627192333373465143">"ханын зургийг тохируулах"</string>
+    <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Апп нь системийн ханын зургийг тохируулах боломжтой."</string>
+    <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"Таны ханын зурагны хэмжээг тохируулах"</string>
+    <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Апп нь системийн ханын зургийн хэмжээний саналыг тохируулах боломжтой"</string>
+    <string name="permlab_masterClear" msgid="2315750423139697397">"системийг үйлдвэрийн үндсэн утгаар тохируулах"</string>
+    <string name="permdesc_masterClear" msgid="3665380492633910226">"Апп нь бүх датаг арилгах болон бүх суулгасан апп-г арилган системийг бүхэлд үйлдвэрийн тохиргоогоор бүрэн тохируулах боломжтой"</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"цагийн тохиргоо"</string>
+    <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Апп нь таблетын цагийг солих боломжтой."</string>
+    <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Апп нь утасны цагийг солих боломжтой."</string>
+    <string name="permlab_setTimeZone" msgid="2945079801013077340">"цагийн бүсийн тохиргоо"</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Апп нь таблетын цагийн бүсийг солих боломжтой."</string>
+    <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Апп нь утасны цагийн бүсийг өөрчлөх боломжтой."</string>
+    <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService болж ажиллах"</string>
+    <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Апп нь Акаунт гэрчлэгчрүү дуудлага хийх боломжтой."</string>
+    <string name="permlab_getAccounts" msgid="1086795467760122114">"төхөөрөмж дээрх акаунтыг олох"</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Апп нь таблетэд мэдэгдэж байгаа акаунтын жагсаалтыг авах боломжтой. Энд таны суулгасан аппликешнүүдийн үүсгэсэн бүх акаунтууд хамрагдана."</string>
+    <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Апп нь утсанд мэдэгдэж байгаа акаунтын жагсаалтыг авах боломжтой. Энд таны суулгасан аппликешнүүдийн үүсгэсэн бүх акаунтууд хамрагдана."</string>
+    <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"акаунт үүсгэх болон нууц үг тохируулах"</string>
+    <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Апп нь акаунт үүсгэх, тэдгээрийн нууц үгийг тохируулах зэрэг акаунт удирдагчийн акаунт гэрчлэгчийн функцийг ашиглах боломжтой."</string>
+    <string name="permlab_manageAccounts" msgid="4983126304757177305">"акаунт нэмэх эсвэл хасах"</string>
+    <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Апп нь акаунт нэмэх, устгах ба тэдний нууц үгийг устгах зэрэг үйлдлийг гүйцэтгэх боломжтой."</string>
+    <string name="permlab_useCredentials" msgid="235481396163877642">"төхөөрөмж дээрх акаунтыг ашиглах"</string>
+    <string name="permdesc_useCredentials" msgid="7984227147403346422">"Апп нь гэрчлэлийн бүтвэрийг хүсэх боломжтой."</string>
+    <string name="permlab_accessNetworkState" msgid="4951027964348974773">"сүлжээний холболтыг үзэх"</string>
+    <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Апп нь сүлжээ байгаа болон холбогдсон эсэх зэрэг сүлжээний холболтын талаарх мэдээллийг харах боломжтой."</string>
+    <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"сүлжээнд бүрэн хандах"</string>
+    <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Апп нь сүлжээний сокетыг үүсгэх болон тусгай сүлжээний протокол ашиглах боломжтой. Хөтөч болон бусад аппликешнүүд Интернетээр дата илгээх боломжтой  тул энэ зөвшөөрөл нь Интернетээр дата илгээхэд шаардлагагүй."</string>
+    <string name="permlab_writeApnSettings" msgid="505660159675751896">"сүлжээний тохиргоо болон урсгалыг солих/таслах"</string>
+    <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Апп нь сүлжээний тохиргоог солих болон сүлжээний бүх урсгалыг APN-н прокси болон портыг солих замаар таслах, хянах боломжтой. Хортой апп нь танд мэдэгдэлгүйгээр сүлжээний пакетыг хянах, дахин чиглүүлэх болон өөрчлөх боломжтой."</string>
+    <string name="permlab_changeNetworkState" msgid="958884291454327309">"сүлжээний холболтыг солих"</string>
+    <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Апп нь сүлжээний холболтын статусыг солих боломжтой."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"модем болгосон холболтыг солих"</string>
+    <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Апп нь холбогдсон сүлжээний холболтын статусыг солих боломжтой."</string>
+    <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"арын дата ашиглалтын тохиргоог солих"</string>
+    <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Апп нь арын дата хэрэглээний тохиргоог солих боломжтой."</string>
+    <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi холболтыг үзэх"</string>
+    <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Апп нь Wi-Fi идэвхтэй эсэх болон холбогдсон Wi-Fi төхөөрөмжийн нэр зэрэг Wi-Fi сүлжээний талаарх мэдээллийг харах боломжтой."</string>
+    <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi -тай холбогдох болон салах"</string>
+    <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Апп нь Wi-Fi холболтын цэгтэй холбогдох буюу салах боломжтой ба тохируулсан Wi-Fi сүлжээнд өөрчлөлт хийх боломжтой."</string>
+    <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi олон дамжуулалт хүлээн авахыг зөвшөөрөх"</string>
+    <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Апп нь олон дамжуулал ашиглан Wi-Fi сүлжээн дэх бүх төхөөрөмжрүү пакет илгээх болон хүлээн авах боломжтой. Энэ нь олон дамжуулал ашиглахгүй горимоос илүү их тэжээл зарцуулна."</string>
+    <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Апп нь олон дамжуулал ашиглан Wi-Fi сүлжээн дэх бүх төхөөрөмжрүү пакет илгээх болон хүлээн авах боломжтой. Энэ нь олон дамжуулал ашиглахгүй горимоос илүү их тэжээл зарцуулна."</string>
+    <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Блютүүт тохиргоонд хандах"</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Апп нь дотоод блютүүт таблетын тохиргоог харах боломжтой ба хос болох төхөөрөмжтэй холболтыг зөвшөөрөх болон хийх боломжтой"</string>
+    <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Апп нь утасны дотоод блютүүтыг тохируулах боломжтой ба гадаад төхөөрөмжийг олох болон хос үүсгэх боломжтой."</string>
+    <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-д холбогдох болон салах"</string>
+    <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Апп нь WiMAX идэвхтэй эсэх болон холбогдсон WiMAX сүлжээний талаар мэдээллийг тодорхойлох боломжтой."</string>
+    <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX статусыг өөрчлөх"</string>
+    <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Апп нь WiMAX сүлжээнд таблетыг холбох болон салгах боломжтой."</string>
+    <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Апп нь WiMAX сүлжээнд утсыг холбох болон салгах боломжтой."</string>
+    <string name="permlab_bluetooth" msgid="6127769336339276828">"Блютүүт төхөөрөмжтэй хос үүсгэх"</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Апп нь таблет дээрх блютүүт тохиргоог харах боломжтой ба хос болох төхөөрөмжтэй холболтыг зөвшөөрөх болон хийх боломжтой."</string>
+    <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Апп нь утсан дээрх Блютүүт тохиргоог харах боломжтой ба хос болох төхөөрөмжтэй холболтыг зөвшөөрөх болон хийх боломжтой."</string>
+    <string name="permlab_nfc" msgid="4423351274757876953">"ойролцоо талбарын холбоог удирдах"</string>
+    <string name="permdesc_nfc" msgid="7120611819401789907">"Апп нь Ойролцоо Талбарын Холболт(NFC) таг, карт, болон уншигчтай холбогдох боломжтой."</string>
+    <string name="permlab_disableKeyguard" msgid="3598496301486439258">"дэлгэцний түгжээг идэвхгүй болгох"</string>
+    <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Апп нь түгжээ болон бусад холбоотой нууц үгийн аюулгүй байдлыг идэвхгүй болгох боломжтой. Жишээ нь бол утас нь дуудлага ирэх үед түгжээг идэвхгүй болгох ба дуудлага дуусахад буцаан идэвхтэй болгодог."</string>
+    <string name="permlab_readSyncSettings" msgid="6201810008230503052">"синк тохиргоог унших"</string>
+    <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Апп нь акаунтын синк тохиргоог унших боломжтой. Жишээ нь энэ нь Хүмүүс апп акаунттай синк хийгдсэн эсэхийг тодорхойлох боломжтой."</string>
+    <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"синкийг унтрааж асаах тохиргоо"</string>
+    <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Апп нь акаунтын синк тохиргоог өөрчлөх боломжтой. Жишээ нь энэ нь Хүмүүс апп акаунттай синк хийхийг идэвхжүүлэх боломжтой."</string>
+    <string name="permlab_readSyncStats" msgid="7396577451360202448">"синк статистикийг унших"</string>
+    <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Апп нь синк үйлдэлийн түүх болон хэр их дата синк хийгдсэн зэрэг акаунтын синк статусыг унших боломжтой."</string>
+    <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"бүртгүүлсэн хангамжийг унших"</string>
+    <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Апп нь одоогийн синк хийгдсэн хангамжийн талаарх мэдээллийг авах боломжтой."</string>
+    <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"бүртгүүлсэн хангамжруу бичих"</string>
+    <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Апп нь таны одоогийн синк хийгдсэн хангамжийг өөрчлөх боломжтой. Хортой апп нь таны синк хийгдсэн хангамжийг өөрчлөх боломжтой."</string>
+    <string name="permlab_readDictionary" msgid="4107101525746035718">"таны толь бичигт нэмсэн нөхцөлийг унших"</string>
+    <string name="permdesc_readDictionary" msgid="659614600338904243">"Апп нь хэрэглэгч хэрэглэгчийн толь бичигт хадгалсан бүх үгс, нэрс болон хэлцийг унших боломжтой."</string>
+    <string name="permlab_writeDictionary" msgid="2183110402314441106">"хэрэглэгчийн толь бичигт үгс нэмэх"</string>
+    <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Апп нь хэрэглэгчийн толь бичигт шинэ үг бичих боломжтой."</string>
+    <string name="permlab_sdcardRead" product="nosdcard" msgid="8235341515605559677">"хамгаалагдсан санд хандах тест хийх"</string>
+    <string name="permlab_sdcardRead" product="default" msgid="8235341515605559677">"хамгаалагдсан санд хандах тест хийх"</string>
+    <string name="permdesc_sdcardRead" product="nosdcard" msgid="3642473292348132072">"Апп нь дараагийн төхөөрөмжүүдэд ашиглах боломжтой болох SD карт зөвшөөрлийг тестлэх боломжтой."</string>
+    <string name="permdesc_sdcardRead" product="default" msgid="5914402684685848828">"Апп нь дараагийн төхөөрөмжүүдэд ашиглах боломжтой болох SD карт эрхийг тестлэх боломжтой."</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB сангийн контентыг өөрчлөх эсвэл устгах"</string>
+    <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD картны контентыг өөрчлөх болон устгах"</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Апп нь USB санруу бичих боломжтой."</string>
+    <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Апп нь SD картруу бичих боломжтой."</string>
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"дотоод медиа сангийн контентыг өөрчлөх/устгах"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Апп нь дотоод медиа сангийн контентыг өөрчлөх боломжтой."</string>
+    <string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"документ санг удирдах"</string>
+    <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Апп нь документ санг удирдах боломжтой."</string>
+    <string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"бүх хэрэглэгчдийн гадаар санд хандах"</string>
+    <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Апп нь бүх хэрэглэгчдийн гадаад санд хандах боломжтой."</string>
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"кеш файлсистемд хандах"</string>
+    <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Апп нь кеш файлсистемийг унших бичих боломжтой."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"Интернет дуудлага хийх/хүлээн авах"</string>
+    <string name="permdesc_use_sip" msgid="4717632000062674294">"Апп нь Интернет дуудлага хийх/хүлээн авахын тулд SIP үйлчилгээг ашиглах боломжтой."</string>
+    <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"сүлжээний ашиглалтын түүхийг унших"</string>
+    <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Апп нь тусгай сүлжээ болон апп-н сүлжээ ашиглалтын түүхийг унших боломжтой."</string>
+    <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"сүлжээний бодлогыг удирдах"</string>
+    <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Апп нь сүлжээний бодлогыг удирдах болон апп-д зориулсан дүрмийг тогтоох боломжтой."</string>
+    <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"сүлжээний хэрэглээний тайланг өөрчлөх"</string>
+    <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Апп нь апп-уудын сүлжээ ашиглалтын талаарх тооцоог өөрчлөх боломжтой. Энгийн апп-д ашиглагдахгүй."</string>
+    <string name="permlab_markNetworkSocket" msgid="3658527214914959749">"соккетын тэмдгүүдийг өөрчлөх"</string>
+    <string name="permdesc_markNetworkSocket" msgid="7655568433696356578">"Апп-д чиглэлийн соккетын тэмдгийг өөрчлөх боломж олгоно"</string>
+    <string name="permlab_accessNotifications" msgid="7673416487873432268">"мэдэгдэлд хандах"</string>
+    <string name="permdesc_accessNotifications" msgid="458457742683431387">"Апп нь бусад апп-уудын илгээсэн мэдэгдлүүдийг дуудах, шалгах, болон цэвэрлэх боломжтой."</string>
+    <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"мэдэгдэл сонсогч үйлчилгээтэй холбох"</string>
+    <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Эзэмшигч нь мэдэгдэл сонсох үйлчилгээний дээд-төвшиний интерфейстэй холбох боломжтой. Энгийн апп-д шаардлагагүй."</string>
+    <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"үүрэн компанийн нийлүүлсэн тохируулгын апп-г өдөөх"</string>
+    <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Эзэмшигчид үүрэн компанийн нийлүүлсэн тохируулах апп-г өдөөх боломж олгоно. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string>
+    <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"Сүлжээний байдлын талаар ажиглалтуудыг хүлээн авах"</string>
+    <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Аппликешнд сүлжээний байдлын талаар ажиглалтуудыг хүлээн авахыг зөвшөөрнө. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Нууц үгний дүрмийг тохируулах"</string>
+    <string name="policydesc_limitPassword" msgid="3252114203919510394">"Дэлгэц түгжих нууц үгэнд зөвшөөрөгдсөн тэмдэгт болон уртыг удирдах"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Дэлгэц тайлах оролдлогыг хянах"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Дэлгэц түгжигдсэн үед нууц үг буруу оруулалтын тоог хянах ба хэрэв хэт олон удаа нууц үгийг буруу оруулбал таблетыг түгжих болон таблетын бүх датаг арилгана"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Дэлгэц түгжигдсэн үед нууц үг буруу оруулалтын тоог хянах, ба хэрэв хэт олон удаа нууц үгийг буруу оруулбал утсыг түгжих болон утасны бүх датаг арилгана"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Дэлгэц түгжих нууц үгийг солих"</string>
+    <string name="policydesc_resetPassword" msgid="605963962301904458">"Дэлгэц түгжих нууц үгийг солих"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Дэлгэц түгжих"</string>
+    <string name="policydesc_forceLock" msgid="1141797588403827138">"Дэлгэц хэзээ яаж түгжихийг удирдах"</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Бүх датаг арилгах"</string>
+    <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Үйлдвэрийн дата утгыг өгсөнөөр таблетын дата шууд арилгагдана."</string>
+    <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Үйлдвэрийн дата утгыг өгсөнөөр утасны дата шууд арилгагдана."</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Төхөрөөмжийн глобал проксиг тохируулах"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Бодлого идэвхтэй үед төхөөрөмжийн глобал проксиг ашиглахаар тохируулсан. Зөвхөн эхний төхөөрөмжийн админ л үр дүнтэй глобал проксиг тохируулна."</string>
+    <string name="policylab_expirePassword" msgid="885279151847254056">"Дэлгэц түгжих нууц үгний хүчинтэй хугацааг тохируулах"</string>
+    <string name="policydesc_expirePassword" msgid="1729725226314691591">"Дэлгэцний түгжих нууц үг хэр давтамжтай солигдохыг удирдах."</string>
+    <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Сангийн шифрлэхийг тохируулах"</string>
+    <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Хадгалагдсан апп дата шифрлэгдэх шаардлагатай"</string>
+    <string name="policylab_disableCamera" msgid="6395301023152297826">"Камер идэвхгүй болгох"</string>
+    <string name="policydesc_disableCamera" msgid="2306349042834754597">"Төхөөрөмжийн бүх камерийг ашиглахгүй."</string>
+    <string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Түлхүүр хамгаалтын функцийг унтраах"</string>
+    <string name="policydesc_disableKeyguardFeatures" msgid="3467082272186534614">"Түлхүүр хамгаалалтын зарим функцийг ашиглахыг хориглох."</string>
+  <string-array name="phoneTypes">
+    <item msgid="8901098336658710359">"Гэрийн"</item>
+    <item msgid="869923650527136615">"Мобайл"</item>
+    <item msgid="7897544654242874543">"Ажлын"</item>
+    <item msgid="1103601433382158155">"Ажлын факс"</item>
+    <item msgid="1735177144948329370">"Гэрийн Факс"</item>
+    <item msgid="603878674477207394">"Пэйжер"</item>
+    <item msgid="1650824275177931637">"Бусад"</item>
+    <item msgid="9192514806975898961">"Тусгай"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item msgid="8073994352956129127">"Гэрийн"</item>
+    <item msgid="7084237356602625604">"Ажлын"</item>
+    <item msgid="1112044410659011023">"Бусад"</item>
+    <item msgid="2374913952870110618">"Тусгай"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item msgid="6880257626740047286">"Гэрийн"</item>
+    <item msgid="5629153956045109251">"Ажлын"</item>
+    <item msgid="4966604264500343469">"Бусад"</item>
+    <item msgid="4932682847595299369">"Тусгай"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item msgid="1738585194601476694">"Гэрийн"</item>
+    <item msgid="1359644565647383708">"Ажлын"</item>
+    <item msgid="7868549401053615677">"Бусад"</item>
+    <item msgid="3145118944639869809">"Тусгай"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item msgid="7546335612189115615">"Ажлын"</item>
+    <item msgid="4378074129049520373">"Бусад"</item>
+    <item msgid="3455047468583965104">"Тусгай"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item msgid="8595261363518459565">"AIM"</item>
+    <item msgid="7390473628275490700">"Windows Live"</item>
+    <item msgid="7882877134931458217">"Yahoo"</item>
+    <item msgid="5035376313200585242">"Skype"</item>
+    <item msgid="7532363178459444943">"QQ"</item>
+    <item msgid="3713441034299660749">"Google Talk"</item>
+    <item msgid="2506857312718630823">"ICQ"</item>
+    <item msgid="1648797903785279353">"Jabber"</item>
+  </string-array>
+    <string name="phoneTypeCustom" msgid="1644738059053355820">"Тусгай"</string>
+    <string name="phoneTypeHome" msgid="2570923463033985887">"Гэрийн"</string>
+    <string name="phoneTypeMobile" msgid="6501463557754751037">"Мобайл"</string>
+    <string name="phoneTypeWork" msgid="8863939667059911633">"Ажлын"</string>
+    <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Ажлын факс"</string>
+    <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Гэрийн Факс"</string>
+    <string name="phoneTypePager" msgid="7582359955394921732">"Пэйжер"</string>
+    <string name="phoneTypeOther" msgid="1544425847868765990">"Бусад"</string>
+    <string name="phoneTypeCallback" msgid="2712175203065678206">"Буцаж холбоо барих"</string>
+    <string name="phoneTypeCar" msgid="8738360689616716982">"Машин"</string>
+    <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Байгууллагын үндсэн"</string>
+    <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
+    <string name="phoneTypeMain" msgid="6766137010628326916">"Үндсэн"</string>
+    <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Бусад факс"</string>
+    <string name="phoneTypeRadio" msgid="4093738079908667513">"Радио"</string>
+    <string name="phoneTypeTelex" msgid="3367879952476250512">"Tелекс"</string>
+    <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
+    <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Ажлын утас"</string>
+    <string name="phoneTypeWorkPager" msgid="649938731231157056">"Ажлын пейжер"</string>
+    <string name="phoneTypeAssistant" msgid="5596772636128562884">"Туслагч"</string>
+    <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Тусгай"</string>
+    <string name="eventTypeBirthday" msgid="2813379844211390740">"Төрсөн огноо"</string>
+    <string name="eventTypeAnniversary" msgid="3876779744518284000">"Түүхэн ой"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Бусад"</string>
+    <string name="emailTypeCustom" msgid="8525960257804213846">"Тусгай"</string>
+    <string name="emailTypeHome" msgid="449227236140433919">"Гэрийн"</string>
+    <string name="emailTypeWork" msgid="3548058059601149973">"Ажлын"</string>
+    <string name="emailTypeOther" msgid="2923008695272639549">"Бусад"</string>
+    <string name="emailTypeMobile" msgid="119919005321166205">"Мобайл"</string>
+    <string name="postalTypeCustom" msgid="8903206903060479902">"Тусгай"</string>
+    <string name="postalTypeHome" msgid="8165756977184483097">"Гэрийн"</string>
+    <string name="postalTypeWork" msgid="5268172772387694495">"Ажлын"</string>
+    <string name="postalTypeOther" msgid="2726111966623584341">"Бусад"</string>
+    <string name="imTypeCustom" msgid="2074028755527826046">"Тусгай"</string>
+    <string name="imTypeHome" msgid="6241181032954263892">"Гэрийн"</string>
+    <string name="imTypeWork" msgid="1371489290242433090">"Ажлын"</string>
+    <string name="imTypeOther" msgid="5377007495735915478">"Бусад"</string>
+    <string name="imProtocolCustom" msgid="6919453836618749992">"Тусгай"</string>
+    <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
+    <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
+    <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
+    <string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
+    <string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
+    <string name="imProtocolGoogleTalk" msgid="493902321140277304">"Цугларалт"</string>
+    <string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
+    <string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
+    <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
+    <string name="orgTypeWork" msgid="29268870505363872">"Ажлын"</string>
+    <string name="orgTypeOther" msgid="3951781131570124082">"Бусад"</string>
+    <string name="orgTypeCustom" msgid="225523415372088322">"Тусгай"</string>
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Тусгай"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Туслагч"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Ах"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Хүүхэд"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Дотоод Түнш"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Эцэг"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Найз"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Менежер"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Эх"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Эцэг эх"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Түнш"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Дурдагдсан"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Хамаатан"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Эгч"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Хань"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Тусгай"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Гэрийн"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Ажлын"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Бусад"</string>
+    <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN кодыг бичнэ үү"</string>
+    <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK-г бичээд шинэ PIN код оруулна уу"</string>
+    <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK код"</string>
+    <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Шинэ PIN код"</string>
+    <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Нууц үг бичих бол хүрнэ үү"</font></string>
+    <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Тайлах нууц үгийг бичнэ үү"</string>
+    <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Тайлах PIN-г оруулна уу"</string>
+    <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Буруу PIN код."</string>
+    <string name="keyguard_label_text" msgid="861796461028298424">"Тайлах бол Цэсийг дараад 0."</string>
+    <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Яаралтай дугаар"</string>
+    <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Үйлчилгээ байхгүй."</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_disabled" msgid="686260028797158364">"Тайлах бол цэсийг дарна уу."</string>
+    <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Тайлах хээгээ зурна уу"</string>
+    <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Яаралтай дуудлага"</string>
+    <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Дуудлагаруу буцах"</string>
+    <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Зөв!"</string>
+    <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Дахин оролдох"</string>
+    <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Дахин оролдох"</string>
+    <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Нүүрээр түгжээ тайлах оролдлогын тоо дээд хэмжээнээс хэтэрсэн"</string>
+    <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Цэнэглэж байна, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="lockscreen_charged" msgid="321635745684060624">"Цэнэглэгдэв"</string>
+    <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="lockscreen_low_battery" msgid="1482873981919249740">"Цэнэглэгчээ холбоно уу."</string>
+    <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM карт байхгүй"</string>
+    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Таблет SIM картгүй."</string>
+    <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Утсанд SIM карт байхгүй."</string>
+    <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SIM картыг оруулна уу."</string>
+    <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM карт байхгүй эсвэл унших боломжгүй. SIM карт оруулна уу."</string>
+    <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Ашиглах боломжгүй SIM карт."</string>
+    <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"Таны SIM карт бүрмөсөн идэвхгүй болов.\n Өөр SIM карт авах бол өөрийн утасгүй үйлчилгээний нийлүүлэгчтэй холбогдоно уу."</string>
+    <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Өмнөх бичлэг товч"</string>
+    <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Дараагийн бичлэг товч"</string>
+    <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Түр зогсоох товч"</string>
+    <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Тоглуулах товч"</string>
+    <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Зогсоох товч"</string>
+    <string name="emergency_calls_only" msgid="6733978304386365407">"Зөвхөн яаралтай дуудлага"</string>
+    <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Сүлжээ түгжигдсэн"</string>
+    <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM карт нь PUK түгжээтэй."</string>
+    <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Хэрэглэгчийн зааврыг харах эсвэл Хэрэглэгчдэд Туслах төвтэй холбоо барина уу."</string>
+    <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM карт түгжигдсэн."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM картны түгжээг гаргаж байна…"</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Та тайлах хээг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Та нууц үгээ <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Та тайлах хээг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та таблетаа тайлахын тулд Google нэвтрэлтээ ашиглах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Та тайлах хээг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол, та таблетаа тайлахын тулд Google нэвтрэлтээ ашиглах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Та таблетыг тайлах гэж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол таблет үйлдвэрийн үндсэн утгаараа тохируулагдах ба хэрэглэгчийн дата бүхэлдээ устана."</string>
+    <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Та утсыг тайлах гэж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол утас үйлдвэрийн үндсэн утгаараа тохируулагдах ба хэрэглэгчийн дата бүхэлдээ устана."</string>
+    <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Та таблетыг <xliff:g id="NUMBER">%d</xliff:g> удаа тайлах гэж буруу оролдлоо. Таблет одоо үйлдвэрийн үндсэн утгаараа тохируулагдах болно."</string>
+    <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Та утсыг тайлах гэж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Утас одоо үйлдвэрийн үндсэн утгаараа тохируулагдах болно."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Хээг мартсан уу?"</string>
+    <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Акаунт тайлах"</string>
+    <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Хээ оруулах оролдлого хэт олон"</string>
+    <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"Түгжээг тайлах бол Google акаунтаараа нэвтэрнэ үү."</string>
+    <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Хэрэглэгч (имэйл)"</string>
+    <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Нууц үг"</string>
+    <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Нэвтрэх"</string>
+    <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Хэрэглэгчийн нэр эсвэл нууц үг буруу."</string>
+    <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"Хэрэглэгчийн нэр нууц үгээ мартсан уу?\n"<b>"google.com/accounts/recovery"</b>"-д зочилно уу."</string>
+    <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Шалгаж байна..."</string>
+    <string name="lockscreen_unlock_label" msgid="737440483220667054">"Тайлах"</string>
+    <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Дуу идэвхтэй"</string>
+    <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Дууг хаагдсан"</string>
+    <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Хээ эхэлж байна"</string>
+    <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Хээ цэвэрлэгдэв"</string>
+    <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Нүд нэмэгдсэн"</string>
+    <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Хээ дуусав"</string>
+    <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d. -н %2$d виджет"</string>
+    <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет нэмэх."</string>
+    <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Хоосон"</string>
+    <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Тайлах хэсэг нээгдсэн."</string>
+    <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Тайлах хэсэг хаагдсан."</string>
+    <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет."</string>
+    <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Хэрэглэгч сонгоч"</string>
+    <string name="keyguard_accessibility_status" msgid="8008264603935930611">"Статус"</string>
+    <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камер"</string>
+    <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Медиа контрол"</string>
+    <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Виджет дахин эрэмбэлж эхлэв."</string>
+    <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Виджетийг дахин эрэмбэлж дуусав."</string>
+    <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет устсан."</string>
+    <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Түгжээгүй хэсгийг өргөсгөх."</string>
+    <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Тайлах гулсуулалт."</string>
+    <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Тайлах хээ."</string>
+    <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Нүүрээр тайлах"</string>
+    <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Тайлах пин."</string>
+    <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Тайлах нууц үг."</string>
+    <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Хээний хэсэг."</string>
+    <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Гулсуулах хэсэг."</string>
+    <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
+    <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string>
+    <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
+    <string name="granularity_label_character" msgid="7336470535385009523">"тэмдэгт"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"үг"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"холбоос"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"Мөр"</string>
+    <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <string name="factorytest_failed" msgid="5410270329114212041">"Үйлдлвэрийн тест бүтэлгүйтэв"</string>
+    <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST үйлдэл нь зөвхөн /system/app-д суусан багцуудад дэмжигдэнэ."</string>
+    <string name="factorytest_no_action" msgid="872991874799998561">"FACTORY_TEST үйлдлийг хангах багц олдсонгүй."</string>
+    <string name="factorytest_reboot" msgid="6320168203050791643">"Дахин асаах"</string>
+    <string name="js_dialog_title" msgid="1987483977834603872">"\"<xliff:g id="TITLE">%s</xliff:g>\" хуудас:"</string>
+    <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
+    <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"Шилжүүлэлтийг бататгах"</string>
+    <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"Энэ хуудсыг орхих"</string>
+    <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Энэ хуудсанд үлдэх"</string>
+    <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nТа үнэхээр энэ хуудаснаас гармаар байна уу?"</string>
+    <string name="save_password_label" msgid="6860261758665825069">"Баталгаажуулах"</string>
+    <string name="double_tap_toast" msgid="4595046515400268881">"Зөвлөмж: Өсгөх бол давхар товшино уу."</string>
+    <string name="autofill_this_form" msgid="4616758841157816676">"Автомат бичих"</string>
+    <string name="setup_autofill" msgid="7103495070180590814">"Автомат дүүргэлтийг тохируулах"</string>
+    <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
+    <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
+    <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
+    <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string>
+    <string name="autofill_province" msgid="2231806553863422300">"Муж"</string>
+    <string name="autofill_postal_code" msgid="4696430407689377108">"Шуудангийн код"</string>
+    <string name="autofill_state" msgid="6988894195520044613">"Муж"</string>
+    <string name="autofill_zip_code" msgid="8697544592627322946">"ZIP код"</string>
+    <string name="autofill_county" msgid="237073771020362891">"Муж"</string>
+    <string name="autofill_island" msgid="4020100875984667025">"Арал"</string>
+    <string name="autofill_district" msgid="8400735073392267672">"Дүүрэг"</string>
+    <string name="autofill_department" msgid="5343279462564453309">"Хэлтэс"</string>
+    <string name="autofill_prefecture" msgid="2028499485065800419">"Муж"</string>
+    <string name="autofill_parish" msgid="8202206105468820057">"Мөргөлч"</string>
+    <string name="autofill_area" msgid="3547409050889952423">"Хэсэг"</string>
+    <string name="autofill_emirate" msgid="2893880978835698818">"Эмират"</string>
+    <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"өөрийн Веб хавчуурга болон түүхийг унших"</string>
+    <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Апп нь Хөтчийн зочилж байсан бүх URL-н түүх болон Хөтчийн бүх хавчуургыг унших боломжтой. Анхаар: Энэ зөвшөөрөл нь гуравдагч талын хөтөч эсвэл вебээр хөтөчлөх чадавхтай аппликешнүүдэд ашиглагдахгүй байх боломжтой."</string>
+    <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"веб хавчуурга болон түүхийг бичих"</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Апп нь таны таблет дээр хадгалагдсан Хөтчийн түүх эсвэл хавчуургыг өөрчлөх боломжтой. Энэ нь апп-д Хөтчийн датаг арилгах эсвэл өөрчлөх боломжийг олгоно. Анхаар: Энэ зөвшөөрөл нь гуравдагч талын хөтөч эсвэл вебээр хөтөчлөх чадвартай аппликешнд ажиллахгүй байх боломжтой."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Апп нь таны утсан дээр хадгалагдсан Хөтчийн түүх эсвэл хавчуургыг өөрчлөх боломжтой. Энэ нь апп-д Хөтчийн датаг арилгах эсвэл өөрчлөх боломжийг олгоно. Анхаар: Энэ зөвшөөрөл нь гуравдагч талын хөтөч эсвэл вебээр хөтөчлөх чадвартай аппликешнд ажиллахгүй байх боломжтой."</string>
+    <string name="permlab_setAlarm" msgid="1379294556362091814">"сэрүүлэг тохируулах"</string>
+    <string name="permdesc_setAlarm" msgid="316392039157473848">"Апп нь суулгагдсан сэрүүлэгний апп дээр сэрүүлэг тохируулах боломжтой. Зарим сэрүүлэгний апп нь энэ функцийг дэмжихгүй байж болзошгүй."</string>
+    <string name="permlab_addVoicemail" msgid="5525660026090959044">"дуут шуудан нэмэх"</string>
+    <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Апп нь таны дуут шуудангийн ирсэн мэйлд мессеж нэмэх боломжтой."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"Хөтчийн геобайршлын зөвшөөрлийг өөрчлөх"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Апп нь Хөтчийн гео байршлын зөвшөөрлийг өөрчлөх боломжтой. Хортой апп нь энийг ашиглан дурын веб хуудасруу байршлын мэдээллийг илгээх боломжтой."</string>
+    <string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"багцийг тулгах"</string>
+    <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Апп нь багцыг суулгаж болох эсэхийг шалгах боломжтой."</string>
+    <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"багц тулгагчтэй холбох"</string>
+    <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Эзэмшигч нь багц тулгагчдад хүсэлт тавих боломжтой. Энгийн апп-д хэрэглэгдэхгүй."</string>
+    <string name="permlab_serialPort" msgid="546083327654631076">"сериал портруу хандах"</string>
+    <string name="permdesc_serialPort" msgid="2991639985224598193">"Эзэмшигч нь SerialManager API ашиглан сериал портод хандах боломжтой."</string>
+    <string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"контент нийлүүлэгчид гаднаас хандах"</string>
+    <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Эзэмшигч нь шелээс контент нийлүүлэгчид хандах боломжтой. Энгийн апп-с хэрэглэхгүй."</string>
+    <string name="permlab_updateLock" msgid="3527558366616680889">"төхөөрөмжийн автомат шинэчлэлтийг хориглох"</string>
+    <string name="permdesc_updateLock" msgid="1655625832166778492">"Эзэмшигч нь төхөөрөмжийг дэвшүүлэхээр хэзээ дахин асаавал тохирох тухай системд мэдээлэл санал болгох боломжтой."</string>
+    <string name="save_password_message" msgid="767344687139195790">"Та хөтчид энэ нууц үгийг сануулах уу?"</string>
+    <string name="save_password_notnow" msgid="6389675316706699758">"Одоо биш"</string>
+    <string name="save_password_remember" msgid="6491879678996749466">"Санах"</string>
+    <string name="save_password_never" msgid="8274330296785855105">"Хэзээ ч үгүй"</string>
+    <string name="open_permission_deny" msgid="7374036708316629800">"Танд энэ хуудсыг нээх зөвшөөрөл байхгүй."</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="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>
+    <string name="search_go" msgid="8298016669822141719">"Хайх"</string>
+    <string name="searchview_description_search" msgid="6749826639098512120">"Хайх"</string>
+    <string name="searchview_description_query" msgid="5911778593125355124">"Хайх асуулга"</string>
+    <string name="searchview_description_clear" msgid="1330281990951833033">"Асуулгыг цэвэрлэх"</string>
+    <string name="searchview_description_submit" msgid="2688450133297983542">"Асуулгыг илгээх"</string>
+    <string name="searchview_description_voice" msgid="2453203695674994440">"Дуут хайлт"</string>
+    <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Хүрч хайх функцийг идэвхтэй болгох уу?"</string>
+    <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> нь Хүрч танихыг идэвхжүүлэхийг шаардаж байна. Хүрч таних идэвхжсэн үед та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба таблеттайгаа дохиогоор харилцах боломжтой."</string>
+    <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> нь Хүрч танихыг идэвхжүүлэхийг шаардаж байна. Хүрч таних идэвхжсэн тохиолдолд та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба утастайгаа дохиогоор харилцах боломжтой."</string>
+    <string name="oneMonthDurationPast" msgid="7396384508953779925">"1 сарын өмнө"</string>
+    <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 сарын өмнө"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one" msgid="4869870056547896011">"1 секундын өмнө"</item>
+    <item quantity="other" msgid="3903706804349556379">"<xliff:g id="COUNT">%d</xliff:g> секундын өмнө"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one" msgid="3306787433088810191">"1 минутын өмнө"</item>
+    <item quantity="other" msgid="2176942008915455116">"<xliff:g id="COUNT">%d</xliff:g> минутын өмнө"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one" msgid="9150797944610821849">"1 цагийн өмнө"</item>
+    <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> цагийн өмнө"</item>
+  </plurals>
+  <plurals name="last_num_days">
+    <item quantity="other" msgid="3069992808164318268">"Сүүлийн <xliff:g id="COUNT">%d</xliff:g> өдөр"</item>
+  </plurals>
+    <string name="last_month" msgid="3959346739979055432">"Сүүлийн сар"</string>
+    <string name="older" msgid="5211975022815554840">"Хуучин"</string>
+  <plurals name="num_days_ago">
+    <item quantity="one" msgid="861358534398115820">"өчигдөр"</item>
+    <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> өдрийн өмнө"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one" msgid="2729745560954905102">"1 секундын дараа"</item>
+    <item quantity="other" msgid="1241926116443974687">"<xliff:g id="COUNT">%d</xliff:g> секундын дараа"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one" msgid="8793095251325200395">"1 минутын дараа"</item>
+    <item quantity="other" msgid="3330713936399448749">"<xliff:g id="COUNT">%d</xliff:g> минутын дараа"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one" msgid="7164353342477769999">"1 цагийн дараа"</item>
+    <item quantity="other" msgid="547290677353727389">"<xliff:g id="COUNT">%d</xliff:g> цагийн дараа"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one" msgid="5413088743009839518">"маргааш"</item>
+    <item quantity="other" msgid="5109449375100953247">"<xliff:g id="COUNT">%d</xliff:g> өдрийн дараа"</item>
+  </plurals>
+  <plurals name="abbrev_num_seconds_ago">
+    <item quantity="one" msgid="1849036840200069118">"1 секундын өмнө"</item>
+    <item quantity="other" msgid="3699169366650930415">"<xliff:g id="COUNT">%d</xliff:g> сек дараа"</item>
+  </plurals>
+  <plurals name="abbrev_num_minutes_ago">
+    <item quantity="one" msgid="6361490147113871545">"1 мин өмнө"</item>
+    <item quantity="other" msgid="851164968597150710">"<xliff:g id="COUNT">%d</xliff:g> минутын өмнө"</item>
+  </plurals>
+  <plurals name="abbrev_num_hours_ago">
+    <item quantity="one" msgid="4796212039724722116">"1 цагийн өмнө"</item>
+    <item quantity="other" msgid="6889970745748538901">"<xliff:g id="COUNT">%d</xliff:g> цагийн өмнө"</item>
+  </plurals>
+  <plurals name="abbrev_num_days_ago">
+    <item quantity="one" msgid="8463161711492680309">"өчигдөр"</item>
+    <item quantity="other" msgid="3453342639616481191">"<xliff:g id="COUNT">%d</xliff:g> өдрийн өмнө"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_seconds">
+    <item quantity="one" msgid="5842225370795066299">"1 сек дараа"</item>
+    <item quantity="other" msgid="5495880108825805108">"<xliff:g id="COUNT">%d</xliff:g> сек дараа"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_minutes">
+    <item quantity="one" msgid="562786149928284878">"1 мин дараа"</item>
+    <item quantity="other" msgid="4216113292706568726">"<xliff:g id="COUNT">%d</xliff:g> минутын дараа"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_hours">
+    <item quantity="one" msgid="3274708118124045246">"1 цагийн дараа"</item>
+    <item quantity="other" msgid="3705373766798013406">"<xliff:g id="COUNT">%d</xliff:g> цагийн дараа"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_days">
+    <item quantity="one" msgid="2178576254385739855">"маргааш"</item>
+    <item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> өдрийн дараа"</item>
+  </plurals>
+    <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>"</string>
+    <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>"</string>
+    <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g>"</string>
+    <string name="day" msgid="8144195776058119424">"өдөр"</string>
+    <string name="days" msgid="4774547661021344602">"өдөр"</string>
+    <string name="hour" msgid="2126771916426189481">"цаг"</string>
+    <string name="hours" msgid="894424005266852993">"цаг"</string>
+    <string name="minute" msgid="9148878657703769868">"мин"</string>
+    <string name="minutes" msgid="5646001005827034509">"минут"</string>
+    <string name="second" msgid="3184235808021478">"сек"</string>
+    <string name="seconds" msgid="3161515347216589235">"сек"</string>
+    <string name="week" msgid="5617961537173061583">"7 хоног"</string>
+    <string name="weeks" msgid="6509623834583944518">"7 хоног"</string>
+    <string name="year" msgid="4001118221013892076">"жил"</string>
+    <string name="years" msgid="6881577717993213522">"жил"</string>
+  <plurals name="duration_seconds">
+    <item quantity="one" msgid="6962015528372969481">"1 секунд"</item>
+    <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> секунд"</item>
+  </plurals>
+  <plurals name="duration_minutes">
+    <item quantity="one" msgid="4915414002546085617">"1 минут"</item>
+    <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> минут"</item>
+  </plurals>
+  <plurals name="duration_hours">
+    <item quantity="one" msgid="8917467491248809972">"1 цаг"</item>
+    <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> цаг"</item>
+  </plurals>
+    <string name="VideoView_error_title" msgid="3534509135438353077">"Видео алдаа"</string>
+    <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Энэ видео энэ төхөөрөмж дээр урсгалаар гарч чадахгүй."</string>
+    <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Энэ видеог тоглуулах боломжгүй."</string>
+    <string name="VideoView_error_button" msgid="2822238215100679592">"Тийм"</string>
+    <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+    <string name="noon" msgid="7245353528818587908">"үд"</string>
+    <string name="Noon" msgid="3342127745230013127">"Үд"</string>
+    <string name="midnight" msgid="7166259508850457595">"шөнө дунд"</string>
+    <string name="Midnight" msgid="5630806906897892201">"Шөнө дунд"</string>
+    <string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll" msgid="6876518925844129331">"Бүгдийг сонгох"</string>
+    <string name="cut" msgid="3092569408438626261">"Таслах"</string>
+    <string name="copy" msgid="2681946229533511987">"Хуулах"</string>
+    <string name="paste" msgid="5629880836805036433">"Буулгах"</string>
+    <string name="replace" msgid="5781686059063148930">"Орлуулах…"</string>
+    <string name="delete" msgid="6098684844021697789">"Устгах"</string>
+    <string name="copyUrl" msgid="2538211579596067402">"URL хуулах"</string>
+    <string name="selectTextMode" msgid="1018691815143165326">"Текст сонгох"</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Текст сонгох"</string>
+    <string name="addToDictionary" msgid="4352161534510057874">"Толь бичигт нэмэх"</string>
+    <string name="deleteText" msgid="6979668428458199034">"Устгах"</string>
+    <string name="inputMethod" msgid="1653630062304567879">"Оруулах арга"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Текст үйлдэл"</string>
+    <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Сангийн хэмжээ дутагдаж байна"</string>
+    <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Зарим систем функц ажиллахгүй байна"</string>
+    <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> ажиллаж байна"</string>
+    <string name="app_running_notification_text" msgid="4653586947747330058">"Илүү мэдээлэл авах бол хүрэх эсвэл апп-г зогсооно уу ."</string>
+    <string name="ok" msgid="5970060430562524910">"Тийм"</string>
+    <string name="cancel" msgid="6442560571259935130">"Цуцлах"</string>
+    <string name="yes" msgid="5362982303337969312">"Тийм"</string>
+    <string name="no" msgid="5141531044935541497">"Цуцлах"</string>
+    <string name="dialog_alert_title" msgid="2049658708609043103">"Анхаар"</string>
+    <string name="loading" msgid="7933681260296021180">"Ачааллаж байна..."</string>
+    <string name="capital_on" msgid="1544682755514494298">"Идэвхтэй"</string>
+    <string name="capital_off" msgid="6815870386972805832">"Идэвхгүй"</string>
+    <string name="whichApplication" msgid="4533185947064773386">"Үйлдлийг дуусгах"</string>
+    <string name="alwaysUse" msgid="4583018368000610438">"Энэ ажиллагааг үндсэн болгох."</string>
+    <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Систем тохиргоо &gt; Апп &gt; Татаж авсан хэсгийн үндсэн утгуудыг цэвэрлэх"</string>
+    <string name="chooseActivity" msgid="7486876147751803333">"Үйлдэл сонгох"</string>
+    <string name="chooseUsbActivity" msgid="6894748416073583509">"USB төхөөрөмжийн апп-г сонгох"</string>
+    <string name="noApplications" msgid="2991814273936504689">"Энэ ажиллагааг гүйцэтгэх апп байхгүй."</string>
+    <string name="aerr_title" msgid="1905800560317137752"></string>
+    <string name="aerr_application" msgid="932628488013092776">"Харамсалтай, <xliff:g id="APPLICATION">%1$s</xliff:g> зогссон."</string>
+    <string name="aerr_process" msgid="4507058997035697579">"Харамсалтай нь <xliff:g id="PROCESS">%1$s</xliff:g> процесс зогссон."</string>
+    <string name="anr_title" msgid="4351948481459135709"></string>
+    <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> хариу өгөхгүй байна.\n\nТа хаамаар байна уу?"</string>
+    <string name="anr_activity_process" msgid="5776209883299089767">"<xliff:g id="ACTIVITY">%1$s</xliff:g> активити хариу өгөхгүй байна.\n\nТа энийг хаах уу?"</string>
+    <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> хариу өгөхгүй байна. Та энийг хаамаар байна уу?"</string>
+    <string name="anr_process" msgid="6513209874880517125">"<xliff:g id="PROCESS">%1$s</xliff:g> процесс хариу өгөхгүй байн.\n\nТа хаамаар байна уу?"</string>
+    <string name="force_close" msgid="8346072094521265605">"Тийм"</string>
+    <string name="report" msgid="4060218260984795706">"Мэдэгдэх"</string>
+    <string name="wait" msgid="7147118217226317732">"Хүлээх"</string>
+    <string name="webpage_unresponsive" msgid="3272758351138122503">"Хуудас хариу өгөхгүй байна.\n\nТа энийг хаах уу?"</string>
+    <string name="launch_warning_title" msgid="1547997780506713581">"Aпп дахин чиглүүлэгдэв"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> одоо ажиллаж байна."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ажиллав."</string>
+    <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Цар хэмжээ"</string>
+    <string name="screen_compat_mode_show" msgid="4013878876486655892">"Байнга харуулах"</string>
+    <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Энийг Системийн тохиргоо &gt; Апп &gt; Татаж авсан дотроос дахин идэвхтэй болгох боломжтой."</string>
+    <string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> апп (<xliff:g id="PROCESS">%2$s</xliff:g> процесс) өөрийнхөө StrictMode бодлогыг зөрчив."</string>
+    <string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> процесс өөрийнхөө StrictMode бодлогыг зөрчив."</string>
+    <string name="android_upgrading_title" msgid="1584192285441405746">"Андройдыг дэвшүүлж байна…"</string>
+    <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>-н <xliff:g id="NUMBER_0">%1$d</xliff:g> апп-г тохируулж байна."</string>
+    <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Апп-г эхлүүлж байна."</string>
+    <string name="android_upgrading_complete" msgid="1405954754112999229">"Эхлэлийг дуусгаж байна."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ажиллаж байна"</string>
+    <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Апп сэлгэх бол хүрнэ үү"</string>
+    <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Апп сэлгэх үү?"</string>
+    <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Та шинэ апп-г ажиллуулахын өмнө зогсоох ёстой өөр апп ажиллаж байна."</string>
+    <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>-руу буцах"</string>
+    <string name="old_app_description" msgid="2082094275580358049">"Шинэ апп-г эхлүүлж болохгүй."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> эхлүүлэх"</string>
+    <string name="new_app_description" msgid="1932143598371537340">"Хуучин апп-г хадгалахгүйгээр зогсооно уу."</string>
+    <string name="sendText" msgid="5209874571959469142">"Текст илгээх үйлдлийг сонгох"</string>
+    <string name="volume_ringtone" msgid="6885421406845734650">"Хонхны аяны хэмжээ"</string>
+    <string name="volume_music" msgid="5421651157138628171">"Медиа дууны хэмжээ"</string>
+    <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Блютүүтээр тоглож байна"</string>
+    <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Хонхны дууг чимээгүй болгов"</string>
+    <string name="volume_call" msgid="3941680041282788711">"Ирсэн дуудлагын дууны хэмжээ"</string>
+    <string name="volume_bluetooth_call" msgid="2002891926351151534">"Блютүүт ирсэн дуудлагын дууны хэмжээ"</string>
+    <string name="volume_alarm" msgid="1985191616042689100">"Сэрүүлгийн дууны хэмжээ"</string>
+    <string name="volume_notification" msgid="2422265656744276715">"Мэдэгдлийн дууны хэмжээ"</string>
+    <string name="volume_unknown" msgid="1400219669770445902">"Дууны хэмжээ"</string>
+    <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Блютүүтын хэмжээ"</string>
+    <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Хонхны дууны хэмжээ"</string>
+    <string name="volume_icon_description_incall" msgid="8890073218154543397">"Дуудлагын дууны хэмжээ"</string>
+    <string name="volume_icon_description_media" msgid="4217311719665194215">"Медиа дууны хэмжээ"</string>
+    <string name="volume_icon_description_notification" msgid="7044986546477282274">"Мэдэгдлийн дууны хэмжээ"</string>
+    <string name="ringtone_default" msgid="3789758980357696936">"Үндсэн хонхны ая"</string>
+    <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Үндсэн хонхны ая (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent" msgid="7937634392408977062">"Алийг нь ч биш"</string>
+    <string name="ringtone_picker_title" msgid="3515143939175119094">"Хонхны ая"</string>
+    <string name="ringtone_unknown" msgid="5477919988701784788">"Үл мэдэгдэх хонхны ая"</string>
+  <plurals name="wifi_available">
+    <item quantity="one" msgid="6654123987418168693">"Wi-Fi сүлжээ ашиглах боломжтой"</item>
+    <item quantity="other" msgid="4192424489168397386">"Wi-Fi сүлжээ ашиглах боломжгүй"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one" msgid="1634101450343277345">"Нээллтэй Wi-Fi сүлжээ ашиглах боломжтой"</item>
+    <item quantity="other" msgid="7915895323644292768">"Нээлттэй Wi-Fi сүлжээ ашиглах боломжтой"</item>
+  </plurals>
+    <string name="wifi_available_sign_in" msgid="4029489716605255386">"Wi-Fi сүлжээнд нэвтэрнэ үү"</string>
+    <string name="network_available_sign_in" msgid="8495155593358054676">"Сүлжээнд нэвтрэх"</string>
+    <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+    <skip />
+    <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-д холбогдож чадсангүй"</string>
+    <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" Интернет холболт муу байна."</string>
+    <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Шууд"</string>
+    <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi Шуудыг эхлүүлнэ үү. Энэ нь Wi-Fi клиент/холболтын цэг унтраана."</string>
+    <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Wi-Fi Шуудыг эхлүүлж чадсангүй."</string>
+    <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Шууд асав"</string>
+    <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Тохируулах бол хүрнэ үү"</string>
+    <string name="accept" msgid="1645267259272829559">"Зөвшөөрөх"</string>
+    <string name="decline" msgid="2112225451706137894">"Татгалзах"</string>
+    <string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Урилга илгээгдсэн"</string>
+    <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Холбох урилга"</string>
+    <string name="wifi_p2p_from_message" msgid="570389174731951769">"Хэнээс:"</string>
+    <string name="wifi_p2p_to_message" msgid="248968974522044099">"Хэнд:"</string>
+    <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Шаардлагатай PIN-г бичнэ үү:"</string>
+    <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+    <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Таблет <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-тэй холбогдох үедээ түр зуур Wi-Fi-с салах болно."</string>
+    <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Утас <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-тай холбогдох үедээ түр зуур Wi-Fi-с салах болно."</string>
+    <string name="select_character" msgid="3365550120617701745">"Тэмдэгт оруулах"</string>
+    <string name="sms_control_title" msgid="7296612781128917719">"SMS мессеж илгээж байна"</string>
+    <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; их хэмжээний SMS мессежийг илгээж байна. Та энэ апп-д үргэлжлүүлэн мессеж илгээхийг зөвшөөрөх үү?"</string>
+    <string name="sms_control_yes" msgid="3663725993855816807">"Зөвшөөрөх"</string>
+    <string name="sms_control_no" msgid="625438561395534982">"Татгалзах"</string>
+    <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; нь &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; уруу мессеж илгээх гэж байна."</string>
+    <string name="sms_short_code_details" msgid="3492025719868078457">"Энэ таны мобайл акаунтад "<font fgcolor="#ffffb060">"төлбөр гаргаж"</font>" болзошгүй."</string>
+    <string name="sms_premium_short_code_details" msgid="5523826349105123687"><font fgcolor="#ffffb060">"Энэ таны мобайл акаунтад төлбөр гаргах болно."</font></string>
+    <string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Илгээх"</string>
+    <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Цуцлах"</string>
+    <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Миний сонголтыг санах"</string>
+    <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"Та дараа энийг Тохиргоо &gt; Апп дотроос солих боломжтой"</string>
+    <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Байнга зөвшөөрөх"</string>
+    <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Хэзээ ч зөвшөөрөхгүй"</string>
+    <string name="sim_removed_title" msgid="6227712319223226185">"SIM карт хасагдсан"</string>
+    <string name="sim_removed_message" msgid="2333164559970958645">"Зөв SIM карт хийгээд дахин асаатал та мобайл сүлжээг ашиглах боломжгүй."</string>
+    <string name="sim_done_button" msgid="827949989369963775">"Дуусгах"</string>
+    <string name="sim_added_title" msgid="3719670512889674693">"SIM карт нэмэгдсэн"</string>
+    <string name="sim_added_message" msgid="6599945301141050216">"Мобайл сүлжээнд хандах бол төхөөрөмжөө дахин асаан уу."</string>
+    <string name="sim_restart_button" msgid="4722407842815232347">"Дахин эхлүүлэх"</string>
+    <string name="time_picker_dialog_title" msgid="8349362623068819295">"Цагийн тохируулах"</string>
+    <string name="date_picker_dialog_title" msgid="5879450659453782278">"Огноо оруулах"</string>
+    <string name="date_time_set" msgid="5777075614321087758">"Тохируулах"</string>
+    <string name="date_time_done" msgid="2507683751759308828">"Дуусгах"</string>
+    <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"ШИНЭ: "</font></string>
+    <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> өгсөн."</string>
+    <string name="no_permissions" msgid="7283357728219338112">"Зөвшөөрөл шаардахгүй"</string>
+    <string name="perm_costs_money" msgid="4902470324142151116">"Энэ таныг төлбөрт оруулж болзошгүй"</string>
+    <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB масс сан"</string>
+    <string name="usb_storage_title" msgid="5901459041398751495">"USB холбогдсон"</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"Та өөрийн компьютертээ USB-р холбогдсон байна. Хэрэв та өөрийн компьютер болон өөрийн Андройдын USB сан хооронд файл хуулах бол доорх товчинд хүрнэ үү."</string>
+    <string name="usb_storage_message" product="default" msgid="805351000446037811">"Та өөрийн компьютертээ USB-р холбогдсон байна. Хэрэв та өөрийн компьютер болон өөрийн Андройдын USB сан хооронд файл хуулах бол доорх товчинд хүрнэ үү."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB санг асаах"</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB санг USB масс сан болгон ашиглахад алдаа гарав."</string>
+    <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"SD картыг USB масс сан болгон ашиглахад алдаа гарав."</string>
+    <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB холбогдсон"</string>
+    <string name="usb_storage_notification_message" msgid="939822783828183763">"Өөрийн компьютер- ээс/луу файл хуулах бол хүрнэ үү"</string>
+    <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB санг унтраах"</string>
+    <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"USB санг унтраах бол хүрнэ үү."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB сан ашиглагдаж байна"</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="4264025280777219521">"USB санг унтраахаас өмнө өөрийн Андройдын SD картыг компьютерээсээ салгана(\"гаргана\") уу."</string>
+    <string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB санг унтраахаас өмнө өөрийн Андройдын SD картыг компьютерээсээ салгана(\"гаргана\") уу."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB санг унтраах"</string>
+    <string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB санг унтраахад алдаа гарав. USB хостоо салгасан эсэхээ шалгаад дахин оролдоно уу."</string>
+    <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USB санг асаах"</string>
+    <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"Хэрэв та USB санг асуувал таны ашиглаж байга зарим апп зогсох ба та USB сангаа унтраатал ашиглах боломжгүй байж болзошгүй."</string>
+    <string name="dlg_error_title" msgid="7323658469626514207">"USB ажиллагаа бүтэлгүйтэв"</string>
+    <string name="dlg_ok" msgid="7376953167039865701">"Тийм"</string>
+    <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Медиа төхөөрөмж болон холбогдов"</string>
+    <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Камер болгон холбов"</string>
+    <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Суулгагч болгон холбогдсон"</string>
+    <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB төхөөрөмжид холбогдов"</string>
+    <string name="usb_notification_message" msgid="2290859399983720271">"Бусад USB сонголт хийх бол хүрнэ үү."</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB санг форматлах уу?"</string>
+    <string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD картыг форматлах уу?"</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"Таны USB санд хадгалагдсан бүх файл арилгагдана. Энэ үйлдлийг буцаах боломжгүй!"</string>
+    <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Таны картан дээрх бүх дата устах болно."</string>
+    <string name="extmedia_format_button_format" msgid="4131064560127478695">"Форматлах"</string>
+    <string name="adb_active_notification_title" msgid="6729044778949189918">"USB дебаг холбогдсон"</string>
+    <string name="adb_active_notification_message" msgid="1016654627626476142">"USB дебаг хийхийг идэвхгүй болгох бол хүрнэ үү."</string>
+    <string name="select_input_method" msgid="4653387336791222978">"Оруулах аргыг сонгоно уу"</string>
+    <string name="configure_input_methods" msgid="9091652157722495116">"Оруулах аргыг тохируулах"</string>
+    <string name="use_physical_keyboard" msgid="6203112478095117625">"Бодит гар"</string>
+    <string name="hardware" msgid="7517821086888990278">"Хардвер"</string>
+    <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Гарын схемийг сонгох"</string>
+    <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Гарын схемийг сонгох бол хүрнэ үү."</string>
+    <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style" msgid="4333913089637062257"><u>"нэр дэвшигч"</u></string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USB санг бэлдэж байна"</string>
+    <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD карт бэлдэж байна"</string>
+    <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Алдааг шалгаж байна."</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Хоосон USB сан"</string>
+    <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Хоосон SD карт"</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="7840121067427269500">"USB сан хоосон эсвэл дэмжигдэхгүй файл системтэй."</string>
+    <string name="ext_media_nofs_notification_message" product="default" msgid="8641065641786923604">"SD карт хоосон эсвэл дэмжигдэхгүй файл систем."</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Гэмтсэн USB сан"</string>
+    <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Гэмтсэн SD карт"</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="1795917578395333280">"USB сан гэмтсэн байна. Дахин форматлаж үзнэ үү."</string>
+    <string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD карт гэмтсэн байна. Дахин форматлаж үзнэ үү."</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB санг санамсаргүй хасагдав"</string>
+    <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD карт санамсаргүй хасагдав"</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Дата хохирлоос сэргийлж USB санг сугалахаасаа өмнө салгаж байна уу."</string>
+    <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Дата хохирлоос сэргийлж SD картыг хасахаасаа өмнө салгаж байна уу."</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB санг салгаж авахад аюулгүй."</string>
+    <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD картыг хасахад аюулгүй"</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"USB санг сугалахад аюулгүй."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"SD картаа салгаж авах аюулгүй."</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Хасагдсан USB сан"</string>
+    <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Сугалсан SD карт"</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB сан сугалагдав. Шинэ медиаг хийнэ үү."</string>
+    <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD карт хасагдав. Шинийг хийнэ үү."</string>
+    <string name="activity_list_empty" msgid="1675388330786841066">"Таарах активити олдсонгүй."</string>
+    <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"компонент ашиглалтын статистикийг шинэчлэх"</string>
+    <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Апп нь компонент хэрэглээний цуглуулагдсан статистикийг өөрчлөх боломжтой. Энгийн апп-д шаардлагагүй."</string>
+    <string name="permlab_copyProtectedData" msgid="4341036311211406692">"контент хуулах"</string>
+    <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Апп нь контентыг хуулах үндсэн контейнер үйлчилгээг дуудах боломжтой. Энгийн апп-д ашиглах боломжгүй."</string>
+    <string name="permlab_route_media_output" msgid="1642024455750414694">"Медиа гаралтыг чиглүүлэх"</string>
+    <string name="permdesc_route_media_output" msgid="4932818749547244346">"Аппликешн нь медиа гаралтыг бусад гадаад төхөөрөмжрүү чиглүүлэх боломжтой."</string>
+    <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Түлхүүр хамгаалах аюулгүй санд хандах"</string>
+    <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Аппликешн нь хамгаалалттай аюулгүй санд хандах боломжтой."</string>
+    <string name="permlab_control_keyguard" msgid="172195184207828387">"Түлхүүр хамгаалалтын харуулах болон далдлахыг удирдах"</string>
+    <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Аппликешн нь түлхүүр хамгаалагчыг удирдах боломжтой."</string>
+    <string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Өсгөх контрол дээр хоёр удаа товшино уу"</string>
+    <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Виджет нэмж чадсангүй."</string>
+    <string name="ime_action_go" msgid="8320845651737369027">"Очих"</string>
+    <string name="ime_action_search" msgid="658110271822807811">"Хайх"</string>
+    <string name="ime_action_send" msgid="2316166556349314424">"Илгээх"</string>
+    <string name="ime_action_next" msgid="3138843904009813834">"Дараах"</string>
+    <string name="ime_action_done" msgid="8971516117910934605">"Дуусгах"</string>
+    <string name="ime_action_previous" msgid="1443550039250105948">"Өмнөх"</string>
+    <string name="ime_action_default" msgid="2840921885558045721">"Ажиллуулах"</string>
+    <string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g> ашиглан \n залгах"</string>
+    <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g> дугаар ашиглан \n харилцагч үүсгэх"</string>
+    <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Дараах нэг буюу түүнээс дээш апп таны акаунтад одоо болон дараа хандах зөвшөөрлийг хүсэж байна."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Та энэ хүсэлтийг зөвшөөрөх үү?"</string>
+    <string name="grant_permissions_header_text" msgid="6874497408201826708">"Хандах хүсэлт"</string>
+    <string name="allow" msgid="7225948811296386551">"Зөвшөөрөх"</string>
+    <string name="deny" msgid="2081879885755434506">"Татгалзах"</string>
+    <string name="permission_request_notification_title" msgid="6486759795926237907">"Зөвшөөрөл хүсэв"</string>
+    <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"<xliff:g id="ACCOUNT">%s</xliff:g> акаунт зөвшөөрөл \n хүссэн"</string>
+    <string name="input_method_binding_label" msgid="1283557179944992649">"Оруулах арга"</string>
+    <string name="sync_binding_label" msgid="3687969138375092423">"Синк"</string>
+    <string name="accessibility_binding_label" msgid="4148120742096474641">"Хандалт"</string>
+    <string name="wallpaper_binding_label" msgid="1240087844304687662">"Ханын зураг"</string>
+    <string name="chooser_wallpaper" msgid="7873476199295190279">"Ханын зураг солих"</string>
+    <string name="notification_listener_binding_label" msgid="2014162835481906429">"Мэдэгдэл сонсогч"</string>
+    <string name="vpn_title" msgid="19615213552042827">"VPN идэвхтэй болов"</string>
+    <string name="vpn_title_long" msgid="6400714798049252294">"VPN-г <xliff:g id="APP">%s</xliff:g> идэвхтэй болгов"</string>
+    <string name="vpn_text" msgid="3011306607126450322">"Сүлжээг удирдах бол хүрнэ үү."</string>
+    <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g>-д холбогдов. Сүлжээг удирдах бол хүрнэ үү."</string>
+    <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Байнгын VPN-д холбогдож байна..."</string>
+    <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Байнга VPN холбоотой"</string>
+    <string name="vpn_lockdown_error" msgid="6009249814034708175">"Байнгын VPN алдаа"</string>
+    <string name="vpn_lockdown_config" msgid="6415899150671537970">"Тохируулах бол хүрнэ үү"</string>
+    <string name="upload_file" msgid="2897957172366730416">"Файл сонгох"</string>
+    <string name="no_file_chosen" msgid="6363648562170759465">"Сонгосон файл байхгүй"</string>
+    <string name="reset" msgid="2448168080964209908">"Бүгдийг цэвэрлэх"</string>
+    <string name="submit" msgid="1602335572089911941">"Илгээх"</string>
+    <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Машины горим идэвхтэй болов"</string>
+    <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Машины горимоос гарах бол хүрнэ үү."</string>
+    <string name="tethered_notification_title" msgid="3146694234398202601">"Модем болгох эсвэл идэвхтэй цэг болгох"</string>
+    <string name="tethered_notification_message" msgid="6857031760103062982">"Тохируулах бол хүрнэ үү."</string>
+    <string name="back_button_label" msgid="2300470004503343439">"Буцах"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Дараах"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Алгасах"</string>
+    <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Мобайл дата хэрэглээ өндөр"</string>
+    <string name="throttle_warning_notification_message" msgid="3340822228599337743">"Мобайл дата хэрэглээний талаар дэлгэрэнгүй үзэх бол хүрнэ үү"</string>
+    <string name="throttled_notification_title" msgid="6269541897729781332">"Мобайл дата хязгаар хэтрэв"</string>
+    <string name="throttled_notification_message" msgid="5443457321354907181">"Мобайл дата хэрэглээний талаар дэлгэрэнгүй үзэх бол хүрнэ үү"</string>
+    <string name="no_matches" msgid="8129421908915840737">"Илэрц алга"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Хуудаснаас олох"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 утга"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="TOTAL">%d</xliff:g>-н <xliff:g id="INDEX">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Дуусгах"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="3923810448507612746">"USB санг салгаж байна…"</string>
+    <string name="progress_unmounting" product="default" msgid="1327894998409537190">"SD картыг салгаж байна…"</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB санг арилгаж байна…"</string>
+    <string name="progress_erasing" product="default" msgid="6596988875507043042">"SD картыг цэвэрлэж байна…"</string>
+    <string name="format_error" product="nosdcard" msgid="6299769563624776948">"USB санг арилгаж чадсангүй."</string>
+    <string name="format_error" product="default" msgid="7315248696644510935">"SD картыг арилгаж чадсангүй."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"SD картыг салгалгүйгээр хассан байна."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB санг одоо шалгаж байна."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"SD картыг одоо шалгаж байна."</string>
+    <string name="media_removed" msgid="7001526905057952097">"SD картыг сугалсан байна."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"USB санг одоо компьютерээс ашиглаж байна."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"USB санг одоо компьютерээс ашиглаж байна."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Гадаад медиа үл мэдэгдэх статустай байна."</string>
+    <string name="share" msgid="1778686618230011964">"Хуваалцах"</string>
+    <string name="find" msgid="4808270900322985960">"Олох"</string>
+    <string name="websearch" msgid="4337157977400211589">"Веб хайлт"</string>
+    <string name="find_next" msgid="5742124618942193978">"Дараагийнхыг хайх"</string>
+    <string name="find_previous" msgid="2196723669388360506">"Өмнөхөөс олох"</string>
+    <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g>-н байршлын хүсэлт"</string>
+    <string name="gpsNotifTitle" msgid="5446858717157416839">"Байршлын хүсэлт"</string>
+    <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) хүсэлт илгээсэн"</string>
+    <string name="gpsVerifYes" msgid="2346566072867213563">"Тийм"</string>
+    <string name="gpsVerifNo" msgid="1146564937346454865">"Үгүй"</string>
+    <string name="sync_too_many_deletes" msgid="5296321850662746890">"Устгах хязгаар хэтрэв"</string>
+    <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>-р <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> акаунтын <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> зүйл устсан . Та юу хиймээр байна?"</string>
+    <string name="sync_really_delete" msgid="2572600103122596243">"Устгах"</string>
+    <string name="sync_undo_deletes" msgid="2941317360600338602">"Устгасныг буцаах"</string>
+    <string name="sync_do_nothing" msgid="3743764740430821845">"Одоо юу ч хийхгүй"</string>
+    <string name="choose_account_label" msgid="5655203089746423927">"Акаунт сонгох"</string>
+    <string name="add_account_label" msgid="2935267344849993553">"Акаунт нэмэх"</string>
+    <string name="add_account_button_label" msgid="3611982894853435874">"Аккаунт нэмэх"</string>
+    <string name="number_picker_increment_button" msgid="2412072272832284313">"Өсөх"</string>
+    <string name="number_picker_decrement_button" msgid="476050778386779067">"Бууруулах"</string>
+    <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> хүрээд барина уу."</string>
+    <string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Өсгөх бол дээшээ бууруулах бол доошоо гулсуулна уу."</string>
+    <string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Минут өсгөх"</string>
+    <string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Минутыг бууруулах"</string>
+    <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Цаг өсгөх"</string>
+    <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Цаг бууруулах"</string>
+    <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM тохируулах"</string>
+    <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM тохируулах"</string>
+    <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Сар өсгөх"</string>
+    <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Сарыг бууруулах"</string>
+    <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Өдөр өсгөх"</string>
+    <string name="date_picker_decrement_day_button" msgid="4131881521818750031">"Өдрийг бууруулах"</string>
+    <string name="date_picker_increment_year_button" msgid="6318697384310808899">"Жилийг өсгөх"</string>
+    <string name="date_picker_decrement_year_button" msgid="4482021813491121717">"Жил бууруулах"</string>
+    <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
+    <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Цуцлах"</string>
+    <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Устгах"</string>
+    <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Дуусгах"</string>
+    <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Горим өөрчлөх"</string>
+    <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Шифт"</string>
+    <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Оруулах"</string>
+    <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Апп сонгох"</string>
+    <string name="shareactionprovider_share_with" msgid="806688056141131819">"Хуваалцах"</string>
+    <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-тай хуваалцана уу"</string>
+    <string name="content_description_sliding_handle" msgid="415975056159262248">"Бариулыг гулсуулна. Хүрээд хүлээнэ."</string>
+    <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г гулсуулах."</string>
+    <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол доош гулсуулах."</string>
+    <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх зүүнлүү гулсуулах."</string>
+    <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол баруунлуу гулсуулах."</string>
+    <string name="description_target_unlock" msgid="2228524900439801453">"Тайлах"</string>
+    <string name="description_target_camera" msgid="969071997552486814">"Камер"</string>
+    <string name="description_target_silent" msgid="893551287746522182">"Чимээгүй"</string>
+    <string name="description_target_soundon" msgid="30052466675500172">"Дуунууд идэвхтэй"</string>
+    <string name="description_target_search" msgid="3091587249776033139">"Хайх"</string>
+    <string name="description_target_unlock_tablet" msgid="3833195335629795055">"Түгжээг тайлах бол татна уу"</string>
+    <string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Нууц үгний дуудлагыг сонсох бол чихэвчийг залгана уу."</string>
+    <string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Цэг."</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Нүүр хуудасруу шилжих"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Дээш шилжих"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Нэмэлт сонголтууд"</string>
+    <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
+    <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string>
+    <string name="storage_internal" msgid="4891916833657929263">"Дотоод сан"</string>
+    <string name="storage_sd_card" msgid="3282948861378286745">"SD карт"</string>
+    <string name="storage_usb" msgid="3017954059538517278">"USB сан"</string>
+    <string name="extract_edit_menu_button" msgid="8940478730496610137">"Засах"</string>
+    <string name="data_usage_warning_title" msgid="1955638862122232342">"Дата хэрэглээний анхааруулга"</string>
+    <string name="data_usage_warning_body" msgid="2814673551471969954">"Ашиглалт болон тохиргоог харах бол хүрнэ үү."</string>
+    <string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G дата идэвхгүй болов"</string>
+    <string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G дата идэвхгүй байна"</string>
+    <string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Мобайл дата идэвхгүй"</string>
+    <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Wi-Fi дата идэвхгүй"</string>
+    <string name="data_usage_limit_body" msgid="3317964706973601386">"Идэвхжүүлэх бол хүрнэ үү."</string>
+    <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G дата хязгаар хэтрэв"</string>
+    <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G дата хязгаар хэтрэв"</string>
+    <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Мобайл дата хязгаар хэтрэв"</string>
+    <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi дата хязгаар хэтрэв"</string>
+    <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> заасан хязгаарыг давав."</string>
+    <string name="data_usage_restricted_title" msgid="5965157361036321914">"Арын дата хязгаарлагдсан"</string>
+    <string name="data_usage_restricted_body" msgid="6741521330997452990">"Хязгаарлалтыг хасах бол хүрнэ үү."</string>
+    <string name="ssl_certificate" msgid="6510040486049237639">"Аюулгүй сертификат"</string>
+    <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Сертификат хүчинтэй."</string>
+    <string name="issued_to" msgid="454239480274921032">"Гаргуулсан:"</string>
+    <string name="common_name" msgid="2233209299434172646">"Ерөнхий нэр:"</string>
+    <string name="org_name" msgid="6973561190762085236">"Байгууллага:"</string>
+    <string name="org_unit" msgid="7265981890422070383">"Байгууллагын нэгж:"</string>
+    <string name="issued_by" msgid="2647584988057481566">"Гаргасан:"</string>
+    <string name="validity_period" msgid="8818886137545983110">"Хүчинтэй байх:"</string>
+    <string name="issued_on" msgid="5895017404361397232">"Гаргасан:"</string>
+    <string name="expires_on" msgid="3676242949915959821">"Хүртэл хүчинтэй:"</string>
+    <string name="serial_number" msgid="758814067660862493">"Сериал дугаар:"</string>
+    <string name="fingerprints" msgid="4516019619850763049">"Хурууны хээ:"</string>
+    <string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 хурууны хээ:"</string>
+    <string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 хурууны хээ:"</string>
+    <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Бүгдийг харах"</string>
+    <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Активити сонгох"</string>
+    <string name="share_action_provider_share_with" msgid="5247684435979149216">"Хуваалцах"</string>
+    <string name="status_bar_device_locked" msgid="3092703448690669768">"Төхөөрөмж түгжигдсэн."</string>
+    <string name="list_delimeter" msgid="3975117572185494152">", "</string>
+    <string name="sending" msgid="3245653681008218030">"Илгээж байна ..."</string>
+    <string name="launchBrowserDefault" msgid="2057951947297614725">"Хөтөч ажиллуулах уу?"</string>
+    <string name="SetupCallDefault" msgid="5834948469253758575">"Дуудлагыг зөвшөөрөх үү?"</string>
+    <string name="activity_resolver_use_always" msgid="8017770747801494933">"Байнга"</string>
+    <string name="activity_resolver_use_once" msgid="2404644797149173758">"Нэг удаа"</string>
+    <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Таблет"</string>
+    <string name="default_audio_route_name" product="default" msgid="4239291273420140123">"Утас"</string>
+    <string name="default_audio_route_name_headphones" msgid="8119971843803439110">"Чихэвч"</string>
+    <string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"Чанга яригчийг суулгах"</string>
+    <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
+    <string name="default_audio_route_category_name" msgid="3722811174003886946">"Систем"</string>
+    <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Блютүүт аудио"</string>
+    <string name="wireless_display_route_description" msgid="9070346425023979651">"Утасгүй дэлгэц"</string>
+    <string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Дууссан"</string>
+    <string name="media_route_button_content_description" msgid="5758553567065145276">"Медиа гаралт"</string>
+    <string name="media_route_status_scanning" msgid="7279908761758293783">"Скан хийж байна..."</string>
+    <string name="media_route_status_connecting" msgid="6422571716007825440">"Холбогдож байна..."</string>
+    <string name="media_route_status_available" msgid="6983258067194649391">"Боломжтой"</string>
+    <string name="media_route_status_not_available" msgid="6739899962681886401">"Боломжгүй"</string>
+    <string name="media_route_status_in_use" msgid="4533786031090198063">"Ашиглаж байгаа"</string>
+    <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Үндсэн дэлгэц"</string>
+    <string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI Дэлгэц"</string>
+    <string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Давхарга #<xliff:g id="ID">%1$d</xliff:g>"</string>
+    <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
+    <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", найдвартай"</string>
+    <string name="wifi_display_notification_title" msgid="2223050649240326557">"Утасгүй дэлгэц холбогдов"</string>
+    <string name="wifi_display_notification_message" msgid="4498802012464170685">"Энэ дэлгэц өөр төхөөрөмжийг харуулж байна"</string>
+    <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Салгах"</string>
+    <string name="kg_emergency_call_label" msgid="684946192523830531">"Яаралтай дуудлага"</string>
+    <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Хээг мартсан"</string>
+    <string name="kg_wrong_pattern" msgid="1850806070801358830">"Буруу хээ"</string>
+    <string name="kg_wrong_password" msgid="2333281762128113157">"Нууц үг буруу"</string>
+    <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN буруу"</string>
+    <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="kg_pattern_instructions" msgid="398978611683075868">"Хээг зурах"</string>
+    <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN оруулна уу"</string>
+    <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN оруулна уу"</string>
+    <string name="kg_password_instructions" msgid="5753646556186936819">"Нууц үгээ оруулна уу"</string>
+    <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM идэвхгүй байна. Үргэлжлүүлэх бол PUK кодыг оруулна уу. Дэлгэрэнгүй мэдээллийг оператороос асууна ууу"</string>
+    <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"Хүссэн PIN кодоо оруулна уу"</string>
+    <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"Хүссэн PIN кодоо дахин оруулна уу"</string>
+    <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM картны түгжээг гаргаж байна…"</string>
+    <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"Буруу PIN код."</string>
+    <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4-8 тооноос бүтэх PIN-г бичнэ үү."</string>
+    <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK код 8-с цөөнгүй тооноос бүтнэ."</string>
+    <string name="kg_invalid_puk" msgid="3638289409676051243">"Зөв PUK кодыг дахин оруулна уу. Давтан оролдвол SIM нь бүрмөсөн идэвхгүй болгоно."</string>
+    <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN кодууд таарахгүй байна"</string>
+    <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Хээ оруулах оролдлого хэт олон"</string>
+    <string name="kg_login_instructions" msgid="1100551261265506448">"Түгжээг тайлах бол Google акаунтаараа нэвтэрнэ үү."</string>
+    <string name="kg_login_username_hint" msgid="5718534272070920364">"Хэрэглэгчийн нэр (имэйл)"</string>
+    <string name="kg_login_password_hint" msgid="9057289103827298549">"Нууц үг"</string>
+    <string name="kg_login_submit_button" msgid="5355904582674054702">"Нэвтрэх"</string>
+    <string name="kg_login_invalid_input" msgid="5754664119319872197">"Хэрэглэгчийн нэр эсвэл нууц үг буруу."</string>
+    <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Хэрэглэгчийн нэр нууц үгээ мартсан уу?\n"<b>"google.com/accounts/recovery"</b>"-д зочилно уу."</string>
+    <string name="kg_login_checking_password" msgid="1052685197710252395">"Акаунт шалгаж байна…"</string>
+    <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Та тайлах хээг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Та таблетыг тайлах гэж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол таблет үйлдвэрийн үндсэн утгаараа тохируулагдах ба хэрэглэгчийн дата бүхэлдээ устана."</string>
+    <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Та утсыг тайлах гэж <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу оролдлоо. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оролдвол утас үйлдвэрийн үндсэн утгаараа тохируулагдах ба хэрэглэгчийн дата бүхэлдээ устана."</string>
+    <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Та таблетыг тайлах гэж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Таблет одоо үйлдвэрийн үндсэн утгаараа тохируулагдах болно."</string>
+    <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Та утсыг тайлах гэж <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оролдлоо. Утас одоо үйлдвэрийн үндсэн утгаараа тохируулагдах болно."</string>
+    <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Та тайлах хээг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та таблетаа тайлахын тулд имэйл акаунт шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Та тайлах хээг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та утсаа тайлахын тулд имэйл акаунтаа ашиглах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
+    <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
+    <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Устгах"</string>
+    <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Дууг санал болгосон дээд төвшинөөс өсгөх үү. \n Өндөр дуугаар урт хугацаанд сонсох нь таны сонсголд хортой."</string>
+    <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Хялбар горимыг идэвхжүүлэх бол хоёр хуруугаараа доошлуулаад хүлээнэ үү."</string>
+    <string name="accessibility_enabled" msgid="1381972048564547685">"Хялбаршуулсан горим идэвхжив."</string>
+    <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Хандалт цуцлагдсан."</string>
+    <string name="user_switched" msgid="3768006783166984410">"Одоогийн хэрэглэгч <xliff:g id="NAME">%1$s</xliff:g>."</string>
+    <string name="owner_name" msgid="2716755460376028154">"Эзэмшигч"</string>
+    <string name="error_message_title" msgid="4510373083082500195">"Алдаа"</string>
+    <string name="app_no_restricted_accounts" msgid="5739463249673727736">"Энэ аппликешн хязгаарлагдсан профайлын акаунтыг дэмжихгүй."</string>
+    <string name="app_not_found" msgid="3429141853498927379">"Энэ ажиллагааг зохицуулах аппликешн олдсонгүй."</string>
+    <string name="revoke" msgid="5404479185228271586">"Цуцлах"</string>
+    <string name="mediaSize_iso_a0" msgid="7875427489420821793">"ISO A0"</string>
+    <string name="mediaSize_iso_a1" msgid="3760734499050875356">"ISO A1"</string>
+    <string name="mediaSize_iso_a2" msgid="5973266378020144382">"ISO A2"</string>
+    <string name="mediaSize_iso_a3" msgid="1373407105687300884">"ISO A3"</string>
+    <string name="mediaSize_iso_a4" msgid="6689772807982597254">"ISO A4"</string>
+    <string name="mediaSize_iso_a5" msgid="5353549652015741040">"ISO A5"</string>
+    <string name="mediaSize_iso_a6" msgid="8585038048674911907">"ISO A6"</string>
+    <string name="mediaSize_iso_a7" msgid="6641836716963839119">"ISO A7"</string>
+    <string name="mediaSize_iso_a8" msgid="7571139437465693355">"ISO A8"</string>
+    <string name="mediaSize_iso_a9" msgid="1378455891957115079">"ISO A9"</string>
+    <string name="mediaSize_iso_a10" msgid="2480747457429475344">"ISO A10"</string>
+    <string name="mediaSize_iso_b0" msgid="3965935097661108039">"ISO B0"</string>
+    <string name="mediaSize_iso_b1" msgid="2505753285010115437">"ISO B1"</string>
+    <string name="mediaSize_iso_b2" msgid="8763874709859458453">"ISO B2"</string>
+    <string name="mediaSize_iso_b3" msgid="4210506688191764076">"ISO B3"</string>
+    <string name="mediaSize_iso_b4" msgid="5749404165888526034">"ISO B4"</string>
+    <string name="mediaSize_iso_b5" msgid="7640627414621904733">"ISO B5"</string>
+    <string name="mediaSize_iso_b6" msgid="7342988864712748544">"ISO B6"</string>
+    <string name="mediaSize_iso_b7" msgid="5069844065235382429">"ISO B7"</string>
+    <string name="mediaSize_iso_b8" msgid="7316818922278779774">"ISO B8"</string>
+    <string name="mediaSize_iso_b9" msgid="5414727094026532341">"ISO B9"</string>
+    <string name="mediaSize_iso_b10" msgid="5251253731832048185">"ISO B10"</string>
+    <string name="mediaSize_iso_c0" msgid="4003138342671964217">"ISO C0"</string>
+    <string name="mediaSize_iso_c1" msgid="1935188063393553008">"ISO C1"</string>
+    <string name="mediaSize_iso_c2" msgid="3197307969712069904">"ISO C2"</string>
+    <string name="mediaSize_iso_c3" msgid="4335826087321913508">"ISO C3"</string>
+    <string name="mediaSize_iso_c4" msgid="3745639598281015005">"ISO C4"</string>
+    <string name="mediaSize_iso_c5" msgid="8269457765822791013">"ISO C5"</string>
+    <string name="mediaSize_iso_c6" msgid="566666105260346930">"ISO C6"</string>
+    <string name="mediaSize_iso_c7" msgid="8678413180782608498">"ISO C7"</string>
+    <string name="mediaSize_iso_c8" msgid="8392376206627041730">"ISO C8"</string>
+    <string name="mediaSize_iso_c9" msgid="9191613372324845405">"ISO C9"</string>
+    <string name="mediaSize_iso_c10" msgid="7327709699184920822">"ISO C10"</string>
+    <string name="mediaSize_na_letter" msgid="4191805615829472953">"Letter"</string>
+    <string name="mediaSize_na_gvrnmt_letter" msgid="7853382192649405507">"Government Letter"</string>
+    <string name="mediaSize_na_legal" msgid="6697982988283823150">"Legal"</string>
+    <string name="mediaSize_na_junior_legal" msgid="3727743969902758948">"Junior Legal"</string>
+    <string name="mediaSize_na_ledger" msgid="281871464896601236">"Ledger"</string>
+    <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
+    <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Цуцлагдсан"</string>
+    <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Контентыг бичих явцад алдаа гарсан"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"тодорхойгүй"</string>
+    <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN оруулна уу"</string>
+    <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Одоогийн PIN"</string>
+    <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Шинэ PIN"</string>
+    <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Шинэ PIN-г баталгаажуулах"</string>
+    <string name="restr_pin_create_pin" msgid="8017600000263450337">"Өөрчлөлтийг хязгаарлахад зориулан PIN үүсгэх"</string>
+    <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN таарахгүй байна. Дахин оролдоно уу."</string>
+    <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN хэт богино байна. Хамгийн багадаа 4 цифртэй байх ёстой."</string>
+  <plurals name="restr_pin_countdown">
+    <item quantity="one" msgid="4835639969503729874">"Буруу PIN. 1 секундын дараа дахин оролдоно уу."</item>
+    <item quantity="other" msgid="8030607343223287654">"Буруу PIN. <xliff:g id="COUNT">%d</xliff:g> секундын дараа дахин оролдоно уу."</item>
+  </plurals>
+    <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Баганыг харуулахын тулд дэлгэцийн ирмэгийг шудрана уу"</string>
+    <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Системийн баганыг гаргахын тулд дэлгэцийн ирмэгээс шудрана уу"</string>
+</resources>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index 9031a79..0088f44 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan yang boleh diakses. Tidak sekali-kali diperlukan untuk apl biasa."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"terikat kepada perkhidmatan cetakan"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan cetakan. Tidak sekali-kali diperlukan untuk apl biasa."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"akses semua kerja cetakan"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Membenarkan pemegang mengakses kerja cetakan yang dibuat oleh apl lain. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"terikat kepada perkhidmatan penspul cetakan"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan penspul cetakan. Tidak sekali-kali diperlukan untuk apl biasa."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"terikat kepada perkhidmatan NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Membenarkan pemegang untuk terikat kepada aplikasi yang mengikut kad NFC. Tidak sekali-kali diperlukan untuk apl normal."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"terikat kepada perkhidmatan teks"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Dibatalkan"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Ralat menulis kandungan"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"tidak diketahui"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Masukkan PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN semasa"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN baharu"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 3e20e6e..ba81a46 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Gir innehaveren tillatelse til å bindes til det øverste nivået av grensesnittet for en tilgjengelighetstjeneste. Skal aldri være nødvendig for vanlige apper."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"binding til en utskriftstjeneste"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Gir innehaveren tillatelse til å binde til toppnivået av brukergrensesnittet for en utskriftstjeneste. Dette skal ikke være nødvendig for vanlige apper."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"tilgang til alle utskriftsjobber"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Gir innehaveren tillatelse til å åpne utskriftsjobber som er opprettet av andre apper. Dette skal ikke være nødvendig for vanlige apper."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"binde til en tjeneste for utskriftskø"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Gir innehaveren tillatelse til å binde til toppnivået av brukergrensesnittet for en tjeneste for utskriftskø. Dette skal ikke være nødvendig for vanlige apper."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"binding til NFC-tjenesten"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Tillater eieren å binde seg til apper som emulerer NFC-kort. Skal aldri være nødvendig for vanlige apper."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"binde til en teksttjeneste"</string>
@@ -415,7 +415,7 @@
     <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Lar appen endre hvorvidt en komponent i en annen app er aktivert eller ikke. Ondsinnede apper kan bruke dette til å deaktivere viktige nettbrettfunksjoner. Denne tillatelsen må brukes med forsiktighet, ettersom det er mulig å få appkomponenter inn i en ubrukelig, inkonsistent eller ustabil tilstand."</string>
     <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Lar appen endre hvorvidt en komponent i en annen app er aktivert eller ikke. Ondsinnede apper kan bruke dette til å deaktivere viktige telefonfunksjoner. Denne tillatelsen må brukes med forsiktighet, ettersom det er mulig å få appkomponenter inn i en ubrukelig, inkonsistent eller ustabil tilstand."</string>
     <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"gi eller trekke tilbake tillatelser"</string>
-    <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Lar programmer gi eller trekke tilbake spesielle tillatelser for eget bruk eller for andre programmer. Skadelige programmer kan bruke dette for å få tilgang til funksjoner de ikke skal ha tilgang til."</string>
+    <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Lar apper gi eller trekke tilbake spesielle tillatelser for eget bruk eller for andre apper. Skadelige apper kan bruke dette for å få tilgang til funksjoner de ikke skal ha tilgang til."</string>
     <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"angi foretrukne apper"</string>
     <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Lar appen endre de foretrukne appene dine. Ondsinnede apper kan ubemerket endre apper som kjøres, og forfalske eksisterende apper til å samle private data fra deg."</string>
     <string name="permlab_writeSettings" msgid="2226195290955224730">"endre systeminnstillingene"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Kansellert"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Feil under skriving av innhold"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"ukjent"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Skriv inn PIN-koden"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Gjeldende PIN-kode:"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Ny PIN-kode"</string>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index bd8dece3..e00d0af 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"एक पहुँच सेवाको उच्च स्तरको कुराकानीलाई पक्का गर्नको लागि समाती राख्नेले अनुमति दिन्छ। साधारण अनुप्रयोगहरूलाई कहिल्यै आवश्यक पर्ने छैन।"</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"एउटा प्रिन्ट सेवासँग जोड्नुहोस्"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"एउटा प्रिन्ट सेवाको उच्च स्तरको इन्टरफेसलाई पक्का गर्नको लागि प्रयोगकर्तालाई अनुमति दिन्छ। साधारण अनुप्रयोगहरूलाई कहिल्यै आवश्यक पर्ने छैन।"</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"सबै प्रिन्ट कार्यहरूको पहुँच गर्नुहोस्"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"प्रयोगकर्तालाई अन्य अनुप्रयोगद्वारा निर्मित प्रिन्ट कार्यहरू पहुँच गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूलाई कहिल्यै आवश्यक पर्ने छैन।"</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"प्रिन्ट स्पुलर सेवासँग बाध्नुहोस्"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"प्रिन्ट स्पुलर सेवाको शीर्ष तह इन्टर्फेसलाई बाहकसँग बाँध्न अनुमति दिन्छ। सामान्य अनुप्रयोगलाई कहिल्यै पनि आवाश्यक नपर्न सक्छ।"</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC सेवामा बाँध्नुहोस्"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"NFC कार्डहरू इमुलेट गर्ने अनुप्रयोगहरूलाई बाँध्नका लागि होल्डरलाई अनुमति दिन्छ। सामान्य अनुप्रयोगहरूका लागि कहिल्यै पनि आवश्यक पर्दैन।"</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"एउटा पाठ सेवासँग संगठित हुनुहोस्"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"रद्द गरियो"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामाग्री लेखनमा त्रुटि"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"अज्ञात"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN प्रविष्टि गर्नुहोस्"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"वर्तमान PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"नयाँ PIN"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 20a3f99..1ae4607 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Hiermee wordt de houder toegestaan verbinding te maken met de hoofdinterface van een toegankelijkheidsservice. Nooit vereist voor normale apps."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"koppelen aan een afdrukservice"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Hiermee kan de houder verbinding maken met de hoofdinterface van een afdrukservice. Nooit vereist voor normale apps."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"toegang krijgen tot alle afdruktaken"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Hiermee kan de houder toegang krijgen tot afdruktaken die zijn gemaakt door een andere app. Nooit vereist voor normale apps."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"koppelen aan een afdrukspoolerservice"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Hiermee kan de houder verbinding maken met de hoofdinterface van een afdrukspoolerservice. Nooit vereist voor normale apps."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"koppelen aan NFC-service"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Hiermee kan de houder apps koppelen die NFC-kaarten emuleren. Nooit vereist voor normale apps."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"koppelen aan een sms-service"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Geannuleerd"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Fout bij schrijven van inhoud"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"onbekend"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Geef de pincode op"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Huidige pincode"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nieuwe pincode"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index d4be6ba..ade7c405 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Zezwala na tworzenie powiązania z interfejsem najwyższego poziomu usługi ułatwień dostępu. Nieprzeznaczone dla zwykłych aplikacji."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"tworzenie powiązania z usługą drukowania"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Zezwala na tworzenie powiązania z interfejsem najwyższego poziomu usługi drukowania. Nieprzeznaczone dla zwykłych aplikacji."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"dostęp do wszystkich zadań drukowania"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Zezwala na dostęp do zadań drukowania utworzonych przez inną aplikację. Nieprzeznaczone dla zwykłych aplikacji."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"tworzenie powiązania z usługą buforowania wydruku"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Zezwala na tworzenie powiązania z interfejsem najwyższego poziomu usługi buforowania wydruku. Nieprzeznaczone dla zwykłych aplikacji."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"powiązanie z usługą NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Umożliwia właścicielowi powiązanie z aplikacjami emulującymi karty NFC. Nie powinno być nigdy potrzebne w normalnych aplikacjach."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"tworzenie powiązania z usługą tekstową"</string>
@@ -442,7 +442,7 @@
     <string name="permlab_writeCallLog" msgid="8552045664743499354">"zapisywanie rejestru połączeń"</string>
     <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Zezwala aplikacji na modyfikowanie rejestru połączeń tabletu, w tym danych o połączeniach przychodzących i wychodzących. Złośliwe aplikacje mogą wykorzystać tę możliwość, by wyczyścić lub zmodyfikować rejestr połączeń."</string>
     <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Zezwala aplikacji na modyfikowanie rejestru połączeń telefonu, w tym danych o połączeniach przychodzących i wychodzących. Złośliwe aplikacje mogą wykorzystać tę możliwość, by wyczyścić lub zmodyfikować rejestr połączeń."</string>
-    <string name="permlab_readProfile" msgid="4701889852612716678">"odczyt własnej karty kontaktu"</string>
+    <string name="permlab_readProfile" msgid="4701889852612716678">"odczytywanie własnej karty kontaktu"</string>
     <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Pozwala aplikacji na odczyt osobistych informacji przechowywanych w Twoim profilu na urządzeniu (np. imienia i nazwiska lub adresu). Oznacza to, że aplikacja może Cię zidentyfikować i wysłać informacje z Twojego profilu do innych osób."</string>
     <string name="permlab_writeProfile" msgid="907793628777397643">"zmiana własnej karty kontaktu"</string>
     <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Pozwala aplikacji na zmianę lub dodanie osobistych informacji przechowywanych w Twoim profilu na urządzeniu (np. imienia i nazwiska lub adresu). Oznacza to, że aplikacja może Cię zidentyfikować i wysłać informacje z Twojego profilu do innych osób."</string>
@@ -597,7 +597,7 @@
     <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Pozwala aplikacji na konfigurowanie lokalnego telefonu z funkcją Bluetooth oraz na wykrywanie urządzeń zdalnych i parowanie z nimi."</string>
     <string name="permlab_accessWimaxState" msgid="4195907010610205703">"łączenie się i rozłączanie z siecią WiMAX"</string>
     <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Pozawala aplikacji określić, czy obsługa WiMAX jest włączona, oraz uzyskać informacje o wszystkich podłączonych sieciach WiMAX."</string>
-    <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Zmień stan WiMAX"</string>
+    <string name="permlab_changeWimaxState" msgid="2405042267131496579">"zmienianie stanu WiMAX"</string>
     <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Pozwala aplikacji na nawiązywanie i kończenie połączeń z sieciami WiMAX w tablecie."</string>
     <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Pozwala aplikacji na nawiązywanie i kończenie połączeń z sieciami WiMAX w telefonie."</string>
     <string name="permlab_bluetooth" msgid="6127769336339276828">"parowanie z urządzeniami Bluetooth"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Anulowane"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Błąd podczas zapisu treści"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"brak informacji"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Podaj PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Bieżący PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nowy PIN"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index cd26fc7..810b5b3 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite que o titular vincule a interface de nível superior de um serviço de acessibilidade. Nunca deverá ser necessário para aplicações normais."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"vincular a um serviço de impressão"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permite que o titular vincule a interface de nível superior de um serviço de impressão. Nunca deverá ser necessário para aplicações normais."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"aceder a todas as tarefas de impressão"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Permite que o titular aceda a tarefas de impressão criadas por outra aplicação. Nunca deverá ser necessário para aplicações normais."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"vincular a um serviço spooler de impressão"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permite que o titular vincule a interface de nível superior de um serviço spooler de impressão. Nunca deverá ser necessário para aplicações normais."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"vincular a serviço NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permite ao titular vincular a aplicações que recriam cartões NFC. Nunca deverá ser necessário para aplicações normais."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"vincular a um serviço de texto"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelada"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Erro ao escrever conteúdo"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"desconhecido"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Introduzir PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN Atual"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Novo PIN"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 22c5774..f457e21 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite que o proprietário use a interface de nível superior de um serviço de acessibilidade. Nunca deve ser necessário para aplicativos comuns."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"associar a um serviço de impressão"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permite que o proprietário use a interface de nível superior de um serviço de impressão. Não deve ser necessário para aplicativos comuns."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"acessar todos os trabalhos de impressão"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Permite que o proprietário acesse trabalhos de impressão criados por outro aplicativo. Não deve ser necessário para aplicativos comuns."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"associar a um serviço de spooler de impressão"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permite que o proprietário use a interface de nível superior de um serviço de spooler de impressão. Não deve ser necessário para aplicativos comuns."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"associar ao serviço NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permite ao proprietário associar a aplicativos que emulam cartões NFC. Não deve ser necessário para aplicativos comuns."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"sujeitar-se a um serviço de texto"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloide"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelado"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Erro ao gravar o conteúdo"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"desconhecido"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Insira o PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN atual"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Novo PIN"</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 84632f9..74830ef 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -561,9 +561,9 @@
     <skip />
     <!-- no translation found for permdesc_bindPrintService (7960067623209111135) -->
     <skip />
-    <!-- no translation found for permlab_accessAllPrintJobs (1120792468465711159) -->
+    <!-- no translation found for permlab_bindPrintSpoolerService (6807762783744125954) -->
     <skip />
-    <!-- no translation found for permdesc_accessAllPrintJobs (2978185311041864762) -->
+    <!-- no translation found for permdesc_bindPrintSpoolerService (3680552285933318372) -->
     <skip />
     <!-- no translation found for permlab_bindNfcService (2752731300419410724) -->
     <skip />
@@ -2576,6 +2576,8 @@
     <skip />
     <!-- no translation found for write_fail_reason_cannot_write (8132505417935337724) -->
     <skip />
+    <!-- no translation found for reason_unknown (6048913880184628119) -->
+    <skip />
     <!-- no translation found for restr_pin_enter_pin (3395953421368476103) -->
     <skip />
     <!-- no translation found for restr_pin_enter_old_pin (1462206225512910757) -->
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index add353d..4ab2b43 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite proprietarului să se conecteze la interfaţa de nivel superior a unui serviciu de accesibilitate. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"conectarea la un serviciu de printare"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permite proprietarului să se conecteze la interfața de nivel superior a unui serviciu de printare. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"acces la toate procesele de printare"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Permite proprietarului să acceseze procesele de printare create de o altă aplicație. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"conectare la un serviciu derulator de printare"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permite proprietarului să se conecteze la interfața de nivel superior a unui serviciu derulator de printare. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"conectare la serviciul NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permite aplicației autorizate să se asocieze cu aplicații care emulează carduri NFC. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"conectare la un serviciu text"</string>
@@ -1323,7 +1323,7 @@
     <string name="submit" msgid="1602335572089911941">"Trimiteţi"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mod Maşină activat"</string>
     <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Atingeţi pentru a ieşi din modul Maşină."</string>
-    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering sau hotspot active"</string>
+    <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering sau hotspot activ"</string>
     <string name="tethered_notification_message" msgid="6857031760103062982">"Atingeţi pentru a configura."</string>
     <string name="back_button_label" msgid="2300470004503343439">"Înapoi"</string>
     <string name="next_button_label" msgid="1080555104677992408">"Înainte"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Anulat"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Eroare la scrierea conținutului"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"necunoscut"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Introduceți codul PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Codul PIN actual"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Codul PIN nou"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index e32b6de..5635381 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Приложение сможет подключаться к базовому интерфейсу службы специальных возможностей. Это разрешение не используется обычными приложениями."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"Подключение к службе печати"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Приложение сможет подключаться к базовому интерфейсу службы печати. Это разрешение не используется обычными приложениями."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"Доступ к заданиям печати"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Владелец сможет просматривать задания печати, созданные другими приложениями. Это разрешение не используется обычными приложениями."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"подключение к спулеру печати"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Приложение сможет подключаться к базовому интерфейсу спулера печати. Это разрешение не используется обычными приложениями."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"подключаться к службе NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Приложение сможет подключаться к программам с имитацией карт NFC. Это разрешение не используется обычными приложениями."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"Подключение к службе текстовых сообщений"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid (279 х 432 мм)"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Печать отменена"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Ошибка записи"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"неизвестно"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Введите PIN-код"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Текущий PIN-код"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Новый PIN-код"</string>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index 3a01bad..50aa81c 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ප‍්‍රවේශ්‍යතා සේවාවේ ඉහළ මට්ටමේ අතුරුමුහුණතට බැඳීමට දරන්නාට අවසර දේ. සාමාන්‍ය යෙදුම් සඳහා කිසිවිටක අවශ්‍ය නොවේ."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"මුද්‍රණ සේවාවකට බද්ධ වී ඇත"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"මුද්‍රණ සේවාව ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට ධාරකයාට අවසර දෙන්න. සාමාන්‍ය යෙදුම්වලට කිසි විටෙක අවශ්‍ය නොවෙයි."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"සියලු මුද්‍රණ කාර්යයන් වෙත පිවිසෙන්න"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"වෙනත් යෙදුමකින් සෑදු මුද්‍රණ කාර්ය වෙත පිවිසීමට ධාරකයාට අවසර දෙන්න. සාමාන්‍ය යෙදුම් සඳහා කිසිදා අවශ්‍ය නොවෙයි."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"මුද්‍රණ සේවාවකට බද්ධ වී ඇත"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"මුද්‍රණ සේවාව ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට ධාරකයාට අවසර දෙන්න. සාමාන්‍ය යෙදුම්වලට කිසි විටෙක අවශ්‍ය නොවෙයි."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC සේවාව වෙත බැඳෙන්න"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"NFC කාඩ් පත් ආදර්ශනය කරන යෙදුම් රඳවනයට සම්බන්ධ වීමට ඉඩ දෙන්න. සාමාන්‍ය යෙදුම් සඳහා කිසිදා අවශ්‍ය නොවෙයි."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"පෙළ සේවාවකට බඳින්න"</string>
@@ -1571,6 +1571,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"කුඩා පුවත්පත"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"අවලංගු කරන ලදි"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"අන්තර්ගතය ලිවීමේදී දෝෂයකි"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"නොදනී"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN එක ඇතුළු කරන්න"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"වත්මන් PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"නව PIN"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 49486675..b4ba202 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby zjednodušeného ovládania. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"viazanie na tlačovú službu"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania tlačovej služby. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"prístup ku všetkým tlačovým úlohám"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Umožňuje držiteľovi prístup k tlačovým úlohám vytvoreným inou aplikáciou. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"väzba na tlačovú službu"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania tlačovej služby. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"previazať so službou NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Umožňuje držiteľovi previazať sa s aplikáciami, ktoré vydávajú karty NFC. Bežné aplikácie toto povolenie nikdy nepotrebujú."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"väzba na textovú službu"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Zrušené"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Pri zapisovaní obsahu došlo ku chybe"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"neznáme"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Zadajte kód PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuálny kód PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nový kód PIN"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 04c2adf..3336dab 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Lastniku omogoča povezovanje z vmesnikom najvišje ravni storitve za ljudi s posebnimi potrebami. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"povezava s storitvijo tiskanja"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Lastniku omogoča povezovanje z vmesnikom storitve tiskanja najvišje ravni. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"dostop do vseh tiskalnih poslov"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Lastniku omogoča dostop do tiskalnih poslov, ki jih je ustvarila druga aplikacija. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"povezava s storitvijo čakalne vrste za tiskanje"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Lastniku omogoča povezovanje z vmesnikom storitve čakalne vrste za tiskanje najvišje ravni. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"povezava s storitvijo NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Dovoljuje, da se lastnik poveže z aplikacijami, ki posnemajo kartice za NFC. Pri navadnih aplikacijah to ne bi smelo biti potrebno."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"poveži z besedilno storitvijo"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Preklicano"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Napaka pri pisanju vsebine"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"neznano"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Vnesite PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Trenutni PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Novi PIN"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 26de499..d66f18c 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Дозвољава власнику да се повеже са интерфејсом услуге приступачности највишег нивоа. Уобичајене апликације никада не би требало да је користе."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"повезивање са услугом штампања"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Дозвољава власнику да се повеже са интерфејсом услуге штампања највишег нивоа. Уобичајене апликације никада не би требало да је користе."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"приступ свим задацима за штампање"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Дозвољава власнику да приступа задацима за штампање које је направила друга апликација. Уобичајене апликације никада не би требало да је користе."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"повезивање са услугом штампања из меморије"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Дозвољава власнику да се повеже са интерфејсом највишег нивоа услуге штампања из меморије. Не би требало никада да буде потребно за нормалне апликације."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"повезивање са NFC услугом"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Дозвољава власнику да се повеже са апликацијама које опонашају NFC картице. Никада не би требало да буде потребно за обичне апликације."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"обавезивање на текстуалну услугу"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Отказано је"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Грешка при исписивању садржаја"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"непознато"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Унесите PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Актуелни PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Нови PIN"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 3eac87f..00aa419 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en tillgänglighetstjänst. Ska inte behövas för vanliga appar."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"binda till en utskriftstjänst"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en utskriftstjänst. Ska inte behövas för vanliga appar."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"få tillgång till alla utskriftsjobb"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Ger innehavaren tillgång till utskriftsjobb som skapas med en annan app. Ska inte behövas för normala appar."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"binda till en utskriftskö"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en utskriftskö. Ska inte behövas för vanliga appar."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"låsa till NFC-tjänsten"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Innehavaren får låsa appar som fungerar som NFC-kort. Behövs normalt inte för vanliga appar."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"bind till en texttjänst"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Inställd"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Det gick inte att skriva innehållet"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"okänt"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ange pinkod"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuell pinkod"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Ny pinkod"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index b4cf861..b7b6506 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -160,9 +160,9 @@
     <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mtindo wa kimya"</string>
     <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sauti Imezimwa"</string>
     <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sauti imewashwa"</string>
-    <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"gumzo ya ndege"</string>
+    <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Hali ya ndege"</string>
     <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hali ya ndege IMEWASHWA"</string>
-    <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"gumzo ya ndege IMEZIMWA"</string>
+    <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Hali ya ndege IMEZIMWA"</string>
     <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
     <string name="safeMode" msgid="2788228061547930246">"Mtindo salama"</string>
     <string name="android_system_label" msgid="6577375335728551336">"Mfumo wa Android"</string>
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Inamuruhusu mmiliki kufunga kipengee kinachojitokeza katika nyanja mbalimbali za kiwango cha juu cha huduma ya afikiaji. Hapaswi kuhitajika kwa programu za kawaida."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"tundika kwenye huduma ya kuchapisha"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Inaruhusu kishikiliaji kujifungilia kiolesura cha kiwango cha juu cha huduma ya kuchapisha. Haipaswi kuhitajika kwa programu za kawaida."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"fikia kazi zote za kuchapisha"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Huruhusu mmiliki kufikia kazi za kuchapisha zilizoundwa na programu nyingine. Haipaswi kuhitajika kwa programu za kawaida kamwe."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"Fungia kwenye huduma ya kuchapisha"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Inaruhusu mtumiaji kujifungia kiolesura cha kiwango cha juu cha huduma ya kuchapisha. Haipaswi kuhitajika kwa programu za kawaida."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"funga kwenye huduma za NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Huruhusu mmiliki kufunga kwa programu zinazoiga kadi za NFC. Haipaswi kuhitajika kamwe kwa programu za kawaida."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"Imefungwa kwa huduma ya maandishi"</string>
@@ -555,7 +555,7 @@
     <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"rekebisha ukubwa wa mandhari yako"</string>
     <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Inaruhusu programu kuweka vidokezo vya ukubwa wa mandhari ya mfumo."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"weka upya mfumo kwa chaguo-msingi za kiwanda"</string>
-    <string name="permdesc_masterClear" msgid="3665380492633910226">"Huruhusu programu kurudisha mfumo kwenye mipangilio yake ya mwanzo, hatua ambayo hufuta data, usanidi, na programu zote zilizosanikishwa."</string>
+    <string name="permdesc_masterClear" msgid="3665380492633910226">"Huruhusu programu kurudisha mfumo kwenye mipangilio yake ya mwanzo, hatua ambayo hufuta data, mipangilio, na programu zote zilizosanikishwa."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"weka muda"</string>
     <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Inaruhusu programu kubadilisha wakati wa saa ya kompyuta kibao."</string>
     <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Inaruhusu programu kubadilisha wakati wa saa ya simu."</string>
@@ -1121,7 +1121,7 @@
     <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Wezesha tena hii katika mipangilio ya Mfumo &gt; Programu &gt;  iliyopakuliwa."</string>
     <string name="smv_application" msgid="3307209192155442829">"Programu <xliff:g id="APPLICATION">%1$s</xliff:g>  (utaratibu  <xliff:g id="PROCESS">%2$s</xliff:g>) imeenda kinyume na sera yake ya StrictMode."</string>
     <string name="smv_process" msgid="5120397012047462446">"Shughuli ya <xliff:g id="PROCESS">%1$s</xliff:g> imeenda kinyume na kulazimisha sera yake ya StrictMode."</string>
-    <string name="android_upgrading_title" msgid="1584192285441405746">"Android inapandishwa gredi..."</string>
+    <string name="android_upgrading_title" msgid="1584192285441405746">"Toleo jipya la Android linawekwa..."</string>
     <string name="android_upgrading_apk" msgid="7904042682111526169">"Inasadifisha programu <xliff:g id="NUMBER_0">%1$d</xliff:g> ya <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
     <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Programu zinaanza"</string>
     <string name="android_upgrading_complete" msgid="1405954754112999229">"Inamaliza kuwasha."</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Kijigazeti"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Imeghairiwa"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Hitilafu katika kuandika maudhui"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"haijulikani"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ingiza PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN ya sasa"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN mpya"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 54728fb..376ee26 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"อนุญาตให้เจ้าของเชื่อมโยงกับส่วนติดต่อระดับบนสุดของบริการการเข้าถึง ซึ่งแอปพลิเคชันทั่วไปไม่จำเป็นต้องใช้"</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"เชื่อมโยงกับบริการการพิมพ์"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"อนุญาตให้ผู้ใช้เชื่อมโยงกับอินเทอร์เฟซระดับสูงสุดของบริการการพิมพ์ ซึ่งแอปทั่วไปไม่จำเป็นต้องใช้"</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"เข้าถึงงานพิมพ์ทั้งหมด"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"อนุญาตให้ผู้ใช้สามารถเข้าถึงงานพิมพ์ที่สร้างโดยแอปอื่นได้ ซึ่งแอปทั่วไปไม่จำเป็นต้องใช้"</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"เชื่อมโยงกับบริการจัิดคิวและจัดการการพิมพ์"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"อนุญาตให้ผู้ใช้เชื่อมโยงกับอินเทอร์เฟซระดับสูงสุดของบริการจัดคิวและจัดการการพิมพ์ ซึ่งแอปทั่วไปไม่จำเป็นต้องใช้"</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"เชื่อมโยงกับบริการ NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"อนุญาตให้ผู้ถือเชื่อมโยงกับแอปพลิเคชันที่เลียนแบบการ์ด NFC ไม่จำเป็นสำหรับแอปทั่วไป"</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"เชื่อมโยงกับบริการข้อความ"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ยกเลิก"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"ข้อผิดพลาดในการเขียนเนื้อหา"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"ไม่ทราบ"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"ป้อน PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN ปัจจุบัน"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN ใหม่"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 1bd10ae..b6bca5d 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Binibigyang-daan ang may-ari na sumailalim sa nasa nangungunang antas na interface ng isang serbisyo sa accessibility. Hindi dapat kailanman kailanganin para sa normal na apps."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"sumailalim sa isang serbisyo sa pag-print"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Nagbibigay-daan sa may-ari na sumailalim sa interface sa nangungunang antas ng isang serbisyo sa pag-print. Hindi dapat kailanganin para sa normal na apps kahit kailan."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"i-access ang lahat ng pag-print"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Nagbibigay-daan sa may-ari na i-access ang mga pag-print na ginawa ng ibang app. Hindi dapat kailanganin para sa normal na apps kahit kailan."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"mag-bind sa isang serbisyo ng print spooler"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Nagbibigay-daan sa may-ari na mag-bind sa interface sa nangungunang antas ng isang serbisyo ng print spooler. Hindi dapat kailanganin para sa normal na apps."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"i-bind sa serbisyo ng NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Nagbibigay-daan sa may-ari na mag-bind sa mga application na nag-e-emulate ng mga NFC card. Hindi dapat kailanman kailanganin para sa normal na apps."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"sumailalim sa serbisyo ng teksto"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Kinansela"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"May error sa pagsusulat ng nilalaman"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"hindi alam"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ilagay ang PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Kasalukuyang PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Bagong PIN"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 5ab9165..44168d2 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"İzin sahibine bir erişilebilirlik hizmetinin en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"bir yazdırma hizmetine bağlan"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"İzin sahibine, bir yazdırma hizmetinin en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"tüm yazdırma işlerine eriş"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"İzin sahibine, başka uygulama tarafından oluşturulan yazdırma işlerine erişim izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"bir yazdırma biriktirici hizmetine bağlan"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"İzin sahibine, bir yazdırma biriktirici hizmetinin en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmaz."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC hizmetine bağla"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"İzin sahibine, NFC kartlara öykünen uygulamalara bağlama izni verir. Normal uygulamalar için hiçbir zaman gerekmez."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"kısa mesaj hizmetine bağla"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"İptal edildi"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"İçerik yazılırken hata oluştu"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"bilinmiyor"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN\'i girin"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Mevcut PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Yeni PIN"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 8877a05..2dcb546 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Дозволяє власникові прив’язуватися до інтерфейсу верхнього рівня служби доступності. Ніколи не застосовується для звичайних програм."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"прив’язуватися до служби друку"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Дозволяє власникові прив’язуватися до інтерфейсу верхнього рівня служби друку. Ніколи не застосовується для звичайних програм."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"отримувати доступ до всіх завдань друку"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Дозволяє власнику отримувати доступ до завдань друку, створених в іншій програмі. Ніколи не застосовується для звичайних програм."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"прив’язуватися до служби спулера друку"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Дозволяє власникові прив’язуватися до інтерфейсу верхнього рівня служби спулера друку. Ніколи не застосовується для звичайних програм."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"прив’язуватися до служби NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Дозволяє власникові прив’язуватися до програм, які емулюють картки NFC. Ніколи не використовується звичайними програмами."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"прив’язати до текстової служби"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Скасовано"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Помилка записування вмісту"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"невідомо"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Введіть PIN-код"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Поточний PIN-код"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Новий PIN-код"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 5e1a9ae..0f417fe 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ truy cập. Không cần thiết cho các ứng dụng thông thường."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"liên kết với dịch vụ in"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ in. Không cần thiết cho các ứng dụng thông thường."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"truy cập tất cả các lệnh in"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Cho phép chủ sở hữu truy cập các lệnh in được tạo ra bởi ứng dụng khác. Không cần thiết cho các ứng dụng thông thường."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"liên kết với dịch vụ bộ đệm in"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ bộ đệm in. Không cần thiết cho các ứng dụng thông thường."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"liên kết với dịch vụ NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Cho phép chủ sở hữu liên kết với ứng dụng đang mô phỏng thẻ NFC. Không cần thiết cho các ứng dụng thông thường."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"liên kết với dịch vụ văn bản"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Đã hủy"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Lỗi ghi nội dung"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"không xác định"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Nhập mã PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Mã PIN hiện tại"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Mã PIN mới"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 529997b..3bd2566 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"允许应用绑定至辅助服务的顶级接口。普通应用绝不需要此权限。"</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"绑定至打印服务"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"允许应用绑定至打印服务的顶级接口。普通应用绝不需要此权限。"</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"查看或修改所有打印作业"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"允许应用查看或修改其他应用创建的打印作业。普通应用绝不需要此权限。"</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"绑定至打印后台处理程序服务"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"允许应用绑定至打印后台处理程序服务的顶级接口。普通应用绝不需要此权限。"</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"绑定到 NFC 服务"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"允许应用绑定到模拟 NFC 卡的应用。普通应用绝不需要此权限。"</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"绑定至文字服务"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"已取消"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"写入内容时出错"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"未知"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"输入 PIN 码"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"当前 PIN 码"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"新 PIN 码"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 0252a81..c27890f 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"允許應用程式繫結至協助工具服務的頂層介面 (不建議一般應用程式使用)。"</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"繫結至列印服務"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"允許應用程式繫結至列印服務的頂層介面 (不建議一般應用程式使用)。"</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"存取所有列印工作"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"允許應用程式存取其他應用程式所建立的列印工作 (不建議一般應用程式使用)。"</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"繫結至列印多工緩衝處理器服務"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"允許應用程式繫結至列印多工緩衝處理器服務的頂層介面 (不建議一般應用程式使用)。"</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"繫結至 NFC 服務"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"允許應用程式繫結至模擬 NFC 卡的應用程式 (不建議一般應用程式使用)。"</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"繫結至文字服務"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"已取消"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"寫入內容時發生錯誤"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"不明"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"輸入 PIN 碼"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"目前的 PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"新的 PIN"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 5b8d8e8..571e01c 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"允許應用程式繫結至協助工具服務的頂層介面 (一般應用程式不需使用)。"</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"繫結至列印服務"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"允許應用程式繫結至列印服務的頂層介面 (一般應用程式並不需要)。"</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"存取所有列印工作"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"允許應用程式存取其他應用程式所建立的列印工作 (一般應用程式並不需要)。"</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"繫結至列印多工緩衝處理器服務"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"允許應用程式繫結至列印多工緩衝處理器服務的頂層介面 (一般應用程式並不需要)。"</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"繫結至 NFC 服務"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"允許應用程式繫結至模擬 NFC 卡的應用程式 (一般應用程式並不需要)。"</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"繫結至文字服務"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Tabloid"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"已取消"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"寫入內容時發生錯誤"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"不明"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"輸入 PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"目前的 PIN"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"新 PIN"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 3ff3303..c0b5c86 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -360,8 +360,8 @@
     <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Ivumela isibambi ukuhlanganisa uxhumo nomsebenzisi kwezinga eliphezulu lesevisi yesinqunjwana. Akusoze kwadingekela izinhlelo zokusebenza ezivamile."</string>
     <string name="permlab_bindPrintService" msgid="8462815179572748761">"bophezela kusevisi yokuphrinta"</string>
     <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Ivumela umnikazi ukuthi abophezele isixhumanisi esibonakalayo sezinga eliphezulu sesevisi lokuphrinta. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string>
-    <string name="permlab_accessAllPrintJobs" msgid="1120792468465711159">"finyelela kuyo yonke imisebenzi yokuphrinta"</string>
-    <string name="permdesc_accessAllPrintJobs" msgid="2978185311041864762">"Ivumela umnikazi ukuthi afinyelele imisebenzi yokushicilela edalwe olunye uhlelo lokusebenza. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string>
+    <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"bophezela kusevisi yendawo yokuphrinta"</string>
+    <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Ivumela umnikazi ukuthi abophezele isixhumanisi esibonakalayo sezinga eliphezulu sesevisi yendawo yokuphrinta. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string>
     <string name="permlab_bindNfcService" msgid="2752731300419410724">"bophezela kusevisi ye-NFC"</string>
     <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Ivumela umnikazi ukuthi abophezele izinhlelo zokusebenza ezifana namakhadi we-NFC. Akumele idingeke kuzinhlelo zokusebenza ezijwayelekile."</string>
     <string name="permlab_bindTextService" msgid="7358378401915287938">"bophezela kunsizakalo yombhalo"</string>
@@ -1568,6 +1568,7 @@
     <string name="mediaSize_na_tabloid" msgid="5775966416333578127">"Iphephandaba"</string>
     <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Kukhanseliwe"</string>
     <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Iphutha ekubhaleni okuqukethwe"</string>
+    <string name="reason_unknown" msgid="6048913880184628119">"akwaziwa"</string>
     <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Faka i-PIN"</string>
     <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"I-PIN yamanje"</string>
     <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"I-PIN entsha"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 50ea08b..b6a4250 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2379,7 +2379,13 @@
              method should be considered an option as the default. -->
         <attr name="isDefault" format="boolean" />
         <!-- Set to true if this input method supports ways to switch to
-             a next input method (e.g. a globe key.). -->
+             a next input method (e.g. a globe key.). When this is true and
+             InputMethodManager#shouldOfferSwitchingToNextInputMethod() returns true,
+             the IME has to offer ways to to invoke InputMethodManager#switchToNextInputMethod()
+             accordingly.
+             <p> Note that the system determines the most appropriate next input method
+             and subtype in order to provide the consistent user experience in switching
+             between IMEs and subtypes. -->
         <attr name="supportsSwitchingToNextInputMethod" format="boolean" />
     </declare-styleable>
 
@@ -2602,6 +2608,12 @@
         <!-- Short description of the functionality the service implements. This attribute
              is mandatory.-->
         <attr name="description" />
+        <!-- Whether the device must be unlocked before routing data to this service.
+             The default is false.-->
+        <attr name="requireDeviceUnlock" format="boolean"/>
+        <!-- A drawable that can be rendered in Android's system UI for representing
+             the service. -->
+        <attr name="apduServiceBanner" format="reference"/>
     </declare-styleable>
 
     <!-- Use <code>offhost-apdu-service</code> as the root tag of the XML resource that
@@ -2612,6 +2624,9 @@
         <!-- Short description of the functionality the service implements. This attribute
              is mandatory.-->
         <attr name="description" />
+        <!-- A drawable that can be rendered in Android's system UI for representing
+             the service. -->
+        <attr name="apduServiceBanner"/>
     </declare-styleable>
 
     <!-- Specify one or more <code>aid-group</code> elements inside a
@@ -2622,7 +2637,8 @@
         <!-- Short description of what the AID group implements. This attribute is mandatory.-->
         <attr name="description" />
         <!-- The category attribute will be used by the Android platform to present
-             multiple applications that register AIDs in the same category uniformly.
+             multiple applications that register ISO 7816 Application IDs (AIDs) in the
+             same category uniformly.
              Additionally, when a category is specified, Android will ensure that either
              all AIDs in this group are routed to this application, or none at all.
              This attribute is optional.-->
@@ -5739,11 +5755,11 @@
          describes an injected "Location services" setting. Note that the status value (subtitle)
          for the setting is specified dynamically by a subclass of SettingInjectorService.
      -->
-    <declare-styleable name="InjectedLocationSetting">
-        <!-- The user-visible name (title) of the setting. -->
-        <attr name="label"/>
-        <!-- The icon for the apps covered by the setting. Typically a generic icon for the
-             developer. -->
+    <declare-styleable name="SettingInjectorService">
+        <!-- The title for the preference. -->
+        <attr name="title"/>
+        <!-- The icon for the preference, should refer to all apps covered by the setting. Typically
+             a generic icon for the developer. -->
         <attr name="icon"/>
         <!-- The activity to launch when the setting is clicked on. -->
         <attr name="settingsActivity"/>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 5d4383f..dd233c5 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -774,6 +774,9 @@
          re-validation -->
     <bool name="config_bluetooth_address_validation">false</bool>
 
+    <!-- Boolean indicating if current platform supports BLE peripheral mode -->
+    <bool name="config_bluetooth_le_peripheral_mode_supported">false</bool>
+
     <!-- The default data-use polling period. -->
     <integer name="config_datause_polling_period_sec">600</integer>
 
@@ -820,6 +823,10 @@
     <!-- IP address of the dns server to use if nobody else suggests one -->
     <string name="config_default_dns_server" translatable="false">8.8.8.8</string>
 
+    <!-- The default mobile provisioning apn. Empty by default, maybe overridden by
+         an mcc/mnc specific config.xml -->
+    <string name="mobile_provisioning_apn" translatable="false"></string>
+
     <!-- The default mobile provisioning url. Empty by default, maybe overridden by
          an mcc/mnc specific config.xml -->
     <string name="mobile_provisioning_url" translatable="false"></string>
@@ -1207,4 +1214,15 @@
     <!-- Default Gravity setting for the system Toast view. Equivalent to: Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM -->
     <integer name="config_toastDefaultGravity">0x00000051</integer>
 
+    <!-- set to false if we need to show user confirmation
+         when alpha identifier is not provided by the UICC -->
+    <bool name="config_stkNoAlphaUsrCnf">true</bool>
+
+    <!-- Don't use roaming icon for considered operators.
+         Can use mcc or mcc+mnc as item. For example, 302 or 21407.
+         If operators, 21404 and 21407, make roaming agreements, user of 21404 should not see
+         the roaming icon as using 21407 network.
+         To do this, add 21407 item to values-mcc214-mnc04/config.xml -->
+    <string-array translatable="false" name="config_operatorConsideredNonRoaming">
+    </string-array>
 </resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index f2ec04f..e6702b0 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2073,5 +2073,8 @@
   <public type="attr" name="customRoots" />
   <public type="attr" name="autoMirrored" />
   <public type="attr" name="supportsSwitchingToNextInputMethod" />
+  <public type="attr" name="requireDeviceUnlock" />
+  <public type="attr" name="apduServiceBanner" />
+  <public type="attr" name="provideAssistData" />
 
 </resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index ead46c2..aa04bf6 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -984,12 +984,13 @@
     <string name="permdesc_bindPrintService">Allows the holder to bind to the top-level
         interface of a print service. Should never be needed for normal apps.</string>
 
-    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-    <string name="permlab_accessAllPrintJobs">access all print jobs</string>
-    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-    <string name="permdesc_accessAllPrintJobs">Allows the holder to access print jobs
-        created by another app. Should never be needed for normal apps.</string>
-
+    <!-- Title of an application permission, listed so the user can choose
+         whether they want to allow the application to do this. -->
+    <string name="permlab_bindPrintSpoolerService">bind to a print spooler service</string>
+    <!-- Description of an application permission, listed so the user can
+         choose whether they want to allow the application to do this. -->
+    <string name="permdesc_bindPrintSpoolerService">Allows the holder to bind to the top-level
+        interface of a print spooler service. Should never be needed for normal apps.</string>
 
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permlab_bindNfcService">bind to NFC service</string>
@@ -3969,11 +3970,6 @@
     <!-- Title for a dialog showing possible activities for sharing in ShareActionProvider [CHAR LIMIT=25] -->
     <string name="share_action_provider_share_with">Share with</string>
 
-    <!-- Status Bar icon descriptions -->
-
-    <!-- Description of for the status bar's icon that the device is locked for accessibility. [CHAR LIMIT=NONE] -->
-    <string name="status_bar_device_locked">Device locked.</string>
-
     <!-- Delimeter used between each item in a textual list; for example "Alpha, Beta". [CHAR LIMIT=3] -->
     <string name="list_delimeter">", "</string>
 
@@ -4292,8 +4288,15 @@
     <!-- Write fail reason: couldn't write the printed content. [CHAR LIMIT=none] -->
     <string name="write_fail_reason_cannot_write">Error writing content</string>
 
+    <!-- Print fail reason: unknown. [CHAR LIMIT=25] -->
+    <string name="reason_unknown">unknown</string>
+
+    <!-- PIN entry dialog title for entering the administrator PIN [CHAR LIMIT=none] -->
+    <string name="restr_pin_enter_admin_pin">Enter administrator PIN</string>
     <!-- PIN entry dialog label/hint for PIN [CHAR LIMIT=none] -->
     <string name="restr_pin_enter_pin">Enter PIN</string>
+    <!-- PIN entry dialog label/hint for incorrect PIN entry [CHAR LIMIT=none] -->
+    <string name="restr_pin_incorrect">Incorrect</string>
     <!-- PIN entry dialog label/hint for old PIN [CHAR LIMIT=none] -->
     <string name="restr_pin_enter_old_pin">Current PIN</string>
     <!-- PIN entry dialog label for new PIN [CHAR LIMIT=none] -->
@@ -4309,9 +4312,11 @@
     <!-- PIN entry dialog countdown message for next chance to enter the PIN [CHAR LIMIT=none] -->
     <!-- Phrase describing a time duration using seconds [CHAR LIMIT=16] -->
     <plurals name="restr_pin_countdown">
-        <item quantity="one">Incorrect PIN. Try again in 1 second.</item>
-        <item quantity="other">Incorrect PIN. Try again in <xliff:g id="count">%d</xliff:g> seconds.</item>
+        <item quantity="one">Try again in 1 second</item>
+        <item quantity="other">Try again in <xliff:g id="count">%d</xliff:g> seconds</item>
     </plurals>
+    <!-- PIN entry dialog tells the user to not enter a PIN for a while. [CHAR LIMIT=none] -->
+    <string name="restr_pin_try_later">Try again later</string>
 
     <!-- Toast bar message when hiding the transient navigation bar [CHAR LIMIT=35] -->
     <string name="transient_navigation_confirmation">Swipe edge of screen to reveal bar</string>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 879d0f1..ba72a2b 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -529,7 +529,6 @@
 
     <style name="Widget.CalendarView">
         <item name="android:showWeekNumber">true</item>
-        <item name="android:firstDayOfWeek">1</item>
         <item name="android:minDate">01/01/1900</item>
         <item name="android:maxDate">12/31/2100</item>
         <item name="android:shownWeekCount">6</item>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
old mode 100755
new mode 100644
index a9c812e..1035054
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -212,7 +212,8 @@
   <java-symbol type="id" name="sms_short_code_remember_undo_instruction" />
   <java-symbol type="id" name="breadcrumb_section" />
   <java-symbol type="id" name="action_bar_spinner" />
-  <java-symbol type="id" name="pin_message" />
+  <java-symbol type="id" name="pin_cancel_button" />
+  <java-symbol type="id" name="pin_ok_button" />
   <java-symbol type="id" name="pin_text" />
   <java-symbol type="id" name="pin_new_text" />
   <java-symbol type="id" name="pin_confirm_text" />
@@ -248,6 +249,7 @@
   <java-symbol type="bool" name="config_allowActionMenuItemTextWithIcon" />
   <java-symbol type="bool" name="config_bluetooth_address_validation" />
   <java-symbol type="bool" name="config_bluetooth_sco_off_call" />
+  <java-symbol type="bool" name="config_bluetooth_le_peripheral_mode_supported" />
   <java-symbol type="bool" name="config_cellBroadcastAppLinks" />
   <java-symbol type="bool" name="config_duplicate_port_omadm_wappush" />
   <java-symbol type="bool" name="config_enable_emergency_call_while_sim_locked" />
@@ -668,6 +670,7 @@
   <java-symbol type="string" name="preposition_for_time" />
   <java-symbol type="string" name="progress_erasing" />
   <java-symbol type="string" name="progress_unmounting" />
+  <java-symbol type="string" name="mobile_provisioning_apn" />
   <java-symbol type="string" name="mobile_provisioning_url" />
   <java-symbol type="string" name="mobile_redirected_provisioning_url" />
   <java-symbol type="string" name="reboot_safemode_confirm" />
@@ -868,7 +871,11 @@
   <java-symbol type="string" name="mediaSize_na_junior_legal" />
   <java-symbol type="string" name="mediaSize_na_ledger" />
   <java-symbol type="string" name="mediaSize_na_tabloid" />
+  <java-symbol type="string" name="reason_unknown" />
+  <java-symbol type="string" name="restr_pin_enter_admin_pin" />
   <java-symbol type="string" name="restr_pin_enter_pin" />
+  <java-symbol type="string" name="restr_pin_incorrect" />
+  <java-symbol type="string" name="restr_pin_try_later" />
   <java-symbol type="string" name="write_fail_reason_cancelled" />
   <java-symbol type="string" name="write_fail_reason_cannot_write" />
   <java-symbol type="string" name="transient_navigation_confirmation" />
@@ -910,6 +917,7 @@
   <java-symbol type="array" name="config_masterVolumeRamp" />
   <java-symbol type="array" name="config_cdma_dun_supported_types" />
   <java-symbol type="array" name="config_disabledUntilUsedPreinstalledImes" />
+  <java-symbol type="array" name="config_operatorConsideredNonRoaming" />
 
   <java-symbol type="drawable" name="default_wallpaper" />
   <java-symbol type="drawable" name="indicator_input_error" />
@@ -1241,7 +1249,6 @@
   <java-symbol type="drawable" name="jog_tab_target_yellow" />
   <java-symbol type="drawable" name="magnified_region_frame" />
   <java-symbol type="drawable" name="menu_background" />
-  <java-symbol type="drawable" name="stat_sys_secure" />
   <java-symbol type="id" name="action_mode_bar_stub" />
   <java-symbol type="id" name="button0" />
   <java-symbol type="id" name="button4" />
@@ -1304,7 +1311,6 @@
   <java-symbol type="string" name="global_action_toggle_silent_mode" />
   <java-symbol type="string" name="invalidPuk" />
   <java-symbol type="string" name="lockscreen_carrier_default" />
-  <java-symbol type="string" name="status_bar_device_locked" />
   <java-symbol type="style" name="Animation.LockScreen" />
   <java-symbol type="style" name="Theme.Dialog.RecentApplications" />
   <java-symbol type="style" name="Theme.ExpandedMenu" />
@@ -1526,8 +1532,8 @@
   <java-symbol type="string" name="enable_explore_by_touch_warning_title" />
   <java-symbol type="string" name="enable_explore_by_touch_warning_message" />
 
-  <java-symbol type="layout" name="resolver_grid" />
-  <java-symbol type="id" name="resolver_grid" />
+  <java-symbol type="layout" name="resolver_list" />
+  <java-symbol type="id" name="resolver_list" />
   <java-symbol type="id" name="button_once" />
   <java-symbol type="id" name="button_always" />
   <java-symbol type="integer" name="config_maxResolverActivityColumns" />
@@ -1639,6 +1645,7 @@
   <java-symbol type="bool" name="config_sf_slowBlur" />
   <java-symbol type="drawable" name="ic_volume" />
   <java-symbol type="drawable" name="stat_notify_sim_toolkit" />
+  <java-symbol type="bool" name="config_stkNoAlphaUsrCnf" />
 
   <!-- From maps library -->
   <java-symbol type="array" name="maps_starting_lat_lng" />
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index 22fa7fc..be55444 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -22,7 +22,7 @@
 	$(call all-java-files-under, EnabledTestApp/src)
 
 LOCAL_DX_FLAGS := --core-library
-LOCAL_STATIC_JAVA_LIBRARIES := core-tests android-common frameworks-core-util-lib mockwebserver guava littlemock
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests-support android-common frameworks-core-util-lib mockwebserver guava littlemock
 LOCAL_JAVA_LIBRARIES := android.test.runner conscrypt telephony-common
 LOCAL_PACKAGE_NAME := FrameworksCoreTests
 
diff --git a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java b/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java
deleted file mode 100644
index 417a85f..0000000
--- a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java
+++ /dev/null
@@ -1,1809 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package android.webkit;
-
-import android.accessibilityservice.AccessibilityService;
-import android.accessibilityservice.AccessibilityServiceInfo;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.SystemClock;
-import android.provider.Settings;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.view.KeyEvent;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-
-/**
- * This is a test for the behavior of the {@link AccessibilityInjector}
- * which is used by {@link WebView} to provide basic accessibility support
- * in case JavaScript is disabled.
- * </p>
- * Note: This test works against the generated {@link AccessibilityEvent}s
- *       to so it also checks if the test for announcing navigation axis and
- *       status messages as appropriate.
- */
-public class AccessibilityInjectorTest
-    extends ActivityInstrumentationTestCase2<AccessibilityInjectorTestActivity> {
-
-    /** The timeout to wait for the expected selection. */
-    private static final long TIMEOUT_WAIT_FOR_SELECTION_STRING = 1000;
-
-    /** The timeout to wait for accessibility and the mock service to be enabled. */
-    private static final long TIMEOUT_ENABLE_ACCESSIBILITY_AND_MOCK_SERVICE = 1000;
-
-    /** The count of tests to detect when to shut down the service. */
-    private static final int TEST_CASE_COUNT = 19;
-
-    /** The meta state for pressed left ALT. */
-    private static final int META_STATE_ALT_LEFT_ON = KeyEvent.META_ALT_ON
-            | KeyEvent.META_ALT_LEFT_ON;
-
-    /** Prefix for the CSS style span appended by WebKit. */
-    private static final String APPLE_SPAN_PREFIX = "<span class=\"Apple-style-span\"";
-
-    /** Suffix for the CSS style span appended by WebKit. */
-    private static final String APPLE_SPAN_SUFFIX = "</span>";
-
-    /** The value for not specified selection string since null is a valid value. */
-    private static final String SELECTION_STRING_UNKNOWN = "Unknown";
-
-    /** Lock for locking the test. */
-    private static final Object sTestLock = new Object();
-
-    /** Key bindings used for testing. */
-    private static final String TEST_KEY_DINDINGS =
-        "0x13=0x01000100;" +
-        "0x14=0x01010100;" +
-        "0x15=0x04000000;" +
-        "0x16=0x04000000;" +
-        "0x200000013=0x03020701:0x03010201:0x03000101:0x03030001:0x03040001:0x03050001:0x03060001;" +
-        "0x200000014=0x03010001:0x03020101:0x03070201:0x03030701:0x03040701:0x03050701:0x03060701;" +
-        "0x200000015=0x03040301:0x03050401:0x03060501:0x03000601:0x03010601:0x03020601:0x03070601;" +
-        "0x200000016=0x03050601:0x03040501:0x03030401:0x03020301:0x03070301:0x03010301:0x03000301;";
-
-    /** Handle to the test for use by the mock service. */
-    private static AccessibilityInjectorTest sInstance;
-
-    /** Flag indicating if the accessibility service is ready to receive events. */
-    private static boolean sIsAccessibilityServiceReady;
-
-    /** The count of executed tests to detect when to toggle accessibility and the service. */
-    private static int sExecutedTestCount;
-
-    /** Worker thread with a handler to perform non test thread processing. */
-    private Worker mWorker;
-
-    /** Handle to the {@link WebView} to load data in. */
-    private WebView mWebView;
-
-    /** Used for caching the default bindings so they can be restored. */
-    private static String sDefaultKeyBindings;
-
-    /** The received selection string for assertion checking. */
-    private static String sReceivedSelectionString = SELECTION_STRING_UNKNOWN;
-
-    public AccessibilityInjectorTest() {
-        super(AccessibilityInjectorTestActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mWorker = new Worker();
-        sInstance = this;
-        if (sExecutedTestCount == 0) {
-            // until JUnit4 comes to play with @BeforeTest
-            disableAccessibilityAndMockAccessibilityService();
-            enableAccessibilityAndMockAccessibilityService();
-            injectTestWebContentKeyBindings();
-        }
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        if (mWorker != null) {
-            mWorker.stop();
-        }
-        if (sExecutedTestCount == TEST_CASE_COUNT) {
-            // until JUnit4 comes to play with @AfterTest
-            disableAccessibilityAndMockAccessibilityService();
-            restoreDefaultWebContentKeyBindings();
-        }
-        super.tearDown();
-    }
-
-    /**
-     * Tests navigation by character.
-     */
-    @LargeTest
-    public void testNavigationByCharacter() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<html>" +
-               "<head>" +
-               "</head>" +
-               "<body>" +
-                   "<p>" +
-                      "a<b>b</b>c" +
-                   "</p>" +
-                   "<p>" +
-                     "d" +
-                   "<p/>" +
-                   "e" +
-               "</body>" +
-             "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // change navigation axis to character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("0"); // expect the character navigation axis
-
-        // go to the first character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("a");
-
-        // go to the second character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<b>b</b>");
-
-        // go to the third character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("c");
-
-        // go to the fourth character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("d");
-
-        // go to the fifth character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("e");
-
-        // try to go past the last character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fifth character (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("e");
-
-        // go to the fourth character (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("d");
-
-        // go to the third character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("c");
-
-        // go to the second character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<b>b</b>");
-
-        // go to the first character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("a");
-
-        // try to go before the first character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("a");
-
-        // go to the second character (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<b>b</b>");
-    }
-
-    /**
-     * Tests navigation by word.
-     */
-    @LargeTest
-    public void testNavigationByWord() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<html>" +
-               "<head>" +
-               "</head>" +
-               "<body>" +
-                   "<p>" +
-                      "This is <b>a</b> sentence" +
-                   "</p>" +
-                   "<p>" +
-                     " scattered " +
-                     "<p/>" +
-                     " all over " +
-                   "</p>" +
-                   "<div>" +
-                     "<p>the place.</p>" +
-                   "</div>" +
-               "</body>" +
-             "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This");
-
-        // go to the second word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("is");
-
-        // go to the third word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<b>a</b>");
-
-        // go to the fourth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("sentence");
-
-        // go to the fifth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("scattered");
-
-        // go to the sixth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("all");
-
-        // go to the seventh word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("over");
-
-        // go to the eight word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("the");
-
-        // go to the ninth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("place");
-
-        // NOTE: WebKit selection returns the dot as a word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(".");
-
-        // try to go past the last word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the last word (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("place.");
-
-        // go to the eight word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("the");
-
-        // go to the seventh word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("over");
-
-        // go to the sixth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("all");
-
-        // go to the fifth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("scattered");
-
-        // go to the fourth word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("sentence");
-
-        // go to the third word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<b>a</b>");
-
-        // go to the second word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("is");
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This");
-
-        // try to go before the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This");
-
-        // go to the second word (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("is");
-    }
-
-    /**
-     * Tests navigation by sentence.
-     */
-    @LargeTest
-    public void testNavigationBySentence() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "<p>" +
-                    "This is the first sentence of the first paragraph and has an <b>inline bold tag</b>." +
-                    "This is the second sentence of the first paragraph." +
-                  "</p>" +
-                  "<h1>This is a heading</h1>" +
-                  "<p>" +
-                    "This is the first sentence of the second paragraph." +
-                    "This is the second sentence of the second paragraph." +
-                  "</p>" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // Sentence axis is the default
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the first sentence of the first paragraph and has an "
-                + "<b>inline bold tag</b>.");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the second sentence of the first paragraph.");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is a heading");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the first sentence of the second paragraph.");
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the second sentence of the second paragraph.");
-
-        // try to go past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is the second sentence of the second paragraph.");
-
-        // go to the fourth sentence (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is the first sentence of the second paragraph.");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is a heading");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is the second sentence of the first paragraph.");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("This is the first sentence of the first paragraph and has an "
-                + "<b>inline bold tag</b>.");
-
-        // try to go before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the first sentence of the first paragraph and has an "
-                + "<b>inline bold tag</b>.");
-
-        // go to the second sentence (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("This is the second sentence of the first paragraph.");
-    }
-
-    /**
-     * Tests navigation by heading.
-     */
-    @LargeTest
-    public void testNavigationByHeading() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<h1>Heading one</h1>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h2>Heading two</h2>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h3>Heading three</h3>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h4>Heading four</h4>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h5>Heading five</h5>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<h6>Heading six</h6>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("3"); // expect the heading navigation axis
-
-        // go to the first heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h1>Heading one</h1>");
-
-        // go to the second heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h2>Heading two</h2>");
-
-        // go to the third heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h3>Heading three</h3>");
-
-        // go to the fourth heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h4>Heading four</h4>");
-
-        // go to the fifth heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h5>Heading five</h5>");
-
-        // go to the sixth heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h6>Heading six</h6>");
-
-        // try to go past the last heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fifth heading (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h5>Heading five</h5>");
-
-        // go to the fourth heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h4>Heading four</h4>");
-
-        // go to the third heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h3>Heading three</h3>");
-
-        // go to the second heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h2>Heading two</h2>");
-
-        // go to the first heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h1>Heading one</h1>");
-
-        // try to go before the first heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the second heading (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h2>Heading two</h2>");
-    }
-
-    /**
-     * Tests navigation by sibling.
-     */
-    @LargeTest
-    public void testNavigationBySibing() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<h1>Heading one</h1>" +
-                "<p>" +
-                  "This is some text" +
-                "</p>" +
-                "<div>" +
-                  "<button>Input</button>" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("3"); // expect the heading navigation axis
-
-        // change navigation axis to sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("4"); // expect the sibling navigation axis
-
-        // change navigation axis to parent/first child
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("5"); // expect the parent/first child navigation axis
-
-        // go to the first child of the body
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<h1>Heading one</h1>");
-
-        // change navigation axis to sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_LEFT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("4"); // expect the sibling navigation axis
-
-        // go to the next sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<p>This is some text</p>");
-
-        // go to the next sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div><button>Input</button></div>");
-
-        // try to go past the last sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the previous sibling (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<p>This is some text</p>");
-
-        // go to the previous sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<h1>Heading one</h1>");
-
-        // try to go before the previous sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the next sibling (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<p>This is some text</p>");
-    }
-
-    /**
-     * Tests navigation by parent/first child.
-     */
-    @LargeTest
-    public void testNavigationByParentFirstChild() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "<button>Input</button>" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to document
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_LEFT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("6"); // expect the document navigation axis
-
-        // change navigation axis to parent/first child
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_LEFT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("5"); // expect the parent/first child navigation axis
-
-        // go to the first child
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div><button>Input</button></div>");
-
-        // go to the first child
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<button>Input</button>");
-
-        // try to go to the first child of a leaf element
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the parent (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<div><button>Input</button></div>");
-
-        // go to the parent
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<body><div><button>Input</button></div></body>");
-
-        // try to go to the body parent
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first child (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div><button>Input</button></div>");
-    }
-
-    /**
-     * Tests navigation by document.
-     */
-    @LargeTest
-    public void testNavigationByDocument() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<button>Click</button>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to document
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_LEFT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("6"); // expect the document navigation axis
-
-        // go to the bottom of the document
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Click");
-
-        // go to the top of the document (reverse)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<body><button>Click</button></body>");
-
-        // go to the bottom of the document (reverse again)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Click");
-    }
-
-    /**
-     * Tests the sync between the text navigation and navigation by DOM elements.
-     */
-    @LargeTest
-    public void testSyncBetweenTextAndDomNodeNavigation() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<p>" +
-                  "First" +
-                "</p>" +
-                "<button>Second</button>" +
-                "<p>" +
-                  "Third" +
-                "</p>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // change navigation axis to heading
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("3"); // expect the heading navigation axis
-
-        // change navigation axis to sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_RIGHT, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("4"); // expect the sibling navigation axis
-
-        // go to the next sibling
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<button>Second</button>");
-
-        // change navigation axis to character
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("0"); // expect the character navigation axis
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the next word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-    }
-
-    /**
-     * Tests that the selection does not cross anchor boundaries. This is a
-     * workaround for the asymmetric and inconsistent handling of text with
-     * links by WebKit while traversing by sentence.
-     */
-    @LargeTest
-    public void testEnforceSelectionDoesNotCrossAnchorBoundary1() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>First</div>" +
-                "<p>" +
-                  "<a href=\"\">Second</a> Third" +
-                "</p>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div>First</div>");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"\">Second</a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Third");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"\">Second</a>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<div>First</div>");
-    }
-
-    /**
-     * Tests that the selection does not cross anchor boundaries. This is a
-     * workaround for the asymmetric and inconsistent handling of text with
-     * links by WebKit while traversing by sentence.
-     */
-    @LargeTest
-    public void testEnforceSelectionDoesNotCrossAnchorBoundary2() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>First</div>" +
-                "<a href=\"#\">Second</a>" +
-                "&nbsp;" +
-                "<a href=\"#\">Third</a>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">Second</a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("&nbsp;");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">Third</a>");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">Third</a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("&nbsp;");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">Second</a>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests that the selection does not cross anchor boundaries. This is a
-     * workaround for the asymmetric and inconsistent handling of text with
-     * links by WebKit while traversing by sentence.
-     */
-    @LargeTest
-    public void testEnforceSelectionDoesNotCrossAnchorBoundary3() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "First" +
-                "<div>" +
-                "<div>" +
-                  "<a href=\"#\">Second</a>" +
-                "</div>" +
-                "<div>" +
-                  "Third" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">Second</a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Third");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">Second</a>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests skipping of content with hidden visibility.
-     */
-    @LargeTest
-    public void testSkipVisibilityHidden() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>First </div>" +
-                "<div style=\"visibility:hidden;\">Second</div>" +
-                "<div> Third</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the third word (the second is invisible)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third word (the second is invisible)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Third");
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests skipping of content with display none.
-     */
-    @LargeTest
-    public void testSkipDisplayNone() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>First</div>" +
-                "<div style=\"display: none;\">Second</div>" +
-                "<div>Third</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // change navigation axis to word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON);
-        assertSelectionString("1"); // expect the word navigation axis
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the third word (the second is invisible)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Third");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third word (the second is invisible)
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Third");
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first word
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests for the selection not getting stuck.
-     *
-     * Note: The selection always proceeds but if it can
-     * be selecting the same content i.e. between the start
-     * and end are contained the same text nodes.
-     */
-    @LargeTest
-    public void testSelectionTextProceed() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<a href=\"#\">First</a>" +
-                "<span><a href=\"#\"><span>Second</span>&nbsp;<small>a</small></a>" +
-                "</span>&nbsp;<a href=\"#\">Third</a>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">First</a>");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\"><span>Second&nbsp;<small>a</small></a>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("&nbsp;");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">Third</a>");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">Third</a>");
-
-        // NOTE: Here we are a bit asymmetric around whitespace but we can live with it
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("&nbsp;");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\"><span>Second&nbsp;<small>a</small></a>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<a href=\"#\">First</a>");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<a href=\"#\">First</a>");
-    }
-
-    /**
-     * Tests if input elements are selected rather skipped.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<p>" +
-                  "First" +
-                "</p>" +
-                "<input type=\"text\"/>" +
-                "<p>" +
-                  "Second" +
-                "</p>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Second");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Second");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests traversing of input controls.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements2() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "First" +
-                  "<input type=\"text\"/>" +
-                  "<span>" +
-                    "<input type=\"text\"/>" +
-                  "</span>" +
-                  "<button type=\"button\">Click Me!</button>" +
-                  "<div>" +
-                    "<input type=\"submit\"/>" +
-                  "</div>" +
-                  "<p>" +
-                    "Second" +
-                  "</p>" +
-                "</div>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<button type=\"button\">Click Me!</button>");
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the sixth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Second");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the sixth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Second");
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<button type=\"button\">Click Me!</button>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Tests traversing of input controls.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements3() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<input type=\"text\"/>" +
-                "<button type=\"button\">Click Me!</button>" +
-                "<select>" +
-                  "<option value=\"volvo\">Volvo</option>" +
-                  "<option value=\"saab\">Saab</option>" +
-                "</select>" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<button type=\"button\">Click Me!</button>");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<select><option value=\"volvo\">Volvo</option>" +
-                "<option value=\"saab\">Saab</option></select>");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<select><option value=\"volvo\">Volvo</option>" +
-                "<option value=\"saab\">Saab</option></select>");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<button type=\"button\">Click Me!</button>");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-    }
-
-    /**
-     * Tests traversing of input controls.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements4() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "Start" +
-                "<span>" +
-                  "<span>" +
-                    "<input type=\"submit\">" +
-                  "</span>" +
-                "</span>" +
-                "<input type=\"text\" size=\"30\">" +
-                "<span>" +
-                  "<span>" +
-                    "<input type=\"submit\" size=\"30\">" +
-                  "</span>" +
-                "</span>" +
-                "End" +
-              "</body>" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Start");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\" size=\"30\">");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"submit\" size=\"30\">");
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("End");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fifth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("End");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"submit\" size=\"30\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\" size=\"30\">");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Start");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Start");
-    }
-
-    /**
-     * Tests traversing of input controls.
-     */
-    @LargeTest
-    public void testSelectionOfInputElements5() throws Exception {
-        // a bit ugly but helps detect beginning and end of all tests so accessibility
-        // and the mock service are not toggled on every test (expensive)
-        sExecutedTestCount++;
-
-        String html =
-            "<!DOCTYPE html>" +
-            "<html>" +
-              "<head>" +
-              "</head>" +
-              "<body>" +
-                "<div>" +
-                  "First" +
-                  "<input type=\"hidden\">" +
-                  "<input type=\"hidden\">" +
-                  "<input type=\"hidden\">" +
-                  "<input type=\"hidden\">" +
-                  "<input type=\"text\">" +
-                  "<span>" +
-                    "<span>" +
-                      "<input type=\"submit\">" +
-                    "</span>" +
-                  "</span>" +
-                "</div>" +
-              "</body>" +
-              "Second" +
-            "</html>";
-
-        WebView webView = loadHTML(html);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("Second");
-
-        // go to past the last sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString(null);
-
-        // go to the fourth sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("Second");
-
-        // go to the third sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"submit\">");
-
-        // go to the second sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("<input type=\"text\">");
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString("First");
-
-        // go to before the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0);
-        assertSelectionString(null);
-
-        // go to the first sentence
-        sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0);
-        assertSelectionString("First");
-    }
-
-    /**
-     * Enable accessibility and the mock accessibility service.
-     */
-    private void enableAccessibilityAndMockAccessibilityService() {
-        // make sure the manager is instantiated so the system initializes it
-        AccessibilityManager.getInstance(getActivity());
-
-        // enable accessibility and the mock accessibility service
-        Settings.Secure.putInt(getActivity().getContentResolver(),
-                Settings.Secure.ACCESSIBILITY_ENABLED, 1);
-        String enabledServices = new ComponentName(getActivity().getPackageName(),
-                MockAccessibilityService.class.getName()).flattenToShortString();
-        Settings.Secure.putString(getActivity().getContentResolver(),
-                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, enabledServices);
-
-        // poll within a timeout and let be interrupted in case of success
-        long incrementStep = TIMEOUT_ENABLE_ACCESSIBILITY_AND_MOCK_SERVICE / 5;
-        long start = SystemClock.uptimeMillis();
-        while (SystemClock.uptimeMillis() - start < TIMEOUT_ENABLE_ACCESSIBILITY_AND_MOCK_SERVICE &&
-                !sIsAccessibilityServiceReady) {
-            synchronized (sTestLock) {
-                try {
-                    sTestLock.wait(incrementStep);
-                } catch (InterruptedException ie) {
-                    /* ignore */
-                }
-            }
-        }
-
-        if (!sIsAccessibilityServiceReady) {
-            throw new IllegalStateException("MockAccessibilityService not ready. Did you add " +
-                    "tests and forgot to update AccessibilityInjectorTest#TEST_CASE_COUNT?");
-        }
-    }
-
-    @Override
-    protected void scrubClass(Class<?> testCaseClass) {
-        /* do nothing - avoid superclass behavior */
-    }
-
-    /**
-     * Strips the apple span appended by WebKit while generating
-     * the selection markup.
-     *
-     * @param markup The markup.
-     * @return Stripped from apple spans markup.
-     */
-    private static String stripAppleSpanFromMarkup(String markup) {
-        StringBuilder stripped = new StringBuilder(markup);
-        int prefixBegIdx = stripped.indexOf(APPLE_SPAN_PREFIX);
-        while (prefixBegIdx >= 0) {
-            int prefixEndIdx = stripped.indexOf(">", prefixBegIdx) + 1;
-            stripped.replace(prefixBegIdx, prefixEndIdx, "");
-            int suffixBegIdx = stripped.lastIndexOf(APPLE_SPAN_SUFFIX);
-            int suffixEndIdx = suffixBegIdx + APPLE_SPAN_SUFFIX.length();
-            stripped.replace(suffixBegIdx, suffixEndIdx, "");
-            prefixBegIdx = stripped.indexOf(APPLE_SPAN_PREFIX);
-        }
-        return stripped.toString();
-    }
-
-    /**
-     * Disables accessibility and the mock accessibility service.
-     */
-    private void disableAccessibilityAndMockAccessibilityService() {
-        // disable accessibility and the mock accessibility service
-        Settings.Secure.putInt(getActivity().getContentResolver(),
-                Settings.Secure.ACCESSIBILITY_ENABLED, 0);
-        Settings.Secure.putString(getActivity().getContentResolver(),
-                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "");
-    }
-
-    /**
-     * Asserts the next <code>expectedSelectionString</code> to be received.
-     */
-    private void assertSelectionString(String expectedSelectionString) {
-        assertTrue("MockAccessibilityService not ready", sIsAccessibilityServiceReady);
-
-        long incrementStep = TIMEOUT_WAIT_FOR_SELECTION_STRING / 5;
-        long start = SystemClock.uptimeMillis();
-        while (SystemClock.uptimeMillis() - start < TIMEOUT_WAIT_FOR_SELECTION_STRING &&
-                sReceivedSelectionString == SELECTION_STRING_UNKNOWN) {
-            synchronized (sTestLock) {
-                try {
-                    sTestLock.wait(incrementStep);
-                } catch (InterruptedException ie) {
-                    /* ignore */
-                }
-            }
-        }
-        try {
-            if (sReceivedSelectionString == SELECTION_STRING_UNKNOWN) {
-                fail("No selection string received. Expected: " + expectedSelectionString);
-            }
-            assertEquals(expectedSelectionString, sReceivedSelectionString);
-        } finally {
-            sReceivedSelectionString = SELECTION_STRING_UNKNOWN;
-        }
-    }
-
-    /**
-     * Sends a {@link KeyEvent} (up and down) to the {@link WebView}.
-     *
-     * @param keyCode The event key code.
-     */
-    private void sendKeyEvent(WebView webView, int keyCode, int metaState) {
-        webView.onKeyDown(keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 1, metaState));
-        webView.onKeyUp(keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 1, metaState));
-    }
-
-    /**
-     * Loads HTML content in a {@link WebView}.
-     *
-     * @param html The HTML content;
-     * @return The {@link WebView} view.
-     */
-    private WebView loadHTML(final String html) {
-        mWorker.getHandler().post(new Runnable() {
-            public void run() {
-                if (mWebView == null) {
-                    mWebView = getActivity().getWebView();
-                    mWebView.setWebViewClient(new WebViewClient() {
-                        @Override
-                        public void onPageFinished(WebView view, String url) {
-                            mWorker.getHandler().post(new Runnable() {
-                                public void run() {
-                                    synchronized (sTestLock) {
-                                        sTestLock.notifyAll();
-                                    }
-                                }
-                            });
-                        }
-                    });
-                }
-                mWebView.loadData(html, "text/html", null);
-            }
-        });
-        synchronized (sTestLock) {
-            try {
-                sTestLock.wait();
-            } catch (InterruptedException ie) {
-                /* ignore */
-            }
-        }
-        return mWebView;
-    }
-
-    /**
-     * Injects web content key bindings used for testing. This is required
-     * to ensure that this test will be agnostic to changes of the bindings.
-     */
-    private void injectTestWebContentKeyBindings() {
-        ContentResolver contentResolver = getActivity().getContentResolver();
-        sDefaultKeyBindings = Settings.Secure.getString(contentResolver,
-                Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS);
-        Settings.Secure.putString(contentResolver,
-                Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, TEST_KEY_DINDINGS);
-    }
-
-    /**
-     * Restores the default web content key bindings.
-     */
-    private void restoreDefaultWebContentKeyBindings() {
-        Settings.Secure.putString(getActivity().getContentResolver(),
-                Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
-                sDefaultKeyBindings);
-    }
-
-    /**
-     * This is a worker thread responsible for creating the {@link WebView}.
-     */
-    private class Worker implements Runnable {
-        private final Object mWorkerLock = new Object();
-        private Handler mHandler;
-
-       public Worker() {
-            new Thread(this).start();
-            synchronized (mWorkerLock) {
-                while (mHandler == null) {
-                    try {
-                        mWorkerLock.wait();
-                    } catch (InterruptedException ex) {
-                        /* ignore */
-                    }
-                }
-            }
-        }
-
-        public void run() {
-            synchronized (mWorkerLock) {
-                Looper.prepare();
-                mHandler = new Handler();
-                mWorkerLock.notifyAll();
-            }
-            Looper.loop();
-        }
-
-        public Handler getHandler() {
-            return mHandler;
-        }
-
-        public void stop() {
-            mHandler.getLooper().quit();
-        }
-    }
-
-    /**
-     * Mock accessibility service to receive the accessibility events
-     * with the current {@link WebView} selection.
-     */
-    public static class MockAccessibilityService extends AccessibilityService {
-        private boolean mIsServiceInfoSet;
-
-        @Override
-        protected void onServiceConnected() {
-            if (mIsServiceInfoSet) {
-                return;
-            }
-            AccessibilityServiceInfo info = new AccessibilityServiceInfo();
-            info.eventTypes = AccessibilityEvent.TYPE_VIEW_SELECTED;
-            info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
-            setServiceInfo(info);
-            mIsServiceInfoSet = true;
-
-            sIsAccessibilityServiceReady = true;
-
-            if (sInstance == null) {
-                return;
-            }
-            synchronized (sTestLock) {
-                sTestLock.notifyAll();
-            }
-        }
-
-        @Override
-        public void onAccessibilityEvent(AccessibilityEvent event) {
-            if (sInstance == null) {
-                return;
-            }
-            if (!event.getText().isEmpty()) {
-                CharSequence text = event.getText().get(0);
-                if (text != null) {
-                    sReceivedSelectionString = stripAppleSpanFromMarkup(text.toString());
-                } else {
-                    sReceivedSelectionString = null;
-                }
-            }
-            synchronized (sTestLock) {
-                sTestLock.notifyAll();
-            }
-        }
-
-        @Override
-        public void onInterrupt() {
-            /* do nothing */
-        }
-
-        @Override
-        public boolean onUnbind(Intent intent) {
-            sIsAccessibilityServiceReady = false;
-            return false;
-        }
-    }
-}
diff --git a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTestActivity.java b/core/tests/coretests/src/android/webkit/AccessibilityInjectorTestActivity.java
deleted file mode 100644
index 3842df7..0000000
--- a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTestActivity.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package android.webkit;
-
-import com.android.frameworks.coretests.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class AccessibilityInjectorTestActivity extends Activity {
-
-    private WebView mWebView;
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.accessibility_injector_test);
-        mWebView = (WebView) findViewById(R.id.webview);
-    }
-
-    public WebView getWebView() {
-        return mWebView;
-    }
-}
diff --git a/core/tests/coretests/src/android/webkit/UrlInterceptRegistryTest.java b/core/tests/coretests/src/android/webkit/UrlInterceptRegistryTest.java
deleted file mode 100644
index 7504449..0000000
--- a/core/tests/coretests/src/android/webkit/UrlInterceptRegistryTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.
- */
-
-package android.webkit;
-
-import android.test.AndroidTestCase;
-import android.util.Log;
-import android.webkit.CacheManager.CacheResult;
-import android.webkit.PluginData;
-import android.webkit.UrlInterceptHandler;
-
-import java.util.LinkedList;
-import java.util.Map;
-
-public class UrlInterceptRegistryTest extends AndroidTestCase {
-
-    /**
-     * To run these tests: $ mmm
-     * frameworks/base/tests/CoreTests/android && adb remount && adb
-     * sync $ adb shell am instrument -w  -e class \
-     * android.webkit.UrlInterceptRegistryTest \
-     * android.core/android.test.InstrumentationTestRunner
-     */
-
-    private static class MockUrlInterceptHandler implements UrlInterceptHandler {
-        private PluginData mData;
-        private String mUrl;
-
-        public MockUrlInterceptHandler(PluginData data, String url) {
-            mData = data;
-            mUrl = url;
-        }
-
-        public CacheResult service(String url, Map<String, String> headers) {
-            return null;
-        }
-
-        public PluginData getPluginData(String url,
-                                        Map<String,
-                                        String> headers) {
-            if (mUrl.equals(url)) {
-                return mData;
-            }
-
-            return null;
-        }
-    }
-
-    public void testGetPluginData() {
-        PluginData data = new PluginData(null, 0 , null, 200);
-        String url = new String("url1");
-        MockUrlInterceptHandler handler1 =
-                new MockUrlInterceptHandler(data, url);
-
-        data = new PluginData(null, 0 , null, 404);
-        url = new String("url2");
-        MockUrlInterceptHandler handler2 =
-                new MockUrlInterceptHandler(data, url);
-
-        assertTrue(UrlInterceptRegistry.registerHandler(handler1));
-        assertTrue(UrlInterceptRegistry.registerHandler(handler2));
-
-        data = UrlInterceptRegistry.getPluginData("url1", null);
-        assertTrue(data != null);
-        assertTrue(data.getStatusCode() == 200);
-
-        data = UrlInterceptRegistry.getPluginData("url2", null);
-        assertTrue(data != null);
-        assertTrue(data.getStatusCode() == 404);
-
-        assertTrue(UrlInterceptRegistry.unregisterHandler(handler1));
-        assertTrue(UrlInterceptRegistry.unregisterHandler(handler2));
-
-    }
-}
diff --git a/core/tests/coretests/src/android/webkit/WebkitTest.java b/core/tests/coretests/src/android/webkit/WebkitTest.java
deleted file mode 100644
index 4685e3c..0000000
--- a/core/tests/coretests/src/android/webkit/WebkitTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2006 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.
- */
-
-package android.webkit;
-
-import android.test.AndroidTestCase;
-import android.text.format.DateFormat;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-import android.webkit.DateSorter;
-
-import java.util.Calendar;
-import java.util.Date;
-
-public class WebkitTest extends AndroidTestCase {
-
-    private static final String LOGTAG = WebkitTest.class.getName();
-
-    @MediumTest
-    public void testDateSorter() throws Exception {
-        /**
-         * Note: check the logging output manually to test
-         * nothing automated yet, besides object creation
-         */
-        DateSorter dateSorter = new DateSorter(mContext);
-        Date date = new Date();
-
-        for (int i = 0; i < DateSorter.DAY_COUNT; i++) {
-            Log.i(LOGTAG, "Boundary " + i + " " + dateSorter.getBoundary(i));
-            Log.i(LOGTAG, "Label " + i + " " + dateSorter.getLabel(i));
-        }
-
-        Calendar c = Calendar.getInstance();
-        long time = c.getTimeInMillis();
-        int index;
-        Log.i(LOGTAG, "now: " + dateSorter.getIndex(time));
-        for (int i = 0; i < 20; i++) {
-            time -= 8 * 60 * 60 * 1000; // 8 hours
-            date.setTime(time);
-            c.setTime(date);
-            index = dateSorter.getIndex(time);
-            Log.i(LOGTAG, "time: " + DateFormat.format("yyyy/MM/dd HH:mm:ss", c).toString() +
-                    " " + index + " " + dateSorter.getLabel(index));
-        }
-    }
-}
diff --git a/core/tests/coretests/src/android/webkit/ZoomManagerTest.java b/core/tests/coretests/src/android/webkit/ZoomManagerTest.java
deleted file mode 100644
index 7e0e0b2..0000000
--- a/core/tests/coretests/src/android/webkit/ZoomManagerTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-package android.webkit;
-
-import android.test.AndroidTestCase;
-
-public class ZoomManagerTest extends AndroidTestCase {
-
-    private ZoomManager zoomManager;
-
-    @Override
-    public void setUp() {
-        WebView webView = new WebView(this.getContext());
-        WebViewClassic webViewClassic = WebViewClassic.fromWebView(webView);
-        CallbackProxy callbackProxy = new CallbackProxy(this.getContext(), webViewClassic);
-        zoomManager = new ZoomManager(webViewClassic, callbackProxy);
-
-        zoomManager.init(1.00f);
-    }
-
-    public void testInit() {
-        testInit(0.01f);
-        testInit(1.00f);
-        testInit(1.25f);
-    }
-
-    private void testInit(float density) {
-        zoomManager.init(density);
-        actualScaleTest(density);
-        defaultScaleTest(density);
-        assertEquals(zoomManager.getDefaultMaxZoomScale(), zoomManager.getMaxZoomScale());
-        assertEquals(zoomManager.getDefaultMinZoomScale(), zoomManager.getMinZoomScale());
-        assertEquals(density, zoomManager.getTextWrapScale());
-    }
-
-    public void testUpdateDefaultZoomDensity() {
-        // test the basic case where the actual values are equal to the defaults
-        testUpdateDefaultZoomDensity(0.01f);
-        testUpdateDefaultZoomDensity(1.00f);
-        testUpdateDefaultZoomDensity(1.25f);
-    }
-
-    private void testUpdateDefaultZoomDensity(float density) {
-        zoomManager.updateDefaultZoomDensity(density);
-        defaultScaleTest(density);
-    }
-
-    public void testUpdateDefaultZoomDensityWithSmallMinZoom() {
-        // test the case where the minZoomScale has changed to be < the default
-        float newDefaultScale = 1.50f;
-        float minZoomScale = ZoomManager.DEFAULT_MIN_ZOOM_SCALE_FACTOR * newDefaultScale;
-        WebViewCore.ViewState minViewState = new WebViewCore.ViewState();
-        minViewState.mMinScale = minZoomScale - 0.1f;
-        zoomManager.updateZoomRange(minViewState, 0, 0);
-        zoomManager.updateDefaultZoomDensity(newDefaultScale);
-        defaultScaleTest(newDefaultScale);
-    }
-
-    public void testUpdateDefaultZoomDensityWithLargeMinZoom() {
-        // test the case where the minZoomScale has changed to be > the default
-        float newDefaultScale = 1.50f;
-        float minZoomScale = ZoomManager.DEFAULT_MIN_ZOOM_SCALE_FACTOR * newDefaultScale;
-        WebViewCore.ViewState minViewState = new WebViewCore.ViewState();
-        minViewState.mMinScale = minZoomScale + 0.1f;
-        zoomManager.updateZoomRange(minViewState, 0, 0);
-        zoomManager.updateDefaultZoomDensity(newDefaultScale);
-        defaultScaleTest(newDefaultScale);
-    }
-
-    public void testUpdateDefaultZoomDensityWithSmallMaxZoom() {
-        // test the case where the maxZoomScale has changed to be < the default
-        float newDefaultScale = 1.50f;
-        float maxZoomScale = ZoomManager.DEFAULT_MAX_ZOOM_SCALE_FACTOR * newDefaultScale;
-        WebViewCore.ViewState maxViewState = new WebViewCore.ViewState();
-        maxViewState.mMaxScale = maxZoomScale - 0.1f;
-        zoomManager.updateZoomRange(maxViewState, 0, 0);
-        zoomManager.updateDefaultZoomDensity(newDefaultScale);
-        defaultScaleTest(newDefaultScale);
-    }
-
-    public void testUpdateDefaultZoomDensityWithLargeMaxZoom() {
-        // test the case where the maxZoomScale has changed to be > the default
-        float newDefaultScale = 1.50f;
-        float maxZoomScale = ZoomManager.DEFAULT_MAX_ZOOM_SCALE_FACTOR * newDefaultScale;
-        WebViewCore.ViewState maxViewState = new WebViewCore.ViewState();
-        maxViewState.mMaxScale = maxZoomScale + 0.1f;
-        zoomManager.updateZoomRange(maxViewState, 0, 0);
-        zoomManager.updateDefaultZoomDensity(newDefaultScale);
-        defaultScaleTest(newDefaultScale);
-    }
-
-    public void testComputeScaleWithLimits() {
-        final float maxScale = zoomManager.getMaxZoomScale();
-        final float minScale = zoomManager.getMinZoomScale();
-        assertTrue(maxScale > minScale);
-        assertEquals(maxScale, zoomManager.computeScaleWithLimits(maxScale));
-        assertEquals(maxScale, zoomManager.computeScaleWithLimits(maxScale + .01f));
-        assertEquals(minScale, zoomManager.computeScaleWithLimits(minScale));
-        assertEquals(minScale, zoomManager.computeScaleWithLimits(minScale - .01f));
-    }
-
-    private void actualScaleTest(float actualScale) {
-        assertEquals(actualScale, zoomManager.getScale());
-        assertEquals(1 / actualScale, zoomManager.getInvScale());
-    }
-
-    private void defaultScaleTest(float defaultScale) {
-        final float maxDefault = ZoomManager.DEFAULT_MAX_ZOOM_SCALE_FACTOR * defaultScale;
-        final float minDefault = ZoomManager.DEFAULT_MIN_ZOOM_SCALE_FACTOR * defaultScale;
-        assertEquals(defaultScale, zoomManager.getDefaultScale());
-        assertEquals(1 / defaultScale, zoomManager.getInvDefaultScale());
-        assertEquals(maxDefault, zoomManager.getDefaultMaxZoomScale());
-        assertEquals(minDefault, zoomManager.getDefaultMinZoomScale());
-    }
-}
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 1f38ddb..89d102d 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -126,7 +126,6 @@
          interact with the system. -->
 
     <assign-permission name="android.permission.MODIFY_AUDIO_SETTINGS" uid="media" />
-    <assign-permission name="android.permission.ACCESS_DRM" uid="media" />
     <assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="media" />
     <assign-permission name="android.permission.WAKE_LOCK" uid="media" />
     <assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="media" />
diff --git a/docs/downloads/training/AndroidTestingFun.zip b/docs/downloads/training/AndroidTestingFun.zip
new file mode 100644
index 0000000..dca5812
--- /dev/null
+++ b/docs/downloads/training/AndroidTestingFun.zip
Binary files differ
diff --git a/docs/html/distribute/googleplay/promote/brand.jd b/docs/html/distribute/googleplay/promote/brand.jd
index 265584f..0bda561 100644
--- a/docs/html/distribute/googleplay/promote/brand.jd
+++ b/docs/html/distribute/googleplay/promote/brand.jd
@@ -21,8 +21,8 @@
     <ul>
     <li>Android&trade; should have a trademark symbol the first time it appears in a creative.</li>
     <li>Android should always be capitalized and is never plural or possessive.</li>
-    <li>"Android" by itself cannot be used in the name of an application name or accessory product.
-Instead use "for Android."
+    <li>"Android" cannot be used in names of applications or accessory products,
+    including phones, tablets, TVs, speakers, headphones, watches, and other devices. Instead use "for Android".
       <ul>
         <li><span style="color:red">Incorrect</span>: "Android MediaPlayer"</li>
         <li><span style="color:green">Correct</span>: "MediaPlayer for Android"</li>
diff --git a/docs/html/images/gp-policy-spam-reqrating.png b/docs/html/images/gp-policy-spam-reqrating.png
index 3dc7d6f..20e17c1 100644
--- a/docs/html/images/gp-policy-spam-reqrating.png
+++ b/docs/html/images/gp-policy-spam-reqrating.png
Binary files differ
diff --git a/docs/html/images/training/lesson2_MyFirstTestActivityTest_result.png b/docs/html/images/training/lesson2_MyFirstTestActivityTest_result.png
new file mode 100644
index 0000000..e0e869b
--- /dev/null
+++ b/docs/html/images/training/lesson2_MyFirstTestActivityTest_result.png
Binary files differ
diff --git a/docs/html/training/activity-testing/activity-basic-testing.jd b/docs/html/training/activity-testing/activity-basic-testing.jd
new file mode 100644
index 0000000..016289d
--- /dev/null
+++ b/docs/html/training/activity-testing/activity-basic-testing.jd
@@ -0,0 +1,227 @@
+page.title=Creating and Running a Test Case
+trainingnavtop=true
+
+@jd:body
+
+<!-- This is the training bar -->
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>This lesson teaches you to</h2>
+<ol>
+  <li><a href="#testcase">Create a Test Case for Activity Testing</a>
+      <ol>
+      <li><a href="#fixture">Set Up Your Test Fixture</a></li>
+      <li><a href="#preconditions">Add Test Preconditions</a></li>
+      <li><a href="#test_method">Add Test Methods to Verify Your Activity</a></li>
+      </ol>
+  </li>
+  <li><a href="#build_run">Build and Run Your Test</a></li>
+</ol>
+
+<h2>You should also read</h2>
+<ul>
+<li><a href="{@docRoot}tools/testing/testing_android.html">Testing
+Fundamentals</a></li>
+</ul>
+
+</div>
+</div>
+<p>In order to verify that there are no regressions in the layout design and
+functional behavior in your application, it's important to
+create a test for each {@link android.app.Activity} in your application. For
+each test, you need to create the individual parts of a test case, including
+the test fixture, preconditions test method, and {@link android.app.Activity}
+test methods. You can then run your test to get a test report. If any test
+method fails, this might indicate a potential defect in your code.</p>
+<p class="note"><strong>Note:</strong> In the Test-Driven Development (TDD)
+approach, instead of writing most or all of your app code up-front and then
+running tests later in the development cycle, you would progressively write
+just enough production code to satisfy your test dependencies, update your
+test cases to reflect new functional requirements, and iterate repeatedly this
+way.</p>
+
+<h2 id="testcase">Create a Test Case</h2>
+<p>{@link android.app.Activity} tests are written in a structured way.
+Make sure to put your tests in a separate package, distinct from the code under
+test.</p>
+<p>By convention, your test package name should follow the same name as the
+application package, suffixed with <strong>".tests"</strong>. In the test package
+you created, add the Java class for your test case. By convention, your test case
+name should also follow the same name as the Java or Android class that you
+want to test, but suffixed with <strong>“Test”</strong>.</p>
+<p>To create a new test case in Eclipse:</p>
+<ol type="a">
+   <li>In the Package Explorer, right-click on the {@code /src} directory for
+your test project and select <strong>New &gt; Package</strong>.</li>
+   <li>Set the <strong>Name</strong> field to
+{@code &lt;your_app_package_name&gt;.tests} (for example,
+{@code com.example.android.testingfun.tests}) and click
+<strong>Finish</strong>.</li>
+   <li>Right-click on the test package you created, and select
+<strong>New &gt; Class</strong>.</li>
+    <li>Set the <strong>Name</strong> field to
+{@code &lt;your_app_activity_name&gt;Test} (for example,
+{@code MyFirstTestActivityTest}) and click <strong>Finish</strong>.</li>
+</ol>
+
+<h3 id="fixture">Set Up Your Test Fixture</h3>
+<p>A <em>test fixture</em> consists of objects that must be initialized for
+running one or more tests. To set up the test fixture, you can override the
+{@link junit.framework.TestCase#setUp()} and
+{@link junit.framework.TestCase#tearDown()} methods in your test. The
+test runner automatically runs {@link junit.framework.TestCase#setUp()} before
+running any other test methods, and {@link junit.framework.TestCase#tearDown()}
+at the end of each test method execution. You can use these methods to keep
+the code for test initialization and clean up separate from the tests methods.
+</p>
+<p>To set up your test fixture in Eclipse:</p>
+<ol>
+<li>In the Package Explorer, double-click on the test case that you created
+earlier to bring up the Eclipse Java editor, then modify your test case class
+to extend one of the sub-classes of {@link android.test.ActivityTestCase}.
+<p>For example:</p>
+<pre>
+public class MyFirstTestActivityTest
+        extends ActivityInstrumentationTestCase2&lt;MyFirstTestActivity&gt; {
+</pre>
+</li>
+<li>Next, add the constructor and {@link junit.framework.TestCase#setUp()}
+methods to your test case, and add variable declarations for the
+{@link android.app.Activity} that you want to test.</p>
+<p>For example:</p>
+<pre>
+public class MyFirstTestActivityTest
+        extends ActivityInstrumentationTestCase2&lt;MyFirstTestActivity&gt; {
+
+    private MyFirstTestActivity mFirstTestActivity;
+    private TextView mFirstTestText;
+
+    public MyFirstTestActivityTest() {
+        super(MyFirstTestActivity.class);
+    }
+
+    &#64;Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mFirstTestActivity = getActivity();
+        mFirstTestText =
+                (TextView) mFirstTestActivity
+                .findViewById(R.id.my_first_test_text_view);
+    }
+}
+</pre>
+<p>The constructor is invoked by the test runner to instantiate the test
+class, while the {@link junit.framework.TestCase#setUp()} method is invoked by
+the test runner before it runs any tests in the test class.</p>
+</li>
+</ol>
+
+<p>Typically, in the {@link junit.framework.TestCase#setUp()} method, you
+should:</p>
+<ul>
+<li>Invoke the superclass constructor for
+{@link junit.framework.TestCase#setUp()}, which is required by JUnit.</li>
+<li>Initialize your test fixture state by:
+   <ul>
+   <li>Defining the instance variables that store the state of the fixture.</li>
+   <li>Creating and storing a reference to an instance of the
+{@link android.app.Activity} under test.</li>
+   <li>Obtaining a reference to any UI components in the
+{@link android.app.Activity} that you want to test.</li>
+   </ul>
+</ul>
+
+<p>You can use the
+{@link android.test.ActivityInstrumentationTestCase2#getActivity()} method to
+get a reference to the {@link android.app.Activity} under test.</p>
+
+<h3 id="preconditions">Add Test Preconditions</h3>
+<p>As a sanity check, it is good practice to verify that the test fixture has
+been set up correctly, and the objects that you want to test have been correctly
+instantiated or initialized. That way, you won’t have to see
+tests failing because something was wrong with the setup of your test fixture.
+By convention, the method for verifying your test fixture is called
+{@code testPreconditions()}.</p>
+
+<p>For example, you might want to add a {@code testPreconditons()} method like
+this to your test case:</p>
+
+<pre>
+public void testPreconditions() {
+    assertNotNull(“mFirstTestActivity is null”, mFirstTestActivity);
+    assertNotNull(“mFirstTestText is null”, mFirstTestText);
+}
+</pre>
+
+<p>The assertion methods are from the JUnit {@link junit.framework.Assert}
+class. Generally, you can use assertions to
+verify if a specific condition that you want to test is true.
+<ul>
+<li>If the condition is false, the assertion method throws an
+{@link android.test.AssertionFailedError} exception, which is then typically
+reported by the test runner. You can provide a string in the first argument of
+your assertion method to give some contextual details if the assertion fails.</li>
+<li>If the condition is true, the test passes.</li>
+</ul>
+<p>In both cases, the test runner proceeds to run the other test methods in the
+test case.</p>
+
+<h3 id="test_method">Add Test Methods to Verify Your Activity</h3>
+<p>Next, add one or more test methods to verify the layout and functional
+behavior of your {@link android.app.Activity}.</p>
+<p>For example, if your {@link android.app.Activity} includes a
+{@link android.widget.TextView}, you can add a test method like this to check
+that it has the correct label text:</p>
+<pre>
+public void testMyFirstTestTextView_labelText() {
+    final String expected =
+            mFirstTestActivity.getString(R.string.my_first_test);
+    final String actual = mFirstTestText.getText().toString();
+    assertEquals(expected, actual);
+}
+</pre>
+
+<p>The {@code testMyFirstTestTextView_labelText()} method simply checks that the
+default text of the {@link android.widget.TextView} that is set by the layout
+is the same as the expected text defined in the {@code strings.xml} resource.</p>
+<p class="note"><strong>Note:</strong> When naming test methods, you can use
+an underscore to separate what is being tested from the specific case being
+tested. This style makes it easier to see exactly what cases are being tested.</p>
+<p>When doing this type of string value comparison, it’s good practice to read
+the expected string from your resources, instead of hardcoding the string in
+your comparison code. This prevents your test from easily breaking whenever the
+string definitions are modified in the resource file.</p>
+<p>To perform the comparison, pass both the expected and actual strings as
+arguments to the
+{@link junit.framework.Assert#assertEquals(java.lang.String, java.lang.String) assertEquals()}
+method. If the values are not the same, the assertion will throw an
+{@link junit.framework.AssertionFailedError} exception.</p>
+<p>If you added a {@code testPreconditions()} method, put your test methods
+after the {@code testPreconditions()} definition in your Java class.</p>
+<p>For a complete test case example, take a look at
+{@code MyFirstTestActivityTest.java} in the sample app.</p>
+
+<h2 id="build_run">Build and Run Your Test</h2>
+<p>You can build and run your test easily from the Package Explorer in
+Eclipse.</p>
+<p>To build and run your test:</p>
+<ol>
+<li>Connect an Android device to your machine. On the device or emulator, open
+the <strong>Settings</strong> menu, select <strong>Developer options</strong>
+and make sure that USB debugging is enabled.</li>
+<li>In the Project Explorer, right-click on the test class that you created
+earlier and select <strong>Run As &gt; Android Junit Test</strong>.</li>
+<li>In the Android Device Chooser dialog, select the device that you just
+connected, then click <strong>OK</strong>.</li>
+<li>In the JUnit view, verify that the test passes with no errors or failures.</li>
+</ol>
+<p>For example, if the test case passes with no errors, the result should look
+like this:</p>
+<img src="{@docRoot}images/training/activity-testing_lesson2_MyFirstTestActivityTest_result.png" alt="" />
+<p class="img-caption">
+  <strong>Figure 1.</strong> Result of a test with no errors.
+</p>
+
+
+
diff --git a/docs/html/training/activity-testing/activity-functional-testing.jd b/docs/html/training/activity-testing/activity-functional-testing.jd
new file mode 100644
index 0000000..7c8ff1d
--- /dev/null
+++ b/docs/html/training/activity-testing/activity-functional-testing.jd
@@ -0,0 +1,166 @@
+page.title=Creating Functional Tests
+trainingnavtop=true
+@jd:body
+
+<!-- This is the training bar -->
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>This lesson teaches you to</h2>
+<ol>
+   <li><a href="#test_methods">Add Test Method to Validate Functional Behavior</a>
+   <ol>
+      <li><a href="#activitymonitor">Set Up an ActivityMonitor</a></li>
+      <li><a href="#keyinput">Send Keyboard Input Using Instrumentation</a></li>
+   </ol>
+   </li>
+</ol>
+
+<h2>Try it out</h2>
+<div class="download-box">
+ <a href="http://developer.android.com/shareables/training/AndroidTestingFun.zip"
+class="button">Download the demo</a>
+ <p class="filename">AndroidTestingFun.zip</p>
+</div>
+
+</div>
+</div>
+<p>Functional testing involves verifying that individual application
+components work together as expected by the user. For example, you can create a
+functional test to verify that an {@link android.app.Activity} correctly
+launches a target {@link android.app.Activity} when the user performs a UI
+interaction.</p>
+
+<p>To create a functional test for your {@link android.app.Activity}, your test
+class should extend {@link android.test.ActivityInstrumentationTestCase2}.
+Unlike {@link android.test.ActivityUnitTestCase},
+tests in {@link android.test.ActivityInstrumentationTestCase2} can
+communicate with the Android system and send keyboard input and click events to
+the UI.</p>
+
+<p>For a complete test case example, take a look at
+{@code SenderActivityTest.java} in the sample app.</p>
+
+<h2 id="test_methods">Add Test Method to Validate Functional Behavior</h2>
+<p id="test_goals">Your functional testing goals might include:</p>
+<ul>
+<li>Verifying that a target {@link android.app.Activity} is started when a
+UI control is pushed in the sender {@link android.app.Activity}.</li>
+<li>Verifying that the target {@link android.app.Activity} displays the
+correct data based on the user's input in the sender
+{@link android.app.Activity}.</li>
+</ul>
+<p>You might implement your test method like this:</p>
+
+<pre>
+&#64;MediumTest
+public void testSendMessageToReceiverActivity() {
+    final Button sendToReceiverButton = (Button) 
+            mSenderActivity.findViewById(R.id.send_message_button);
+
+    final EditText senderMessageEditText = (EditText) 
+            mSenderActivity.findViewById(R.id.message_input_edit_text);
+
+    // Set up an ActivityMonitor
+    ...
+
+    // Send string input value
+    ...
+
+    // Validate that ReceiverActivity is started
+    ...
+
+    // Validate that ReceiverActivity has the correct data
+    ...
+
+    // Remove the ActivityMonitor
+    ...
+}
+</pre>
+<p>The test waits for an {@link android.app.Activity} that matches this monitor,
+otherwise returns null after a timeout elapses. If {@code ReceiverActivity} was
+started, the {@link android.app.Instrumentation.ActivityMonitor ActivityMonitor}
+that you set
+up earlier receives a hit. You can use the assertion methods to verify that
+the {@code ReceiverActivity} is indeed started, and that the hit count on the
+{@link android.app.Instrumentation.ActivityMonitor ActivityMonitor} incremented
+as expected.</p>
+
+<h2 id="activitymonitor">Set up an ActivityMonitor</h2>
+<p>To monitor a single {@link android.app.Activity} in your application, you
+can register an {@link android.app.Instrumentation.ActivityMonitor ActivityMonitor}.
+The {@link android.app.Instrumentation.ActivityMonitor ActivityMonitor} is
+notified by the system whenever an {@link android.app.Activity} that matches your criteria is started.
+If a match is found, the monitor’s hit count is updated.</p>
+<p>Generally, to use an
+{@link android.app.Instrumentation.ActivityMonitor ActivityMonitor}, you should:</p>
+<ol>
+<li>Retrieve the {@link android.app.Instrumentation} instance for your test
+case by using the
+{@link android.test.InstrumentationTestCase#getInstrumentation()} method.</li>
+<li>Add an instance of {@link android.app.Instrumentation.ActivityMonitor} to
+the current instrumentation using one of the {@link android.app.Instrumentation}
+{@code addMonitor()} methods. The match criteria can be specified as an
+{@link android.content.IntentFilter} or a class name string.</li>
+<li>Wait for the {@link android.app.Activity} to start.</li>
+<li>Verify that the monitor hits were incremented.</li>
+<li>Remove the monitor.</li>
+</ol>
+<p>For example:</p>
+<pre>
+// Set up an ActivityMonitor
+ActivityMonitor receiverActivityMonitor =
+        getInstrumentation().addMonitor(ReceiverActivity.class.getName(),
+        null, false);
+
+// Validate that ReceiverActivity is started
+TouchUtils.clickView(this, sendToReceiverButton);
+ReceiverActivity receiverActivity = (ReceiverActivity) 
+        receiverActivityMonitor.waitForActivityWithTimeout(TIMEOUT_IN_MS);
+assertNotNull("ReceiverActivity is null", receiverActivity);
+assertEquals("Monitor for ReceiverActivity has not been called",
+        1, receiverActivityMonitor.getHits());
+assertEquals("Activity is of wrong type",
+        ReceiverActivity.class, receiverActivity.getClass());
+
+// Remove the ActivityMonitor
+getInstrumentation().removeMonitor(receiverActivityMonitor);
+</pre>
+
+<h2 id="keyinput">Send Keyboard Input Using Instrumentation</h2>
+<p>If your {@link android.app.Activity} has an {@link android.widget.EditText}
+field, you might want to test that users can enter values into the
+{@link android.widget.EditText} object.</p>
+<p>Generally, to send a string input value to an {@link android.widget.EditText}
+object in {@link android.test.ActivityInstrumentationTestCase2}, you should:</p>
+<ol>
+<li>Use the {@link android.app.Instrumentation#runOnMainSync(java.lang.Runnable) runOnMainSync()}
+method to run the {@link android.view.View#requestFocus()} call synchronously
+in a loop. This way, the UI thread is blocked until focus is received.</li>
+<li>Call {@link android.app.Instrumentation#waitForIdleSync()} method to wait
+for the main thread to become idle (that is, have no more events to process).</li>
+<li>Send a text string to the {@link android.widget.EditText} by calling
+{@link android.app.Instrumentation#sendStringSync(java.lang.String)
+sendStringSync()} and pass your input string as the parameter.</p>
+</ol>
+<p>For example:</p>
+<pre>
+// Send string input value
+getInstrumentation().runOnMainSync(new Runnable() {
+    &#64;Override
+    public void run() {
+        senderMessageEditText.requestFocus();
+    }
+});
+getInstrumentation().waitForIdleSync();
+getInstrumentation().sendStringSync("Hello Android!");
+getInstrumentation().waitForIdleSync();
+</pre>
+
+
+
+
+
+
+
+
diff --git a/docs/html/training/activity-testing/activity-ui-testing.jd b/docs/html/training/activity-testing/activity-ui-testing.jd
new file mode 100644
index 0000000..644f3ca
--- /dev/null
+++ b/docs/html/training/activity-testing/activity-ui-testing.jd
@@ -0,0 +1,216 @@
+page.title=Testing UI Components
+trainingnavtop=true
+
+@jd:body
+
+<!-- This is the training bar -->
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>This lesson teaches you to</h2>
+<ol>
+  <li><a href="#testcase">Create a Test Case for UI Testing with Instrumentation</a>
+  <li><a href="#test_method">Add Test Methods to Verify UI Behavior</a>
+     <ol>
+     <li><a href="#verify_button_display">Verify Button Layout Parameters</a></li>
+     <li><a href="#verify_TextView">Verify TextView Layout Parameters</a></li>
+     <li><a href="#verify_button_behavior">Verify Button Behavior</a></li>
+     </ol>
+  </li>
+  <li><a href="#annotations">Apply Test Annotations</a></li>
+</ol>
+
+<h2>Try it out</h2>
+<div class="download-box">
+ <a href="http://developer.android.com/shareables/training/AndroidTestingFun.zip"
+class="button">Download the demo</a>
+ <p class="filename">AndroidTestingFun.zip</p>
+</div>
+
+</div>
+</div>
+
+<p>Typically, your {@link android.app.Activity} includes user interface
+components (such as buttons, editable text fields, checkboxes, and pickers) to
+allow users to interact with your Android application. This lesson shows how
+you can test an {@link android.app.Activity} with a simple push-button UI. You
+can use the same general steps to test other, more sophisticated types of UI
+components.</p>
+
+<p class="note"><strong>Note:</strong> The type of UI testing in this lesson is
+called <em>white-box testing</em> because you have the
+source code for the application that you want to test. The Android
+<a href="{@docRoot}tools/testing/testing_android.html#Instrumentation">Instrumentation</a>
+framework is suitable for creating white-box tests for UI components within an
+application. An alternative type of UI testing is <em>black-box testing</em>,
+where you may not have access to the application source. This type of testing
+is useful when you want to test how your app interacts with other apps or with
+the system. Black-box testing is not covered in this training. To learn more
+about how to perform black-box testing on your Android apps, see the
+<a href="{@docRoot}tools/testing/testing_ui.html">UI Testing guide</a>.
+<p>For a complete test case example, take a look at
+{@code ClickFunActivityTest.java} in the sample app.</p>
+
+<h2 id="testcase">Create a Test Case for UI Testing with Instrumentation</h2>
+<p>When testing an {@link android.app.Activity} that has a user interface (UI),
+the {@link android.app.Activity} under test runs in the UI thread. However, the
+test application itself runs in a separate thread in the same process as the
+application under test. This means that your test app can reference objects
+from the UI thread, but if it attempts to change properties on those objects or
+send events to the UI thread, you will usually get a {@code WrongThreadException}
+error.</p>
+<p>To safely inject {@link android.content.Intent} objects into your
+{@link android.app.Activity} or run test methods on the UI thread, you can
+extend your test class to use {@link android.test.ActivityInstrumentationTestCase2}.
+To learn more about how to run test methods on the UI thread, see
+<a href="{@docRoot}tools/testing/activity_testing.html#RunOnUIThread">Testing
+on the UI thread</a>.</p>
+
+<h3 id="fixture">Set Up Your Test Fixture</h3>
+<p>When setting up the test fixture for UI testing, you should specify the
+<a href="{@docRoot}guide/topics/ui/ui-events.html#TouchMode">touch mode</a>
+in your {@link junit.framework.TestCase#setUp()} method. Setting the touch mode
+to {@code true} prevents the UI control from taking focus when you click it
+programmatically in the test method later (for example, a button UI will just
+fire its on-click listener). Make sure that you call
+{@link android.test.ActivityInstrumentationTestCase2#setActivityInitialTouchMode(boolean) setActivityInitialTouchMode()}
+before calling {@link android.test.ActivityInstrumentationTestCase2#getActivity()}.
+</p>
+<p>For example:</ap>
+<pre>
+public class ClickFunActivityTest
+        extends ActivityInstrumentationTestCase2<ClickFunActivity> {
+    ...
+    &#64;Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        setActivityInitialTouchMode(true);
+
+        mClickFunActivity = getActivity();
+        mClickMeButton = (Button) 
+                mClickFunActivity
+                .findViewById(R.id.launch_next_activity_button);
+        mInfoTextView = (TextView) 
+                mClickFunActivity.findViewById(R.id.info_text_view);
+    }
+}
+</pre>
+
+<h2 id="test_methods">Add Test Methods to Validate UI Behavior</h2>
+<p id="test_goals">Your UI testing goals might include:</p>
+<ul>
+<li>Verifying that a button is displayed with the correct layout when the
+{@link android.app.Activity} is launched.</li>
+<li>Verifying that a {@link android.widget.TextView} is initially hidden.</li>
+<li>Verifying that a {@link android.widget.TextView} displays the expected string
+when a button is pushed.</li>
+</ul>
+<p>The following section demonstrates how you can implement test methods
+to perform these verifications.</p>
+
+<h3 id="verify_button_display">Verify Button Layout Parameters</h3>
+<p>You might add a test method like this to verify that a button is displayed
+correctly in your {@link android.app.Activity}:</p>
+<pre>
+&#64;MediumTest
+public void testClickMeButton_layout() {
+    final View decorView = mClickFunActivity.getWindow().getDecorView();
+
+    ViewAsserts.assertOnScreen(decorView, mClickMeButton);
+
+    final ViewGroup.LayoutParams layoutParams =
+            mClickMeButton.getLayoutParams();
+    assertNotNull(layoutParams);
+    assertEquals(layoutParams.width, WindowManager.LayoutParams.MATCH_PARENT);
+    assertEquals(layoutParams.height, WindowManager.LayoutParams.WRAP_CONTENT);
+}
+</pre>
+
+<p>In the {@link android.test.ViewAsserts#assertOnScreen(android.view.View,android.view.View) assertOnScreen()}
+method call, you should pass in the root view and the view that you are
+expecting to be present on the screen. If the expected view is not found in the
+root view, the assertion method throws an {@link junit.framework.AssertionFailedError}
+exception, otherwise the test passes.</p>
+<p>You can also verify that the layout of a {@link android.widget.Button} is
+correct by getting a reference to its {@link android.view.ViewGroup.LayoutParams}
+object, then call assertion methods to verify that the
+{@link android.widget.Button} object's width and height attributes match the
+expected values.</p>
+<p>The {@code &#64;MediumTest} annotation specifies how the test is categorized,
+relative to its absolute execution time. To learn more about using test size
+annotations, see <a href="#annotations">Apply Test Annotations</a>.</p>
+
+<h3 id="verify_TextView">Verify TextView Layout Parameters</h3>
+<p>You might add a test method like this to verify that a
+{@link android.widget.TextView} initially appears hidden in
+your {@link android.app.Activity}:</p>
+<pre>
+&#64;MediumTest
+public void testInfoTextView_layout() {
+    final View decorView = mClickFunActivity.getWindow().getDecorView();
+    ViewAsserts.assertOnScreen(decorView, mInfoTextView);
+    assertTrue(View.GONE == mInfoTextView.getVisibility());
+}
+</pre>
+<p>You can call {@link android.view.Window#getDecorView()} to get a reference
+to the decor view for the {@link android.app.Activity}. The decor view is the
+top-level ViewGroup ({@link android.widget.FrameLayout}) view in the layout
+hierarchy.</p>
+
+<h3 id="verify_button_behavior">Verify Button Behavior</h3>
+<p>You can use a test method like this to verify that a
+{@link android.widget.TextView} becomes visible when a
+{@link android.widget.Button} is pushed:</p>
+
+<pre>
+&#64;MediumTest
+public void testClickMeButton_clickButtonAndExpectInfoText() {
+    String expectedInfoText = mClickFunActivity.getString(R.string.info_text);
+    TouchUtils.clickView(this, mClickMeButton);
+    assertTrue(View.VISIBLE == mInfoTextView.getVisibility());
+    assertEquals(expectedInfoText, mInfoTextView.getText());
+}
+</pre>
+
+<p>To programmatically click a {@link android.widget.Button} in your
+test, call {@link android.test.TouchUtils#clickView(android.test.InstrumentationTestCase,android.view.View) clickView()}.
+You must pass in a reference to the test case that is being run and a reference
+to the {@link android.widget.Button} to manipulate.</p>
+
+<p class="note"><strong>Note: </strong>The {@link android.test.TouchUtils}
+helper class provides convenience methods for simulating touch interactions
+with your application. You can use these methods to simulate clicking, tapping,
+and dragging of Views or the application screen.</p>
+<p class="caution"><strong>Caution: </strong>The {@link android.test.TouchUtils}
+methods are designed to send events to the UI thread safely from the test thread.
+You should not run {@link android.test.TouchUtils} directly in the UI thread or
+any test method annotated with {@code &#64;UIThread}. Doing so might
+raise the {@code WrongThreadException}.</p>
+
+<h2 id="annotations">Apply Test Annotations</h2>
+<p>The following annotations can be applied to indicate the size of a test
+method:</p>
+<dl>
+<dt>{@link
+android.test.suitebuilder.annotation.SmallTest &#64;SmallTest}</dt>
+<dd>Marks a test that should run as part of the small tests.</dd>
+<dt>{@link
+android.test.suitebuilder.annotation.MediumTest &#64;MediumTest}</dt>
+<dd>Marks a test that should run as part of the medium tests.</dd>
+<dt>{@link android.test.suitebuilder.annotation.LargeTest &#64;LargeTest}</dt>
+<dd>Marks a test that should run as part of the large tests.</dd>
+</dl>
+<p>Typically, a short running test that take only a few milliseconds should be
+marked as a {@code &#64;SmallTest}. Longer running tests (100 milliseconds or
+more) are usually marked as {@code &#64;MediumTest}s or {@code &#64;LargeTest}s,
+depending on whether the test accesses resources on the local system only or
+remote resources over a network. For guidance on using test size annotations,
+see this <a href="https://plus.sandbox.google.com/+AndroidDevelopers/posts/TPy1EeSaSg8">Android Tools Protip</a>.</p>
+<p>You can mark up your test methods with other test annotations to control
+how the tests are organized and run. For more information on other annotations,
+see the {@link java.lang.annotation.Annotation} class reference.</p>
+
+
+
+
diff --git a/docs/html/training/activity-testing/activity-unit-testing.jd b/docs/html/training/activity-testing/activity-unit-testing.jd
new file mode 100644
index 0000000..74dcda9
--- /dev/null
+++ b/docs/html/training/activity-testing/activity-unit-testing.jd
@@ -0,0 +1,134 @@
+page.title=Creating Unit Tests
+trainingnavtop=true
+@jd:body
+
+<!-- This is the training bar -->
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>This lesson teaches you to</h2>
+<ol>
+  <li><a href="#testcase">Create a Test Case for Activity Unit Testing</a>
+  <li><a href="#test_method">Validate Launch of Another Activity</a>
+</ol>
+
+<h2>Try it out</h2>
+<div class="download-box">
+ <a href="http://developer.android.com/shareables/training/AndroidTestingFun.zip"
+class="button">Download the demo</a>
+ <p class="filename">AndroidTestingFun.zip</p>
+</div>
+
+</div>
+</div>
+
+<p>An {@link android.app.Activity} unit test is an excellent way to quickly
+verify the state of an {@link android.app.Activity} and its interactions with
+other components in isolation (that is, disconnected from the rest of the
+system). A unit test generally tests the smallest possible unit of code
+(which could be a method, class, or component), without dependencies on system
+or network resources. For example, you can write a unit test to check
+that an {@link android.app.Activity} has the correct layout or that it
+triggers an {@link android.content.Intent} object correctly.</p>
+<p>Unit tests are generally not suitable for testing complex UI interaction
+events with the system. Instead, you should use
+the {@link android.test.ActivityInstrumentationTestCase2} class, as described
+in <a href="activity-ui-testing.html">Testing UI Components</a>.</p>
+<p>This lesson shows how you can write a unit test to verify that an
+{@link android.content.Intent} is triggered to launch another
+{@link android.app.Activity}.
+Since the test runs in an isolated environment, the
+{@link android.content.Intent}
+is not actually sent to the Android system, but you can inspect that the
+{@link android.content.Intent} object's payload data is accurate.</p>
+<p>For a complete test case example, take a look at
+{@code LaunchActivityTest.java} in the sample app.</p>
+
+<p class="note"><strong>Note: </strong>To test against system or external
+dependencies, you can use mock objects from a mocking
+framework and inject them into your unit tests. To learn more about the mocking
+framework provided by Android, see
+<a href="{@docRoot}tools/testing/testing_android.html#MockObjectClasses}">Mock
+Object Classes</a>.</p>
+
+<h2 id="testcase">Create a Test Case for Activity Unit Testing</h2>
+<p>The {@link android.test.ActivityUnitTestCase} class provides support for
+isolated testing of a single {@link android.app.Activity}. To create a unit
+test for your {@link android.app.Activity}, your test class should extend
+{@link android.test.ActivityUnitTestCase}.</p>
+
+<p>The {@link android.app.Activity} in an {@link android.test.ActivityUnitTestCase}
+is not automatically started by Android Instrumentation. To start the
+{@link android.app.Activity} in isolation, you need to explicitly call the
+{@link android.test.ActivityUnitTestCase#startActivity(android.content.Intent, android.os.Bundle, java.lang.Object) startActivity()}
+method, and pass in the {@link android.content.Intent} to
+launch your target {@link android.app.Activity}.</p>
+
+<p>For example:</p>
+<pre>
+public class LaunchActivityTest
+        extends ActivityUnitTestCase&lt;LaunchActivity&gt; {
+    ...
+
+    &#64;Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mLaunchIntent = new Intent(getInstrumentation()
+                .getTargetContext(), LaunchActivity.class);
+        startActivity(mLaunchIntent, null, null);
+        final Button launchNextButton =
+                (Button) getActivity()
+                .findViewById(R.id.launch_next_activity_button);
+    }
+}
+</pre>
+
+<h2 id="test_method">Validate Launch of Another Activity</h2>
+<p id="test_goals">Your unit testing goals might include:</p>
+<ul>
+<li>Verifying that {@code LaunchActivity} fires an
+{@link android.content.Intent} when a button is pushed clicked.</li>
+<li>Verifying that the launched {@link android.content.Intent} contains the
+correct payload data.</li>
+</ul>
+
+<p>To verify if an {@link android.content.Intent} was triggered
+following the {@link android.widget.Button} click, you can use the
+{@link android.test.ActivityUnitTestCase#getStartedActivityIntent()} method.
+By using assertion methods, you can verify that the returned
+{@link android.content.Intent} is not null, and that it contains the expected
+string value to launch the next {@link android.app.Activity}. If both assertions
+evaluate to {@code true}, you've successfully verified that the
+{@link android.content.Intent} was correctly sent by your
+{@link android.app.Activity}.</p>
+
+<p>You might implement your test method like this:</p>
+<pre>
+&#64;MediumTest
+public void testNextActivityWasLaunchedWithIntent() {
+    startActivity(mLaunchIntent, null, null);
+    final Button launchNextButton =
+            (Button) getActivity()
+            .findViewById(R.id.launch_next_activity_button);
+    launchNextButton.performClick();
+
+    final Intent launchIntent = getStartedActivityIntent();
+    assertNotNull("Intent was null", launchIntent);
+    assertTrue(isFinishCalled());
+
+    final String payload =
+            launchIntent.getStringExtra(NextActivity.EXTRAS_PAYLOAD_KEY);
+    assertEquals("Payload is empty", LaunchActivity.STRING_PAYLOAD, payload);
+}
+</pre>
+<p>Because {@code LaunchActivity} runs in isolation, you cannot use the
+{@link android.test.TouchUtils} library to manipulate UI controls. To directly
+click a {@link android.widget.Button}, you can call the
+{@link android.view.View#performClick()} method instead.</p>
+
+
+
+
+
+
+
diff --git a/docs/html/training/activity-testing/index.jd b/docs/html/training/activity-testing/index.jd
new file mode 100644
index 0000000..ddede71
--- /dev/null
+++ b/docs/html/training/activity-testing/index.jd
@@ -0,0 +1,68 @@
+page.title=Testing Your Android Activity
+page.tags="testing"
+
+trainingnavtop=true
+startpage=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<!-- Required platform, tools, add-ons, devices, knowledge, etc. -->
+<h2>Dependencies and prerequisites</h2>
+<ul>
+  <li>Android 2.2 (API Level 8) or higher.</li>
+</ul>
+
+<h2>You Should Also Read</h2>
+<ul>
+<li><a href="{@docRoot}tools/testing/index.html">Testing
+(Developer's Guide)</a></li>
+</ul>
+
+</div>
+</div>
+
+<p>You should be writing and running tests as part of your Android application
+development cycle. Well-written tests can help you to catch bugs early in
+development and give you confidence in your code.</p>
+
+<p>A <em>test case</em> defines a set of objects and methods to run multiple
+tests independently from each other. Test cases can be organized into
+<em>test suites</em> and run programmatically, in a repeatable manner, with
+a <em>test runner</em> provided by a testing framework.</p>
+
+<p>The lessons in this class teaches you how to use the Android's custom
+testing framework that is based on the popular JUnit framework. You can
+write test cases to verify specific behavior in your application, and check for
+consistency across different Android devices. Your test cases also serve as a
+form of internal code documentation by describing the expected behavior of
+app components.</p>
+
+<h2>Lessons</h2>
+
+<!-- Create a list of the lessons in this class along with a short description
+of each lesson. These should be short and to the point. It should be clear from
+reading the summary whether someone will want to jump to a lesson or not.-->
+
+<dl>
+  <dt><b><a href="preparing-activity-testing.html">Setting Up Your Test
+Environment</a></b></dt>
+    <dd>Learn how to create your test project.</dd>
+  <dt><b><a href="activity-basic-testing.html">Creating and Running a Test 
+Case</a></b></dt>
+    <dd>Learn how to write test cases to verify the
+expected properties of your {@link android.app.Activity}, and run the test
+cases with the {@code Instrumentation} test runner provided by the Android
+framework.</dd>
+  <dt><b><a href="activity-ui-testing.html">Testing UI Components</a></b></dt>
+    <dd>Learn how to test the behavior of specific UI
+components in your {@link android.app.Activity}.</dd>
+  <dt><b><a href="activity-unit-testing.html">Creating Unit Tests</a></b></dt>
+    <dd>Learn how to how to perform unit testing to
+verify the behavior of an Activity in isolation.</dd>
+  <dt><b><a href="activity-functional-testing.html">Creating Functional Tests</a></b></dt>
+    <dd>Learn how to perform functional testing to
+verify the interaction of multiple Activities.</dd>
+
diff --git a/docs/html/training/activity-testing/preparing-activity-testing.jd b/docs/html/training/activity-testing/preparing-activity-testing.jd
new file mode 100644
index 0000000..c43c9ed
--- /dev/null
+++ b/docs/html/training/activity-testing/preparing-activity-testing.jd
@@ -0,0 +1,95 @@
+page.title=Setting Up Your Test Environment
+trainingnavtop=true
+
+@jd:body
+
+<!-- This is the training bar -->
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>This lesson teaches you to</h2>
+<ol>
+  <li><a href="#eclipse">Set Up Eclipse for Testing</a></li>
+  <li><a href="#cmdline">Set Up the Command Line Interface for Testing</a></li>
+</ol>
+
+<h2>You should also read</h2>
+<ul>
+<li><a href="{@docRoot}sdk/index.html">Getting the SDK Bundle</a></li>
+<li><a href="{@docRoot}tools/testing/testing_eclipse.html">Testing from Eclipse
+with ADT</a></li>
+<li><a href="{@docRoot}tools/testing/testing_otheride.html">Testing from Other
+IDEs</a></li>
+</ul>
+
+<h2>Try it out</h2>
+<div class="download-box">
+ <a href="http://developer.android.com/shareables/training/AndroidTestingFun.zip"
+class="button">Download the demo</a>
+ <p class="filename">AndroidTestingFun.zip</p>
+</div>
+
+</div>
+</div>
+
+<p>Before you start writing and running your tests, you should set up your test
+development environment. This lesson teaches you how to set up the Eclipse
+IDE to build and run tests, and how to
+build and run tests with the Gradle framework by using the command line
+interface.</p>
+
+<p class="note"><strong>Note:</strong> To help you get started, the lessons are
+based on Eclipse with the ADT plugin. However, for your own test development, you
+are free to use the IDE of your choice or the command-line.</p>
+
+<h2 id="eclipse">Set Up Eclipse for Testing</h2>
+<p>Eclipse with the Android Developer Tools (ADT) plugin provides an integrated
+development environment for you to create, build, and run Android application
+test cases from a graphical user interface (GUI). A convenient feature that
+Eclipse provides is the ability to auto-generate a new test project that
+corresponds with your Android application project</a>.
+
+<p>To set up your test environment in Eclipse:</p>
+
+<ol>
+<li><a href="{@docRoot}sdk/installing/bundle.html">Download and install the
+Eclipse ADT plugin</a>, if you haven’t installed it yet.</li>
+<li>Import or create the Android application project that you want to test
+against.</li>
+<li>Generate a test project that corresponds to the application project under
+test. To generate a test project for the app project that you imported:</p>
+   <ol type="a">
+   <li>In the Package Explorer, right-click on your app project, then
+select <strong>Android Tools</strong> &gt; <strong>New Test Project</strong>.</li>
+   <li>In the New Android Test Project wizard, set the property
+values for your test project then click <strong>Finish</strong>.</li>
+   </ol>
+</li>
+</ol>
+<p>You should now be able to create, build, and run test
+cases from your Eclipse environment. To learn how to perform these tasks in
+Eclipse, proceed to <a href="activity-basic-testing.html">Creating and Running 
+a Test Case</a>.</p>
+
+<h2 id="cmdline">Set Up the Command Line Interface for Testing</h2>
+<p>If you are using Gradle version 1.6 or higher as your build environment, you
+can build and run your Android application tests from the command line by using
+the Gradle Wrapper. Make sure that in your {@code gradle.build} file, the
+<a href={@docRoot}guide/topics/manifest/uses-sdk-element.html#min>minSdkVersion</a>
+attribute in the {@code defaultConfig} section is set to 8 or higher. You can
+refer to the sample {@code gradle.build} file that is
+included in the download bundle for this training class.</p>
+<p>To run your tests with the Gradle Wrapper:</p>
+<ol>
+   <li>Connect a physical Android device to your machine or launch the Android
+Emulator.</li>
+   <li>Run the following command from your project directory:
+      <pre>./gradlew build connectedCheck</pre>
+   </li>
+</ol>
+<p>To learn more about using Gradle for Android testing, see the
+<a href="//tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing">Gradle Plugin User Guide</a>.</p>
+<p>To learn more about using command line tools other than Gradle for test
+development, see
+<a href="{@docRoot}tools/testing/testing_otheride.html">Testing from Other IDEs</a>.</p>
+
diff --git a/docs/html/training/testing.jd b/docs/html/training/testing.jd
new file mode 100644
index 0000000..c55370d
--- /dev/null
+++ b/docs/html/training/testing.jd
@@ -0,0 +1,7 @@
+page.title=Best Practices for Testing
+page.trainingcourse=true
+
+@jd:body
+
+<p>These classes and articles provide information about how to
+test your Android application.</p>
diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs
index 40c170e..b884620 100644
--- a/docs/html/training/training_toc.cs
+++ b/docs/html/training/training_toc.cs
@@ -1205,6 +1205,45 @@
   </li>
   <!-- End security and user info -->
 
+  <li class="nav-section">
+    <div class="nav-section-header">
+      <a href="<?cs var:toroot ?>training/testing.html">
+      <span class="small">Best Practices for</span><br/>
+              Testing
+      </a>
+    </div>
+    <ul>
+      <li class="nav-section">
+      <div class="nav-section-header"><a href="<?cs var:toroot ?>training/activity-testing/index.html"
+         description="How to test Activities in your Android applications.">
+            Testing Your Activity
+          </a></div>
+        <ul>
+          <li><a href="<?cs var:toroot ?>training/activity-testing/preparing-activity-testing.html">
+            <span class="en">Setting Up Your Test Environment</span>
+          </a>
+          </li>
+          <li><a href="<?cs var:toroot ?>training/activity-testing/activity-basic-testing.html">
+            <span class="en">Creating and Running a Test Case</span>
+          </a>
+          </li>
+          <li><a href="<?cs var:toroot ?>training/activity-testing/activity-ui-testing.html">
+            <span class="en">Testing UI Components</span>
+          </a>
+          </li>
+          <li><a href="<?cs var:toroot ?>training/activity-testing/activity-unit-testing.html">
+            <span class="en">Creating Unit Tests</span>
+          </a>
+          </li>
+          <li><a href="<?cs var:toroot ?>training/activity-testing/activity-functional-testing.html">
+            <span class="en">Creating Functional Tests</span>
+          </a>
+          </li>
+        </ul>
+      </li>
+    </ul>
+  </li>
+  <!-- End best Testing -->
 
   <li class="nav-section">
     <div class="nav-section-header">
diff --git a/drm/java/android/drm/DrmManagerClient.java b/drm/java/android/drm/DrmManagerClient.java
index e2606d6..10cdab0 100644
--- a/drm/java/android/drm/DrmManagerClient.java
+++ b/drm/java/android/drm/DrmManagerClient.java
@@ -63,8 +63,6 @@
 
     private final CloseGuard mCloseGuard = CloseGuard.get();
 
-    private static final String EXTENDED_INFO_DATA = "extended_info_data";
-
     static {
         // Load the respective library
         System.loadLibrary("drmframework_jni");
@@ -186,22 +184,8 @@
         DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get();
 
         if (null != instance && null != instance.mInfoHandler) {
-            DrmInfoEvent event = new DrmInfoEvent(uniqueId, infoType, message);
             Message m = instance.mInfoHandler.obtainMessage(
-                    InfoHandler.INFO_EVENT_TYPE, event);
-            instance.mInfoHandler.sendMessage(m);
-        }
-    }
-
-    private static void notify(
-            Object thisReference, int uniqueId, int infoType, String message,
-            HashMap<String, Object> attributes) {
-        DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get();
-
-        if (null != instance && null != instance.mInfoHandler) {
-            DrmInfoEvent event = new DrmInfoEvent(uniqueId, infoType, message, attributes);
-            Message m = instance.mInfoHandler.obtainMessage(
-                    InfoHandler.INFO_EVENT_TYPE, event);
+                InfoHandler.INFO_EVENT_TYPE, uniqueId, infoType, message);
             instance.mInfoHandler.sendMessage(m);
         }
     }
@@ -214,25 +198,23 @@
         }
 
         public void handleMessage(Message msg) {
-            DrmInfoEvent info = (DrmInfoEvent) msg.obj;
+            DrmInfoEvent info = null;
             DrmErrorEvent error = null;
-            int uniqueId;
-            int eventType;
-            String message;
 
             switch (msg.what) {
             case InfoHandler.INFO_EVENT_TYPE:
-                uniqueId = info.getUniqueId();
-                eventType = info.getType();
-                message = info.getMessage();
+                int uniqueId = msg.arg1;
+                int infoType = msg.arg2;
+                String message = msg.obj.toString();
 
-                switch (eventType) {
+                switch (infoType) {
                 case DrmInfoEvent.TYPE_REMOVE_RIGHTS: {
                     try {
                         DrmUtils.removeFile(message);
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
+                    info = new DrmInfoEvent(uniqueId, infoType, message);
                     break;
                 }
                 case DrmInfoEvent.TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT:
@@ -240,11 +222,11 @@
                 case DrmInfoEvent.TYPE_WAIT_FOR_RIGHTS:
                 case DrmInfoEvent.TYPE_ACCOUNT_ALREADY_REGISTERED:
                 case DrmInfoEvent.TYPE_RIGHTS_REMOVED: {
+                    info = new DrmInfoEvent(uniqueId, infoType, message);
                     break;
                 }
                 default:
-                    info = null;
-                    error = new DrmErrorEvent(uniqueId, eventType, message);
+                    error = new DrmErrorEvent(uniqueId, infoType, message);
                     break;
                 }
 
diff --git a/drm/jni/android_drm_DrmManagerClient.cpp b/drm/jni/android_drm_DrmManagerClient.cpp
index 7fce3d0..baddf62 100644
--- a/drm/jni/android_drm_DrmManagerClient.cpp
+++ b/drm/jni/android_drm_DrmManagerClient.cpp
@@ -169,49 +169,11 @@
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jstring message = env->NewStringUTF(event.getMessage().string());
     ALOGV("JNIOnInfoListener::onInfo => %d | %d | %s", uniqueId, type, event.getMessage().string());
-    const DrmBuffer& drmBuffer = event.getData();
-    if (event.getCount() > 0 || drmBuffer.length > 0) {
-        jclass hashMapClazz = env->FindClass("java/util/HashMap");
-        jmethodID hashMapInitId = env->GetMethodID(hashMapClazz, "<init>", "()V");
-        jmethodID hashMapPutId = env->GetMethodID(hashMapClazz, "put",
-                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
-        jobject hashMapObject = env->NewObject(hashMapClazz, hashMapInitId);
-        env->DeleteLocalRef(hashMapClazz);
 
-        if (0 < drmBuffer.length) {
-            jfieldID fid = env->GetStaticFieldID(
-                mClass, "EXTENDED_INFO_DATA", "Ljava/lang/String;");
-            jstring key = (jstring) env->GetStaticObjectField(mClass, fid);
-
-            jbyteArray valueByte = env->NewByteArray(drmBuffer.length);
-            env->SetByteArrayRegion(valueByte, 0, drmBuffer.length, (jbyte*) drmBuffer.data);
-            env->CallObjectMethod(hashMapObject, hashMapPutId, key, valueByte);
-            env->DeleteLocalRef(valueByte);
-            env->DeleteLocalRef(key);
-        }
-        DrmInfoEvent::KeyIterator keyIt = event.keyIterator();
-        while (keyIt.hasNext()) {
-            String8 mapKey = keyIt.next();
-            jstring key = env->NewStringUTF(mapKey.string());
-            jstring value = env->NewStringUTF(event.get(mapKey).string());
-            env->CallObjectMethod(hashMapObject, hashMapPutId, key, value);
-            env->DeleteLocalRef(value);
-            env->DeleteLocalRef(key);
-        }
-        env->CallStaticVoidMethod(
-                mClass,
-                env->GetStaticMethodID(mClass, "notify",
-                        "(Ljava/lang/Object;IILjava/lang/String;Ljava/util/HashMap;)V"),
-                mObject, uniqueId, type, message, hashMapObject);
-        env->DeleteLocalRef(hashMapObject);
-    } else {
-        env->CallStaticVoidMethod(
-                mClass,
-                env->GetStaticMethodID(mClass, "notify",
-                        "(Ljava/lang/Object;IILjava/lang/String;)V"),
-                mObject, uniqueId, type, message);
-    }
-    env->DeleteLocalRef(message);
+    env->CallStaticVoidMethod(
+            mClass,
+            env->GetStaticMethodID(mClass, "notify", "(Ljava/lang/Object;IILjava/lang/String;)V"),
+            mObject, uniqueId, type, message);
 }
 
 static Mutex sLock;
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index c971da5..495bbca7 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -419,6 +419,10 @@
          * 
          * It is recommended to use {@link #ARGB_8888} instead of this
          * configuration.
+         *
+         * Note: as of {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE},
+         * any bitmap created with this configuration will be created
+         * using {@link #ARGB_8888} instead.
          * 
          * @deprecated Because of the poor quality of this configuration,
          *             it is advised to use {@link #ARGB_8888} instead.
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index 1c426fd..8872de0 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -23,7 +23,6 @@
 import android.util.Log;
 import android.util.TypedValue;
 
-import java.io.BufferedInputStream;
 import java.io.FileDescriptor;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -82,7 +81,7 @@
          * function to ensure that you are using the bitmap that was used as the
          * decode destination.</p>
          *
-         * @see Bitmap#reconfigure(int,int,Config)
+         * @see Bitmap#reconfigure(int,int, android.graphics.Bitmap.Config)
          */
         public Bitmap inBitmap;
 
@@ -545,28 +544,28 @@
             return null;
         }
 
-        Bitmap bm;
+        Bitmap bm = null;
 
         Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap");
         try {
-            // we need mark/reset to work properly
-            if (!is.markSupported()) {
-                is = new BufferedInputStream(is, DECODE_BUFFER_SIZE);
-            }
-
-            // so we can call reset() if a given codec gives up after reading up to
-            // this many bytes. FIXME: need to find out from the codecs what this
-            // value should be.
-            is.mark(1024);
-
+            boolean decodeGenericStream = true;
             if (is instanceof AssetManager.AssetInputStream) {
                 final int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
                 bm = nativeDecodeAsset(asset, outPadding, opts);
-            } else {
-                // pass some temp storage down to the native code. 1024 is made up,
-                // but should be large enough to avoid too many small calls back
-                // into is.read(...) This number is not related to the value passed
-                // to mark(...) above.
+                // Do not follow the normal case.
+                decodeGenericStream = false;
+            } else if (is instanceof FileInputStream) {
+                try {
+                    FileDescriptor fd = ((FileInputStream) is).getFD();
+                    // decodeFileDescriptor will take care of throwing the IAE and
+                    // calling setDensityFromOptions.
+                    return decodeFileDescriptor(fd, outPadding, opts);
+                } catch (IOException e) {
+                    // Fall through to nativeDecodeStream.
+                }
+            }
+
+            if (decodeGenericStream) {
                 byte [] tempStorage = null;
                 if (opts != null) tempStorage = opts.inTempStorage;
                 if (tempStorage == null) tempStorage = new byte[DECODE_BUFFER_SIZE];
@@ -610,26 +609,41 @@
      *                   no bitmap is returned (null) then padding is
      *                   unchanged.
      * @param opts null-ok; Options that control downsampling and whether the
-     *             image should be completely decoded, or just is size returned.
+     *             image should be completely decoded, or just its size returned.
      * @return the decoded bitmap, or null
      */
     public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {
-        if (nativeIsSeekable(fd)) {
-            Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts);
+        Bitmap bm;
+
+        Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeFileDescriptor");
+        try {
+            if (nativeIsSeekable(fd)) {
+                bm = nativeDecodeFileDescriptor(fd, outPadding, opts);
+            } else {
+                FileInputStream fis = new FileInputStream(fd);
+                // FIXME: If nativeDecodeStream grabbed the pointer to tempStorage
+                // from Options, this code would not need to be duplicated.
+                byte [] tempStorage = null;
+                if (opts != null) tempStorage = opts.inTempStorage;
+                if (tempStorage == null) tempStorage = new byte[DECODE_BUFFER_SIZE];
+                try {
+                    bm = nativeDecodeStream(fis, tempStorage, outPadding, opts);
+                } finally {
+                    try {
+                        fis.close();
+                    } catch (Throwable t) {/* ignore */}
+                }
+            }
+
             if (bm == null && opts != null && opts.inBitmap != null) {
                 throw new IllegalArgumentException("Problem decoding into existing bitmap");
             }
-            return bm;
-        } else {
-            FileInputStream fis = new FileInputStream(fd);
-            try {
-                return decodeStream(fis, outPadding, opts);
-            } finally {
-                try {
-                    fis.close();
-                } catch (Throwable t) {/* ignore */}
-            }
+
+            setDensityFromOptions(bm, opts);
+        } finally {
+            Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);
         }
+        return bm;
     }
 
     /**
diff --git a/graphics/java/android/graphics/BitmapRegionDecoder.java b/graphics/java/android/graphics/BitmapRegionDecoder.java
index b38d107..3524b25 100644
--- a/graphics/java/android/graphics/BitmapRegionDecoder.java
+++ b/graphics/java/android/graphics/BitmapRegionDecoder.java
@@ -17,7 +17,6 @@
 
 import android.content.res.AssetManager;
 
-import java.io.BufferedInputStream;
 import java.io.FileDescriptor;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -108,12 +107,6 @@
      */
     public static BitmapRegionDecoder newInstance(InputStream is,
             boolean isShareable) throws IOException {
-        // we need mark/reset to work properly in JNI
-
-        if (!is.markSupported()) {
-            is = new BufferedInputStream(is, 16 * 1024);
-        }
-
         if (is instanceof AssetManager.AssetInputStream) {
             return nativeNewInstance(
                     ((AssetManager.AssetInputStream) is).getAssetInt(),
diff --git a/graphics/java/android/graphics/LinearGradient.java b/graphics/java/android/graphics/LinearGradient.java
index 54cdcab..4c88de3 100644
--- a/graphics/java/android/graphics/LinearGradient.java
+++ b/graphics/java/android/graphics/LinearGradient.java
@@ -102,8 +102,8 @@
         final LinearGradient copy;
         switch (mType) {
             case TYPE_COLORS_AND_POSITIONS:
-                copy = new LinearGradient(mX0, mY0, mX1, mY1, mColors.clone(), mPositions.clone(),
-                        mTileMode);
+                copy = new LinearGradient(mX0, mY0, mX1, mY1, mColors.clone(),
+                        mPositions != null ? mPositions.clone() : null, mTileMode);
                 break;
             case TYPE_COLOR_START_AND_COLOR_END:
                 copy = new LinearGradient(mX0, mY0, mX1, mY1, mColor0, mColor1, mTileMode);
diff --git a/graphics/java/android/graphics/RadialGradient.java b/graphics/java/android/graphics/RadialGradient.java
index 23244d8..f011e5c 100644
--- a/graphics/java/android/graphics/RadialGradient.java
+++ b/graphics/java/android/graphics/RadialGradient.java
@@ -103,8 +103,8 @@
         final RadialGradient copy;
         switch (mType) {
             case TYPE_COLORS_AND_POSITIONS:
-                copy = new RadialGradient(mX, mY, mRadius, mColors.clone(), mPositions.clone(),
-                        mTileMode);
+                copy = new RadialGradient(mX, mY, mRadius, mColors.clone(),
+                        mPositions != null ? mPositions.clone() : null, mTileMode);
                 break;
             case TYPE_COLOR_CENTER_AND_COLOR_EDGE:
                 copy = new RadialGradient(mX, mY, mRadius, mColor0, mColor1, mTileMode);
diff --git a/graphics/java/android/graphics/SweepGradient.java b/graphics/java/android/graphics/SweepGradient.java
index 3010927..e9cda39 100644
--- a/graphics/java/android/graphics/SweepGradient.java
+++ b/graphics/java/android/graphics/SweepGradient.java
@@ -92,7 +92,8 @@
         final SweepGradient copy;
         switch (mType) {
             case TYPE_COLORS_AND_POSITIONS:
-                copy = new SweepGradient(mCx, mCy, mColors.clone(), mPositions.clone());
+                copy = new SweepGradient(mCx, mCy, mColors.clone(),
+                        mPositions != null ? mPositions.clone() : null);
                 break;
             case TYPE_COLOR_START_AND_COLOR_END:
                 copy = new SweepGradient(mCx, mCy, mColor0, mColor1);
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index d226c8c..b340777 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -19,6 +19,7 @@
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
+import android.graphics.Color;
 import android.graphics.ColorFilter;
 import android.graphics.DashPathEffect;
 import android.graphics.LinearGradient;
@@ -747,9 +748,6 @@
 
                     mFillPaint.setShader(new LinearGradient(x0, y0, x1, y1,
                             colors, st.mPositions, Shader.TileMode.CLAMP));
-                    if (!mGradientState.mHasSolidColor) {
-                        mFillPaint.setColor(mAlpha << 24);
-                    }
                 } else if (st.mGradient == RADIAL_GRADIENT) {
                     x0 = r.left + (r.right - r.left) * st.mCenterX;
                     y0 = r.top + (r.bottom - r.top) * st.mCenterY;
@@ -759,9 +757,6 @@
                     mFillPaint.setShader(new RadialGradient(x0, y0,
                             level * st.mGradientRadius, colors, null,
                             Shader.TileMode.CLAMP));
-                    if (!mGradientState.mHasSolidColor) {
-                        mFillPaint.setColor(mAlpha << 24);
-                    }
                 } else if (st.mGradient == SWEEP_GRADIENT) {
                     x0 = r.left + (r.right - r.left) * st.mCenterX;
                     y0 = r.top + (r.bottom - r.top) * st.mCenterY;
@@ -792,9 +787,12 @@
 
                     }
                     mFillPaint.setShader(new SweepGradient(x0, y0, tempColors, tempPositions));
-                    if (!mGradientState.mHasSolidColor) {
-                        mFillPaint.setColor(mAlpha << 24);
-                    }
+                }
+
+                // If we don't have a solid color, the alpha channel must be
+                // maxed out so that alpha modulation works correctly.
+                if (!st.mHasSolidColor) {
+                    mFillPaint.setColor(Color.BLACK);
                 }
             }
         }
@@ -1281,6 +1279,9 @@
             // the app is stroking the shape, set the color to the default
             // value of state.mSolidColor
             mFillPaint.setColor(0);
+        } else {
+            // Otherwise, make sure the fill alpha is maxed out.
+            mFillPaint.setColor(Color.BLACK);
         }
         mPadding = state.mPadding;
         if (state.mStrokeWidth >= 0) {
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index 7d05a74..ca72c25 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -80,7 +80,7 @@
     int mCurrentCount;
     static HashMap<Integer, Allocation> mAllocationMap =
             new HashMap<Integer, Allocation>();
-    IoInputNotifier mBufferNotifier;
+    OnBufferAvailableListener mBufferNotifier;
 
     /**
      * The usage of the Allocation.  These signal to RenderScript where to place
@@ -1838,26 +1838,22 @@
     }
 
     /**
-     * @hide
-     *
      * Interface to handle notification when new buffers are available via
      * {@link #USAGE_IO_INPUT}. An application will receive one notification
      * when a buffer is available. Additional buffers will not trigger new
      * notifications until a buffer is processed.
      */
-    public interface IoInputNotifier {
+    public interface OnBufferAvailableListener {
         public void onBufferAvailable(Allocation a);
     }
 
     /**
-     * @hide
-     *
      * Set a notification handler for {@link #USAGE_IO_INPUT}.
      *
-     * @param callback instance of the IoInputNotifier class to be called
-     *                 when buffer arrive.
+     * @param callback instance of the OnBufferAvailableListener
+     *                 class to be called when buffer arrive.
      */
-    public void setIoInputNotificationHandler(IoInputNotifier callback) {
+    public void setOnBufferAvailableListener(OnBufferAvailableListener callback) {
         synchronized(mAllocationMap) {
             mAllocationMap.put(new Integer(getID(mRS)), this);
             mBufferNotifier = callback;
diff --git a/graphics/java/android/renderscript/ScriptIntrinsicColorMatrix.java b/graphics/java/android/renderscript/ScriptIntrinsicColorMatrix.java
index 6881627..32c3d15 100644
--- a/graphics/java/android/renderscript/ScriptIntrinsicColorMatrix.java
+++ b/graphics/java/android/renderscript/ScriptIntrinsicColorMatrix.java
@@ -56,8 +56,12 @@
      *          this parameter is ignored. The Element type check is
      *          performed in the kernel launch.
      *
+     * @deprecated Use the single argument version as Element is now
+     *             ignored.
+     *
      * @return ScriptIntrinsicColorMatrix
      */
+    @Deprecated
     public static ScriptIntrinsicColorMatrix create(RenderScript rs, Element e) {
         return create(rs);
     }
diff --git a/graphics/java/android/renderscript/ScriptIntrinsicHistogram.java b/graphics/java/android/renderscript/ScriptIntrinsicHistogram.java
index f143326..adc2d95 100644
--- a/graphics/java/android/renderscript/ScriptIntrinsicHistogram.java
+++ b/graphics/java/android/renderscript/ScriptIntrinsicHistogram.java
@@ -151,7 +151,7 @@
      *
      * @param ain The input image
      */
-    public void forEach_dot(Allocation ain) {
+    public void forEach_Dot(Allocation ain) {
         if (mOut.getType().getElement().getVectorSize() != 1) {
             throw new RSIllegalArgumentException("Output vector size must be one.");
         }
@@ -170,7 +170,7 @@
      *
      * @return Script.KernelID The KernelID object.
      */
-    public Script.KernelID getKernelID_seperate() {
+    public Script.KernelID getKernelID_Separate() {
         return createKernelID(0, 3, null, null);
     }
 
diff --git a/keystore/java/android/security/AndroidKeyPairGenerator.java b/keystore/java/android/security/AndroidKeyPairGenerator.java
index 390e732..1ab0aeb 100644
--- a/keystore/java/android/security/AndroidKeyPairGenerator.java
+++ b/keystore/java/android/security/AndroidKeyPairGenerator.java
@@ -18,6 +18,7 @@
 
 import com.android.org.bouncycastle.x509.X509V3CertificateGenerator;
 
+import com.android.org.conscrypt.NativeCrypto;
 import com.android.org.conscrypt.OpenSSLEngine;
 
 import java.security.InvalidAlgorithmParameterException;
@@ -33,7 +34,10 @@
 import java.security.cert.CertificateEncodingException;
 import java.security.cert.X509Certificate;
 import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.ECParameterSpec;
 import java.security.spec.InvalidKeySpecException;
+import java.security.spec.RSAKeyGenParameterSpec;
 import java.security.spec.X509EncodedKeySpec;
 
 /**
@@ -87,8 +91,12 @@
 
         Credentials.deleteAllTypesForAlias(mKeyStore, alias);
 
+        final int keyType = KeyStore.getKeyTypeForAlgorithm(mSpec.getKeyType());
+        byte[][] args = getArgsForKeyType(keyType, mSpec.getAlgorithmParameterSpec());
+
         final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + alias;
-        if (!mKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF, mSpec.getFlags())) {
+        if (!mKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF, keyType,
+                mSpec.getKeySize(), mSpec.getFlags(), args)) {
             throw new IllegalStateException("could not generate key in keystore");
         }
 
@@ -104,10 +112,10 @@
 
         final PublicKey pubKey;
         try {
-            final KeyFactory keyFact = KeyFactory.getInstance("RSA");
+            final KeyFactory keyFact = KeyFactory.getInstance(mSpec.getKeyType());
             pubKey = keyFact.generatePublic(new X509EncodedKeySpec(pubKeyBytes));
         } catch (NoSuchAlgorithmException e) {
-            throw new IllegalStateException("Can't instantiate RSA key generator", e);
+            throw new IllegalStateException("Can't instantiate key generator", e);
         } catch (InvalidKeySpecException e) {
             throw new IllegalStateException("keystore returned invalid key encoding", e);
         }
@@ -119,7 +127,7 @@
         certGen.setIssuerDN(mSpec.getSubjectDN());
         certGen.setNotBefore(mSpec.getStartDate());
         certGen.setNotAfter(mSpec.getEndDate());
-        certGen.setSignatureAlgorithm("sha1WithRSA");
+        certGen.setSignatureAlgorithm(getDefaultSignatureAlgorithmForKeyType(mSpec.getKeyType()));
 
         final X509Certificate cert;
         try {
@@ -146,6 +154,37 @@
         return new KeyPair(pubKey, privKey);
     }
 
+    private static String getDefaultSignatureAlgorithmForKeyType(String keyType) {
+        if ("RSA".equalsIgnoreCase(keyType)) {
+            return "sha256WithRSA";
+        } else if ("DSA".equalsIgnoreCase(keyType)) {
+            return "sha1WithDSA";
+        } else if ("EC".equalsIgnoreCase(keyType)) {
+            return "sha256WithECDSA";
+        } else {
+            throw new IllegalArgumentException("Unsupported key type " + keyType);
+        }
+    }
+
+    private static byte[][] getArgsForKeyType(int keyType, AlgorithmParameterSpec spec) {
+        switch (keyType) {
+            case NativeCrypto.EVP_PKEY_RSA:
+                if (spec instanceof RSAKeyGenParameterSpec) {
+                    RSAKeyGenParameterSpec rsaSpec = (RSAKeyGenParameterSpec) spec;
+                    return new byte[][] { rsaSpec.getPublicExponent().toByteArray() };
+                }
+                break;
+            case NativeCrypto.EVP_PKEY_DSA:
+                if (spec instanceof DSAParameterSpec) {
+                    DSAParameterSpec dsaSpec = (DSAParameterSpec) spec;
+                    return new byte[][] { dsaSpec.getG().toByteArray(),
+                            dsaSpec.getP().toByteArray(), dsaSpec.getQ().toByteArray() };
+                }
+                break;
+        }
+        return null;
+    }
+
     @Override
     public void initialize(int keysize, SecureRandom random) {
         throw new IllegalArgumentException("cannot specify keysize with AndroidKeyPairGenerator");
diff --git a/keystore/java/android/security/KeyPairGeneratorSpec.java b/keystore/java/android/security/KeyPairGeneratorSpec.java
index 59f89bc..21d6caa 100644
--- a/keystore/java/android/security/KeyPairGeneratorSpec.java
+++ b/keystore/java/android/security/KeyPairGeneratorSpec.java
@@ -16,13 +16,18 @@
 
 package android.security;
 
+import com.android.org.conscrypt.NativeCrypto;
+
 import android.content.Context;
 import android.text.TextUtils;
 
 import java.math.BigInteger;
+import java.security.NoSuchAlgorithmException;
 import java.security.PrivateKey;
 import java.security.cert.Certificate;
 import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.RSAKeyGenParameterSpec;
 import java.util.Date;
 
 import javax.security.auth.x500.X500Principal;
@@ -50,10 +55,35 @@
  * certificate signed by a real Certificate Authority.
  */
 public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec {
-    private final String mKeystoreAlias;
+    /*
+     * These must be kept in sync with system/security/keystore/defaults.h
+     */
+
+    /* DSA */
+    private static final int DSA_DEFAULT_KEY_SIZE = 1024;
+    private static final int DSA_MIN_KEY_SIZE = 512;
+    private static final int DSA_MAX_KEY_SIZE = 8192;
+
+    /* EC */
+    private static final int EC_DEFAULT_KEY_SIZE = 256;
+    private static final int EC_MIN_KEY_SIZE = 192;
+    private static final int EC_MAX_KEY_SIZE = 521;
+
+    /* RSA */
+    private static final int RSA_DEFAULT_KEY_SIZE = 2048;
+    private static final int RSA_MIN_KEY_SIZE = 512;
+    private static final int RSA_MAX_KEY_SIZE = 8192;
 
     private final Context mContext;
 
+    private final String mKeystoreAlias;
+
+    private final String mKeyType;
+
+    private final int mKeySize;
+
+    private final AlgorithmParameterSpec mSpec;
+
     private final X500Principal mSubjectDN;
 
     private final BigInteger mSerialNumber;
@@ -84,6 +114,9 @@
      * @param context Android context for the activity
      * @param keyStoreAlias name to use for the generated key in the Android
      *            keystore
+     * @param keyType key algorithm to use (RSA, DSA, EC)
+     * @param keySize size of key to generate
+     * @param spec the underlying key type parameters
      * @param subjectDN X.509 v3 Subject Distinguished Name
      * @param serialNumber X509 v3 certificate serial number
      * @param startDate the start of the self-signed certificate validity period
@@ -93,9 +126,9 @@
      *             {@code endDate} is before {@code startDate}.
      * @hide should be built with KeyPairGeneratorSpecBuilder
      */
-    public KeyPairGeneratorSpec(Context context, String keyStoreAlias,
-            X500Principal subjectDN, BigInteger serialNumber, Date startDate, Date endDate,
-            int flags) {
+    public KeyPairGeneratorSpec(Context context, String keyStoreAlias, String keyType, int keySize,
+            AlgorithmParameterSpec spec, X500Principal subjectDN, BigInteger serialNumber,
+            Date startDate, Date endDate, int flags) {
         if (context == null) {
             throw new IllegalArgumentException("context == null");
         } else if (TextUtils.isEmpty(keyStoreAlias)) {
@@ -112,8 +145,18 @@
             throw new IllegalArgumentException("endDate < startDate");
         }
 
+        final int keyTypeInt = KeyStore.getKeyTypeForAlgorithm(keyType);
+        if (keySize == -1) {
+            keySize = getDefaultKeySizeForType(keyTypeInt);
+        }
+        checkCorrectParametersSpec(keyTypeInt, keySize, spec);
+        checkValidKeySize(keyTypeInt, keySize);
+
         mContext = context;
         mKeystoreAlias = keyStoreAlias;
+        mKeyType = keyType;
+        mKeySize = keySize;
+        mSpec = spec;
         mSubjectDN = subjectDN;
         mSerialNumber = serialNumber;
         mStartDate = startDate;
@@ -121,6 +164,64 @@
         mFlags = flags;
     }
 
+    private static int getDefaultKeySizeForType(int keyType) {
+        if (keyType == NativeCrypto.EVP_PKEY_DSA) {
+            return DSA_DEFAULT_KEY_SIZE;
+        } else if (keyType == NativeCrypto.EVP_PKEY_EC) {
+            return EC_DEFAULT_KEY_SIZE;
+        } else if (keyType == NativeCrypto.EVP_PKEY_RSA) {
+            return RSA_DEFAULT_KEY_SIZE;
+        }
+        throw new IllegalArgumentException("Invalid key type " + keyType);
+    }
+
+    private static void checkValidKeySize(int keyType, int keySize) {
+        if (keyType == NativeCrypto.EVP_PKEY_DSA) {
+            if (keySize < DSA_MIN_KEY_SIZE || keySize > DSA_MAX_KEY_SIZE) {
+                throw new IllegalArgumentException("DSA keys must be >= " + DSA_MIN_KEY_SIZE
+                        + " and <= " + DSA_MAX_KEY_SIZE);
+            }
+        } else if (keyType == NativeCrypto.EVP_PKEY_EC) {
+            if (keySize < EC_MIN_KEY_SIZE || keySize > EC_MAX_KEY_SIZE) {
+                throw new IllegalArgumentException("EC keys must be >= " + EC_MIN_KEY_SIZE
+                        + " and <= " + EC_MAX_KEY_SIZE);
+            }
+        } else if (keyType == NativeCrypto.EVP_PKEY_RSA) {
+            if (keySize < RSA_MIN_KEY_SIZE || keySize > RSA_MAX_KEY_SIZE) {
+                throw new IllegalArgumentException("RSA keys must be >= " + RSA_MIN_KEY_SIZE
+                        + " and <= " + RSA_MAX_KEY_SIZE);
+            }
+        } else {
+            throw new IllegalArgumentException("Invalid key type " + keyType);
+        }
+    }
+
+    private static void checkCorrectParametersSpec(int keyType, int keySize,
+            AlgorithmParameterSpec spec) {
+        if (keyType == NativeCrypto.EVP_PKEY_DSA && spec != null) {
+            if (!(spec instanceof DSAParameterSpec)) {
+                throw new IllegalArgumentException("DSA keys must have DSAParameterSpec specified");
+            }
+        } else if (keyType == NativeCrypto.EVP_PKEY_RSA && spec != null) {
+            if (spec instanceof RSAKeyGenParameterSpec) {
+                RSAKeyGenParameterSpec rsaSpec = (RSAKeyGenParameterSpec) spec;
+                if (keySize != -1 && keySize != rsaSpec.getKeysize()) {
+                    throw new IllegalArgumentException("RSA key size must match: " + keySize
+                            + " vs " + rsaSpec.getKeysize());
+                }
+            } else {
+                throw new IllegalArgumentException("RSA may only use RSAKeyGenParameterSpec");
+            }
+        }
+    }
+
+    /**
+     * Gets the Android context used for operations with this instance.
+     */
+    public Context getContext() {
+        return mContext;
+    }
+
     /**
      * Returns the alias that will be used in the {@code java.security.KeyStore}
      * in conjunction with the {@code AndroidKeyStore}.
@@ -130,10 +231,28 @@
     }
 
     /**
-     * Gets the Android context used for operations with this instance.
+     * Returns the key type (e.g., "RSA", "DSA", "EC") specified by this
+     * parameter.
      */
-    public Context getContext() {
-        return mContext;
+    public String getKeyType() {
+        return mKeyType;
+    }
+
+    /**
+     * Returns the key size specified by this parameter. For instance, for RSA
+     * this will return the modulus size and for EC it will return the field
+     * size.
+     */
+    public int getKeySize() {
+        return mKeySize;
+    }
+
+    /**
+     * Returns the {@link AlgorithmParameterSpec} that will be used for creation
+     * of the key pair.
+     */
+    public AlgorithmParameterSpec getAlgorithmParameterSpec() {
+        return mSpec;
     }
 
     /**
@@ -209,6 +328,12 @@
 
         private String mKeystoreAlias;
 
+        private String mKeyType = "RSA";
+
+        private int mKeySize = -1;
+
+        private AlgorithmParameterSpec mSpec;
+
         private X500Principal mSubjectDN;
 
         private BigInteger mSerialNumber;
@@ -246,6 +371,49 @@
         }
 
         /**
+         * Sets the key type (e.g., RSA, DSA, EC) of the keypair to be created.
+         */
+        public Builder setKeyType(String keyType) throws NoSuchAlgorithmException {
+            if (keyType == null) {
+                throw new NullPointerException("keyType == null");
+            } else {
+                try {
+                    KeyStore.getKeyTypeForAlgorithm(keyType);
+                } catch (IllegalArgumentException e) {
+                    throw new NoSuchAlgorithmException("Unsupported key type: " + keyType);
+                }
+            }
+            mKeyType = keyType;
+            return this;
+        }
+
+        /**
+         * Sets the key size for the keypair to be created. For instance, for a
+         * key type of RSA this will set the modulus size and for a key type of
+         * EC it will select a curve with a matching field size.
+         */
+        public Builder setKeySize(int keySize) {
+            if (keySize < 0) {
+                throw new IllegalArgumentException("keySize < 0");
+            }
+            mKeySize = keySize;
+            return this;
+        }
+
+        /**
+         * Sets the underlying key type's parameters. This is required for DSA
+         * where you must set this to an instance of
+         * {@link java.security.spec.DSAParameterSpec}.
+         */
+        public Builder setAlgorithmParameterSpec(AlgorithmParameterSpec spec) {
+            if (spec == null) {
+                throw new NullPointerException("spec == null");
+            }
+            mSpec = spec;
+            return this;
+        }
+
+        /**
          * Sets the subject used for the self-signed certificate of the
          * generated key pair.
          */
@@ -311,8 +479,8 @@
          * @return built instance of {@code KeyPairGeneratorSpec}
          */
         public KeyPairGeneratorSpec build() {
-            return new KeyPairGeneratorSpec(mContext, mKeystoreAlias, mSubjectDN,
-                    mSerialNumber, mStartDate, mEndDate, mFlags);
+            return new KeyPairGeneratorSpec(mContext, mKeystoreAlias, mKeyType, mKeySize, mSpec,
+                    mSubjectDN, mSerialNumber, mStartDate, mEndDate, mFlags);
         }
     }
 }
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index fb5e039..9babb94 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -16,6 +16,8 @@
 
 package android.security;
 
+import com.android.org.conscrypt.NativeCrypto;
+
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.util.Log;
@@ -64,6 +66,18 @@
         return new KeyStore(keystore);
     }
 
+    static int getKeyTypeForAlgorithm(String keyType) throws IllegalArgumentException {
+        if ("RSA".equalsIgnoreCase(keyType)) {
+            return NativeCrypto.EVP_PKEY_RSA;
+        } else if ("DSA".equalsIgnoreCase(keyType)) {
+            return NativeCrypto.EVP_PKEY_DSA;
+        } else if ("EC".equalsIgnoreCase(keyType)) {
+            return NativeCrypto.EVP_PKEY_EC;
+        } else {
+            throw new IllegalArgumentException("Unsupported key type: " + keyType);
+        }
+    }
+
     public State state() {
         final int ret;
         try {
@@ -188,9 +202,10 @@
         }
     }
 
-    public boolean generate(String key, int uid, int flags) {
+    public boolean generate(String key, int uid, int keyType, int keySize, int flags,
+            byte[][] args) {
         try {
-            return mBinder.generate(key, uid, flags) == NO_ERROR;
+            return mBinder.generate(key, uid, keyType, keySize, flags, args) == NO_ERROR;
         } catch (RemoteException e) {
             Log.w(TAG, "Cannot connect to keystore", e);
             return false;
diff --git a/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java b/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java
index 1582f74..ea6c43d 100644
--- a/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java
+++ b/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java
@@ -27,6 +27,13 @@
 import java.security.cert.Certificate;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
+import java.security.interfaces.DSAParams;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.RSAKeyGenParameterSpec;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
@@ -118,6 +125,8 @@
         mGenerator.initialize(
                 new KeyPairGeneratorSpec.Builder(getContext())
                         .setAlias(TEST_ALIAS_1)
+                        .setKeyType("RSA")
+                        .setKeySize(1024)
                         .setSubject(TEST_DN_1)
                         .setSerialNumber(TEST_SERIAL_1)
                         .setStartDate(NOW)
@@ -142,10 +151,207 @@
         final KeyPair pair = mGenerator.generateKeyPair();
         assertNotNull("The KeyPair returned should not be null", pair);
 
-        assertKeyPairCorrect(pair, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW, NOW_PLUS_10_YEARS);
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
     }
 
-    public void testKeyPairGenerator_GenerateKeyPair_Unencrypted_Success() throws Exception {
+    public void testKeyPairGenerator_GenerateKeyPair_DSA_Unencrypted_Success() throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("DSA")
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 1024, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_DSA_2048_Unencrypted_Success()
+            throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("DSA")
+                .setKeySize(2048)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_DSA_SpecifiedParams_Unencrypted_Success()
+            throws Exception {
+        /*
+         * generated using: openssl dsaparam -C 2048
+         */
+        BigInteger p = new BigInteger(1, new byte[] {
+                (byte) 0xC0, (byte) 0x3D, (byte) 0x86, (byte) 0x09, (byte) 0xCA, (byte) 0x8C,
+                (byte) 0x37, (byte) 0xCA, (byte) 0xCC, (byte) 0x4A, (byte) 0x81, (byte) 0xBD,
+                (byte) 0xD8, (byte) 0x50, (byte) 0x77, (byte) 0xCD, (byte) 0xDD, (byte) 0x32,
+                (byte) 0x0B, (byte) 0x43, (byte) 0xBF, (byte) 0x42, (byte) 0x06, (byte) 0x5A,
+                (byte) 0x3D, (byte) 0x18, (byte) 0x50, (byte) 0x47, (byte) 0x79, (byte) 0xE1,
+                (byte) 0x5B, (byte) 0x86, (byte) 0x03, (byte) 0xB9, (byte) 0x28, (byte) 0x9C,
+                (byte) 0x18, (byte) 0xA9, (byte) 0xF5, (byte) 0xD6, (byte) 0xF4, (byte) 0x94,
+                (byte) 0x5B, (byte) 0x87, (byte) 0x58, (byte) 0xCA, (byte) 0xB2, (byte) 0x1E,
+                (byte) 0xFC, (byte) 0xED, (byte) 0x37, (byte) 0xC3, (byte) 0x49, (byte) 0xAC,
+                (byte) 0xFA, (byte) 0x46, (byte) 0xDB, (byte) 0x7A, (byte) 0x50, (byte) 0x96,
+                (byte) 0xCF, (byte) 0x52, (byte) 0xD7, (byte) 0x4E, (byte) 0xEB, (byte) 0x26,
+                (byte) 0x41, (byte) 0xA2, (byte) 0x6F, (byte) 0x99, (byte) 0x80, (byte) 0x9F,
+                (byte) 0x0F, (byte) 0x0A, (byte) 0xA8, (byte) 0x0D, (byte) 0xAC, (byte) 0xAB,
+                (byte) 0xEF, (byte) 0x7D, (byte) 0xE7, (byte) 0x4C, (byte) 0xF1, (byte) 0x88,
+                (byte) 0x44, (byte) 0xC9, (byte) 0x17, (byte) 0xD0, (byte) 0xBB, (byte) 0xE2,
+                (byte) 0x01, (byte) 0x8C, (byte) 0xC1, (byte) 0x02, (byte) 0x1D, (byte) 0x3C,
+                (byte) 0x15, (byte) 0xB7, (byte) 0x41, (byte) 0x30, (byte) 0xD8, (byte) 0x11,
+                (byte) 0xBD, (byte) 0x6A, (byte) 0x2A, (byte) 0x0D, (byte) 0x36, (byte) 0x44,
+                (byte) 0x9C, (byte) 0x3F, (byte) 0x32, (byte) 0xE2, (byte) 0x1C, (byte) 0xFB,
+                (byte) 0xE3, (byte) 0xFF, (byte) 0xCC, (byte) 0x1A, (byte) 0x72, (byte) 0x38,
+                (byte) 0x37, (byte) 0x69, (byte) 0x5E, (byte) 0x35, (byte) 0x73, (byte) 0xE1,
+                (byte) 0x1E, (byte) 0x74, (byte) 0x35, (byte) 0x44, (byte) 0x07, (byte) 0xB5,
+                (byte) 0x2F, (byte) 0x0B, (byte) 0x60, (byte) 0xF4, (byte) 0xA9, (byte) 0xE0,
+                (byte) 0x81, (byte) 0xB2, (byte) 0xCD, (byte) 0x8B, (byte) 0x82, (byte) 0x76,
+                (byte) 0x7F, (byte) 0xD4, (byte) 0x17, (byte) 0x32, (byte) 0x86, (byte) 0x98,
+                (byte) 0x7C, (byte) 0x85, (byte) 0x66, (byte) 0xF6, (byte) 0x77, (byte) 0xED,
+                (byte) 0x8B, (byte) 0x1A, (byte) 0x52, (byte) 0x16, (byte) 0xDA, (byte) 0x1C,
+                (byte) 0xA7, (byte) 0x16, (byte) 0x79, (byte) 0x20, (byte) 0x1C, (byte) 0x99,
+                (byte) 0x5F, (byte) 0x12, (byte) 0x66, (byte) 0x15, (byte) 0x9F, (byte) 0xE5,
+                (byte) 0x73, (byte) 0xA9, (byte) 0x61, (byte) 0xBA, (byte) 0xA7, (byte) 0x23,
+                (byte) 0x93, (byte) 0x77, (byte) 0xB5, (byte) 0xF6, (byte) 0xEC, (byte) 0x13,
+                (byte) 0xBF, (byte) 0x95, (byte) 0x60, (byte) 0x78, (byte) 0x84, (byte) 0xE3,
+                (byte) 0x44, (byte) 0xEC, (byte) 0x74, (byte) 0xC2, (byte) 0xCB, (byte) 0xD4,
+                (byte) 0x70, (byte) 0xC5, (byte) 0x7B, (byte) 0xF8, (byte) 0x07, (byte) 0x3B,
+                (byte) 0xEB, (byte) 0x9F, (byte) 0xC9, (byte) 0x7D, (byte) 0xE0, (byte) 0xA5,
+                (byte) 0xBA, (byte) 0x68, (byte) 0x7B, (byte) 0xF4, (byte) 0x70, (byte) 0x40,
+                (byte) 0xAE, (byte) 0xE9, (byte) 0x65, (byte) 0xEE, (byte) 0x5B, (byte) 0x71,
+                (byte) 0x36, (byte) 0x0B, (byte) 0xB0, (byte) 0xA2, (byte) 0x98, (byte) 0x7D,
+                (byte) 0xE3, (byte) 0x24, (byte) 0x95, (byte) 0x2B, (byte) 0xC2, (byte) 0x0A,
+                (byte) 0x78, (byte) 0x3D, (byte) 0xCC, (byte) 0x3A, (byte) 0xEE, (byte) 0xED,
+                (byte) 0x48, (byte) 0xEB, (byte) 0xA3, (byte) 0x78, (byte) 0xA8, (byte) 0x9D,
+                (byte) 0x0A, (byte) 0x8F, (byte) 0x9E, (byte) 0x59, (byte) 0x2C, (byte) 0x44,
+                (byte) 0xB5, (byte) 0xF9, (byte) 0x53, (byte) 0x43,
+        });
+
+        BigInteger q = new BigInteger(1, new byte[] {
+                (byte) 0xA1, (byte) 0x9B, (byte) 0x1D, (byte) 0xC0, (byte) 0xE3, (byte) 0xF6,
+                (byte) 0x4A, (byte) 0x35, (byte) 0xE1, (byte) 0x8A, (byte) 0x43, (byte) 0xC2,
+                (byte) 0x9C, (byte) 0xF9, (byte) 0x52, (byte) 0x8F, (byte) 0x94, (byte) 0xA1,
+                (byte) 0x12, (byte) 0x11, (byte) 0xDB, (byte) 0x9A, (byte) 0xB6, (byte) 0x35,
+                (byte) 0x56, (byte) 0x26, (byte) 0x60, (byte) 0x89, (byte) 0x11, (byte) 0xAC,
+                (byte) 0xA8, (byte) 0xE5,
+        });
+
+        BigInteger g = new BigInteger(1, new byte[] {
+                (byte) 0xA1, (byte) 0x5C, (byte) 0x57, (byte) 0x15, (byte) 0xC3, (byte) 0xD9,
+                (byte) 0xD7, (byte) 0x41, (byte) 0x89, (byte) 0xD6, (byte) 0xB8, (byte) 0x7B,
+                (byte) 0xF3, (byte) 0xE0, (byte) 0xB3, (byte) 0xC5, (byte) 0xD1, (byte) 0xAA,
+                (byte) 0xF9, (byte) 0x55, (byte) 0x48, (byte) 0xF1, (byte) 0xDA, (byte) 0xE8,
+                (byte) 0x6F, (byte) 0x51, (byte) 0x05, (byte) 0xB2, (byte) 0xC9, (byte) 0x64,
+                (byte) 0xDA, (byte) 0x5F, (byte) 0xD4, (byte) 0xAA, (byte) 0xFD, (byte) 0x67,
+                (byte) 0xE0, (byte) 0x10, (byte) 0x2C, (byte) 0x1F, (byte) 0x03, (byte) 0x10,
+                (byte) 0xD4, (byte) 0x4B, (byte) 0x20, (byte) 0x82, (byte) 0x2B, (byte) 0x04,
+                (byte) 0xF9, (byte) 0x09, (byte) 0xAE, (byte) 0x28, (byte) 0x3D, (byte) 0x9B,
+                (byte) 0xFF, (byte) 0x87, (byte) 0x76, (byte) 0xCD, (byte) 0xF0, (byte) 0x11,
+                (byte) 0xB7, (byte) 0xEA, (byte) 0xE6, (byte) 0xCD, (byte) 0x60, (byte) 0xD3,
+                (byte) 0x8C, (byte) 0x74, (byte) 0xD3, (byte) 0x45, (byte) 0x63, (byte) 0x69,
+                (byte) 0x3F, (byte) 0x1D, (byte) 0x31, (byte) 0x25, (byte) 0x49, (byte) 0x97,
+                (byte) 0x4B, (byte) 0x73, (byte) 0x34, (byte) 0x12, (byte) 0x73, (byte) 0x27,
+                (byte) 0x4C, (byte) 0xDA, (byte) 0xF3, (byte) 0x08, (byte) 0xA8, (byte) 0xA9,
+                (byte) 0x27, (byte) 0xE4, (byte) 0xB8, (byte) 0xD6, (byte) 0xB5, (byte) 0xC4,
+                (byte) 0x18, (byte) 0xED, (byte) 0xBD, (byte) 0x6F, (byte) 0xA2, (byte) 0x36,
+                (byte) 0xA2, (byte) 0x9C, (byte) 0x27, (byte) 0x62, (byte) 0x7F, (byte) 0x93,
+                (byte) 0xD7, (byte) 0x52, (byte) 0xA9, (byte) 0x76, (byte) 0x55, (byte) 0x99,
+                (byte) 0x00, (byte) 0x5B, (byte) 0xC2, (byte) 0xB9, (byte) 0x18, (byte) 0xAC,
+                (byte) 0x6B, (byte) 0x83, (byte) 0x0D, (byte) 0xA1, (byte) 0xC5, (byte) 0x01,
+                (byte) 0x1A, (byte) 0xE5, (byte) 0x4D, (byte) 0x2F, (byte) 0xCF, (byte) 0x5D,
+                (byte) 0xB2, (byte) 0xE7, (byte) 0xC7, (byte) 0xCB, (byte) 0x2C, (byte) 0xFF,
+                (byte) 0x51, (byte) 0x1B, (byte) 0x9D, (byte) 0xA4, (byte) 0x05, (byte) 0xEB,
+                (byte) 0x17, (byte) 0xD8, (byte) 0x97, (byte) 0x9D, (byte) 0x0C, (byte) 0x59,
+                (byte) 0x92, (byte) 0x8A, (byte) 0x03, (byte) 0x34, (byte) 0xFD, (byte) 0x16,
+                (byte) 0x0F, (byte) 0x2A, (byte) 0xF9, (byte) 0x7D, (byte) 0xC3, (byte) 0x41,
+                (byte) 0x0D, (byte) 0x06, (byte) 0x5A, (byte) 0x4B, (byte) 0x34, (byte) 0xD5,
+                (byte) 0xF5, (byte) 0x09, (byte) 0x1C, (byte) 0xCE, (byte) 0xA7, (byte) 0x19,
+                (byte) 0x6D, (byte) 0x04, (byte) 0x53, (byte) 0x71, (byte) 0xCC, (byte) 0x84,
+                (byte) 0xA0, (byte) 0xB2, (byte) 0xA0, (byte) 0x68, (byte) 0xA3, (byte) 0x40,
+                (byte) 0xC0, (byte) 0x67, (byte) 0x38, (byte) 0x96, (byte) 0x73, (byte) 0x2E,
+                (byte) 0x8E, (byte) 0x2A, (byte) 0x9D, (byte) 0x56, (byte) 0xE9, (byte) 0xAC,
+                (byte) 0xC7, (byte) 0xEC, (byte) 0x84, (byte) 0x7F, (byte) 0xFC, (byte) 0xE0,
+                (byte) 0x69, (byte) 0x03, (byte) 0x8B, (byte) 0x48, (byte) 0x64, (byte) 0x76,
+                (byte) 0x85, (byte) 0xA5, (byte) 0x10, (byte) 0xD9, (byte) 0x31, (byte) 0xC3,
+                (byte) 0x8B, (byte) 0x07, (byte) 0x48, (byte) 0x62, (byte) 0xF6, (byte) 0x68,
+                (byte) 0xF2, (byte) 0x96, (byte) 0xB2, (byte) 0x18, (byte) 0x5B, (byte) 0xFF,
+                (byte) 0x6D, (byte) 0xD1, (byte) 0x6B, (byte) 0xF5, (byte) 0xFD, (byte) 0x81,
+                (byte) 0xF1, (byte) 0xFD, (byte) 0x04, (byte) 0xF0, (byte) 0x9F, (byte) 0xB7,
+                (byte) 0x08, (byte) 0x95, (byte) 0x57, (byte) 0x48, (byte) 0x07, (byte) 0x00,
+                (byte) 0x52, (byte) 0xEC, (byte) 0x75, (byte) 0x91, (byte) 0x02, (byte) 0x11,
+                (byte) 0xA3, (byte) 0x64, (byte) 0x26, (byte) 0xCA,
+        });
+
+        AlgorithmParameterSpec spec = new DSAParameterSpec(p, q, g);
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("DSA")
+                .setKeySize(2048)
+                .setAlgorithmParameterSpec(spec)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 2048, spec, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_EC_Unencrypted_Success() throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("EC")
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 256, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_EC_P521_Unencrypted_Success() throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("EC")
+                .setKeySize(521)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 521, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_RSA_Unencrypted_Success() throws Exception {
         mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
                 .setAlias(TEST_ALIAS_1)
                 .setSubject(TEST_DN_1)
@@ -157,7 +363,28 @@
         final KeyPair pair = mGenerator.generateKeyPair();
         assertNotNull("The KeyPair returned should not be null", pair);
 
-        assertKeyPairCorrect(pair, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW, NOW_PLUS_10_YEARS);
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_RSA_WithParams_Unencrypted_Success()
+            throws Exception {
+        AlgorithmParameterSpec spec = new RSAKeyGenParameterSpec(1024, BigInteger.valueOf(3L));
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeySize(1024)
+                .setAlgorithmParameterSpec(spec)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 1024, spec, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
     }
 
     public void testKeyPairGenerator_GenerateKeyPair_Replaced_Success() throws Exception {
@@ -172,8 +399,8 @@
                     .build());
             final KeyPair pair1 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair1);
-            assertKeyPairCorrect(pair1, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
+                    NOW, NOW_PLUS_10_YEARS);
         }
 
         // Replace the original key
@@ -187,8 +414,8 @@
                     .build());
             final KeyPair pair2 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair2);
-            assertKeyPairCorrect(pair2, TEST_ALIAS_2, TEST_DN_2, TEST_SERIAL_2, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair2, TEST_ALIAS_2, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
+                    NOW, NOW_PLUS_10_YEARS);
         }
     }
 
@@ -205,8 +432,8 @@
                     .build());
             final KeyPair pair1 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair1);
-            assertKeyPairCorrect(pair1, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
+                    NOW, NOW_PLUS_10_YEARS);
         }
 
         // Attempt to replace previous key
@@ -230,18 +457,45 @@
 
             final KeyPair pair2 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair2);
-            assertKeyPairCorrect(pair2, TEST_ALIAS_1, TEST_DN_2, TEST_SERIAL_2, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair2, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
+                    NOW, NOW_PLUS_10_YEARS);
         }
     }
 
-    private void assertKeyPairCorrect(KeyPair pair, String alias, X500Principal dn,
-            BigInteger serial, Date start, Date end) throws Exception {
+    private void assertKeyPairCorrect(KeyPair pair, String alias, String keyType, int keySize,
+            AlgorithmParameterSpec spec, X500Principal dn, BigInteger serial, Date start, Date end)
+            throws Exception {
         final PublicKey pubKey = pair.getPublic();
         assertNotNull("The PublicKey for the KeyPair should be not null", pubKey);
+        assertEquals(keyType, pubKey.getAlgorithm());
+
+        if ("DSA".equalsIgnoreCase(keyType)) {
+            DSAPublicKey dsaPubKey = (DSAPublicKey) pubKey;
+            DSAParams actualParams = dsaPubKey.getParams();
+            assertEquals(keySize, (actualParams.getP().bitLength() + 7) & ~7);
+            if (spec != null) {
+                DSAParameterSpec expectedParams = (DSAParameterSpec) spec;
+                assertEquals(expectedParams.getP(), actualParams.getP());
+                assertEquals(expectedParams.getQ(), actualParams.getQ());
+                assertEquals(expectedParams.getG(), actualParams.getG());
+            }
+        } else if ("EC".equalsIgnoreCase(keyType)) {
+            assertEquals("Curve should be what was specified during initialization", keySize,
+                    ((ECPublicKey) pubKey).getParams().getCurve().getField().getFieldSize());
+        } else if ("RSA".equalsIgnoreCase(keyType)) {
+            RSAPublicKey rsaPubKey = (RSAPublicKey) pubKey;
+            assertEquals("Modulus size should be what is specified during initialization",
+                    (keySize + 7) & ~7, (rsaPubKey.getModulus().bitLength() + 7) & ~7);
+            if (spec != null) {
+                RSAKeyGenParameterSpec params = (RSAKeyGenParameterSpec) spec;
+                assertEquals((keySize + 7) & ~7, (params.getKeysize() + 7) & ~7);
+                assertEquals(params.getPublicExponent(), rsaPubKey.getPublicExponent());
+            }
+        }
 
         final PrivateKey privKey = pair.getPrivate();
         assertNotNull("The PrivateKey for the KeyPair should be not null", privKey);
+        assertEquals(keyType, privKey.getAlgorithm());
 
         final byte[] userCertBytes = mAndroidKeyStore.get(Credentials.USER_CERTIFICATE + alias);
         assertNotNull("The user certificate should exist for the generated entry", userCertBytes);
diff --git a/keystore/tests/src/android/security/AndroidKeyStoreTest.java b/keystore/tests/src/android/security/AndroidKeyStoreTest.java
index b7129db..6597d3f 100644
--- a/keystore/tests/src/android/security/AndroidKeyStoreTest.java
+++ b/keystore/tests/src/android/security/AndroidKeyStoreTest.java
@@ -18,7 +18,9 @@
 
 import com.android.org.bouncycastle.x509.X509V3CertificateGenerator;
 
+import com.android.org.conscrypt.NativeCrypto;
 import com.android.org.conscrypt.OpenSSLEngine;
+import com.android.org.conscrypt.OpenSSLKeyHolder;
 
 import android.test.AndroidTestCase;
 
@@ -39,6 +41,10 @@
 import java.security.cert.Certificate;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
+import java.security.interfaces.DSAPrivateKey;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.ECPublicKey;
 import java.security.interfaces.RSAPrivateKey;
 import java.security.spec.InvalidKeySpecException;
 import java.security.spec.PKCS8EncodedKeySpec;
@@ -99,7 +105,7 @@
      *
      * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
      */
-    private static final byte[] FAKE_CA_1 = {
+    private static final byte[] FAKE_RSA_CA_1 = {
             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0xce, (byte) 0x30, (byte) 0x82,
             (byte) 0x02, (byte) 0x37, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
             (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0x6a,
@@ -228,7 +234,7 @@
      *
      * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
      */
-    private static final byte[] FAKE_KEY_1 = new byte[] {
+    private static final byte[] FAKE_RSA_KEY_1 = new byte[] {
             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
             (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
             (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
@@ -342,7 +348,7 @@
      *
      * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
      */
-    private static final byte[] FAKE_USER_1 = new byte[] {
+    private static final byte[] FAKE_RSA_USER_1 = new byte[] {
             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x95, (byte) 0x30, (byte) 0x82,
             (byte) 0x01, (byte) 0xfe, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
             (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
@@ -456,6 +462,628 @@
             (byte) 0x08, (byte) 0x41, (byte) 0x0a, (byte) 0xf3, (byte) 0x72
     };
 
+    /*
+     * The keys and certificates below are generated with:
+     *
+     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
+     * openssl ecparam -name prime256v1 -out ecparam.pem
+     * openssl req -newkey ec:ecparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
+     * mkdir -p demoCA/newcerts
+     * touch demoCA/index.txt
+     * echo "01" > demoCA/serial
+     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
+     */
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_EC_CA_1 = {
+            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x58, (byte) 0x30, (byte) 0x82,
+            (byte) 0x01, (byte) 0xc1, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0xb2,
+            (byte) 0x8c, (byte) 0x04, (byte) 0x95, (byte) 0xeb, (byte) 0x10, (byte) 0xcb,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31,
+            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
+            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
+            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
+            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
+            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
+            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
+            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
+            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
+            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
+            (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d,
+            (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37,
+            (byte) 0x31, (byte) 0x36, (byte) 0x32, (byte) 0x38, (byte) 0x32, (byte) 0x38,
+            (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30,
+            (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x32,
+            (byte) 0x38, (byte) 0x32, (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x45,
+            (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,
+            (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a,
+            (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53,
+            (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21,
+            (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74,
+            (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20,
+            (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74,
+            (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20,
+            (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x81, (byte) 0x9f,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8d,
+            (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89, (byte) 0x02, (byte) 0x81,
+            (byte) 0x81, (byte) 0x00, (byte) 0xb5, (byte) 0xf6, (byte) 0x08, (byte) 0x0f,
+            (byte) 0xc4, (byte) 0x4d, (byte) 0xe4, (byte) 0x0d, (byte) 0x34, (byte) 0x1d,
+            (byte) 0xe2, (byte) 0x23, (byte) 0x18, (byte) 0x63, (byte) 0x03, (byte) 0xf7,
+            (byte) 0x14, (byte) 0x0e, (byte) 0x98, (byte) 0xcd, (byte) 0x45, (byte) 0x1f,
+            (byte) 0xfe, (byte) 0xfb, (byte) 0x09, (byte) 0x3f, (byte) 0x5d, (byte) 0x36,
+            (byte) 0x3b, (byte) 0x0f, (byte) 0xf9, (byte) 0x5e, (byte) 0x86, (byte) 0x56,
+            (byte) 0x64, (byte) 0xd7, (byte) 0x3f, (byte) 0xae, (byte) 0x33, (byte) 0x09,
+            (byte) 0xd3, (byte) 0xdd, (byte) 0x06, (byte) 0x17, (byte) 0x26, (byte) 0xdc,
+            (byte) 0xa2, (byte) 0x8c, (byte) 0x3c, (byte) 0x65, (byte) 0xed, (byte) 0x03,
+            (byte) 0x82, (byte) 0x78, (byte) 0x9b, (byte) 0xee, (byte) 0xe3, (byte) 0x98,
+            (byte) 0x58, (byte) 0xe1, (byte) 0xf1, (byte) 0xa0, (byte) 0x85, (byte) 0xae,
+            (byte) 0x63, (byte) 0x84, (byte) 0x41, (byte) 0x46, (byte) 0xa7, (byte) 0x4f,
+            (byte) 0xdc, (byte) 0xbb, (byte) 0x1c, (byte) 0x6e, (byte) 0xec, (byte) 0x7b,
+            (byte) 0xd5, (byte) 0xab, (byte) 0x3d, (byte) 0x6a, (byte) 0x05, (byte) 0x58,
+            (byte) 0x0f, (byte) 0x9b, (byte) 0x6a, (byte) 0x67, (byte) 0x4b, (byte) 0xe9,
+            (byte) 0x2a, (byte) 0x6d, (byte) 0x96, (byte) 0x11, (byte) 0x53, (byte) 0x95,
+            (byte) 0x78, (byte) 0xaa, (byte) 0xd1, (byte) 0x91, (byte) 0x4a, (byte) 0xf8,
+            (byte) 0x54, (byte) 0x52, (byte) 0x6d, (byte) 0xb9, (byte) 0xca, (byte) 0x74,
+            (byte) 0x81, (byte) 0xf8, (byte) 0x99, (byte) 0x64, (byte) 0xd1, (byte) 0x4f,
+            (byte) 0x01, (byte) 0x38, (byte) 0x4f, (byte) 0x08, (byte) 0x5c, (byte) 0x31,
+            (byte) 0xcb, (byte) 0x7c, (byte) 0x5c, (byte) 0x78, (byte) 0x5d, (byte) 0x47,
+            (byte) 0xd9, (byte) 0xf0, (byte) 0x1a, (byte) 0xeb, (byte) 0x02, (byte) 0x03,
+            (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x50, (byte) 0x30,
+            (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
+            (byte) 0x5f, (byte) 0x5b, (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa,
+            (byte) 0xa1, (byte) 0x9f, (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1,
+            (byte) 0xbc, (byte) 0x20, (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4,
+            (byte) 0xfa, (byte) 0xe3, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
+            (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b, (byte) 0x5e,
+            (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f, (byte) 0x9e,
+            (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20, (byte) 0x72,
+            (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3, (byte) 0x30,
+            (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
+            (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01,
+            (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
+            (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
+            (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81,
+            (byte) 0x81, (byte) 0x00, (byte) 0xa1, (byte) 0x4a, (byte) 0xe6, (byte) 0xfc,
+            (byte) 0x7f, (byte) 0x17, (byte) 0xaa, (byte) 0x65, (byte) 0x4a, (byte) 0x34,
+            (byte) 0xde, (byte) 0x69, (byte) 0x67, (byte) 0x54, (byte) 0x4d, (byte) 0xa2,
+            (byte) 0xc2, (byte) 0x98, (byte) 0x02, (byte) 0x43, (byte) 0x6a, (byte) 0x0e,
+            (byte) 0x0b, (byte) 0x7f, (byte) 0xa4, (byte) 0x46, (byte) 0xaf, (byte) 0xa4,
+            (byte) 0x65, (byte) 0xa0, (byte) 0xdb, (byte) 0xf1, (byte) 0x5b, (byte) 0xd5,
+            (byte) 0x09, (byte) 0xbc, (byte) 0xee, (byte) 0x37, (byte) 0x51, (byte) 0x19,
+            (byte) 0x36, (byte) 0xc0, (byte) 0x90, (byte) 0xd3, (byte) 0x5f, (byte) 0xf3,
+            (byte) 0x4f, (byte) 0xb9, (byte) 0x08, (byte) 0x45, (byte) 0x0e, (byte) 0x01,
+            (byte) 0x8a, (byte) 0x95, (byte) 0xef, (byte) 0x92, (byte) 0x95, (byte) 0x33,
+            (byte) 0x78, (byte) 0xdd, (byte) 0x90, (byte) 0xbb, (byte) 0xf3, (byte) 0x06,
+            (byte) 0x75, (byte) 0xd0, (byte) 0x66, (byte) 0xe6, (byte) 0xd0, (byte) 0x18,
+            (byte) 0x6e, (byte) 0xeb, (byte) 0x1c, (byte) 0x52, (byte) 0xc3, (byte) 0x2e,
+            (byte) 0x57, (byte) 0x7d, (byte) 0xa9, (byte) 0x03, (byte) 0xdb, (byte) 0xf4,
+            (byte) 0x57, (byte) 0x5f, (byte) 0x6c, (byte) 0x7e, (byte) 0x00, (byte) 0x0d,
+            (byte) 0x8f, (byte) 0xe8, (byte) 0x91, (byte) 0xf7, (byte) 0xae, (byte) 0x24,
+            (byte) 0x35, (byte) 0x07, (byte) 0xb5, (byte) 0x48, (byte) 0x2d, (byte) 0x36,
+            (byte) 0x30, (byte) 0x5d, (byte) 0xe9, (byte) 0x49, (byte) 0x2d, (byte) 0xd1,
+            (byte) 0x5d, (byte) 0xc5, (byte) 0xf4, (byte) 0x33, (byte) 0x77, (byte) 0x3c,
+            (byte) 0x71, (byte) 0xad, (byte) 0x90, (byte) 0x65, (byte) 0xa9, (byte) 0xc1,
+            (byte) 0x0b, (byte) 0x5c, (byte) 0x62, (byte) 0x55, (byte) 0x50, (byte) 0x6f,
+            (byte) 0x9b, (byte) 0xc9, (byte) 0x0d, (byte) 0xee
+    };
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_EC_KEY_1 = new byte[] {
+            (byte) 0x30, (byte) 0x81, (byte) 0x87, (byte) 0x02, (byte) 0x01, (byte) 0x00,
+            (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06,
+            (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d,
+            (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x04, (byte) 0x6d, (byte) 0x30,
+            (byte) 0x6b, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x20,
+            (byte) 0x3a, (byte) 0x8a, (byte) 0x02, (byte) 0xdc, (byte) 0xde, (byte) 0x70,
+            (byte) 0x84, (byte) 0x45, (byte) 0x34, (byte) 0xaf, (byte) 0xbd, (byte) 0xd5,
+            (byte) 0x02, (byte) 0x17, (byte) 0x69, (byte) 0x90, (byte) 0x65, (byte) 0x1e,
+            (byte) 0x87, (byte) 0xf1, (byte) 0x3d, (byte) 0x17, (byte) 0xb6, (byte) 0xf4,
+            (byte) 0x31, (byte) 0x94, (byte) 0x86, (byte) 0x76, (byte) 0x55, (byte) 0xf7,
+            (byte) 0xcc, (byte) 0xba, (byte) 0xa1, (byte) 0x44, (byte) 0x03, (byte) 0x42,
+            (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7, (byte) 0x9b,
+            (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33, (byte) 0x14,
+            (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3, (byte) 0xcd,
+            (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d, (byte) 0xf3,
+            (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f, (byte) 0x79,
+            (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3, (byte) 0xd1,
+            (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf, (byte) 0x50,
+            (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22, (byte) 0xe6,
+            (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68, (byte) 0x3b,
+            (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77, (byte) 0x5e,
+            (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2, (byte) 0x38
+    };
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_EC_USER_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x51, (byte) 0x30, (byte) 0x82,
+            (byte) 0x01, (byte) 0xba, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
+            (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
+            (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
+            (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
+            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
+            (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
+            (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
+            (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
+            (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
+            (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
+            (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
+            (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x33,
+            (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x31, (byte) 0x36,
+            (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x38, (byte) 0x5a, (byte) 0x17,
+            (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
+            (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x33, (byte) 0x30, (byte) 0x30,
+            (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31, (byte) 0x0b,
+            (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31,
+            (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f,
+            (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61,
+            (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c,
+            (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72,
+            (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69,
+            (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20,
+            (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74,
+            (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x12,
+            (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65, (byte) 0x72,
+            (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70,
+            (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x30, (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07,
+            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02,
+            (byte) 0x01, (byte) 0x06, (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
+            (byte) 0xce, (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x03,
+            (byte) 0x42, (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7,
+            (byte) 0x9b, (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33,
+            (byte) 0x14, (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3,
+            (byte) 0xcd, (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d,
+            (byte) 0xf3, (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f,
+            (byte) 0x79, (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3,
+            (byte) 0xd1, (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf,
+            (byte) 0x50, (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22,
+            (byte) 0xe6, (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68,
+            (byte) 0x3b, (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77,
+            (byte) 0x5e, (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2,
+            (byte) 0x38, (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30,
+            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
+            (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c,
+            (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01,
+            (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04,
+            (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65,
+            (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47,
+            (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72,
+            (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61,
+            (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04,
+            (byte) 0x14, (byte) 0xd5, (byte) 0xc4, (byte) 0x72, (byte) 0xbd, (byte) 0xd2,
+            (byte) 0x4e, (byte) 0x90, (byte) 0x1b, (byte) 0x14, (byte) 0x32, (byte) 0xdb,
+            (byte) 0x03, (byte) 0xae, (byte) 0xfa, (byte) 0x27, (byte) 0x7d, (byte) 0x8d,
+            (byte) 0xe4, (byte) 0x80, (byte) 0x58, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18,
+            (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b,
+            (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f,
+            (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20,
+            (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81,
+            (byte) 0x00, (byte) 0x43, (byte) 0x99, (byte) 0x9f, (byte) 0x67, (byte) 0x08,
+            (byte) 0x43, (byte) 0xd5, (byte) 0x6b, (byte) 0x6f, (byte) 0xd7, (byte) 0x05,
+            (byte) 0xd6, (byte) 0x75, (byte) 0x34, (byte) 0x30, (byte) 0xca, (byte) 0x20,
+            (byte) 0x47, (byte) 0x61, (byte) 0xa1, (byte) 0x89, (byte) 0xb6, (byte) 0xf1,
+            (byte) 0x49, (byte) 0x7b, (byte) 0xd9, (byte) 0xb9, (byte) 0xe8, (byte) 0x1e,
+            (byte) 0x29, (byte) 0x74, (byte) 0x0a, (byte) 0x67, (byte) 0xc0, (byte) 0x7d,
+            (byte) 0xb8, (byte) 0xe6, (byte) 0x39, (byte) 0xa8, (byte) 0x5e, (byte) 0xc3,
+            (byte) 0xb0, (byte) 0xa1, (byte) 0x30, (byte) 0x6a, (byte) 0x1f, (byte) 0x1d,
+            (byte) 0xfc, (byte) 0x11, (byte) 0x59, (byte) 0x0b, (byte) 0xb9, (byte) 0xad,
+            (byte) 0x3a, (byte) 0x4e, (byte) 0x50, (byte) 0x0a, (byte) 0x61, (byte) 0xdb,
+            (byte) 0x75, (byte) 0x6b, (byte) 0xe5, (byte) 0x3f, (byte) 0x8d, (byte) 0xde,
+            (byte) 0x28, (byte) 0x68, (byte) 0xb1, (byte) 0x29, (byte) 0x9a, (byte) 0x18,
+            (byte) 0x8a, (byte) 0xfc, (byte) 0x3f, (byte) 0x13, (byte) 0x93, (byte) 0x29,
+            (byte) 0xed, (byte) 0x22, (byte) 0x7c, (byte) 0xb4, (byte) 0x50, (byte) 0xd5,
+            (byte) 0x4d, (byte) 0x32, (byte) 0x4d, (byte) 0x42, (byte) 0x2b, (byte) 0x29,
+            (byte) 0x97, (byte) 0x86, (byte) 0xc0, (byte) 0x01, (byte) 0x00, (byte) 0x25,
+            (byte) 0xf6, (byte) 0xd3, (byte) 0x2a, (byte) 0xd8, (byte) 0xda, (byte) 0x13,
+            (byte) 0x94, (byte) 0x12, (byte) 0x78, (byte) 0x14, (byte) 0x0b, (byte) 0x51,
+            (byte) 0xc0, (byte) 0x45, (byte) 0xb4, (byte) 0x02, (byte) 0x37, (byte) 0x98,
+            (byte) 0x42, (byte) 0x3c, (byte) 0xcb, (byte) 0x2e, (byte) 0xe4, (byte) 0x38,
+            (byte) 0x69, (byte) 0x1b, (byte) 0x72, (byte) 0xf0, (byte) 0xaa, (byte) 0x89,
+            (byte) 0x7e, (byte) 0xde, (byte) 0xb2
+    };
+
+    /*
+     * The keys and certificates below are generated with:
+     *
+     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
+     * openssl dsaparam -out dsaparam.pem 1024
+     * openssl req -newkey dsa:dsaparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
+     * mkdir -p demoCA/newcerts
+     * touch demoCA/index.txt
+     * echo "01" > demoCA/serial
+     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
+     */
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_DSA_CA_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x8a, (byte) 0x30, (byte) 0x82,
+            (byte) 0x01, (byte) 0xf3, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0x87, (byte) 0xc0,
+            (byte) 0x68, (byte) 0x7f, (byte) 0x42, (byte) 0x92, (byte) 0x0b, (byte) 0x7a,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31,
+            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
+            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
+            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
+            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
+            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
+            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
+            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
+            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
+            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
+            (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
+            (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78,
+            (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e,
+            (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17,
+            (byte) 0x0d, (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
+            (byte) 0x37, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x31, (byte) 0x32,
+            (byte) 0x39, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33,
+            (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33,
+            (byte) 0x33, (byte) 0x31, (byte) 0x32, (byte) 0x39, (byte) 0x5a, (byte) 0x30,
+            (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02,
+            (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c,
+            (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d,
+            (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31,
+            (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e,
+            (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74,
+            (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69,
+            (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79,
+            (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17,
+            (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e,
+            (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c,
+            (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30,
+            (byte) 0x81, (byte) 0x9f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
+            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
+            (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03,
+            (byte) 0x81, (byte) 0x8d, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89,
+            (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xa4, (byte) 0xc7,
+            (byte) 0x06, (byte) 0xba, (byte) 0xdf, (byte) 0x2b, (byte) 0xee, (byte) 0xd2,
+            (byte) 0xb9, (byte) 0xe4, (byte) 0x52, (byte) 0x21, (byte) 0x68, (byte) 0x2b,
+            (byte) 0x83, (byte) 0xdf, (byte) 0xe3, (byte) 0x9c, (byte) 0x08, (byte) 0x73,
+            (byte) 0xdd, (byte) 0x90, (byte) 0xea, (byte) 0x97, (byte) 0x0c, (byte) 0x96,
+            (byte) 0x20, (byte) 0xb1, (byte) 0xee, (byte) 0x11, (byte) 0xd5, (byte) 0xd4,
+            (byte) 0x7c, (byte) 0x44, (byte) 0x96, (byte) 0x2e, (byte) 0x6e, (byte) 0xa2,
+            (byte) 0xb2, (byte) 0xa3, (byte) 0x4b, (byte) 0x0f, (byte) 0x32, (byte) 0x90,
+            (byte) 0xaf, (byte) 0x5c, (byte) 0x6f, (byte) 0x00, (byte) 0x88, (byte) 0x45,
+            (byte) 0x4e, (byte) 0x9b, (byte) 0x26, (byte) 0xc1, (byte) 0x94, (byte) 0x3c,
+            (byte) 0xfe, (byte) 0x10, (byte) 0xbd, (byte) 0xda, (byte) 0xf2, (byte) 0x8d,
+            (byte) 0x03, (byte) 0x52, (byte) 0x32, (byte) 0x11, (byte) 0xff, (byte) 0xf6,
+            (byte) 0xf9, (byte) 0x6e, (byte) 0x8f, (byte) 0x0f, (byte) 0xc8, (byte) 0x0a,
+            (byte) 0x48, (byte) 0x39, (byte) 0x33, (byte) 0xb9, (byte) 0x0c, (byte) 0xb3,
+            (byte) 0x2b, (byte) 0xab, (byte) 0x7d, (byte) 0x79, (byte) 0x6f, (byte) 0x57,
+            (byte) 0x5b, (byte) 0xb8, (byte) 0x84, (byte) 0xb6, (byte) 0xcc, (byte) 0xe8,
+            (byte) 0x30, (byte) 0x78, (byte) 0xff, (byte) 0x92, (byte) 0xe5, (byte) 0x43,
+            (byte) 0x2e, (byte) 0xef, (byte) 0x66, (byte) 0x98, (byte) 0xb4, (byte) 0xfe,
+            (byte) 0xa2, (byte) 0x40, (byte) 0xf2, (byte) 0x1f, (byte) 0xd0, (byte) 0x86,
+            (byte) 0x16, (byte) 0xc8, (byte) 0x45, (byte) 0xc4, (byte) 0x52, (byte) 0xcb,
+            (byte) 0x31, (byte) 0x5c, (byte) 0x9f, (byte) 0x32, (byte) 0x3b, (byte) 0xf7,
+            (byte) 0x19, (byte) 0x08, (byte) 0xc7, (byte) 0x00, (byte) 0x21, (byte) 0x7d,
+            (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3,
+            (byte) 0x50, (byte) 0x30, (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16,
+            (byte) 0x04, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3, (byte) 0xf1,
+            (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f, (byte) 0x30,
+            (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15, (byte) 0x32,
+            (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30, (byte) 0x1f,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04,
+            (byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47,
+            (byte) 0x82, (byte) 0xa3, (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a,
+            (byte) 0xde, (byte) 0x4f, (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72,
+            (byte) 0x81, (byte) 0x15, (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58,
+            (byte) 0x18, (byte) 0x30, (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03,
+            (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
+            (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7,
+            (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00,
+            (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x08, (byte) 0x7f,
+            (byte) 0x6a, (byte) 0x48, (byte) 0x90, (byte) 0x7b, (byte) 0x9b, (byte) 0x72,
+            (byte) 0x13, (byte) 0xa7, (byte) 0xef, (byte) 0x6b, (byte) 0x0b, (byte) 0x59,
+            (byte) 0xe5, (byte) 0x49, (byte) 0x72, (byte) 0x3a, (byte) 0xc8, (byte) 0x84,
+            (byte) 0xcc, (byte) 0x23, (byte) 0x18, (byte) 0x4c, (byte) 0xec, (byte) 0xc7,
+            (byte) 0xef, (byte) 0xcb, (byte) 0xa7, (byte) 0xbe, (byte) 0xe4, (byte) 0xef,
+            (byte) 0x8f, (byte) 0xc6, (byte) 0x06, (byte) 0x8c, (byte) 0xc0, (byte) 0xe4,
+            (byte) 0x2f, (byte) 0x2a, (byte) 0xc0, (byte) 0x35, (byte) 0x7d, (byte) 0x5e,
+            (byte) 0x19, (byte) 0x29, (byte) 0x8c, (byte) 0xb9, (byte) 0xf1, (byte) 0x1e,
+            (byte) 0xaf, (byte) 0x82, (byte) 0xd8, (byte) 0xe3, (byte) 0x88, (byte) 0xe1,
+            (byte) 0x31, (byte) 0xc8, (byte) 0x82, (byte) 0x1f, (byte) 0x83, (byte) 0xa9,
+            (byte) 0xde, (byte) 0xfe, (byte) 0x4b, (byte) 0xe2, (byte) 0x78, (byte) 0x64,
+            (byte) 0xed, (byte) 0xa4, (byte) 0x7b, (byte) 0xee, (byte) 0x8d, (byte) 0x71,
+            (byte) 0x1b, (byte) 0x44, (byte) 0xe6, (byte) 0xb7, (byte) 0xe8, (byte) 0xc5,
+            (byte) 0x9a, (byte) 0x93, (byte) 0x92, (byte) 0x6f, (byte) 0x6f, (byte) 0xdb,
+            (byte) 0xbd, (byte) 0xd7, (byte) 0x03, (byte) 0x85, (byte) 0xa9, (byte) 0x5f,
+            (byte) 0x53, (byte) 0x5f, (byte) 0x5d, (byte) 0x30, (byte) 0xc6, (byte) 0xd9,
+            (byte) 0xce, (byte) 0x34, (byte) 0xa8, (byte) 0xbe, (byte) 0x31, (byte) 0x47,
+            (byte) 0x1c, (byte) 0xa4, (byte) 0x7f, (byte) 0xc0, (byte) 0x2c, (byte) 0xbc,
+            (byte) 0xfe, (byte) 0x1a, (byte) 0x31, (byte) 0xd8, (byte) 0x77, (byte) 0x4d,
+            (byte) 0xfc, (byte) 0x45, (byte) 0x84, (byte) 0xfc, (byte) 0x45, (byte) 0x12,
+            (byte) 0xab, (byte) 0x50, (byte) 0xe4, (byte) 0x45, (byte) 0xe5, (byte) 0x11
+    };
+
+    /**
+     * Generated from above and converted with: openssl pkcs8 -topk8 -outform d
+     * -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_DSA_KEY_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x4c, (byte) 0x02, (byte) 0x01,
+            (byte) 0x00, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06,
+            (byte) 0x07, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38,
+            (byte) 0x04, (byte) 0x01, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f,
+            (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23,
+            (byte) 0xf7, (byte) 0x86, (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc,
+            (byte) 0xc3, (byte) 0x91, (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02,
+            (byte) 0x47, (byte) 0x35, (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98,
+            (byte) 0x13, (byte) 0x56, (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20,
+            (byte) 0xa8, (byte) 0x60, (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77,
+            (byte) 0xc1, (byte) 0x69, (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92,
+            (byte) 0xf2, (byte) 0x6a, (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c,
+            (byte) 0x91, (byte) 0x20, (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2,
+            (byte) 0x87, (byte) 0xa6, (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45,
+            (byte) 0x46, (byte) 0xf9, (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38,
+            (byte) 0x8d, (byte) 0xff, (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f,
+            (byte) 0x66, (byte) 0x15, (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb,
+            (byte) 0x57, (byte) 0x39, (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd,
+            (byte) 0xe2, (byte) 0xb4, (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32,
+            (byte) 0x3b, (byte) 0x9d, (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d,
+            (byte) 0x75, (byte) 0xb9, (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba,
+            (byte) 0xb7, (byte) 0xc8, (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71,
+            (byte) 0x91, (byte) 0xd3, (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e,
+            (byte) 0x7c, (byte) 0x15, (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52,
+            (byte) 0x65, (byte) 0x4d, (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35,
+            (byte) 0xce, (byte) 0x0b, (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1,
+            (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f,
+            (byte) 0x7a, (byte) 0x31, (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2,
+            (byte) 0xf7, (byte) 0xaf, (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92,
+            (byte) 0xf3, (byte) 0x6c, (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02,
+            (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36,
+            (byte) 0x48, (byte) 0xdb, (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce,
+            (byte) 0x6d, (byte) 0xbc, (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50,
+            (byte) 0x91, (byte) 0x10, (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50,
+            (byte) 0xda, (byte) 0x4f, (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb,
+            (byte) 0x4d, (byte) 0xb0, (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3,
+            (byte) 0x6c, (byte) 0xc9, (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0,
+            (byte) 0x54, (byte) 0x7e, (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e,
+            (byte) 0x5f, (byte) 0xc0, (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3,
+            (byte) 0xd3, (byte) 0xdf, (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb,
+            (byte) 0xe6, (byte) 0x20, (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca,
+            (byte) 0xdb, (byte) 0xc0, (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16,
+            (byte) 0x1d, (byte) 0xb3, (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89,
+            (byte) 0x17, (byte) 0x73, (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60,
+            (byte) 0xb7, (byte) 0xaa, (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03,
+            (byte) 0x4e, (byte) 0x36, (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa,
+            (byte) 0xf3, (byte) 0xd6, (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4,
+            (byte) 0x41, (byte) 0xd6, (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b,
+            (byte) 0x2d, (byte) 0x23, (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39,
+            (byte) 0xa8, (byte) 0x6a, (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2,
+            (byte) 0x77, (byte) 0x91, (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48,
+            (byte) 0x78, (byte) 0xcd, (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x04,
+            (byte) 0x17, (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xc7, (byte) 0xe7,
+            (byte) 0xe2, (byte) 0x6b, (byte) 0x14, (byte) 0xe6, (byte) 0x31, (byte) 0x12,
+            (byte) 0xb2, (byte) 0x1e, (byte) 0xd4, (byte) 0xf2, (byte) 0x9b, (byte) 0x2c,
+            (byte) 0xf6, (byte) 0x54, (byte) 0x4c, (byte) 0x12, (byte) 0xe8, (byte) 0x22
+    };
+
+    /**
+     * Generated from above and converted with: openssl x509 -outform d -in
+     * usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_DSA_USER_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x03, (byte) 0xca, (byte) 0x30, (byte) 0x82,
+            (byte) 0x03, (byte) 0x33, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
+            (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
+            (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
+            (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
+            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
+            (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
+            (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
+            (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
+            (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
+            (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
+            (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
+            (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63,
+            (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
+            (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
+            (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31,
+            (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x32,
+            (byte) 0x33, (byte) 0x33, (byte) 0x34, (byte) 0x32, (byte) 0x32, (byte) 0x5a,
+            (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38,
+            (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x34,
+            (byte) 0x32, (byte) 0x32, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31,
+            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
+            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
+            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
+            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
+            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
+            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
+            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
+            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
+            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
+            (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
+            (byte) 0x12, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65,
+            (byte) 0x72, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
+            (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
+            (byte) 0x6d, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0xb7, (byte) 0x30,
+            (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06, (byte) 0x07, (byte) 0x2a,
+            (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38, (byte) 0x04, (byte) 0x01,
+            (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f, (byte) 0x02, (byte) 0x81,
+            (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23, (byte) 0xf7, (byte) 0x86,
+            (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc, (byte) 0xc3, (byte) 0x91,
+            (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02, (byte) 0x47, (byte) 0x35,
+            (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98, (byte) 0x13, (byte) 0x56,
+            (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20, (byte) 0xa8, (byte) 0x60,
+            (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77, (byte) 0xc1, (byte) 0x69,
+            (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92, (byte) 0xf2, (byte) 0x6a,
+            (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c, (byte) 0x91, (byte) 0x20,
+            (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2, (byte) 0x87, (byte) 0xa6,
+            (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45, (byte) 0x46, (byte) 0xf9,
+            (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38, (byte) 0x8d, (byte) 0xff,
+            (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f, (byte) 0x66, (byte) 0x15,
+            (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb, (byte) 0x57, (byte) 0x39,
+            (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd, (byte) 0xe2, (byte) 0xb4,
+            (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32, (byte) 0x3b, (byte) 0x9d,
+            (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d, (byte) 0x75, (byte) 0xb9,
+            (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba, (byte) 0xb7, (byte) 0xc8,
+            (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71, (byte) 0x91, (byte) 0xd3,
+            (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e, (byte) 0x7c, (byte) 0x15,
+            (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52, (byte) 0x65, (byte) 0x4d,
+            (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35, (byte) 0xce, (byte) 0x0b,
+            (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1, (byte) 0x02, (byte) 0x15,
+            (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f, (byte) 0x7a, (byte) 0x31,
+            (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2, (byte) 0xf7, (byte) 0xaf,
+            (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92, (byte) 0xf3, (byte) 0x6c,
+            (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02, (byte) 0x81, (byte) 0x81,
+            (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36, (byte) 0x48, (byte) 0xdb,
+            (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce, (byte) 0x6d, (byte) 0xbc,
+            (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50, (byte) 0x91, (byte) 0x10,
+            (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50, (byte) 0xda, (byte) 0x4f,
+            (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb, (byte) 0x4d, (byte) 0xb0,
+            (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3, (byte) 0x6c, (byte) 0xc9,
+            (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0, (byte) 0x54, (byte) 0x7e,
+            (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e, (byte) 0x5f, (byte) 0xc0,
+            (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3, (byte) 0xd3, (byte) 0xdf,
+            (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb, (byte) 0xe6, (byte) 0x20,
+            (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca, (byte) 0xdb, (byte) 0xc0,
+            (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16, (byte) 0x1d, (byte) 0xb3,
+            (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89, (byte) 0x17, (byte) 0x73,
+            (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60, (byte) 0xb7, (byte) 0xaa,
+            (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03, (byte) 0x4e, (byte) 0x36,
+            (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa, (byte) 0xf3, (byte) 0xd6,
+            (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4, (byte) 0x41, (byte) 0xd6,
+            (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b, (byte) 0x2d, (byte) 0x23,
+            (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39, (byte) 0xa8, (byte) 0x6a,
+            (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2, (byte) 0x77, (byte) 0x91,
+            (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48, (byte) 0x78, (byte) 0xcd,
+            (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x03, (byte) 0x81, (byte) 0x84,
+            (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x1a, (byte) 0x50,
+            (byte) 0x9d, (byte) 0x3e, (byte) 0xa1, (byte) 0x6c, (byte) 0x99, (byte) 0x35,
+            (byte) 0x36, (byte) 0x26, (byte) 0x22, (byte) 0x6b, (byte) 0x47, (byte) 0x45,
+            (byte) 0x80, (byte) 0x5b, (byte) 0xd5, (byte) 0xc1, (byte) 0xc5, (byte) 0x70,
+            (byte) 0x75, (byte) 0x55, (byte) 0x66, (byte) 0x33, (byte) 0x1d, (byte) 0xae,
+            (byte) 0xd0, (byte) 0x01, (byte) 0x64, (byte) 0x8b, (byte) 0xae, (byte) 0x9d,
+            (byte) 0x66, (byte) 0x58, (byte) 0xf9, (byte) 0x42, (byte) 0x74, (byte) 0x3a,
+            (byte) 0x32, (byte) 0xc7, (byte) 0x7f, (byte) 0x25, (byte) 0x64, (byte) 0x7d,
+            (byte) 0x08, (byte) 0x26, (byte) 0xbf, (byte) 0x21, (byte) 0x3a, (byte) 0x84,
+            (byte) 0xcc, (byte) 0x2c, (byte) 0x66, (byte) 0x7d, (byte) 0xc7, (byte) 0xd6,
+            (byte) 0xb1, (byte) 0x69, (byte) 0x57, (byte) 0x67, (byte) 0x52, (byte) 0x73,
+            (byte) 0x3f, (byte) 0x79, (byte) 0x60, (byte) 0xaa, (byte) 0xf4, (byte) 0x8a,
+            (byte) 0x48, (byte) 0x42, (byte) 0x46, (byte) 0x41, (byte) 0xd0, (byte) 0x50,
+            (byte) 0x9b, (byte) 0xa2, (byte) 0x4e, (byte) 0xa5, (byte) 0x88, (byte) 0x10,
+            (byte) 0xf7, (byte) 0x61, (byte) 0xa2, (byte) 0xfa, (byte) 0x8d, (byte) 0xa6,
+            (byte) 0x13, (byte) 0x9e, (byte) 0x36, (byte) 0x86, (byte) 0x62, (byte) 0xf0,
+            (byte) 0x97, (byte) 0xef, (byte) 0x11, (byte) 0xc6, (byte) 0x35, (byte) 0xd3,
+            (byte) 0x79, (byte) 0x30, (byte) 0xde, (byte) 0xf2, (byte) 0x7f, (byte) 0x7a,
+            (byte) 0x3c, (byte) 0x03, (byte) 0xa3, (byte) 0xc5, (byte) 0xbc, (byte) 0xb1,
+            (byte) 0xbc, (byte) 0x2f, (byte) 0x10, (byte) 0xf4, (byte) 0x51, (byte) 0x89,
+            (byte) 0xe2, (byte) 0xaf, (byte) 0xf7, (byte) 0x61, (byte) 0x1a, (byte) 0xf0,
+            (byte) 0x87, (byte) 0x5e, (byte) 0xa5, (byte) 0x02, (byte) 0xd2, (byte) 0xe4,
+            (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30, (byte) 0x09,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04,
+            (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c, (byte) 0x06,
+            (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01, (byte) 0x86,
+            (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04, (byte) 0x1f,
+            (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65, (byte) 0x6e,
+            (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47, (byte) 0x65,
+            (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74, (byte) 0x65,
+            (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72, (byte) 0x74,
+            (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
+            (byte) 0xd1, (byte) 0x6c, (byte) 0x36, (byte) 0x36, (byte) 0x61, (byte) 0x6c,
+            (byte) 0xf6, (byte) 0x90, (byte) 0x82, (byte) 0x82, (byte) 0x87, (byte) 0x93,
+            (byte) 0xbe, (byte) 0x99, (byte) 0x60, (byte) 0x1b, (byte) 0x03, (byte) 0x58,
+            (byte) 0x36, (byte) 0x63, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
+            (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3,
+            (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f,
+            (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15,
+            (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30,
+            (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
+            (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,
+            (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00,
+            (byte) 0x81, (byte) 0xde, (byte) 0x20, (byte) 0xa1, (byte) 0xb2, (byte) 0x50,
+            (byte) 0x03, (byte) 0xcd, (byte) 0x90, (byte) 0x4f, (byte) 0x2b, (byte) 0x47,
+            (byte) 0x1d, (byte) 0xac, (byte) 0x6e, (byte) 0xb4, (byte) 0xc7, (byte) 0x14,
+            (byte) 0xc6, (byte) 0x4f, (byte) 0x45, (byte) 0xaf, (byte) 0x81, (byte) 0x5d,
+            (byte) 0x5a, (byte) 0x31, (byte) 0xff, (byte) 0x9c, (byte) 0x4d, (byte) 0xdc,
+            (byte) 0x9e, (byte) 0x36, (byte) 0x9f, (byte) 0x9b, (byte) 0xb1, (byte) 0xc9,
+            (byte) 0x50, (byte) 0xa3, (byte) 0xf6, (byte) 0x9c, (byte) 0x68, (byte) 0x6f,
+            (byte) 0x68, (byte) 0xd9, (byte) 0x56, (byte) 0x1b, (byte) 0xe5, (byte) 0x1b,
+            (byte) 0x41, (byte) 0xd4, (byte) 0xcc, (byte) 0xb6, (byte) 0x37, (byte) 0xd5,
+            (byte) 0x69, (byte) 0x6b, (byte) 0x39, (byte) 0xaf, (byte) 0xc6, (byte) 0xb8,
+            (byte) 0x39, (byte) 0x76, (byte) 0xe3, (byte) 0xf7, (byte) 0x97, (byte) 0x74,
+            (byte) 0x31, (byte) 0xc4, (byte) 0x2d, (byte) 0xb7, (byte) 0x9a, (byte) 0xa4,
+            (byte) 0xfa, (byte) 0x9f, (byte) 0xa8, (byte) 0xe3, (byte) 0x41, (byte) 0xda,
+            (byte) 0x2f, (byte) 0x0c, (byte) 0x9d, (byte) 0x83, (byte) 0xdc, (byte) 0x86,
+            (byte) 0x1f, (byte) 0x5c, (byte) 0x0f, (byte) 0x87, (byte) 0x05, (byte) 0xc9,
+            (byte) 0xb0, (byte) 0x63, (byte) 0xca, (byte) 0x9b, (byte) 0xdb, (byte) 0xe6,
+            (byte) 0x3c, (byte) 0xe9, (byte) 0x23, (byte) 0x9e, (byte) 0x23, (byte) 0x44,
+            (byte) 0x1d, (byte) 0x5b, (byte) 0x60, (byte) 0x66, (byte) 0xb6, (byte) 0x72,
+            (byte) 0x8c, (byte) 0x87, (byte) 0x86, (byte) 0xe8, (byte) 0xdb, (byte) 0x29,
+            (byte) 0x67, (byte) 0x9c, (byte) 0x33, (byte) 0x5c, (byte) 0x39, (byte) 0xf1,
+            (byte) 0xb5, (byte) 0x9b, (byte) 0xb8, (byte) 0xe1, (byte) 0x42, (byte) 0x51,
+            (byte) 0xed, (byte) 0x2c
+    };
+
     /**
      * The amount of time to allow before and after expected time for variance
      * in timing tests.
@@ -505,11 +1133,12 @@
         assertAliases(new String[] {});
 
         assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
+                null));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
@@ -533,11 +1162,12 @@
         assertAliases(new String[] {});
 
         assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
+                null));
 
         assertTrue("Should contain generated private key", mKeyStore.containsAlias(TEST_ALIAS_1));
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
@@ -551,7 +1181,7 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
@@ -572,18 +1202,18 @@
 
         // TEST_ALIAS_1
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         // TEST_ALIAS_2
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         // TEST_ALIAS_3
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_3, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_3, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
@@ -617,10 +1247,10 @@
 
         // TEST_ALIAS_1
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         // Should not throw when a non-existent entry is requested for delete.
@@ -632,7 +1262,7 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
@@ -645,7 +1275,7 @@
         assertNotNull("Retrieved certificate should not be null", retrieved);
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertEquals("Actual and retrieved certificates should be the same", actual, retrieved);
     }
@@ -664,11 +1294,11 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
                 mKeyStore.getCertificateAlias(actual));
@@ -681,14 +1311,14 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
         assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
                 mKeyStore.getCertificateAlias(actual));
@@ -701,19 +1331,19 @@
         mKeyStore.load(null, null);
 
         // Insert TrustedCertificateEntry with CA name
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         // Insert PrivateKeyEntry that uses the same CA
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertEquals("Stored certificate alias should be found", TEST_ALIAS_2,
                 mKeyStore.getCertificateAlias(actual));
@@ -726,7 +1356,7 @@
         mKeyStore.load(null, null);
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertNull("Stored certificate alias should not be found",
                 mKeyStore.getCertificateAlias(actual));
@@ -737,11 +1367,11 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate userCert = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        Certificate userCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
         assertNull("Stored certificate alias should be found",
                 mKeyStore.getCertificateAlias(userCert));
@@ -753,16 +1383,16 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         CertificateFactory cf = CertificateFactory.getInstance("X.509");
         Certificate[] expected = new Certificate[2];
-        expected[0] = cf.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expected[1] = cf.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expected[0] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expected[1] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         Certificate[] actual = mKeyStore.getCertificateChain(TEST_ALIAS_1);
 
@@ -792,10 +1422,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         Date now = new Date();
@@ -812,10 +1442,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
 
         Date now = new Date();
@@ -833,7 +1463,7 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         Date now = new Date();
@@ -853,10 +1483,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
@@ -866,17 +1496,18 @@
 
         PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
 
-        assertPrivateKeyEntryEquals(keyEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                FAKE_RSA_CA_1);
     }
 
-    public void testKeyStore_GetEntry_NullParams_Unencrypted_Success() throws Exception {
+    public void testKeyStore_GetEntry_DSA_NullParams_Unencrypted_Success() throws Exception {
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
-                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+                FAKE_DSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
+                FAKE_DSA_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_DSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
 
         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
@@ -886,13 +1517,54 @@
 
         PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
 
-        assertPrivateKeyEntryEquals(keyEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(keyEntry, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1);
+    }
+
+    public void testKeyStore_GetEntry_EC_NullParams_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
+                FAKE_EC_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
+                FAKE_EC_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_EC_CA_1,
+                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+
+        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Entry should exist", entry);
+
+        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
+
+        assertPrivateKeyEntryEquals(keyEntry, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
+    }
+
+    public void testKeyStore_GetEntry_RSA_NullParams_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
+                FAKE_RSA_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
+                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+
+        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Entry should exist", entry);
+
+        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
+
+        assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                FAKE_RSA_CA_1);
     }
 
     @SuppressWarnings("unchecked")
-    private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, byte[] key, byte[] cert,
-            byte[] ca) throws Exception {
-        KeyFactory keyFact = KeyFactory.getInstance("RSA");
+    private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, String keyType, byte[] key,
+            byte[] cert, byte[] ca) throws Exception {
+        KeyFactory keyFact = KeyFactory.getInstance(keyType);
         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(key));
 
         CertificateFactory certFact = CertificateFactory.getInstance("X.509");
@@ -911,9 +1583,19 @@
 
     private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, PrivateKey expectedKey,
             Certificate expectedCert, Collection<Certificate> expectedChain) throws Exception {
-        assertEquals("Returned PrivateKey should be what we inserted",
-                ((RSAPrivateKey) expectedKey).getModulus(),
-                ((RSAPrivateKey) keyEntry.getPrivateKey()).getModulus());
+        if (expectedKey instanceof DSAPrivateKey) {
+            assertEquals("Returned PrivateKey should be what we inserted",
+                    ((DSAPrivateKey) expectedKey).getParams(),
+                    ((DSAPublicKey) keyEntry.getCertificate().getPublicKey()).getParams());
+        } else if (expectedKey instanceof ECPrivateKey) {
+            assertEquals("Returned PrivateKey should be what we inserted",
+                    ((ECPrivateKey) expectedKey).getParams().getCurve(),
+                    ((ECPublicKey) keyEntry.getCertificate().getPublicKey()).getParams().getCurve());
+        } else if (expectedKey instanceof RSAPrivateKey) {
+            assertEquals("Returned PrivateKey should be what we inserted",
+                    ((RSAPrivateKey) expectedKey).getModulus(),
+                    ((RSAPrivateKey) keyEntry.getPrivateKey()).getModulus());
+        }
 
         assertEquals("Returned Certificate should be what we inserted", expectedCert,
                 keyEntry.getCertificate());
@@ -956,10 +1638,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
@@ -970,7 +1652,7 @@
         RSAPrivateKey actualKey = (RSAPrivateKey) key;
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         assertEquals("Inserted key should be same as retrieved key",
                 ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
@@ -980,10 +1662,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
 
         Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
@@ -994,7 +1676,7 @@
         RSAPrivateKey actualKey = (RSAPrivateKey) key;
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         assertEquals("Inserted key should be same as retrieved key",
                 ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
@@ -1005,7 +1687,7 @@
 
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertNull("Certificate entries should return null", mKeyStore.getKey(TEST_ALIAS_1, null));
@@ -1035,7 +1717,7 @@
         setupPassword();
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertTrue("Should return true for CA certificate",
@@ -1047,10 +1729,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertFalse("Should return false for PrivateKeyEntry",
@@ -1077,10 +1759,10 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertTrue("Should return true for PrivateKeyEntry", mKeyStore.isKeyEntry(TEST_ALIAS_1));
@@ -1090,7 +1772,7 @@
         setupPassword();
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertFalse("Should return false for CA certificate", mKeyStore.isKeyEntry(TEST_ALIAS_1));
@@ -1106,7 +1788,7 @@
 
     public void testKeyStore_SetCertificate_CA_Encrypted_Success() throws Exception {
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
-        final Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         setupPassword();
         mKeyStore.load(null, null);
@@ -1124,13 +1806,13 @@
         setupPassword();
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
-        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // TODO have separate FAKE_CA for second test
         mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
@@ -1143,16 +1825,16 @@
         mKeyStore.load(null, null);
 
         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
-                FAKE_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_USER_1,
+                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
-        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         try {
             mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
@@ -1166,13 +1848,13 @@
         mKeyStore.load(null, null);
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
         final Certificate[] expectedChain = new Certificate[2];
-        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1186,20 +1868,74 @@
 
         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-        assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
     }
 
-    public void testKeyStore_SetEntry_PrivateKeyEntry_Unencrypted_Success() throws Exception {
+    public void testKeyStore_SetEntry_PrivateKeyEntry_DSA_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        KeyFactory keyFact = KeyFactory.getInstance("DSA");
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_DSA_KEY_1));
+
+        final CertificateFactory f = CertificateFactory.getInstance("X.509");
+
+        final Certificate[] expectedChain = new Certificate[2];
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_DSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_DSA_CA_1));
+
+        PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
+
+        mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
+
+        Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Retrieved entry should exist", actualEntry);
+
+        assertTrue("Retrieved entry should be of type PrivateKeyEntry",
+                actualEntry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
+
+        assertPrivateKeyEntryEquals(actual, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1);
+    }
+
+    public void testKeyStore_SetEntry_PrivateKeyEntry_EC_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        KeyFactory keyFact = KeyFactory.getInstance("EC");
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_EC_KEY_1));
+
+        final CertificateFactory f = CertificateFactory.getInstance("X.509");
+
+        final Certificate[] expectedChain = new Certificate[2];
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_CA_1));
+
+        PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
+
+        mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
+
+        Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Retrieved entry should exist", actualEntry);
+
+        assertTrue("Retrieved entry should be of type PrivateKeyEntry",
+                actualEntry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
+
+        assertPrivateKeyEntryEquals(actual, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
+    }
+
+    public void testKeyStore_SetEntry_PrivateKeyEntry_RSA_Unencrypted_Success() throws Exception {
         mKeyStore.load(null, null);
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
         final Certificate[] expectedChain = new Certificate[2];
-        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1213,20 +1949,20 @@
 
         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-        assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
     }
 
     public void testKeyStore_SetEntry_PrivateKeyEntry_Params_Unencrypted_Failure() throws Exception {
         mKeyStore.load(null, null);
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
         final Certificate[] expectedChain = new Certificate[2];
-        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         PrivateKeyEntry entry = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1253,11 +1989,11 @@
 
         // Start with PrivateKeyEntry
         {
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1271,17 +2007,18 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // TODO make entirely new test vector for the overwrite
         // Replace with PrivateKeyEntry
         {
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1295,7 +2032,8 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
     }
 
@@ -1308,7 +2046,7 @@
 
         // Start with TrustedCertificateEntry
         {
-            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
             mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
@@ -1326,10 +2064,10 @@
         // Replace with PrivateKeyEntry
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1341,7 +2079,8 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
     }
 
@@ -1352,14 +2091,14 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // Start with PrivateKeyEntry
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             expectedChain[1] = caCert;
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
@@ -1372,7 +2111,8 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // Replace with TrustedCertificateEntry
@@ -1400,14 +2140,14 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // Start with PrivateKeyEntry
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             expectedChain[1] = caCert;
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
@@ -1420,15 +2160,16 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // Replace with PrivateKeyEntry that has no chain
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[1];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1440,7 +2181,8 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, null);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    null);
         }
     }
 
@@ -1453,7 +2195,7 @@
 
         // Insert TrustedCertificateEntry
         {
-            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
             mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
@@ -1471,7 +2213,7 @@
         // Replace with TrustedCertificateEntry of USER
         {
             final Certificate userCert = f
-                    .generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+                    .generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
             TrustedCertificateEntry expectedUserEntry = new TrustedCertificateEntry(userCert);
             mKeyStore.setEntry(TEST_ALIAS_1, expectedUserEntry, null);
@@ -1493,12 +2235,12 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
         final Certificate[] chain = new Certificate[2];
-        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
         chain[1] = caCert;
 
         try {
@@ -1514,12 +2256,12 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
         final Certificate[] chain = new Certificate[2];
-        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
         chain[1] = caCert;
 
         mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
@@ -1532,7 +2274,7 @@
 
         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-        assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
     }
 
     public void testKeyStore_SetKeyEntry_Replaced_Encrypted_Success() throws Exception {
@@ -1541,14 +2283,14 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // Insert initial key
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] chain = new Certificate[2];
-            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             chain[1] = caCert;
 
             mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
@@ -1561,16 +2303,17 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // TODO make a separate key
         // Replace key
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] chain = new Certificate[2];
-            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             chain[1] = caCert;
 
             mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
@@ -1583,7 +2326,8 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
     }
 
@@ -1635,7 +2379,7 @@
         {
             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
             assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
-                    KeyStore.FLAG_ENCRYPTED));
+                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
 
             Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
 
@@ -1691,7 +2435,7 @@
         {
             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
             assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
-                    KeyStore.FLAG_ENCRYPTED));
+                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
 
             X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
                     TEST_SERIAL_1, TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
@@ -1704,7 +2448,7 @@
         {
             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_2;
             assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
-                    KeyStore.FLAG_ENCRYPTED));
+                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
 
             X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_2,
                     TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
@@ -1736,7 +2480,8 @@
         {
             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
             assertTrue(mAndroidKeyStore.generate(privateKeyAlias,
-                    android.security.KeyStore.UID_SELF, android.security.KeyStore.FLAG_NONE));
+                    android.security.KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024,
+                    android.security.KeyStore.FLAG_NONE, null));
 
             X509Certificate cert =
                     generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1, TEST_DN_1,
@@ -1774,20 +2519,21 @@
         setupPassword();
         mKeyStore.load(null, null);
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertEquals("The keystore size should match expected", 1, mKeyStore.size());
         assertAliases(new String[] { TEST_ALIAS_1 });
 
-        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_CA_1,
+        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
 
         assertEquals("The keystore size should match expected", 2, mKeyStore.size());
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
 
         assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_3,
-                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
+                null));
 
         assertEquals("The keystore size should match expected", 3, mKeyStore.size());
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
@@ -1854,7 +2600,8 @@
     private void setupKey() throws Exception {
         final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
         assertTrue(mAndroidKeyStore
-                .generate(privateKeyAlias, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                .generate(privateKeyAlias, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024,
+                        KeyStore.FLAG_ENCRYPTED, null));
 
         X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1,
                 TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
diff --git a/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java b/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
index 113d730..bc8dd13 100644
--- a/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
+++ b/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
@@ -40,13 +40,17 @@
 
     public void testConstructor_Success() throws Exception {
         KeyPairGeneratorSpec spec =
-                new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
-                        NOW, NOW_PLUS_10_YEARS, 0);
+                new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1,
+                        SERIAL_1, NOW, NOW_PLUS_10_YEARS, 0);
 
         assertEquals("Context should be the one specified", getContext(), spec.getContext());
 
         assertEquals("Alias should be the one specified", TEST_ALIAS_1, spec.getKeystoreAlias());
 
+        assertEquals("Key algorithm should be the one specified", "RSA", spec.getKeyType());
+
+        assertEquals("Key size should be the one specified", 1024, spec.getKeySize());
+
         assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
 
         assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
@@ -57,6 +61,8 @@
     public void testBuilder_Success() throws Exception {
         KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getContext())
                 .setAlias(TEST_ALIAS_1)
+                .setKeyType("RSA")
+                .setKeySize(1024)
                 .setSubject(TEST_DN_1)
                 .setSerialNumber(SERIAL_1)
                 .setStartDate(NOW)
@@ -68,6 +74,10 @@
 
         assertEquals("Alias should be the one specified", TEST_ALIAS_1, spec.getKeystoreAlias());
 
+        assertEquals("Key algorithm should be the one specified", "RSA", spec.getKeyType());
+
+        assertEquals("Key size should be the one specified", 1024, spec.getKeySize());
+
         assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
 
         assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
@@ -79,7 +89,7 @@
 
     public void testConstructor_NullContext_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(null, TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
+            new KeyPairGeneratorSpec(null, TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1, NOW,
                     NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when context is null");
         } catch (IllegalArgumentException success) {
@@ -88,7 +98,7 @@
 
     public void testConstructor_NullKeystoreAlias_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), null, TEST_DN_1, SERIAL_1, NOW,
+            new KeyPairGeneratorSpec(getContext(), null, "RSA", 1024, null, TEST_DN_1, SERIAL_1, NOW,
                     NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when keystoreAlias is null");
         } catch (IllegalArgumentException success) {
@@ -97,7 +107,7 @@
 
     public void testConstructor_NullSubjectDN_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, null, SERIAL_1, NOW,
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, null, SERIAL_1, NOW,
                     NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when subjectDN is null");
         } catch (IllegalArgumentException success) {
@@ -106,7 +116,7 @@
 
     public void testConstructor_NullSerial_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, null, NOW,
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, null, NOW,
                     NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when startDate is null");
         } catch (IllegalArgumentException success) {
@@ -115,8 +125,8 @@
 
     public void testConstructor_NullStartDate_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, null,
-                    NOW_PLUS_10_YEARS, 0);
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
+                    null, NOW_PLUS_10_YEARS, 0);
             fail("Should throw IllegalArgumentException when startDate is null");
         } catch (IllegalArgumentException success) {
         }
@@ -124,8 +134,8 @@
 
     public void testConstructor_NullEndDate_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
-                    null, 0);
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
+                    NOW, null, 0);
             fail("Should throw IllegalArgumentException when keystoreAlias is null");
         } catch (IllegalArgumentException success) {
         }
@@ -133,7 +143,7 @@
 
     public void testConstructor_EndBeforeStart_Failure() throws Exception {
         try {
-            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
+            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
                     NOW_PLUS_10_YEARS, NOW, 0);
             fail("Should throw IllegalArgumentException when end is before start");
         } catch (IllegalArgumentException success) {
diff --git a/keystore/tests/src/android/security/KeyStoreTest.java b/keystore/tests/src/android/security/KeyStoreTest.java
index 9bf88d3..7a142cc 100644
--- a/keystore/tests/src/android/security/KeyStoreTest.java
+++ b/keystore/tests/src/android/security/KeyStoreTest.java
@@ -22,6 +22,7 @@
 import android.test.ActivityUnitTestCase;
 import android.test.AssertionFailedError;
 import android.test.suitebuilder.annotation.MediumTest;
+import com.android.org.conscrypt.NativeCrypto;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Date;
@@ -347,21 +348,24 @@
 
     public void testGenerate_NotInitialized_Fail() throws Exception {
         assertFalse("Should fail when keystore is not initialized",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
     }
 
     public void testGenerate_Locked_Fail() throws Exception {
         mKeyStore.password(TEST_PASSWD);
         mKeyStore.lock();
         assertFalse("Should fail when keystore is locked",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
     }
 
     public void testGenerate_Success() throws Exception {
         assertTrue(mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key when unlocked",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
     }
@@ -370,7 +374,8 @@
         assertTrue(mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key when unlocked",
-                mKeyStore.generate(TEST_KEYNAME, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, Process.WIFI_UID, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
         assertTrue(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
         assertFalse(mKeyStore.contains(TEST_KEYNAME));
     }
@@ -378,7 +383,8 @@
     public void testGenerate_ungrantedUid_Bluetooth_Failure() throws Exception {
         assertTrue(mKeyStore.password(TEST_PASSWD));
 
-        assertFalse(mKeyStore.generate(TEST_KEYNAME, Process.BLUETOOTH_UID, KeyStore.FLAG_ENCRYPTED));
+        assertFalse(mKeyStore.generate(TEST_KEYNAME, Process.BLUETOOTH_UID,
+                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
         assertFalse(mKeyStore.contains(TEST_KEYNAME));
@@ -424,7 +430,8 @@
     public void testSign_Success() throws Exception {
         mKeyStore.password(TEST_PASSWD);
 
-        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                    1024, KeyStore.FLAG_ENCRYPTED, null));
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         final byte[] signature = mKeyStore.sign(TEST_KEYNAME, TEST_DATA);
 
@@ -434,7 +441,8 @@
     public void testVerify_Success() throws Exception {
         mKeyStore.password(TEST_PASSWD);
 
-        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                    1024, KeyStore.FLAG_ENCRYPTED, null));
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         final byte[] signature = mKeyStore.sign(TEST_KEYNAME, TEST_DATA);
 
@@ -461,7 +469,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue("Should be able to grant key to other user",
                 mKeyStore.grant(TEST_KEYNAME, 0));
@@ -494,7 +503,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue("Should be able to grant key to other user",
                 mKeyStore.grant(TEST_KEYNAME, 0));
@@ -527,7 +537,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertFalse("Should not be able to revoke not existent grant",
                 mKeyStore.ungrant(TEST_KEYNAME, 0));
@@ -538,7 +549,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue("Should be able to grant key to other user",
                 mKeyStore.grant(TEST_KEYNAME, 0));
@@ -555,7 +567,8 @@
                 mKeyStore.password(TEST_PASSWD));
 
         assertTrue("Should be able to generate key for testcase",
-                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+                mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                        1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue("Should be able to grant key to other user",
                 mKeyStore.grant(TEST_KEYNAME, 0));
@@ -575,7 +588,8 @@
 
         assertFalse(mKeyStore.contains(TEST_KEYNAME));
 
-        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                    1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
@@ -613,7 +627,8 @@
 
         assertFalse(mKeyStore.contains(TEST_KEYNAME));
 
-        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
+        assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA,
+                    1024, KeyStore.FLAG_ENCRYPTED, null));
 
         assertTrue(mKeyStore.contains(TEST_KEYNAME));
         assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index e5f1cf5..14b812e 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -152,12 +152,24 @@
 
     /**
      * Broadcast intent action when the configured location providers
-     * change.
+     * change. If you're interacting with the
+     * {@link android.provider.Settings.Secure#LOCATION_MODE} API,
+     * use {@link #MODE_CHANGED_ACTION} instead.
      */
     public static final String PROVIDERS_CHANGED_ACTION =
         "android.location.PROVIDERS_CHANGED";
 
     /**
+     * Broadcast intent action when {@link android.provider.Settings.Secure#LOCATION_MODE} changes.
+     * If you're interacting with provider-based APIs such as {@link #getProviders(boolean)}, you
+     * use {@link #PROVIDERS_CHANGED_ACTION} instead.
+     *
+     * In the future, there may be mode changes that do not result in
+     * {@link #PROVIDERS_CHANGED_ACTION} broadcasts.
+     */
+    public static final String MODE_CHANGED_ACTION = "android.location.MODE_CHANGED";
+
+    /**
      * Broadcast intent action indicating that the GPS has either started or
      * stopped receiving GPS fixes. An intent extra provides this state as a
      * boolean, where {@code true} means that the GPS is actively receiving fixes.
diff --git a/location/java/android/location/SettingInjectorService.java b/location/java/android/location/SettingInjectorService.java
index 0b0f05d..8181f4e 100644
--- a/location/java/android/location/SettingInjectorService.java
+++ b/location/java/android/location/SettingInjectorService.java
@@ -22,12 +22,11 @@
 import android.os.Message;
 import android.os.Messenger;
 import android.os.RemoteException;
-import android.preference.Preference;
 import android.util.Log;
 
 /**
- * Dynamically specifies the summary (subtile) and enabled status of a preference injected into
- * the "Settings &gt; Location &gt; Location services" list.
+ * Dynamically specifies the summary (subtitle) and enabled status of a preference injected into
+ * the list of location services displayed by the system settings app.
  *
  * The location services list is intended for use only by preferences that affect multiple apps from
  * the same developer. Location settings that apply only to one app should be shown within that app,
@@ -39,52 +38,47 @@
  * <pre>
  *     &lt;service android:name="com.example.android.injector.MyInjectorService" &gt;
  *         &lt;intent-filter&gt;
- *             &lt;action android:name="com.android.settings.InjectedLocationSetting" /&gt;
+ *             &lt;action android:name="android.location.SettingInjectorService" /&gt;
  *         &lt;/intent-filter&gt;
  *
  *         &lt;meta-data
- *             android:name="com.android.settings.InjectedLocationSetting"
+ *             android:name="android.location.SettingInjectorService"
  *             android:resource="@xml/my_injected_location_setting" /&gt;
  *     &lt;/service&gt;
  * </pre>
  * The resource file specifies the static data for the setting:
  * <pre>
  *     &lt;injected-location-setting xmlns:android="http://schemas.android.com/apk/res/android"
- *         android:label="@string/injected_setting_label"
- *         android:icon="@drawable/ic_launcher"
+ *         android:title="@string/injected_setting_title"
+ *         android:icon="@drawable/ic_acme_corp"
  *         android:settingsActivity="com.example.android.injector.MySettingActivity"
  *     /&gt;
  * </pre>
  * Here:
  * <ul>
- *     <li>label: The {@link Preference#getTitle()} value. The title should make it clear which apps
- *     are affected by the setting, typically by including the name of the developer. For example,
- *     "Acme Corp. ads preferences." </li>
+ *     <li>title: The {@link android.preference.Preference#getTitle()} value. The title should make
+ *     it clear which apps are affected by the setting, typically by including the name of the
+ *     developer. For example, "Acme Corp. ads preferences." </li>
  *
- *     <li>icon: The {@link Preference#getIcon()} value. Typically this will be a generic icon for
- *     the developer rather than the icon for an individual app.</li>
+ *     <li>icon: The {@link android.preference.Preference#getIcon()} value. Typically this will be a
+ *     generic icon for the developer rather than the icon for an individual app.</li>
  *
  *     <li>settingsActivity: the activity which is launched to allow the user to modify the setting
- *     value  The activity must be in the same package as the subclass of
+ *     value.  The activity must be in the same package as the subclass of
  *     {@link SettingInjectorService}. The activity should use your own branding to help emphasize
  *     to the user that it is not part of the system settings.</li>
  * </ul>
  *
- * To ensure a good user experience, your {@link #onHandleIntent(Intent)} must complete within
- * 200 msec even if your app is not already running. This means that both
- * {@link android.app.Application#onCreate()} and {@link #getStatus()} must be fast. If you exceed
- * this time, then this can delay the retrieval of settings status for other apps as well.
- *
- * For consistency, the label and {@link #getStatus()} values should be provided in all of the
- * locales supported by the system settings app. The text should not contain offensive language.
+ * To ensure a good user experience, the average time from the start of
+ * {@link #startService(Intent)} to the end of {@link #onHandleIntent(Intent)} should be less
+ * than 300 msec even if your app is not already in memory. This means that both your
+ * {@link android.app.Application#onCreate()} and your {@link #getStatus()} must be fast. If
+ * either is slow, it can delay the display of settings values for other apps as well.
  *
  * For compactness, only one copy of a given setting should be injected. If each account has a
  * distinct value for the setting, then the {@link #getStatus()} value should represent a summary of
  * the state across all of the accounts and {@code settingsActivity} should display the value for
  * each account.
- *
- * Apps that violate these guidelines will be taken down from the Google Play Store and/or flagged
- * as malware.
  */
 // TODO: is there a public list of supported locales?
 // TODO: is there a public list of guidelines for settings text?
@@ -94,6 +88,30 @@
     private static final String TAG = "SettingInjectorService";
 
     /**
+     * Intent action that must be declared in the manifest for the subclass. Used to start the
+     * service to read the dynamic status for the setting.
+     */
+    public static final String ACTION_SERVICE_INTENT = "android.location.SettingInjectorService";
+
+    /**
+     * Name of the meta-data tag used to specify the resource file that includes the settings
+     * attributes.
+     */
+    public static final String META_DATA_NAME = "android.location.SettingInjectorService";
+
+    /**
+     * Name of the XML tag that includes the attributes for the setting.
+     */
+    public static final String ATTRIBUTES_NAME = "injected-location-setting";
+
+    /**
+     * Intent action a client should broadcast when the value of one of its injected settings has
+     * changed, so that the setting can be updated in the UI.
+     */
+    public static final String ACTION_INJECTED_SETTING_CHANGED =
+            "android.location.InjectedSettingChanged";
+
+    /**
      * Name of the bundle key for the string specifying the summary for the setting (e.g., "ON" or
      * "OFF").
      *
@@ -115,13 +133,6 @@
      */
     public static final String MESSENGER_KEY = "messenger";
 
-    /**
-     * Intent action a client should broadcast when the value of one of its injected settings has
-     * changed, so that the setting can be updated in the UI.
-     */
-    public static final String ACTION_INJECTED_SETTING_CHANGED =
-            "com.android.location.InjectedSettingChanged";
-
     private final String mName;
 
     /**
@@ -169,7 +180,10 @@
     }
 
     /**
-     * Reads the status of the setting.
+     * Reads the status of the setting. Should not perform unpredictably-long operations such as
+     * network access--see the running-time comments in the class-level javadoc.
+     *
+     * @return the status of the setting value
      */
     protected abstract Status getStatus();
 
@@ -179,12 +193,16 @@
     public static final class Status {
 
         /**
-         * The {@link Preference#getSummary()} value
+         * The {@link android.preference.Preference#getSummary()} value.
+         *
+         * @hide
          */
         public final String summary;
 
         /**
-         * The {@link Preference#isEnabled()} value
+         * The {@link android.preference.Preference#isEnabled()} value.
+         *
+         * @hide
          */
         public final boolean enabled;
 
@@ -193,9 +211,8 @@
          * <p/>
          * Note that to prevent churn in the settings list, there is no support for dynamically
          * choosing to hide a setting. Instead you should provide a {@code enabled} value of false,
-         * which will gray the setting out and disable the link from "Settings > Location"
-         * to your setting activity. One reason why you might choose to do this is if
-         * {@link android.provider.Settings.Secure#LOCATION_MODE}
+         * which will disable the setting and its link to your setting activity. One reason why you
+         * might choose to do this is if {@link android.provider.Settings.Secure#LOCATION_MODE}
          * is {@link android.provider.Settings.Secure#LOCATION_MODE_OFF}.
          *
          * It is possible that the user may click on the setting before you return a false value for
@@ -203,8 +220,9 @@
          * though the setting is disabled. The simplest approach may be to simply call
          * {@link android.app.Activity#finish()} when disabled.
          *
-         * @param summary the {@link Preference#getSummary()} value (allowed to be null or empty)
-         * @param enabled the {@link Preference#isEnabled()} value
+         * @param summary the {@link android.preference.Preference#getSummary()} value (allowed to
+         *                be null or empty)
+         * @param enabled the {@link android.preference.Preference#isEnabled()} value
          */
         public Status(String summary, boolean enabled) {
             this.summary = summary;
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 946dd71..1b9bdaf 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -2382,6 +2382,16 @@
      */
     public static final int MEDIA_INFO_TIMED_TEXT_ERROR = 900;
 
+    /** Subtitle track was not supported by the media framework.
+     * @see android.media.MediaPlayer.OnInfoListener
+     */
+    public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901;
+
+    /** Reading the subtitle track takes too long.
+     * @see android.media.MediaPlayer.OnInfoListener
+     */
+    public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;
+
     /**
      * Interface definition of a callback to be invoked to communicate some
      * info and/or warning about the media or its playback.
@@ -2402,6 +2412,8 @@
          * <li>{@link #MEDIA_INFO_BAD_INTERLEAVING}
          * <li>{@link #MEDIA_INFO_NOT_SEEKABLE}
          * <li>{@link #MEDIA_INFO_METADATA_UPDATE}
+         * <li>{@link #MEDIA_INFO_UNSUPPORTED_SUBTITLE}
+         * <li>{@link #MEDIA_INFO_SUBTITLE_TIMED_OUT}
          * </ul>
          * @param extra an extra code, specific to the info. Typically
          * implementation dependent.
diff --git a/media/java/android/media/MediaScannerConnection.java b/media/java/android/media/MediaScannerConnection.java
index 21b6e14..273eb64 100644
--- a/media/java/android/media/MediaScannerConnection.java
+++ b/media/java/android/media/MediaScannerConnection.java
@@ -113,6 +113,9 @@
         synchronized (this) {
             if (!mConnected) {
                 Intent intent = new Intent(IMediaScannerService.class.getName());
+                intent.setComponent(
+                        new ComponentName("com.android.providers.media",
+                                "com.android.providers.media.MediaScannerService"));
                 mContext.bindService(intent, this, Context.BIND_AUTO_CREATE);
                 mConnected = true;
             }
diff --git a/media/java/android/media/MediaTimeProvider.java b/media/java/android/media/MediaTimeProvider.java
new file mode 100644
index 0000000..fe37712
--- /dev/null
+++ b/media/java/android/media/MediaTimeProvider.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package android.media;
+
+/** @hide */
+public interface MediaTimeProvider {
+    // we do not allow negative media time
+    /**
+     * Presentation time value if no timed event notification is requested.
+     */
+    public final static long NO_TIME = -1;
+
+    /**
+     * Cancels all previous notification request from this listener if any.  It
+     * registers the listener to get seek and stop notifications.  If timeUs is
+     * not negative, it also registers the listener for a timed event
+     * notification when the presentation time reaches (becomes greater) than
+     * the value specified.  This happens immediately if the current media time
+     * is larger than or equal to timeUs.
+     *
+     * @param timeUs presentation time to get timed event callback at (or
+     *               {@link #NO_TIME})
+     */
+    public void notifyAt(long timeUs, OnMediaTimeListener listener);
+
+    /**
+     * Cancels all previous notification request from this listener if any.  It
+     * registers the listener to get seek and stop notifications.  If the media
+     * is stopped, the listener will immediately receive a stop notification.
+     * Otherwise, it will receive a timed event notificaton.
+     */
+    public void scheduleUpdate(OnMediaTimeListener listener);
+
+    /**
+     * Cancels all previous notification request from this listener if any.
+     */
+    public void cancelNotifications(OnMediaTimeListener listener);
+
+    /**
+     * Get the current presentation time.
+     *
+     * @param precise   Whether getting a precise time is important. This is
+     *                  more costly.
+     * @param monotonic Whether returned time should be monotonic: that is,
+     *                  greater than or equal to the last returned time.  Don't
+     *                  always set this to true.  E.g. this has undesired
+     *                  consequences if the media is seeked between calls.
+     * @throws IllegalStateException if the media is not initialized
+     */
+    public long getCurrentTimeUs(boolean precise, boolean monotonic)
+            throws IllegalStateException;
+
+    /** @hide */
+    public static interface OnMediaTimeListener {
+        /**
+         * Called when the registered time was reached naturally.
+         *
+         * @param timeUs current media time
+         */
+        void onTimedEvent(long timeUs);
+
+        /**
+         * Called when the media time changed due to seeking.
+         *
+         * @param timeUs current media time
+         */
+        void onSeek(long timeUs);
+
+        /**
+         * Called when the playback stopped.  This is not called on pause, only
+         * on full stop, at which point there is no further current media time.
+         */
+        void onStop();
+    }
+}
+
diff --git a/media/java/android/media/RemoteControlClient.java b/media/java/android/media/RemoteControlClient.java
index 4dcac31..58f5d55 100644
--- a/media/java/android/media/RemoteControlClient.java
+++ b/media/java/android/media/RemoteControlClient.java
@@ -294,14 +294,13 @@
      */
     public final static int FLAG_KEY_MEDIA_POSITION_UPDATE = 1 << 8;
     /**
-     * @hide
-     * CANDIDATE FOR PUBLIC API
      * Flag indicating a RemoteControlClient supports ratings.
      * This flag must be set in order for components that display the RemoteControlClient
      * information, to display ratings information, and, if ratings are declared editable
      * (by calling {@link MetadataEditor#addEditableKey(int)} with the
      * {@link MetadataEditor#LONG_KEY_RATING_BY_USER} key), it will enable the user to rate
-     * the media.
+     * the media, with values being received through the interface set with
+     * {@link #setMetadataUpdateListener(OnMetadataUpdateListener)}.
      * @see #setTransportControlFlags(int)
      */
     public final static int FLAG_KEY_MEDIA_RATING = 1 << 9;
@@ -452,8 +451,6 @@
          */
         public final static int BITMAP_KEY_ARTWORK = 100;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * The metadata key qualifying the content rating.
          * The value associated with this key may be: {@link #RATING_HEART},
          * {@link #RATING_THUMB_UP_DOWN}, or a non-null positive integer expressing a maximum
@@ -461,8 +458,6 @@
          */
         public final static int LONG_KEY_RATING_TYPE = 101;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * The metadata key for the content's average rating, not the user's rating.
          * The value associated with this key may be: an integer value between 0 and 100,
          * or {@link #RATING_NOT_RATED} to express that no average rating is available.
@@ -472,11 +467,12 @@
          * <p></p>
          * When the rating type is:
          * <ul>
-         * <li>{@link #RATING_HEART}, a rating of 50 to 100 means "heart selected",</li>
-         * <li>{@link #RATING_THUMB_UP_DOWN}, a rating of 0 to 49 means "thumb down", 50 means
-         *     both "thumb up" and "thumb down" selected, 51 to 100 means "thumb up"</li>
+         * <li>{@link #RATING_HEART}, a rating of 51 to 100 means "heart selected",</li>
+         * <li>{@link #RATING_THUMB_UP_DOWN}, a rating of 0 to 50 means "thumb down",
+         *     51 to 100 means "thumb up"</li>
          * <li>a non-null positive integer, the rating value is mapped to the number of stars, e.g.
-         *     with a maximum of 5 stars, a rating of 21 to 40 maps to 2 stars.</li>
+         *     with a maximum of 5 stars, a rating of 0 maps to 0 stars, 1 to 20 maps to 1 star,
+         *     21 to 40 maps to 2 stars, etc.</li>
          * </ul>
          * @see #LONG_KEY_RATING_BY_USER
          */
@@ -489,34 +485,29 @@
          */
         public final static int KEY_EDITABLE_MASK = 0x1FFFFFFF;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
-         * The metadata key for the content's rating by the user.
+         * The metadata key for the content's user rating.
          * The value associated with this key may be: an integer value between 0 and 100,
          * or {@link #RATING_NOT_RATED} to express that the user hasn't rated this content.
          * Rules for the interpretation of the rating value according to the rating style are
-         * the same as for {@link #LONG_KEY_RATING_BY_OTHERS}
+         * the same as for {@link #LONG_KEY_RATING_BY_OTHERS}.
+         * This key can be flagged as "editable" (with {@link #addEditableKey(int)}) to enable
+         * receiving user rating values through the
+         * {@link android.media.RemoteControlClient.OnMetadataUpdateListener} interface.
          */
         public final static int LONG_KEY_RATING_BY_USER = 0x10000001;
 
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * A rating style with a single degree of rating, "heart" vs "no heart". Can be used to
          * indicate the content referred to is a favorite (or not).
          * @see #LONG_KEY_RATING_TYPE
          */
         public final static long RATING_HEART = -1;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * A rating style for "thumb up" vs "thumb down".
          * @see #LONG_KEY_RATING_TYPE
          */
         public final static long RATING_THUMB_UP_DOWN = -2;
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
          * A rating value indicating no rating is available.
          * @see #LONG_KEY_RATING_BY_OTHERS
          * @see #LONG_KEY_RATING_BY_USER
@@ -573,7 +564,9 @@
          *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_DISC_NUMBER},
          *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_DURATION} (with a value
          *      expressed in milliseconds),
-         *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_YEAR}.
+         *      {@link android.media.MediaMetadataRetriever#METADATA_KEY_YEAR},
+         *      {@link #LONG_KEY_RATING_BY_OTHERS}, {@link #LONG_KEY_RATING_BY_USER},
+         *      {@link #LONG_KEY_RATING_TYPE}.
          * @param value The long value for the given key
          * @return Returns a reference to the same MetadataEditor object, so you can chain put
          *      calls together.
@@ -620,8 +613,9 @@
         /**
          * Clears all the metadata that has been set since the MetadataEditor instance was
          *     created with {@link RemoteControlClient#editMetadata(boolean)}.
+         * Note that clearing the metadata doesn't reset the editable keys
+         * (use {@link #clearEditableKeys()} instead).
          */
-        // TODO add in javadoc that this doesn't call clearEditableKeys()
         public synchronized void clear() {
             if (mApplied) {
                 Log.e(TAG, "Can't clear a previously applied MetadataEditor");
@@ -632,8 +626,11 @@
         }
 
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
+         * Flag the given key as being editable.
+         * This will declare the metadata field as eligible to be updated, with new values
+         * received through the {@link RemoteControlClient.OnMetadataUpdateListener} interface.
+         * @param key the type of metadata that can be edited. The supported key is
+         *     {@link #LONG_KEY_RATING_BY_USER}.
          */
         public synchronized void addEditableKey(int key) {
             if (mApplied) {
@@ -651,8 +648,7 @@
         }
 
         /**
-         * @hide
-         * CANDIDATE FOR PUBLIC API
+         * Causes all metadata fields to be read-only.
          */
         public synchronized void clearEditableKeys() {
             if (mApplied) {
@@ -869,7 +865,8 @@
      *      {@link #FLAG_KEY_MEDIA_STOP},
      *      {@link #FLAG_KEY_MEDIA_FAST_FORWARD},
      *      {@link #FLAG_KEY_MEDIA_NEXT},
-     *      {@link #FLAG_KEY_MEDIA_POSITION_UPDATE}
+     *      {@link #FLAG_KEY_MEDIA_POSITION_UPDATE},
+     *      {@link #FLAG_KEY_MEDIA_RATING}.
      */
     public void setTransportControlFlags(int transportControlFlags) {
         synchronized(mCacheLock) {
@@ -882,36 +879,39 @@
     }
 
     /**
-     * @hide
-     * CANDIDATE FOR PUBLIC API
-     * TODO ADD DESCRIPTION
+     * Interface definition for a callback to be invoked when one of the metadata values has
+     * been updated.
      */
     public interface OnMetadataUpdateListener  {
         /**
-         * TODO ADD DESCRIPTION
-         * @param key
-         * @param newValue
+         * Called on the implementer to notify that the metadata field for the given key has
+         * been updated to the new value of type <code>long</long>.
+         * @param key the identifier of the updated metadata field of type <code>long</long>.
+         * @param newValue the new <code>long</long> value for the key
          */
         void onMetadataUpdateLong(int key, long newValue);
         /**
-         * TODO ADD DESCRIPTION
-         * @param key
-         * @param newValue
+         * Called on the implementer to notify that the metadata field for the given key has
+         * been updated to the new <code>String</long>.
+         * @param key the identifier of the updated metadata field of type <code>String</long>.
+         * @param newValue the new <code>String</long> value for the key
          */
         void onMetadataUpdateString(int key, String newValue);
         /**
-         * TODO ADD DESCRIPTION
-         * @param key
-         * @param newValue
+         * Called on the implementer to notify that the metadata field for the given key has
+         * been updated to the new {@link android.graphics.Bitmap}.
+         * @param key the identifier of the updated metadata field of type
+         *     {@link android.graphics.Bitmap}.
+         * @param newValue the new {@link android.graphics.Bitmap} for the key
          */
         void onMetadataUpdateBitmap(int key, Bitmap newValue);
     }
 
     /**
-     * @hide
-     * CANDIDATE FOR PUBLIC API
-     * TODO ADD DESCRIPTION
-     * @param l
+     * Sets the listener to be called whenever the metadata is updated.
+     * New metadata values will be received in the same thread as the one in which
+     * RemoteControlClient was created.
+     * @param l the metadata update listener
      */
     public void setMetadataUpdateListener(OnMetadataUpdateListener l) {
         synchronized(mCacheLock) {
diff --git a/media/java/android/media/SubtitleController.java b/media/java/android/media/SubtitleController.java
new file mode 100644
index 0000000..2cf1b2d
--- /dev/null
+++ b/media/java/android/media/SubtitleController.java
@@ -0,0 +1,312 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package android.media;
+
+import java.util.Locale;
+import java.util.Vector;
+
+import android.content.Context;
+import android.media.MediaPlayer.OnSubtitleDataListener;
+import android.view.View;
+import android.view.accessibility.CaptioningManager;
+
+/**
+ * The subtitle controller provides the architecture to display subtitles for a
+ * media source.  It allows specifying which tracks to display, on which anchor
+ * to display them, and also allows adding external, out-of-band subtitle tracks.
+ *
+ * @hide
+ */
+public class SubtitleController {
+    private Context mContext;
+    private MediaTimeProvider mTimeProvider;
+    private Vector<Renderer> mRenderers;
+    private Vector<SubtitleTrack> mTracks;
+    private SubtitleTrack mSelectedTrack;
+    private boolean mShowing;
+    private CaptioningManager mCaptioningManager;
+
+    /**
+     * Creates a subtitle controller for a media playback object that implements
+     * the MediaTimeProvider interface.
+     *
+     * @param timeProvider
+     */
+    public SubtitleController(
+            Context context,
+            MediaTimeProvider timeProvider,
+            Listener listener) {
+        mContext = context;
+        mTimeProvider = timeProvider;
+        mListener = listener;
+
+        mRenderers = new Vector<Renderer>();
+        mShowing = false;
+        mTracks = new Vector<SubtitleTrack>();
+        mCaptioningManager =
+            (CaptioningManager)context.getSystemService(Context.CAPTIONING_SERVICE);
+    }
+
+    /**
+     * @return the available subtitle tracks for this media. These include
+     * the tracks found by {@link MediaPlayer} as well as any tracks added
+     * manually via {@link #addTrack}.
+     */
+    public SubtitleTrack[] getTracks() {
+        SubtitleTrack[] tracks = new SubtitleTrack[mTracks.size()];
+        mTracks.toArray(tracks);
+        return tracks;
+    }
+
+    /**
+     * @return the currently selected subtitle track
+     */
+    public SubtitleTrack getSelectedTrack() {
+        return mSelectedTrack;
+    }
+
+    private View getSubtitleView() {
+        if (mSelectedTrack == null) {
+            return null;
+        }
+        return mSelectedTrack.getView();
+    }
+
+    /**
+     * Selects a subtitle track.  As a result, this track will receive
+     * in-band data from the {@link MediaPlayer}.  However, this does
+     * not change the subtitle visibility.
+     *
+     * @param track The subtitle track to select.  This must be one of the
+     *              tracks in {@link #getTracks}.
+     * @return true if the track was successfully selected.
+     */
+    public boolean selectTrack(SubtitleTrack track) {
+        if (track != null && !mTracks.contains(track)) {
+            return false;
+        }
+        mTrackIsExplicit = true;
+        if (mSelectedTrack == track) {
+            return true;
+        }
+
+        if (mSelectedTrack != null) {
+            mSelectedTrack.hide();
+            mSelectedTrack.setTimeProvider(null);
+        }
+
+        mSelectedTrack = track;
+        mAnchor.setSubtitleView(getSubtitleView());
+
+        if (mSelectedTrack != null) {
+            mSelectedTrack.setTimeProvider(mTimeProvider);
+            mSelectedTrack.show();
+        }
+
+        if (mListener != null) {
+            mListener.onSubtitleTrackSelected(track);
+        }
+        return true;
+    }
+
+    /**
+     * @return the default subtitle track based on system preferences, or null,
+     * if no such track exists in this manager.
+     */
+    public SubtitleTrack getDefaultTrack() {
+        Locale locale = mCaptioningManager.getLocale();
+
+        for (SubtitleTrack track: mTracks) {
+            MediaFormat format = track.getFormat();
+            String language = format.getString(MediaFormat.KEY_LANGUAGE);
+            // TODO: select track with best renderer.  For now, we select first
+            // track with local's language or first track if locale has none
+            if (locale == null ||
+                locale.getLanguage().equals("") ||
+                locale.getISO3Language().equals(language) ||
+                locale.getLanguage().equals(language)) {
+                return track;
+            }
+        }
+        return null;
+    }
+
+    private boolean mTrackIsExplicit = false;
+    private boolean mVisibilityIsExplicit = false;
+
+    /** @hide */
+    public void selectDefaultTrack() {
+        if (mTrackIsExplicit) {
+            return;
+        }
+
+        SubtitleTrack track = getDefaultTrack();
+        if (track != null) {
+            selectTrack(track);
+            mTrackIsExplicit = false;
+            if (!mVisibilityIsExplicit) {
+                if (mCaptioningManager.isEnabled()) {
+                    show();
+                } else {
+                    hide();
+                }
+                mVisibilityIsExplicit = false;
+            }
+        }
+    }
+
+    /** @hide */
+    public void reset() {
+        hide();
+        selectTrack(null);
+        mTracks.clear();
+        mTrackIsExplicit = false;
+        mVisibilityIsExplicit = false;
+    }
+
+    /**
+     * Adds a new, external subtitle track to the manager.
+     *
+     * @param format the format of the track that will include at least
+     *               the MIME type {@link MediaFormat@KEY_MIME}.
+     * @return the created {@link SubtitleTrack} object
+     */
+    public SubtitleTrack addTrack(MediaFormat format) {
+        for (Renderer renderer: mRenderers) {
+            if (renderer.supports(format)) {
+                SubtitleTrack track = renderer.createTrack(format);
+                if (track != null) {
+                    mTracks.add(track);
+                    return track;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Show the selected (or default) subtitle track.
+     */
+    public void show() {
+        mShowing = true;
+        mVisibilityIsExplicit = true;
+        if (mSelectedTrack != null) {
+            mSelectedTrack.show();
+        }
+    }
+
+    /**
+     * Hide the selected (or default) subtitle track.
+     */
+    public void hide() {
+        mVisibilityIsExplicit = true;
+        if (mSelectedTrack != null) {
+            mSelectedTrack.hide();
+        }
+        mShowing = false;
+    }
+
+    /**
+     * Interface for supporting a single or multiple subtitle types in {@link
+     * MediaPlayer}.
+     */
+    public abstract static class Renderer {
+        /**
+         * Called by {@link MediaPlayer}'s {@link SubtitleController} when a new
+         * subtitle track is detected, to see if it should use this object to
+         * parse and display this subtitle track.
+         *
+         * @param format the format of the track that will include at least
+         *               the MIME type {@link MediaFormat@KEY_MIME}.
+         *
+         * @return true if and only if the track format is supported by this
+         * renderer
+         */
+        public abstract boolean supports(MediaFormat format);
+
+        /**
+         * Called by {@link MediaPlayer}'s {@link SubtitleController} for each
+         * subtitle track that was detected and is supported by this object to
+         * create a {@link SubtitleTrack} object.  This object will be created
+         * for each track that was found.  If the track is selected for display,
+         * this object will be used to parse and display the track data.
+         *
+         * @param format the format of the track that will include at least
+         *               the MIME type {@link MediaFormat@KEY_MIME}.
+         * @return a {@link SubtitleTrack} object that will be used to parse
+         * and render the subtitle track.
+         */
+        public abstract SubtitleTrack createTrack(MediaFormat format);
+    }
+
+    /**
+     * Add support for a subtitle format in {@link MediaPlayer}.
+     *
+     * @param renderer a {@link SubtitleController.Renderer} object that adds
+     *                 support for a subtitle format.
+     */
+    public void registerRenderer(Renderer renderer) {
+        // TODO how to get available renderers in the system
+        if (!mRenderers.contains(renderer)) {
+            // TODO should added renderers override existing ones (to allow replacing?)
+            mRenderers.add(renderer);
+        }
+    }
+
+    /**
+     * Subtitle anchor, an object that is able to display a subtitle view,
+     * e.g. a VideoView.
+     */
+    public interface Anchor {
+        /**
+         * Anchor should set the subtitle view to the supplied view,
+         * or none, if the supplied view is null.
+         *
+         * @param view subtitle view, or null
+         */
+        public void setSubtitleView(View view);
+    }
+
+    private Anchor mAnchor;
+
+    /** @hide */
+    public void setAnchor(Anchor anchor) {
+        if (mAnchor == anchor) {
+            return;
+        }
+
+        if (mAnchor != null) {
+            mAnchor.setSubtitleView(null);
+        }
+        mAnchor = anchor;
+        if (mAnchor != null) {
+            mAnchor.setSubtitleView(getSubtitleView());
+        }
+    }
+
+    public interface Listener {
+        /**
+         * Called when a subtitle track has been selected.
+         *
+         * @param track selected subtitle track or null
+         * @hide
+         */
+        public void onSubtitleTrackSelected(SubtitleTrack track);
+    }
+
+    private Listener mListener;
+}
diff --git a/media/java/android/media/SubtitleTrack.java b/media/java/android/media/SubtitleTrack.java
new file mode 100644
index 0000000..09fb3f2
--- /dev/null
+++ b/media/java/android/media/SubtitleTrack.java
@@ -0,0 +1,648 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package android.media;
+
+import android.os.Handler;
+import android.util.Log;
+import android.util.LongSparseArray;
+import android.util.Pair;
+import android.view.View;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.Vector;
+
+/**
+ * A subtitle track abstract base class that is responsible for parsing and displaying
+ * an instance of a particular type of subtitle.
+ *
+ * @hide
+ */
+public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeListener {
+    private static final String TAG = "SubtitleTrack";
+    private long mLastUpdateTimeMs;
+    private long mLastTimeMs;
+
+    private Runnable mRunnable;
+
+    /** @hide TODO private */
+    final protected LongSparseArray<Run> mRunsByEndTime = new LongSparseArray<Run>();
+    /** @hide TODO private */
+    final protected LongSparseArray<Run> mRunsByID = new LongSparseArray<Run>();
+
+    /** @hide TODO private */
+    protected CueList mCues;
+    /** @hide TODO private */
+    final protected Vector<Cue> mActiveCues = new Vector<Cue>();
+    /** @hide */
+    protected boolean mVisible;
+
+    /** @hide */
+    public boolean DEBUG = false;
+
+    /** @hide */
+    protected Handler mHandler = new Handler();
+
+    private MediaFormat mFormat;
+
+    public SubtitleTrack(MediaFormat format) {
+        mFormat = format;
+        mCues = new CueList();
+        clearActiveCues();
+        mLastTimeMs = -1;
+    }
+
+    /** @hide */
+    public MediaFormat getFormat() {
+        return mFormat;
+    }
+
+    private long mNextScheduledTimeMs = -1;
+
+    /**
+     * Called when there is input data for the subtitle track.  The
+     * complete subtitle for a track can include multiple whole units
+     * (runs).  Each of these units can have multiple sections.  The
+     * contents of a run are submitted in sequential order, with eos
+     * indicating the last section of the run.  Calls from different
+     * runs must not be intermixed.
+     *
+     * @param data
+     * @param eos true if this is the last section of the run.
+     * @param runID mostly-unique ID for this run of data.  Subtitle cues
+     *              with runID of 0 are discarded immediately after
+     *              display.  Cues with runID of ~0 are discarded
+     *              only at the deletion of the track object.  Cues
+     *              with other runID-s are discarded at the end of the
+     *              run, which defaults to the latest timestamp of
+     *              any of its cues (with this runID).
+     *
+     * TODO use ByteBuffer
+     */
+    public abstract void onData(String data, boolean eos, long runID);
+
+    /**
+     * Called when adding the subtitle rendering view to the view hierarchy, as
+     * well as when showing or hiding the subtitle track, or when the video
+     * surface position has changed.
+     *
+     * @return the view object that displays this subtitle track.  For most
+     * renderers there should be a single shared view instance that is used
+     * for all tracks supported by that renderer, as at most one subtitle
+     * track is visible at one time.
+     */
+    public abstract View getView();
+
+    /**
+     * Called when the active cues have changed, and the contents of the subtitle
+     * view should be updated.
+     *
+     * @hide
+     */
+    public abstract void updateView(Vector<Cue> activeCues);
+
+    /** @hide */
+    protected synchronized void updateActiveCues(boolean rebuild, long timeMs) {
+        // out-of-order times mean seeking or new active cues being added
+        // (during their own timespan)
+        if (rebuild || mLastUpdateTimeMs > timeMs) {
+            clearActiveCues();
+        }
+
+        for(Iterator<Pair<Long, Cue> > it =
+                mCues.entriesBetween(mLastUpdateTimeMs, timeMs).iterator(); it.hasNext(); ) {
+            Pair<Long, Cue> event = it.next();
+            Cue cue = event.second;
+
+            if (cue.mEndTimeMs == event.first) {
+                // remove past cues
+                if (DEBUG) Log.v(TAG, "Removing " + cue);
+                mActiveCues.remove(cue);
+                if (cue.mRunID == 0) {
+                    it.remove();
+                }
+            } else if (cue.mStartTimeMs == event.first) {
+                // add new cues
+                // TRICKY: this will happen in start order
+                if (DEBUG) Log.v(TAG, "Adding " + cue);
+                if (cue.mInnerTimesMs != null) {
+                    cue.onTime(timeMs);
+                }
+                mActiveCues.add(cue);
+            } else if (cue.mInnerTimesMs != null) {
+                // cue is modified
+                cue.onTime(timeMs);
+            }
+        }
+
+        /* complete any runs */
+        while (mRunsByEndTime.size() > 0 &&
+               mRunsByEndTime.keyAt(0) <= timeMs) {
+            removeRunsByEndTimeIndex(0); // removes element
+        }
+        mLastUpdateTimeMs = timeMs;
+    }
+
+    private void removeRunsByEndTimeIndex(int ix) {
+        Run run = mRunsByEndTime.valueAt(ix);
+        while (run != null) {
+            Cue cue = run.mFirstCue;
+            while (cue != null) {
+                mCues.remove(cue);
+                Cue nextCue = cue.mNextInRun;
+                cue.mNextInRun = null;
+                cue = nextCue;
+            }
+            mRunsByID.remove(run.mRunID);
+            Run nextRun = run.mNextRunAtEndTimeMs;
+            run.mPrevRunAtEndTimeMs = null;
+            run.mNextRunAtEndTimeMs = null;
+            run = nextRun;
+        }
+        mRunsByEndTime.removeAt(ix);
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        /* remove all cues (untangle all cross-links) */
+        int size = mRunsByEndTime.size();
+        for(int ix = size - 1; ix >= 0; ix--) {
+            removeRunsByEndTimeIndex(ix);
+        }
+
+        super.finalize();
+    }
+
+    private synchronized void takeTime(long timeMs) {
+        mLastTimeMs = timeMs;
+    }
+
+    /** @hide */
+    protected synchronized void clearActiveCues() {
+        if (DEBUG) Log.v(TAG, "Clearing " + mActiveCues.size() + " active cues");
+        mActiveCues.clear();
+        mLastUpdateTimeMs = -1;
+    }
+
+    /** @hide */
+    public void scheduleTimedEvents() {
+        /* get times for the next event */
+        if (mTimeProvider != null) {
+            mNextScheduledTimeMs = mCues.nextTimeAfter(mLastTimeMs);
+            if (DEBUG) Log.d(TAG, "sched @" + mNextScheduledTimeMs + " after " + mLastTimeMs);
+            mTimeProvider.notifyAt(
+                    mNextScheduledTimeMs >= 0 ?
+                        (mNextScheduledTimeMs * 1000) : MediaTimeProvider.NO_TIME,
+                    this);
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @Override
+    public void onTimedEvent(long timeUs) {
+        if (DEBUG) Log.d(TAG, "onTimedEvent " + timeUs);
+        synchronized (this) {
+            long timeMs = timeUs / 1000;
+            updateActiveCues(false, timeMs);
+            takeTime(timeMs);
+        }
+        updateView(mActiveCues);
+        scheduleTimedEvents();
+    }
+
+    /**
+     * @hide
+     */
+    @Override
+    public void onSeek(long timeUs) {
+        if (DEBUG) Log.d(TAG, "onSeek " + timeUs);
+        synchronized (this) {
+            long timeMs = timeUs / 1000;
+            updateActiveCues(true, timeMs);
+            takeTime(timeMs);
+        }
+        updateView(mActiveCues);
+        scheduleTimedEvents();
+    }
+
+    /**
+     * @hide
+     */
+    @Override
+    public void onStop() {
+        synchronized (this) {
+            if (DEBUG) Log.d(TAG, "onStop");
+            clearActiveCues();
+            mLastTimeMs = -1;
+        }
+        updateView(mActiveCues);
+        mNextScheduledTimeMs = -1;
+        mTimeProvider.notifyAt(MediaTimeProvider.NO_TIME, this);
+    }
+
+    /** @hide */
+    protected MediaTimeProvider mTimeProvider;
+
+    /** @hide */
+    public void show() {
+        if (mVisible) {
+            return;
+        }
+
+        mVisible = true;
+        getView().setVisibility(View.VISIBLE);
+        if (mTimeProvider != null) {
+            mTimeProvider.scheduleUpdate(this);
+        }
+    }
+
+    /** @hide */
+    public void hide() {
+        if (!mVisible) {
+            return;
+        }
+
+        if (mTimeProvider != null) {
+            mTimeProvider.cancelNotifications(this);
+        }
+        getView().setVisibility(View.INVISIBLE);
+        mVisible = false;
+    }
+
+    /** @hide */
+    protected synchronized boolean addCue(Cue cue) {
+        mCues.add(cue);
+
+        if (cue.mRunID != 0) {
+            Run run = mRunsByID.get(cue.mRunID);
+            if (run == null) {
+                run = new Run();
+                mRunsByID.put(cue.mRunID, run);
+                run.mEndTimeMs = cue.mEndTimeMs;
+            } else if (run.mEndTimeMs < cue.mEndTimeMs) {
+                run.mEndTimeMs = cue.mEndTimeMs;
+            }
+
+            // link-up cues in the same run
+            cue.mNextInRun = run.mFirstCue;
+            run.mFirstCue = cue;
+        }
+
+        // if a cue is added that should be visible, need to refresh view
+        long nowMs = -1;
+        if (mTimeProvider != null) {
+            try {
+                nowMs = mTimeProvider.getCurrentTimeUs(
+                        false /* precise */, true /* monotonic */) / 1000;
+            } catch (IllegalStateException e) {
+                // handle as it we are not playing
+            }
+        }
+
+        if (DEBUG) Log.v(TAG, "mVisible=" + mVisible + ", " +
+                cue.mStartTimeMs + " <= " + nowMs + ", " +
+                cue.mEndTimeMs + " >= " + mLastTimeMs);
+
+        if (mVisible &&
+                cue.mStartTimeMs <= nowMs &&
+                // we don't trust nowMs, so check any cue since last callback
+                cue.mEndTimeMs >= mLastTimeMs) {
+            if (mRunnable != null) {
+                mHandler.removeCallbacks(mRunnable);
+            }
+            final SubtitleTrack track = this;
+            final long thenMs = nowMs;
+            mRunnable = new Runnable() {
+                @Override
+                public void run() {
+                    // even with synchronized, it is possible that we are going
+                    // to do multiple updates as the runnable could be already
+                    // running.
+                    synchronized (track) {
+                        mRunnable = null;
+                        updateActiveCues(true, thenMs);
+                        updateView(mActiveCues);
+                    }
+                }
+            };
+            // delay update so we don't update view on every cue.  TODO why 10?
+            if (mHandler.postDelayed(mRunnable, 10 /* delay */)) {
+                if (DEBUG) Log.v(TAG, "scheduling update");
+            } else {
+                if (DEBUG) Log.w(TAG, "failed to schedule subtitle view update");
+            }
+            return true;
+        }
+
+        if (mVisible &&
+                cue.mEndTimeMs >= mLastTimeMs &&
+                (cue.mStartTimeMs < mNextScheduledTimeMs ||
+                 mNextScheduledTimeMs < 0)) {
+            scheduleTimedEvents();
+        }
+
+        return false;
+    }
+
+    /** @hide */
+    public void setTimeProvider(MediaTimeProvider timeProvider) {
+        if (mTimeProvider == timeProvider) {
+            return;
+        }
+        if (mTimeProvider != null) {
+            mTimeProvider.cancelNotifications(this);
+        }
+        mTimeProvider = timeProvider;
+        if (mTimeProvider != null) {
+            mTimeProvider.scheduleUpdate(this);
+        }
+    }
+
+
+    /** @hide */
+    static class CueList {
+        private static final String TAG = "CueList";
+        // simplistic, inefficient implementation
+        private SortedMap<Long, Vector<Cue> > mCues;
+        public boolean DEBUG = false;
+
+        private boolean addEvent(Cue cue, long timeMs) {
+            Vector<Cue> cues = mCues.get(timeMs);
+            if (cues == null) {
+                cues = new Vector<Cue>(2);
+                mCues.put(timeMs, cues);
+            } else if (cues.contains(cue)) {
+                // do not duplicate cues
+                return false;
+            }
+
+            cues.add(cue);
+            return true;
+        }
+
+        private void removeEvent(Cue cue, long timeMs) {
+            Vector<Cue> cues = mCues.get(timeMs);
+            if (cues != null) {
+                cues.remove(cue);
+                if (cues.size() == 0) {
+                    mCues.remove(timeMs);
+                }
+            }
+        }
+
+        public void add(Cue cue) {
+            // ignore non-positive-duration cues
+            if (cue.mStartTimeMs >= cue.mEndTimeMs)
+                return;
+
+            if (!addEvent(cue, cue.mStartTimeMs)) {
+                return;
+            }
+
+            long lastTimeMs = cue.mStartTimeMs;
+            if (cue.mInnerTimesMs != null) {
+                for (long timeMs: cue.mInnerTimesMs) {
+                    if (timeMs > lastTimeMs && timeMs < cue.mEndTimeMs) {
+                        addEvent(cue, timeMs);
+                        lastTimeMs = timeMs;
+                    }
+                }
+            }
+
+            addEvent(cue, cue.mEndTimeMs);
+        }
+
+        public void remove(Cue cue) {
+            removeEvent(cue, cue.mStartTimeMs);
+            if (cue.mInnerTimesMs != null) {
+                for (long timeMs: cue.mInnerTimesMs) {
+                    removeEvent(cue, timeMs);
+                }
+            }
+            removeEvent(cue, cue.mEndTimeMs);
+        }
+
+        public Iterable<Pair<Long, Cue>> entriesBetween(
+                final long lastTimeMs, final long timeMs) {
+            return new Iterable<Pair<Long, Cue> >() {
+                @Override
+                public Iterator<Pair<Long, Cue> > iterator() {
+                    if (DEBUG) Log.d(TAG, "slice (" + lastTimeMs + ", " + timeMs + "]=");
+                    try {
+                        return new EntryIterator(
+                                mCues.subMap(lastTimeMs + 1, timeMs + 1));
+                    } catch(IllegalArgumentException e) {
+                        return new EntryIterator(null);
+                    }
+                }
+            };
+        }
+
+        public long nextTimeAfter(long timeMs) {
+            SortedMap<Long, Vector<Cue>> tail = null;
+            try {
+                tail = mCues.tailMap(timeMs + 1);
+                if (tail != null) {
+                    return tail.firstKey();
+                } else {
+                    return -1;
+                }
+            } catch(IllegalArgumentException e) {
+                return -1;
+            } catch(NoSuchElementException e) {
+                return -1;
+            }
+        }
+
+        class EntryIterator implements Iterator<Pair<Long, Cue> > {
+            @Override
+            public boolean hasNext() {
+                return !mDone;
+            }
+
+            @Override
+            public Pair<Long, Cue> next() {
+                if (mDone) {
+                    throw new NoSuchElementException("");
+                }
+                mLastEntry = new Pair<Long, Cue>(
+                        mCurrentTimeMs, mListIterator.next());
+                mLastListIterator = mListIterator;
+                if (!mListIterator.hasNext()) {
+                    nextKey();
+                }
+                return mLastEntry;
+            }
+
+            @Override
+            public void remove() {
+                // only allow removing end tags
+                if (mLastListIterator == null ||
+                        mLastEntry.second.mEndTimeMs != mLastEntry.first) {
+                    throw new IllegalStateException("");
+                }
+
+                // remove end-cue
+                mLastListIterator.remove();
+                mLastListIterator = null;
+                if (mCues.get(mLastEntry.first).size() == 0) {
+                    mCues.remove(mLastEntry.first);
+                }
+
+                // remove rest of the cues
+                Cue cue = mLastEntry.second;
+                removeEvent(cue, cue.mStartTimeMs);
+                if (cue.mInnerTimesMs != null) {
+                    for (long timeMs: cue.mInnerTimesMs) {
+                        removeEvent(cue, timeMs);
+                    }
+                }
+            }
+
+            public EntryIterator(SortedMap<Long, Vector<Cue> > cues) {
+                if (DEBUG) Log.v(TAG, cues + "");
+                mRemainingCues = cues;
+                mLastListIterator = null;
+                nextKey();
+            }
+
+            private void nextKey() {
+                do {
+                    try {
+                        if (mRemainingCues == null) {
+                            throw new NoSuchElementException("");
+                        }
+                        mCurrentTimeMs = mRemainingCues.firstKey();
+                        mListIterator =
+                            mRemainingCues.get(mCurrentTimeMs).iterator();
+                        try {
+                            mRemainingCues =
+                                mRemainingCues.tailMap(mCurrentTimeMs + 1);
+                        } catch (IllegalArgumentException e) {
+                            mRemainingCues = null;
+                        }
+                        mDone = false;
+                    } catch (NoSuchElementException e) {
+                        mDone = true;
+                        mRemainingCues = null;
+                        mListIterator = null;
+                        return;
+                    }
+                } while (!mListIterator.hasNext());
+            }
+
+            private long mCurrentTimeMs;
+            private Iterator<Cue> mListIterator;
+            private boolean mDone;
+            private SortedMap<Long, Vector<Cue> > mRemainingCues;
+            private Iterator<Cue> mLastListIterator;
+            private Pair<Long,Cue> mLastEntry;
+        }
+
+        CueList() {
+            mCues = new TreeMap<Long, Vector<Cue>>();
+        }
+    }
+
+    /** @hide */
+    public static class Cue {
+        public long mStartTimeMs;
+        public long mEndTimeMs;
+        public long[] mInnerTimesMs;
+        public long mRunID;
+
+        /** @hide */
+        public Cue mNextInRun;
+
+        public void onTime(long timeMs) { }
+    }
+
+    /** @hide update mRunsByEndTime (with default end time) */
+    protected void finishedRun(long runID) {
+        if (runID != 0 && runID != ~0) {
+            Run run = mRunsByID.get(runID);
+            if (run != null) {
+                run.storeByEndTimeMs(mRunsByEndTime);
+            }
+        }
+    }
+
+    /** @hide update mRunsByEndTime with given end time */
+    public void setRunDiscardTimeMs(long runID, long timeMs) {
+        if (runID != 0 && runID != ~0) {
+            Run run = mRunsByID.get(runID);
+            if (run != null) {
+                run.mEndTimeMs = timeMs;
+                run.storeByEndTimeMs(mRunsByEndTime);
+            }
+        }
+    }
+
+    /** @hide */
+    private static class Run {
+        public Cue mFirstCue;
+        public Run mNextRunAtEndTimeMs;
+        public Run mPrevRunAtEndTimeMs;
+        public long mEndTimeMs = -1;
+        public long mRunID = 0;
+        private long mStoredEndTimeMs = -1;
+
+        public void storeByEndTimeMs(LongSparseArray<Run> runsByEndTime) {
+            // remove old value if any
+            int ix = runsByEndTime.indexOfKey(mStoredEndTimeMs);
+            if (ix >= 0) {
+                if (mPrevRunAtEndTimeMs == null) {
+                    assert(this == runsByEndTime.valueAt(ix));
+                    if (mNextRunAtEndTimeMs == null) {
+                        runsByEndTime.removeAt(ix);
+                    } else {
+                        runsByEndTime.setValueAt(ix, mNextRunAtEndTimeMs);
+                    }
+                }
+                removeAtEndTimeMs();
+            }
+
+            // add new value
+            if (mEndTimeMs >= 0) {
+                mPrevRunAtEndTimeMs = null;
+                mNextRunAtEndTimeMs = runsByEndTime.get(mEndTimeMs);
+                if (mNextRunAtEndTimeMs != null) {
+                    mNextRunAtEndTimeMs.mPrevRunAtEndTimeMs = this;
+                }
+                runsByEndTime.put(mEndTimeMs, this);
+                mStoredEndTimeMs = mEndTimeMs;
+            }
+        }
+
+        public void removeAtEndTimeMs() {
+            Run prev = mPrevRunAtEndTimeMs;
+
+            if (mPrevRunAtEndTimeMs != null) {
+                mPrevRunAtEndTimeMs.mNextRunAtEndTimeMs = mNextRunAtEndTimeMs;
+                mPrevRunAtEndTimeMs = null;
+            }
+            if (mNextRunAtEndTimeMs != null) {
+                mNextRunAtEndTimeMs.mPrevRunAtEndTimeMs = prev;
+                mNextRunAtEndTimeMs = null;
+            }
+        }
+    }
+}
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index 7f1d946..92edb8a 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -155,7 +155,7 @@
     return buffer;
 }
 
-void JNIImageReaderContext::returnLockedBuffer(CpuConsumer::LockedBuffer * buffer) {
+void JNIImageReaderContext::returnLockedBuffer(CpuConsumer::LockedBuffer* buffer) {
     mBuffers.push_back(buffer);
 }
 
@@ -698,8 +698,11 @@
     CpuConsumer* consumer = ctx->getCpuConsumer();
     CpuConsumer::LockedBuffer* buffer = ctx->getLockedBuffer();
     if (buffer == NULL) {
-        ALOGE("Unable to acquire a lockedBuffer, very likely client tries to lock more than"
-            "maxImages buffers");
+        ALOGW("Unable to acquire a lockedBuffer, very likely client tries to lock more than"
+            " maxImages buffers");
+        jniThrowException(env, OutOfResourcesException,
+                  "Too many outstanding images, close existing images"
+                  " to be able to acquire more.");
         return false;
     }
     status_t res = consumer->lockNextBuffer(buffer);
diff --git a/packages/DocumentsUI/Android.mk b/packages/DocumentsUI/Android.mk
index 853353d..7900953 100644
--- a/packages/DocumentsUI/Android.mk
+++ b/packages/DocumentsUI/Android.mk
@@ -5,7 +5,7 @@
 
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 guava
 
 LOCAL_PACKAGE_NAME := DocumentsUI
 LOCAL_CERTIFICATE := platform
diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml
index d79f5c6..45e2650 100644
--- a/packages/DocumentsUI/AndroidManifest.xml
+++ b/packages/DocumentsUI/AndroidManifest.xml
@@ -11,10 +11,7 @@
         <!-- TODO: allow rotation when state saving is in better shape -->
         <activity
             android:name=".DocumentsActivity"
-            android:finishOnCloseSystemDialogs="true"
-            android:excludeFromRecents="true"
-            android:theme="@android:style/Theme.Holo.Light"
-            android:screenOrientation="nosensor">
+            android:theme="@android:style/Theme.Holo.Light">
             <intent-filter android:priority="100">
                 <action android:name="android.intent.action.OPEN_DOCUMENT" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -35,9 +32,9 @@
             </intent-filter>
             <!-- data expected to point at existing root to manage -->
             <intent-filter>
-                <action android:name="android.intent.action.MANAGE_DOCUMENT" />
+                <action android:name="android.provider.action.MANAGE_DOCUMENTS" />
                 <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/root" />
+                <data android:mimeType="vnd.android.document/directory" />
             </intent-filter>
         </activity>
 
diff --git a/packages/DocumentsUI/res/layout/item_loading.xml b/packages/DocumentsUI/res/layout/item_loading.xml
new file mode 100644
index 0000000..7da71e3
--- /dev/null
+++ b/packages/DocumentsUI/res/layout/item_loading.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingTop="8dip"
+    android:paddingBottom="8dip"
+    android:orientation="horizontal">
+
+    <ProgressBar
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:indeterminate="true"
+        style="?android:attr/progressBarStyle" />
+
+</FrameLayout>
diff --git a/packages/DocumentsUI/res/layout/item_message_grid.xml b/packages/DocumentsUI/res/layout/item_message_grid.xml
new file mode 100644
index 0000000..941340e
--- /dev/null
+++ b/packages/DocumentsUI/res/layout/item_message_grid.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="180dip"
+    android:paddingBottom="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/chip"
+        android:foreground="@drawable/item_background"
+        android:duplicateParentState="true">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:paddingBottom="6dp"
+            android:orientation="vertical"
+            android:gravity="center">
+
+            <ImageView
+                android:id="@android:id/icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:contentDescription="@null" />
+
+            <TextView
+                android:id="@android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:ellipsize="marquee"
+                android:paddingTop="6dp"
+                android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+                android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textAlignment="viewStart" />
+
+        </LinearLayout>
+
+    </FrameLayout>
+
+</FrameLayout>
diff --git a/packages/DocumentsUI/res/layout/item_message_list.xml b/packages/DocumentsUI/res/layout/item_message_list.xml
new file mode 100644
index 0000000..dda3c80
--- /dev/null
+++ b/packages/DocumentsUI/res/layout/item_message_list.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/item_background"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingTop="8dip"
+    android:paddingBottom="8dip"
+    android:orientation="horizontal">
+
+    <ImageView
+        android:id="@android:id/icon"
+        android:layout_width="@android:dimen/app_icon_size"
+        android:layout_height="@android:dimen/app_icon_size"
+        android:layout_marginEnd="8dip"
+        android:layout_gravity="center_vertical"
+        android:scaleType="centerInside"
+        android:contentDescription="@null" />
+
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:singleLine="true"
+        android:ellipsize="marquee"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textAlignment="viewStart" />
+
+</LinearLayout>
diff --git a/packages/DocumentsUI/res/layout/item_title.xml b/packages/DocumentsUI/res/layout/item_title.xml
index fe6c14d..eab3839 100644
--- a/packages/DocumentsUI/res/layout/item_title.xml
+++ b/packages/DocumentsUI/res/layout/item_title.xml
@@ -29,13 +29,4 @@
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:textAlignment="viewStart" />
 
-    <TextView
-        android:id="@android:id/summary"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:singleLine="true"
-        android:ellipsize="marquee"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textAlignment="viewStart" />
-
 </LinearLayout>
diff --git a/packages/DocumentsUI/res/menu/activity.xml b/packages/DocumentsUI/res/menu/activity.xml
index 575336c..e182159 100644
--- a/packages/DocumentsUI/res/menu/activity.xml
+++ b/packages/DocumentsUI/res/menu/activity.xml
@@ -28,6 +28,23 @@
         android:actionViewClass="android.widget.SearchView"
         android:imeOptions="actionSearch" />
     <item
+        android:id="@+id/menu_sort"
+        android:title="@string/menu_sort"
+        android:icon="@drawable/ic_menu_sort"
+        android:showAsAction="always">
+        <menu>
+            <item
+                android:id="@+id/menu_sort_name"
+                android:title="@string/sort_name" />
+            <item
+                android:id="@+id/menu_sort_date"
+                android:title="@string/sort_date" />
+            <item
+                android:id="@+id/menu_sort_size"
+                android:title="@string/sort_size" />
+        </menu>
+    </item>
+    <item
         android:id="@+id/menu_grid"
         android:title="@string/menu_grid"
         android:icon="@drawable/ic_menu_grid"
diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml
index 47ce39d..ece6673 100644
--- a/packages/DocumentsUI/res/values-af/strings.xml
+++ b/packages/DocumentsUI/res/values-af/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="2783841764617238354">"Dokumente"</string>
     <string name="title_open" msgid="4353228937663917801">"Maak oop vanaf"</string>
-    <string name="title_save" msgid="2433679664882857999">"Stoor in"</string>
+    <string name="title_save" msgid="2433679664882857999">"Stoor na"</string>
     <string name="menu_create_dir" msgid="5947289605844398389">"Skep vouer"</string>
     <string name="menu_grid" msgid="6878021334497835259">"Roosteraansig"</string>
     <string name="menu_list" msgid="7279285939892417279">"Lysaansig"</string>
@@ -41,13 +41,15 @@
     <string name="root_type_service" msgid="2857362700576006694">"Dienste"</string>
     <string name="root_type_shortcut" msgid="3318760609471618093">"Kortpaaie"</string>
     <string name="root_type_device" msgid="7121342474653483538">"Toestelle"</string>
-    <string name="root_type_apps" msgid="8838065367985945189">"Nog meer programme"</string>
+    <string name="root_type_apps" msgid="8838065367985945189">"Nog programme"</string>
     <string name="pref_advanced_devices" msgid="903257239609301276">"Wys gevorderde toestelle"</string>
     <string name="pref_file_size" msgid="2826879315743961459">"Wys lêergrootte"</string>
     <string name="pref_device_size" msgid="3542106883278997222">"Wys toestelgrootte"</string>
     <string name="empty" msgid="7858882803708117596">"Geen items nie"</string>
-    <string name="toast_no_application" msgid="1339885974067891667">"Kan nie lêer oopmaak nie"</string>
-    <string name="toast_failed_delete" msgid="2180678019407244069">"Kan nie sommige dokumente uitvee nie"</string>
-    <string name="more" msgid="7117420986529297171">"Nog meer"</string>
+    <string name="toast_no_application" msgid="1339885974067891667">"Kan lêer nie oopmaak nie"</string>
+    <string name="toast_failed_delete" msgid="2180678019407244069">"Kan sommige dokumente nie uitvee nie"</string>
+    <string name="more" msgid="7117420986529297171">"Nog"</string>
     <string name="loading" msgid="7933681260296021180">"Laai tans..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-am/strings.xml b/packages/DocumentsUI/res/values-am/strings.xml
index 4b9e4ff..8761a27 100644
--- a/packages/DocumentsUI/res/values-am/strings.xml
+++ b/packages/DocumentsUI/res/values-am/strings.xml
@@ -17,9 +17,9 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="2783841764617238354">"ሰነዶች"</string>
-    <string name="title_open" msgid="4353228937663917801">"ይክፈቱ ከ"</string>
-    <string name="title_save" msgid="2433679664882857999">"ያስቀምጡ ወደ"</string>
-    <string name="menu_create_dir" msgid="5947289605844398389">"አቃፊ ይፍጠሩ"</string>
+    <string name="title_open" msgid="4353228937663917801">"ክፈት ከ"</string>
+    <string name="title_save" msgid="2433679664882857999">"አስቀምጥ ወደ"</string>
+    <string name="menu_create_dir" msgid="5947289605844398389">"አቃፊ ፍጠር"</string>
     <string name="menu_grid" msgid="6878021334497835259">"የፍርግርግ እይታ"</string>
     <string name="menu_list" msgid="7279285939892417279">"የዝርዝር እይታ"</string>
     <string name="menu_sort" msgid="7677740407158414452">"ደርድር በ"</string>
@@ -31,7 +31,7 @@
     <string name="menu_delete" msgid="8138799623850614177">"ሰርዝ"</string>
     <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ተመርጠዋል"</string>
     <string name="sort_name" msgid="9183560467917256779">"በስም"</string>
-    <string name="sort_date" msgid="586080032956151448">"በተስተካከሉበት ቀን"</string>
+    <string name="sort_date" msgid="586080032956151448">"በተለወጠበት ቀን"</string>
     <string name="sort_size" msgid="3350681319735474741">"በመጠን"</string>
     <string name="drawer_open" msgid="4545466532430226949">"ስሮችን አሳይ"</string>
     <string name="drawer_close" msgid="7602734368552123318">"ስሮችን ደብቅ"</string>
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"አንዳንድ ሰነዶችን መሰረዝ አልተቻለም"</string>
     <string name="more" msgid="7117420986529297171">"ተጨማሪ"</string>
     <string name="loading" msgid="7933681260296021180">"በመጫን ላይ…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-ar/strings.xml b/packages/DocumentsUI/res/values-ar/strings.xml
index 19599b6..febc6dc 100644
--- a/packages/DocumentsUI/res/values-ar/strings.xml
+++ b/packages/DocumentsUI/res/values-ar/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"تعذر حذف بعض المستندات"</string>
     <string name="more" msgid="7117420986529297171">"المزيد"</string>
     <string name="loading" msgid="7933681260296021180">"جارٍ التحميل…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-az-rAZ/strings.xml b/packages/DocumentsUI/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..a301b66
--- /dev/null
+++ b/packages/DocumentsUI/res/values-az-rAZ/strings.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2013 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="2783841764617238354">"Sənədlər"</string>
+    <string name="title_open" msgid="4353228937663917801">"Vasitəsilə açın"</string>
+    <string name="title_save" msgid="2433679664882857999">"buraya saxlayın"</string>
+    <string name="menu_create_dir" msgid="5947289605844398389">"Qovluq yaradın"</string>
+    <string name="menu_grid" msgid="6878021334497835259">"Torlu görünüş"</string>
+    <string name="menu_list" msgid="7279285939892417279">"Siyahı görünüşü"</string>
+    <string name="menu_sort" msgid="7677740407158414452">"Bunlardan biri üzrə sırala"</string>
+    <string name="menu_search" msgid="3816712084502856974">"Axtarış"</string>
+    <string name="menu_settings" msgid="6008033148948428823">"Ayarlar"</string>
+    <string name="menu_open" msgid="432922957274920903">"Açın"</string>
+    <string name="menu_save" msgid="2394743337684426338">"Yadda saxlayın"</string>
+    <string name="menu_share" msgid="3075149983979628146">"Paylaşın"</string>
+    <string name="menu_delete" msgid="8138799623850614177">"Sil"</string>
+    <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> seçilmiş"</string>
+    <string name="sort_name" msgid="9183560467917256779">"Ad üzrə"</string>
+    <string name="sort_date" msgid="586080032956151448">"Tarix üzrə dəyişmiş"</string>
+    <string name="sort_size" msgid="3350681319735474741">"Ölçü üzrə"</string>
+    <string name="drawer_open" msgid="4545466532430226949">"Kökləri göstərin"</string>
+    <string name="drawer_close" msgid="7602734368552123318">"Kökləri gizlədin"</string>
+    <string name="save_error" msgid="6167009778003223664">"Sənədi yadda saxlaya bilmədi"</string>
+    <string name="root_recent" msgid="4470053704320518133">"Son"</string>
+    <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ödənişsiz"</string>
+    <string name="root_type_service" msgid="2857362700576006694">"Xidmətlər"</string>
+    <string name="root_type_shortcut" msgid="3318760609471618093">"Qısa yollar"</string>
+    <string name="root_type_device" msgid="7121342474653483538">"Cihazlar"</string>
+    <string name="root_type_apps" msgid="8838065367985945189">"Daha çox tətbiq"</string>
+    <string name="pref_advanced_devices" msgid="903257239609301276">"Qabaqcıl cihazları görüntüləyin"</string>
+    <string name="pref_file_size" msgid="2826879315743961459">"Fayl ölçüsünü görüntüləyin"</string>
+    <string name="pref_device_size" msgid="3542106883278997222">"Cihaz ölçüsünü görüntüləyin"</string>
+    <string name="empty" msgid="7858882803708117596">"Element yoxdur"</string>
+    <string name="toast_no_application" msgid="1339885974067891667">"Faylı aça bilmir"</string>
+    <string name="toast_failed_delete" msgid="2180678019407244069">"Bəzi sənədləri silə bilmir"</string>
+    <string name="more" msgid="7117420986529297171">"Daha çox"</string>
+    <string name="loading" msgid="7933681260296021180">"Yüklənir…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
+</resources>
diff --git a/packages/DocumentsUI/res/values-be/strings.xml b/packages/DocumentsUI/res/values-be/strings.xml
index da91d95..689a935 100644
--- a/packages/DocumentsUI/res/values-be/strings.xml
+++ b/packages/DocumentsUI/res/values-be/strings.xml
@@ -83,4 +83,6 @@
     <!-- no translation found for more (7117420986529297171) -->
     <skip />
     <string name="loading" msgid="7933681260296021180">"Загрузка..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml
index d04ec6c..bf399d2 100644
--- a/packages/DocumentsUI/res/values-bg/strings.xml
+++ b/packages/DocumentsUI/res/values-bg/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Някои документи не могат да бъдат изтрити"</string>
     <string name="more" msgid="7117420986529297171">"Още"</string>
     <string name="loading" msgid="7933681260296021180">"Зарежда се..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml
index f5009d1..22c12fc 100644
--- a/packages/DocumentsUI/res/values-ca/strings.xml
+++ b/packages/DocumentsUI/res/values-ca/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"No es poden suprimir alguns documents."</string>
     <string name="more" msgid="7117420986529297171">"Més"</string>
     <string name="loading" msgid="7933681260296021180">"S\'està carregant…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml
index 6a04e42..42a5a2b 100644
--- a/packages/DocumentsUI/res/values-cs/strings.xml
+++ b/packages/DocumentsUI/res/values-cs/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Některé dokumenty nelze smazat"</string>
     <string name="more" msgid="7117420986529297171">"Více"</string>
     <string name="loading" msgid="7933681260296021180">"Načítání..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml
index 06bf57c..41b1aac 100644
--- a/packages/DocumentsUI/res/values-da/strings.xml
+++ b/packages/DocumentsUI/res/values-da/strings.xml
@@ -17,7 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="2783841764617238354">"Dokumenter"</string>
-    <string name="title_open" msgid="4353228937663917801">"Åbn i"</string>
+    <string name="title_open" msgid="4353228937663917801">"Åbn fra"</string>
     <string name="title_save" msgid="2433679664882857999">"Gem på"</string>
     <string name="menu_create_dir" msgid="5947289605844398389">"Opret mappe"</string>
     <string name="menu_grid" msgid="6878021334497835259">"Gittervisning"</string>
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Nogle dokumenter kan ikke slettes"</string>
     <string name="more" msgid="7117420986529297171">"Mere"</string>
     <string name="loading" msgid="7933681260296021180">"Indlæser…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml
index 2c7bff1..bd54545 100644
--- a/packages/DocumentsUI/res/values-de/strings.xml
+++ b/packages/DocumentsUI/res/values-de/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Einige Dokumente konnten nicht gelöscht werden."</string>
     <string name="more" msgid="7117420986529297171">"Mehr"</string>
     <string name="loading" msgid="7933681260296021180">"Wird geladen…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml
index 0070e8f..c15eb1f 100644
--- a/packages/DocumentsUI/res/values-el/strings.xml
+++ b/packages/DocumentsUI/res/values-el/strings.xml
@@ -45,9 +45,11 @@
     <string name="pref_advanced_devices" msgid="903257239609301276">"Εμφάνιση προηγμένων συσκευών"</string>
     <string name="pref_file_size" msgid="2826879315743961459">"Εμφάνιση μεγέθους αρχείου"</string>
     <string name="pref_device_size" msgid="3542106883278997222">"Εμφάνιση μεγέθους συσκευής"</string>
-    <string name="empty" msgid="7858882803708117596">"Δεν υπάρχουν αντικείμενα"</string>
+    <string name="empty" msgid="7858882803708117596">"Δεν υπάρχουν στοιχεία"</string>
     <string name="toast_no_application" msgid="1339885974067891667">"Δεν είναι δυνατό το άνοιγμα του αρχείου"</string>
     <string name="toast_failed_delete" msgid="2180678019407244069">"Δεν είναι δυνατή η διαγραφή ορισμένων εγγράφων"</string>
     <string name="more" msgid="7117420986529297171">"Περισσότερα"</string>
     <string name="loading" msgid="7933681260296021180">"Φόρτωση…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-en-rGB/strings.xml b/packages/DocumentsUI/res/values-en-rGB/strings.xml
index 913e6d7..b1693b0 100644
--- a/packages/DocumentsUI/res/values-en-rGB/strings.xml
+++ b/packages/DocumentsUI/res/values-en-rGB/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string>
     <string name="more" msgid="7117420986529297171">"More"</string>
     <string name="loading" msgid="7933681260296021180">"Loading…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-en-rIN/strings.xml b/packages/DocumentsUI/res/values-en-rIN/strings.xml
index 913e6d7..b1693b0 100644
--- a/packages/DocumentsUI/res/values-en-rIN/strings.xml
+++ b/packages/DocumentsUI/res/values-en-rIN/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string>
     <string name="more" msgid="7117420986529297171">"More"</string>
     <string name="loading" msgid="7933681260296021180">"Loading…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml
index 68c5ac1..d556667 100644
--- a/packages/DocumentsUI/res/values-es-rUS/strings.xml
+++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos."</string>
     <string name="more" msgid="7117420986529297171">"Más"</string>
     <string name="loading" msgid="7933681260296021180">"Cargando…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml
index b9695f1..723a0ec 100644
--- a/packages/DocumentsUI/res/values-es/strings.xml
+++ b/packages/DocumentsUI/res/values-es/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos"</string>
     <string name="more" msgid="7117420986529297171">"Más"</string>
     <string name="loading" msgid="7933681260296021180">"Cargando..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml
index 2f7e14a..7c298de 100644
--- a/packages/DocumentsUI/res/values-et-rEE/strings.xml
+++ b/packages/DocumentsUI/res/values-et-rEE/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Mõnda dokumenti ei õnnestu kustutada"</string>
     <string name="more" msgid="7117420986529297171">"Rohkem"</string>
     <string name="loading" msgid="7933681260296021180">"Laadimine ..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml
index 6a1375f..418a08f 100644
--- a/packages/DocumentsUI/res/values-fa/strings.xml
+++ b/packages/DocumentsUI/res/values-fa/strings.xml
@@ -17,7 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="2783841764617238354">"اسناد"</string>
-    <string name="title_open" msgid="4353228937663917801">"باز از"</string>
+    <string name="title_open" msgid="4353228937663917801">"باز کردن از"</string>
     <string name="title_save" msgid="2433679664882857999">"ذخیره در"</string>
     <string name="menu_create_dir" msgid="5947289605844398389">"ایجاد پوشه"</string>
     <string name="menu_grid" msgid="6878021334497835259">"نمای جدولی"</string>
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"برخی از اسناد حذف نمی‌شوند"</string>
     <string name="more" msgid="7117420986529297171">"بیشتر"</string>
     <string name="loading" msgid="7933681260296021180">"در حال بارگیری..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml
index c97159b..0d9d883 100644
--- a/packages/DocumentsUI/res/values-fi/strings.xml
+++ b/packages/DocumentsUI/res/values-fi/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Joitakin asiakirjoja ei voi poistaa"</string>
     <string name="more" msgid="7117420986529297171">"Lisää"</string>
     <string name="loading" msgid="7933681260296021180">"Ladataan…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
index a9912c9..086b82c 100644
--- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml
+++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents"</string>
     <string name="more" msgid="7117420986529297171">"Plus"</string>
     <string name="loading" msgid="7933681260296021180">"Chargement en cours..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml
index 6049df7..d70877a 100644
--- a/packages/DocumentsUI/res/values-fr/strings.xml
+++ b/packages/DocumentsUI/res/values-fr/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents."</string>
     <string name="more" msgid="7117420986529297171">"Plus"</string>
     <string name="loading" msgid="7933681260296021180">"Chargement…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-hi/strings.xml b/packages/DocumentsUI/res/values-hi/strings.xml
index 2931df0..d45e9bb 100644
--- a/packages/DocumentsUI/res/values-hi/strings.xml
+++ b/packages/DocumentsUI/res/values-hi/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"कुछ दस्तावेज़ों को हटाने में अक्षम"</string>
     <string name="more" msgid="7117420986529297171">"अधिक"</string>
     <string name="loading" msgid="7933681260296021180">"लोड हो रहे हैं..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-hr/strings.xml b/packages/DocumentsUI/res/values-hr/strings.xml
index 07bc0c7..01be538 100644
--- a/packages/DocumentsUI/res/values-hr/strings.xml
+++ b/packages/DocumentsUI/res/values-hr/strings.xml
@@ -47,7 +47,9 @@
     <string name="pref_device_size" msgid="3542106883278997222">"Prikaži veličinu uređaja"</string>
     <string name="empty" msgid="7858882803708117596">"Nema stavki"</string>
     <string name="toast_no_application" msgid="1339885974067891667">"Datoteku nije moguće otvoriti"</string>
-    <string name="toast_failed_delete" msgid="2180678019407244069">"Nije bilo moguće izbrisati neke dokumente"</string>
+    <string name="toast_failed_delete" msgid="2180678019407244069">"Nije moguće izbrisati neke dokumente"</string>
     <string name="more" msgid="7117420986529297171">"Više"</string>
     <string name="loading" msgid="7933681260296021180">"Učitavanje…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-hu/strings.xml b/packages/DocumentsUI/res/values-hu/strings.xml
index 660f654..2648f82 100644
--- a/packages/DocumentsUI/res/values-hu/strings.xml
+++ b/packages/DocumentsUI/res/values-hu/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Néhány dokumentumot nem lehet törölni"</string>
     <string name="more" msgid="7117420986529297171">"Továbbiak"</string>
     <string name="loading" msgid="7933681260296021180">"Betöltés..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml
index 357875d..ed026c2 100644
--- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml
+++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Անհնար է ջնջել որոշ փաստաթղթեր"</string>
     <string name="more" msgid="7117420986529297171">"Ավելին"</string>
     <string name="loading" msgid="7933681260296021180">"Բեռնում..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml
index 9bf1179..a1cefc2 100644
--- a/packages/DocumentsUI/res/values-in/strings.xml
+++ b/packages/DocumentsUI/res/values-in/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat menghapus beberapa dokumen"</string>
     <string name="more" msgid="7117420986529297171">"Lainnya"</string>
     <string name="loading" msgid="7933681260296021180">"Memuat..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-it/strings.xml b/packages/DocumentsUI/res/values-it/strings.xml
index 5a185d9..6b1bb8b 100644
--- a/packages/DocumentsUI/res/values-it/strings.xml
+++ b/packages/DocumentsUI/res/values-it/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Impossibile eliminare alcuni documenti"</string>
     <string name="more" msgid="7117420986529297171">"Altro"</string>
     <string name="loading" msgid="7933681260296021180">"Caricamento..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml
index 202eb10..98bfa87 100644
--- a/packages/DocumentsUI/res/values-iw/strings.xml
+++ b/packages/DocumentsUI/res/values-iw/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"לא ניתן למחוק חלק מהמסמכים"</string>
     <string name="more" msgid="7117420986529297171">"עוד"</string>
     <string name="loading" msgid="7933681260296021180">"טוען..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml
index 4a1bdc9..9a83c1f 100644
--- a/packages/DocumentsUI/res/values-ja/strings.xml
+++ b/packages/DocumentsUI/res/values-ja/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"一部のドキュメントを削除できません"</string>
     <string name="more" msgid="7117420986529297171">"その他"</string>
     <string name="loading" msgid="7933681260296021180">"読み込んでいます..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml
index 32ba350..2b9338d 100644
--- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml
+++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"ზოგიერთი დოკუმენტის წაშლა ვერ ხერხდება"</string>
     <string name="more" msgid="7117420986529297171">"მეტი"</string>
     <string name="loading" msgid="7933681260296021180">"ჩატვირთვა…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-km-rKH/strings.xml b/packages/DocumentsUI/res/values-km-rKH/strings.xml
index 253e9b2..7455ef4 100644
--- a/packages/DocumentsUI/res/values-km-rKH/strings.xml
+++ b/packages/DocumentsUI/res/values-km-rKH/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"មិន​អាច​លុប​ឯកសារ​មួយ​ចំនួន"</string>
     <string name="more" msgid="7117420986529297171">"ច្រើន​ទៀត"</string>
     <string name="loading" msgid="7933681260296021180">"កំពុង​ផ្ទុក..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml
index e23aed4..b96ae3b 100644
--- a/packages/DocumentsUI/res/values-ko/strings.xml
+++ b/packages/DocumentsUI/res/values-ko/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"일부 문서를 삭제할 수 없음"</string>
     <string name="more" msgid="7117420986529297171">"더보기"</string>
     <string name="loading" msgid="7933681260296021180">"로드 중.."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml
index 8a1aea9..6f889ea 100644
--- a/packages/DocumentsUI/res/values-lo-rLA/strings.xml
+++ b/packages/DocumentsUI/res/values-lo-rLA/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"ບໍ່ສາມາດລຶບບາງເອກະສານໄດ້"</string>
     <string name="more" msgid="7117420986529297171">"ເພີ່ມເຕີມ"</string>
     <string name="loading" msgid="7933681260296021180">"ກຳລັງໂຫລດ..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml
index 9af9617..6bbc2ce 100644
--- a/packages/DocumentsUI/res/values-lt/strings.xml
+++ b/packages/DocumentsUI/res/values-lt/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Nepavyko ištrinti kai kurių dokumentų"</string>
     <string name="more" msgid="7117420986529297171">"Daugiau"</string>
     <string name="loading" msgid="7933681260296021180">"Įkeliama..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml
index 4d94b30..425c9a6 100644
--- a/packages/DocumentsUI/res/values-lv/strings.xml
+++ b/packages/DocumentsUI/res/values-lv/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Nevar dzēst dažus dokumentus."</string>
     <string name="more" msgid="7117420986529297171">"Vēl"</string>
     <string name="loading" msgid="7933681260296021180">"Notiek ielāde..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..49b12c9
--- /dev/null
+++ b/packages/DocumentsUI/res/values-mn-rMN/strings.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2013 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="2783841764617238354">"Документүүд"</string>
+    <string name="title_open" msgid="4353228937663917801">"Нээх"</string>
+    <string name="title_save" msgid="2433679664882857999">"Хадгалах"</string>
+    <string name="menu_create_dir" msgid="5947289605844398389">"Фолдер үүсгэх"</string>
+    <string name="menu_grid" msgid="6878021334497835259">"Эгнүүлж харах"</string>
+    <string name="menu_list" msgid="7279285939892417279">"Жагсааж харах"</string>
+    <string name="menu_sort" msgid="7677740407158414452">"Эрэмбэлэх"</string>
+    <string name="menu_search" msgid="3816712084502856974">"Хайх"</string>
+    <string name="menu_settings" msgid="6008033148948428823">"Тохиргоо"</string>
+    <string name="menu_open" msgid="432922957274920903">"Нээх"</string>
+    <string name="menu_save" msgid="2394743337684426338">"Хадгалах"</string>
+    <string name="menu_share" msgid="3075149983979628146">"Хуваалцах"</string>
+    <string name="menu_delete" msgid="8138799623850614177">"Устгах"</string>
+    <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> сонгогдсон"</string>
+    <string name="sort_name" msgid="9183560467917256779">"Нэрээр"</string>
+    <string name="sort_date" msgid="586080032956151448">"Өөрчлөгдсөн огноогоор"</string>
+    <string name="sort_size" msgid="3350681319735474741">"Хэмжээгээр"</string>
+    <string name="drawer_open" msgid="4545466532430226949">"Язгуурыг харуулах"</string>
+    <string name="drawer_close" msgid="7602734368552123318">"Язгуурыг нууцлах"</string>
+    <string name="save_error" msgid="6167009778003223664">"Документыг хадгалж чадсангүй"</string>
+    <string name="root_recent" msgid="4470053704320518133">"Саяхны"</string>
+    <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> чөлөөтэй"</string>
+    <string name="root_type_service" msgid="2857362700576006694">"Үйлчилгээнүүд"</string>
+    <string name="root_type_shortcut" msgid="3318760609471618093">"Товчлол"</string>
+    <string name="root_type_device" msgid="7121342474653483538">"Төхөөрөмжүүд"</string>
+    <string name="root_type_apps" msgid="8838065367985945189">"Өөр апп-ууд"</string>
+    <string name="pref_advanced_devices" msgid="903257239609301276">"Дэвшилтэт төхөөрөмжүүдийг харуулах"</string>
+    <string name="pref_file_size" msgid="2826879315743961459">"Файлын хэмжээг харуулах"</string>
+    <string name="pref_device_size" msgid="3542106883278997222">"Төхөөрөмжийн хэмжээг харуулах"</string>
+    <string name="empty" msgid="7858882803708117596">"Хоосон"</string>
+    <string name="toast_no_application" msgid="1339885974067891667">"Файлыг нээх боломжгүй"</string>
+    <string name="toast_failed_delete" msgid="2180678019407244069">"Зарим документуудыг устгах боломжгүй"</string>
+    <string name="more" msgid="7117420986529297171">"Цааш"</string>
+    <string name="loading" msgid="7933681260296021180">"Ачааллаж байна..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
+</resources>
diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml
index 504b459..f013e7a 100644
--- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml
+++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml
@@ -30,7 +30,7 @@
     <string name="menu_share" msgid="3075149983979628146">"Kongsi"</string>
     <string name="menu_delete" msgid="8138799623850614177">"Padam"</string>
     <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> dipilih"</string>
-    <string name="sort_name" msgid="9183560467917256779">"Oleh nama"</string>
+    <string name="sort_name" msgid="9183560467917256779">"Mengikut nama"</string>
     <string name="sort_date" msgid="586080032956151448">"Diubah suai mengikut tarikh"</string>
     <string name="sort_size" msgid="3350681319735474741">"Mengikut saiz"</string>
     <string name="drawer_open" msgid="4545466532430226949">"Tunjukkan akar"</string>
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat memadam beberapa dokumen"</string>
     <string name="more" msgid="7117420986529297171">"Lagi"</string>
     <string name="loading" msgid="7933681260296021180">"Memuatkan…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml
index b4d034d..fc5d0ce4f 100644
--- a/packages/DocumentsUI/res/values-nb/strings.xml
+++ b/packages/DocumentsUI/res/values-nb/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Enkelte dokumenter kunne ikke slettes"</string>
     <string name="more" msgid="7117420986529297171">"Mer"</string>
     <string name="loading" msgid="7933681260296021180">"Laster inn …"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-ne-rNP/strings.xml b/packages/DocumentsUI/res/values-ne-rNP/strings.xml
index 39e7cd1..c7aac6b 100644
--- a/packages/DocumentsUI/res/values-ne-rNP/strings.xml
+++ b/packages/DocumentsUI/res/values-ne-rNP/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"केही कागजातहरू मेट्न असमर्थ छ"</string>
     <string name="more" msgid="7117420986529297171">"थप"</string>
     <string name="loading" msgid="7933681260296021180">"लोड हुँदै..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml
index 03ecae4..60a61bf 100644
--- a/packages/DocumentsUI/res/values-nl/strings.xml
+++ b/packages/DocumentsUI/res/values-nl/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Kan bepaalde documenten niet verwijderen"</string>
     <string name="more" msgid="7117420986529297171">"Meer"</string>
     <string name="loading" msgid="7933681260296021180">"Laden..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml
index 125d81f..923e7ac 100644
--- a/packages/DocumentsUI/res/values-pl/strings.xml
+++ b/packages/DocumentsUI/res/values-pl/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Nie można usunąć niektórych dokumentów"</string>
     <string name="more" msgid="7117420986529297171">"Więcej"</string>
     <string name="loading" msgid="7933681260296021180">"Wczytywanie…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml
index 79fe252..93b3ca9 100644
--- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml
+++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml
@@ -37,7 +37,7 @@
     <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string>
     <string name="save_error" msgid="6167009778003223664">"Falha ao guardar o documento"</string>
     <string name="root_recent" msgid="4470053704320518133">"Recentes"</string>
-    <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> grátis"</string>
+    <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> espaço livre"</string>
     <string name="root_type_service" msgid="2857362700576006694">"Serviços"</string>
     <string name="root_type_shortcut" msgid="3318760609471618093">"Atalhos"</string>
     <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string>
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Não é possível eliminar alguns documentos"</string>
     <string name="more" msgid="7117420986529297171">"Mais"</string>
     <string name="loading" msgid="7933681260296021180">"A carregar…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml
index 1e72dca1..79dc36e 100644
--- a/packages/DocumentsUI/res/values-pt/strings.xml
+++ b/packages/DocumentsUI/res/values-pt/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Não foi possível excluir alguns documentos"</string>
     <string name="more" msgid="7117420986529297171">"Mais"</string>
     <string name="loading" msgid="7933681260296021180">"Carregando…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml
index b2f9284..01fc980 100644
--- a/packages/DocumentsUI/res/values-ro/strings.xml
+++ b/packages/DocumentsUI/res/values-ro/strings.xml
@@ -18,8 +18,8 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="2783841764617238354">"Documente"</string>
     <string name="title_open" msgid="4353228937663917801">"Deschideți din"</string>
-    <string name="title_save" msgid="2433679664882857999">"Salvaţi în"</string>
-    <string name="menu_create_dir" msgid="5947289605844398389">"Creaţi un dosar"</string>
+    <string name="title_save" msgid="2433679664882857999">"Salvați în"</string>
+    <string name="menu_create_dir" msgid="5947289605844398389">"Creați un dosar"</string>
     <string name="menu_grid" msgid="6878021334497835259">"Afișare tip grilă"</string>
     <string name="menu_list" msgid="7279285939892417279">"Afișare tip listă"</string>
     <string name="menu_sort" msgid="7677740407158414452">"Sortați după"</string>
@@ -32,9 +32,9 @@
     <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selectate"</string>
     <string name="sort_name" msgid="9183560467917256779">"După nume"</string>
     <string name="sort_date" msgid="586080032956151448">"După data modificării"</string>
-    <string name="sort_size" msgid="3350681319735474741">"În funcţie de dimensiune"</string>
-    <string name="drawer_open" msgid="4545466532430226949">"Afișați directoarele principale"</string>
-    <string name="drawer_close" msgid="7602734368552123318">"Ascundeți directoarele principale"</string>
+    <string name="sort_size" msgid="3350681319735474741">"După dimensiune"</string>
+    <string name="drawer_open" msgid="4545466532430226949">"Afișați directoarele rădăcină"</string>
+    <string name="drawer_close" msgid="7602734368552123318">"Ascundeți directoarele rădăcină"</string>
     <string name="save_error" msgid="6167009778003223664">"Salvarea documentului nu a reușit"</string>
     <string name="root_recent" msgid="4470053704320518133">"Recente"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> spațiu liber"</string>
@@ -46,8 +46,10 @@
     <string name="pref_file_size" msgid="2826879315743961459">"Afișați dimensiunile fișierelor"</string>
     <string name="pref_device_size" msgid="3542106883278997222">"Afișați capacitatea de stocare a dispozitivelor"</string>
     <string name="empty" msgid="7858882803708117596">"Nu există elemente"</string>
-    <string name="toast_no_application" msgid="1339885974067891667">"Fişierul nu poate fi deschis"</string>
+    <string name="toast_no_application" msgid="1339885974067891667">"Fișierul nu poate fi deschis"</string>
     <string name="toast_failed_delete" msgid="2180678019407244069">"Unele documente nu au putut fi șterse"</string>
     <string name="more" msgid="7117420986529297171">"Mai multe"</string>
     <string name="loading" msgid="7933681260296021180">"Se încarcă…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml
index f23c008..587a057 100644
--- a/packages/DocumentsUI/res/values-ru/strings.xml
+++ b/packages/DocumentsUI/res/values-ru/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Не удалось удалить некоторые документы"</string>
     <string name="more" msgid="7117420986529297171">"Ещё"</string>
     <string name="loading" msgid="7933681260296021180">"Загрузка…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-si-rLK/strings.xml b/packages/DocumentsUI/res/values-si-rLK/strings.xml
index b7a1b49..fefa4dd 100644
--- a/packages/DocumentsUI/res/values-si-rLK/strings.xml
+++ b/packages/DocumentsUI/res/values-si-rLK/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"සමහර ලේඛන මැකීමට නොහැකි විය"</string>
     <string name="more" msgid="7117420986529297171">"තව"</string>
     <string name="loading" msgid="7933681260296021180">"පූරණය වෙමින්..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml
index 3b8dabc..2b073db 100644
--- a/packages/DocumentsUI/res/values-sk/strings.xml
+++ b/packages/DocumentsUI/res/values-sk/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Niektoré dokumenty sa nepodarilo odstrániť"</string>
     <string name="more" msgid="7117420986529297171">"Viac"</string>
     <string name="loading" msgid="7933681260296021180">"Prebieha načítavanie..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-sl/strings.xml b/packages/DocumentsUI/res/values-sl/strings.xml
index b9a265f..b5ee908 100644
--- a/packages/DocumentsUI/res/values-sl/strings.xml
+++ b/packages/DocumentsUI/res/values-sl/strings.xml
@@ -22,7 +22,7 @@
     <string name="menu_create_dir" msgid="5947289605844398389">"Ustvarjanje mape"</string>
     <string name="menu_grid" msgid="6878021334497835259">"Mrežni pogled"</string>
     <string name="menu_list" msgid="7279285939892417279">"Pogled seznama"</string>
-    <string name="menu_sort" msgid="7677740407158414452">"Uredi glede na"</string>
+    <string name="menu_sort" msgid="7677740407158414452">"Razvrsti glede na"</string>
     <string name="menu_search" msgid="3816712084502856974">"Iskanje"</string>
     <string name="menu_settings" msgid="6008033148948428823">"Nastavitve"</string>
     <string name="menu_open" msgid="432922957274920903">"Odpri"</string>
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Nekaterih dokumentov ni mogoče izbrisati"</string>
     <string name="more" msgid="7117420986529297171">"Več"</string>
     <string name="loading" msgid="7933681260296021180">"Nalaganje …"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml
index b5042e7..3310f3e 100644
--- a/packages/DocumentsUI/res/values-sr/strings.xml
+++ b/packages/DocumentsUI/res/values-sr/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Није могуће избрисати неке документе"</string>
     <string name="more" msgid="7117420986529297171">"Још"</string>
     <string name="loading" msgid="7933681260296021180">"Учитавање…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml
index 8737033..55f3f54 100644
--- a/packages/DocumentsUI/res/values-sv/strings.xml
+++ b/packages/DocumentsUI/res/values-sv/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Det gick inte att ta bort vissa dokument"</string>
     <string name="more" msgid="7117420986529297171">"Mer"</string>
     <string name="loading" msgid="7933681260296021180">"Läser in …"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml
index affed56..b6e128f 100644
--- a/packages/DocumentsUI/res/values-sw/strings.xml
+++ b/packages/DocumentsUI/res/values-sw/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Imeshindwa kufuta baadhi ya hati"</string>
     <string name="more" msgid="7117420986529297171">"Zaidi"</string>
     <string name="loading" msgid="7933681260296021180">"Inapakia…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml
index 7e786ba..08dc27b 100644
--- a/packages/DocumentsUI/res/values-th/strings.xml
+++ b/packages/DocumentsUI/res/values-th/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"ไม่สามารถลบเอกสารบางรายการ"</string>
     <string name="more" msgid="7117420986529297171">"เพิ่มเติม"</string>
     <string name="loading" msgid="7933681260296021180">"กำลังโหลด..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml
index ae1608b..57e6380 100644
--- a/packages/DocumentsUI/res/values-tl/strings.xml
+++ b/packages/DocumentsUI/res/values-tl/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Hindi matanggal ang ilang dokumento"</string>
     <string name="more" msgid="7117420986529297171">"Higit pa"</string>
     <string name="loading" msgid="7933681260296021180">"Naglo-load…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml
index bdd85cf..0c87107 100644
--- a/packages/DocumentsUI/res/values-tr/strings.xml
+++ b/packages/DocumentsUI/res/values-tr/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Bazı dokümanlar silinemiyor"</string>
     <string name="more" msgid="7117420986529297171">"Diğer"</string>
     <string name="loading" msgid="7933681260296021180">"Yükleniyor..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml
index f1a443d..bdaab59 100644
--- a/packages/DocumentsUI/res/values-uk/strings.xml
+++ b/packages/DocumentsUI/res/values-uk/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Не вдалося видалити деякі документи"</string>
     <string name="more" msgid="7117420986529297171">"Більше"</string>
     <string name="loading" msgid="7933681260296021180">"Завантаження..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml
index 058c870..8257d9b 100644
--- a/packages/DocumentsUI/res/values-vi/strings.xml
+++ b/packages/DocumentsUI/res/values-vi/strings.xml
@@ -39,7 +39,7 @@
     <string name="root_recent" msgid="4470053704320518133">"Gần đây"</string>
     <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> còn trống"</string>
     <string name="root_type_service" msgid="2857362700576006694">"Dịch vụ"</string>
-    <string name="root_type_shortcut" msgid="3318760609471618093">"Phím tắt"</string>
+    <string name="root_type_shortcut" msgid="3318760609471618093">"Lối tắt"</string>
     <string name="root_type_device" msgid="7121342474653483538">"Thiết bị"</string>
     <string name="root_type_apps" msgid="8838065367985945189">"Các ứng dụng khác"</string>
     <string name="pref_advanced_devices" msgid="903257239609301276">"Hiển thị các thiết bị nâng cao"</string>
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Không thể xóa một số tài liệu"</string>
     <string name="more" msgid="7117420986529297171">"Thêm"</string>
     <string name="loading" msgid="7933681260296021180">"Đang tải…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml
index 4f6f15c..882aee2 100644
--- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml
@@ -17,8 +17,8 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="2783841764617238354">"文档"</string>
-    <string name="title_open" msgid="4353228937663917801">"打开方式:"</string>
-    <string name="title_save" msgid="2433679664882857999">"保存到:"</string>
+    <string name="title_open" msgid="4353228937663917801">"打开文件"</string>
+    <string name="title_save" msgid="2433679664882857999">"保存文件"</string>
     <string name="menu_create_dir" msgid="5947289605844398389">"新建文件夹"</string>
     <string name="menu_grid" msgid="6878021334497835259">"网格视图"</string>
     <string name="menu_list" msgid="7279285939892417279">"列表视图"</string>
@@ -27,7 +27,7 @@
     <string name="menu_settings" msgid="6008033148948428823">"设置"</string>
     <string name="menu_open" msgid="432922957274920903">"打开"</string>
     <string name="menu_save" msgid="2394743337684426338">"保存"</string>
-    <string name="menu_share" msgid="3075149983979628146">"共享"</string>
+    <string name="menu_share" msgid="3075149983979628146">"分享"</string>
     <string name="menu_delete" msgid="8138799623850614177">"删除"</string>
     <string name="mode_selected_count" msgid="459111894725594625">"已选择<xliff:g id="COUNT">%1$d</xliff:g>项"</string>
     <string name="sort_name" msgid="9183560467917256779">"按名称"</string>
@@ -45,9 +45,11 @@
     <string name="pref_advanced_devices" msgid="903257239609301276">"显示高级设备"</string>
     <string name="pref_file_size" msgid="2826879315743961459">"显示文件大小"</string>
     <string name="pref_device_size" msgid="3542106883278997222">"显示设备大小"</string>
-    <string name="empty" msgid="7858882803708117596">"无任何项"</string>
+    <string name="empty" msgid="7858882803708117596">"无任何文件"</string>
     <string name="toast_no_application" msgid="1339885974067891667">"无法打开文件"</string>
     <string name="toast_failed_delete" msgid="2180678019407244069">"无法删除部分文档"</string>
     <string name="more" msgid="7117420986529297171">"更多"</string>
     <string name="loading" msgid="7933681260296021180">"正在加载..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
index 7d2af3a..773b8b3 100644
--- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string>
     <string name="more" msgid="7117420986529297171">"更多"</string>
     <string name="loading" msgid="7933681260296021180">"正在載入..."</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml
index 2246bd7..0852a1b 100644
--- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string>
     <string name="more" msgid="7117420986529297171">"更多"</string>
     <string name="loading" msgid="7933681260296021180">"載入中…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml
index 6a630d7..d4ad405 100644
--- a/packages/DocumentsUI/res/values-zu/strings.xml
+++ b/packages/DocumentsUI/res/values-zu/strings.xml
@@ -50,4 +50,6 @@
     <string name="toast_failed_delete" msgid="2180678019407244069">"Ayikwazi ukususa amanye amadokhumenti"</string>
     <string name="more" msgid="7117420986529297171">"Okuningi"</string>
     <string name="loading" msgid="7933681260296021180">"Iyalayisha…"</string>
+    <!-- no translation found for share_via (8966594246261344259) -->
+    <skip />
 </resources>
diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml
index 928ba85..f4a822d 100644
--- a/packages/DocumentsUI/res/values/strings.xml
+++ b/packages/DocumentsUI/res/values/strings.xml
@@ -63,4 +63,6 @@
     <string name="more">More</string>
     <string name="loading">Loading\u2026</string>
 
+    <string name="share_via">Share via</string>
+
 </resources>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
index 575947f..e0b8d19 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
@@ -21,22 +21,19 @@
 import android.app.DialogFragment;
 import android.app.FragmentManager;
 import android.content.ContentResolver;
-import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
 import android.net.Uri;
 import android.os.Bundle;
-import android.provider.DocumentsContract.DocumentColumns;
-import android.provider.DocumentsContract.Documents;
+import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Document;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.Toast;
 
-import com.android.documentsui.model.Document;
-
-import java.io.FileNotFoundException;
+import com.android.documentsui.model.DocumentInfo;
 
 /**
  * Dialog to create a new directory.
@@ -58,7 +55,7 @@
         final LayoutInflater dialogInflater = LayoutInflater.from(builder.getContext());
 
         final View view = dialogInflater.inflate(R.layout.dialog_create_dir, null, false);
-        final EditText text1 = (EditText)view.findViewById(android.R.id.text1);
+        final EditText text1 = (EditText) view.findViewById(android.R.id.text1);
 
         builder.setTitle(R.string.menu_create_dir);
         builder.setView(view);
@@ -68,23 +65,17 @@
             public void onClick(DialogInterface dialog, int which) {
                 final String displayName = text1.getText().toString();
 
-                final ContentValues values = new ContentValues();
-                values.put(DocumentColumns.MIME_TYPE, Documents.MIME_TYPE_DIR);
-                values.put(DocumentColumns.DISPLAY_NAME, displayName);
-
                 final DocumentsActivity activity = (DocumentsActivity) getActivity();
-                final Document cwd = activity.getCurrentDirectory();
+                final DocumentInfo cwd = activity.getCurrentDirectory();
 
-                Uri childUri = resolver.insert(cwd.uri, values);
                 try {
-                    // Navigate into newly created child
-                    final Document childDoc = Document.fromUri(resolver, childUri);
-                    activity.onDocumentPicked(childDoc);
-                } catch (FileNotFoundException e) {
-                    childUri = null;
-                }
+                    final Uri childUri = DocumentsContract.createDocument(
+                            resolver, cwd.uri, Document.MIME_TYPE_DIR, displayName);
 
-                if (childUri == null) {
+                    // Navigate into newly created child
+                    final DocumentInfo childDoc = DocumentInfo.fromUri(resolver, childUri);
+                    activity.onDocumentPicked(childDoc);
+                } catch (Exception e) {
                     Toast.makeText(context, R.string.save_error, Toast.LENGTH_SHORT).show();
                 }
             }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index dd9aee5..33d7d6af 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -17,12 +17,12 @@
 package com.android.documentsui;
 
 import static com.android.documentsui.DocumentsActivity.TAG;
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_MANAGE;
-import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_GRID;
-import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_LIST;
-import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_DATE;
-import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_NAME;
-import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_SIZE;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_MANAGE;
+import static com.android.documentsui.DocumentsActivity.State.MODE_GRID;
+import static com.android.documentsui.DocumentsActivity.State.MODE_LIST;
+import static com.android.documentsui.model.DocumentInfo.getCursorInt;
+import static com.android.documentsui.model.DocumentInfo.getCursorLong;
+import static com.android.documentsui.model.DocumentInfo.getCursorString;
 
 import android.app.Fragment;
 import android.app.FragmentManager;
@@ -39,6 +39,7 @@
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Document;
 import android.text.format.DateUtils;
 import android.text.format.Formatter;
 import android.text.format.Time;
@@ -55,21 +56,19 @@
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.BaseAdapter;
-import android.widget.Button;
 import android.widget.GridView;
 import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.android.documentsui.DocumentsActivity.DisplayState;
-import com.android.documentsui.model.Document;
-import com.android.documentsui.model.Root;
+import com.android.documentsui.DocumentsActivity.State;
+import com.android.documentsui.model.DocumentInfo;
+import com.android.documentsui.model.RootInfo;
 import com.android.internal.util.Predicate;
 import com.google.android.collect.Lists;
 
 import java.util.ArrayList;
-import java.util.Comparator;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -81,11 +80,10 @@
     private View mEmptyView;
     private ListView mListView;
     private GridView mGridView;
-    private Button mMoreView;
 
     private AbsListView mCurrentView;
 
-    private Predicate<Document> mFilter;
+    private Predicate<DocumentInfo> mFilter;
 
     public static final int TYPE_NORMAL = 1;
     public static final int TYPE_SEARCH = 2;
@@ -99,29 +97,38 @@
     private LoaderCallbacks<DirectoryResult> mCallbacks;
 
     private static final String EXTRA_TYPE = "type";
-    private static final String EXTRA_URI = "uri";
+    private static final String EXTRA_AUTHORITY = "authority";
+    private static final String EXTRA_ROOT_ID = "rootId";
+    private static final String EXTRA_DOC_ID = "docId";
+    private static final String EXTRA_QUERY = "query";
 
     private static AtomicInteger sLoaderId = new AtomicInteger(4000);
 
+    private int mLastSortOrder = -1;
+
     private final int mLoaderId = sLoaderId.incrementAndGet();
 
     public static void showNormal(FragmentManager fm, Uri uri) {
-        show(fm, TYPE_NORMAL, uri);
+        show(fm, TYPE_NORMAL, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), null);
     }
 
     public static void showSearch(FragmentManager fm, Uri uri, String query) {
-        final Uri searchUri = DocumentsContract.buildSearchUri(uri, query);
-        show(fm, TYPE_SEARCH, searchUri);
+        show(fm, TYPE_SEARCH, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri),
+                query);
     }
 
     public static void showRecentsOpen(FragmentManager fm) {
-        show(fm, TYPE_RECENT_OPEN, null);
+        show(fm, TYPE_RECENT_OPEN, null, null, null, null);
     }
 
-    private static void show(FragmentManager fm, int type, Uri uri) {
+    private static void show(FragmentManager fm, int type, String authority, String rootId,
+            String docId, String query) {
         final Bundle args = new Bundle();
         args.putInt(EXTRA_TYPE, type);
-        args.putParcelable(EXTRA_URI, uri);
+        args.putString(EXTRA_AUTHORITY, authority);
+        args.putString(EXTRA_ROOT_ID, rootId);
+        args.putString(EXTRA_DOC_ID, docId);
+        args.putString(EXTRA_QUERY, query);
 
         final DirectoryFragment fragment = new DirectoryFragment();
         fragment.setArguments(args);
@@ -140,7 +147,6 @@
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         final Context context = inflater.getContext();
-
         final View view = inflater.inflate(R.layout.fragment_directory, container, false);
 
         mEmptyView = view.findViewById(android.R.id.empty);
@@ -153,107 +159,77 @@
         mGridView.setOnItemClickListener(mItemListener);
         mGridView.setMultiChoiceModeListener(mMultiListener);
 
-        mMoreView = (Button) view.findViewById(R.id.more);
+        return view;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        final Context context = getActivity();
 
         mAdapter = new DocumentsAdapter();
-
-        final Uri uri = getArguments().getParcelable(EXTRA_URI);
         mType = getArguments().getInt(EXTRA_TYPE);
 
         mCallbacks = new LoaderCallbacks<DirectoryResult>() {
             @Override
             public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) {
-                final DisplayState state = getDisplayState(DirectoryFragment.this);
-                mFilter = new MimePredicate(state.acceptMimes);
+                final State state = getDisplayState(DirectoryFragment.this);
+
+                final String authority = getArguments().getString(EXTRA_AUTHORITY);
+                final String rootId = getArguments().getString(EXTRA_ROOT_ID);
+                final String docId = getArguments().getString(EXTRA_DOC_ID);
+                final String query = getArguments().getString(EXTRA_QUERY);
 
                 Uri contentsUri;
-                if (mType == TYPE_NORMAL) {
-                    contentsUri = DocumentsContract.buildContentsUri(uri);
-                } else if (mType == TYPE_RECENT_OPEN) {
-                    contentsUri = RecentsProvider.buildRecentOpen();
-                } else {
-                    contentsUri = uri;
-                }
+                switch (mType) {
+                    case TYPE_NORMAL:
+                        contentsUri = DocumentsContract.buildChildDocumentsUri(authority, docId);
+                        return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder);
+                    case TYPE_SEARCH:
+                        contentsUri = DocumentsContract.buildSearchDocumentsUri(
+                                authority, docId, query);
+                        return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder);
+                    case TYPE_RECENT_OPEN:
+                        final RootsCache roots = DocumentsApplication.getRootsCache(context);
+                        final List<RootInfo> matchingRoots = roots.getMatchingRoots(state);
+                        return new RecentLoader(context, matchingRoots);
+                    default:
+                        throw new IllegalStateException("Unknown type " + mType);
 
-                if (state.localOnly) {
-                    contentsUri = DocumentsContract.setLocalOnly(contentsUri);
                 }
-
-                final Comparator<Document> sortOrder;
-                if (state.sortOrder == SORT_ORDER_DATE || mType == TYPE_RECENT_OPEN) {
-                    sortOrder = new Document.DateComparator();
-                } else if (state.sortOrder == SORT_ORDER_NAME) {
-                    sortOrder = new Document.NameComparator();
-                } else if (state.sortOrder == SORT_ORDER_SIZE) {
-                    sortOrder = new Document.SizeComparator();
-                } else {
-                    throw new IllegalArgumentException("Unknown sort order " + state.sortOrder);
-                }
-
-                return new DirectoryLoader(context, contentsUri, mType, null, sortOrder);
             }
 
             @Override
             public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) {
-                mAdapter.swapDocuments(result.contents);
-
-                final Cursor cursor = result.cursor;
-                if (cursor != null && cursor.getExtras()
-                        .getBoolean(DocumentsContract.EXTRA_HAS_MORE, false)) {
-                    mMoreView.setText(R.string.more);
-                    mMoreView.setVisibility(View.VISIBLE);
-                    mMoreView.setOnClickListener(new View.OnClickListener() {
-                        @Override
-                        public void onClick(View v) {
-                            mMoreView.setText(R.string.loading);
-                            final Bundle bundle = new Bundle();
-                            bundle.putBoolean(DocumentsContract.EXTRA_REQUEST_MORE, true);
-                            try {
-                                cursor.respond(bundle);
-                            } catch (Exception e) {
-                                Log.w(TAG, "Failed to respond: " + e);
-                            }
-                        }
-                    });
-                } else {
-                    mMoreView.setVisibility(View.GONE);
-                }
+                mAdapter.swapCursor(result.cursor);
             }
 
             @Override
             public void onLoaderReset(Loader<DirectoryResult> loader) {
-                mAdapter.swapDocuments(null);
+                mAdapter.swapCursor(null);
             }
         };
 
         updateDisplayState();
-
-        return view;
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        getLoaderManager().restartLoader(mLoaderId, getArguments(), mCallbacks);
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        getLoaderManager().destroyLoader(mLoaderId);
     }
 
     public void updateDisplayState() {
-        final DisplayState state = getDisplayState(this);
+        final State state = getDisplayState(this);
 
-        // TODO: avoid kicking loader when nothing changed
-        getLoaderManager().restartLoader(mLoaderId, getArguments(), mCallbacks);
+        if (mLastSortOrder != state.sortOrder) {
+            getLoaderManager().restartLoader(mLoaderId, null, mCallbacks);
+            mLastSortOrder = state.sortOrder;
+        }
+
         mListView.smoothScrollToPosition(0);
         mGridView.smoothScrollToPosition(0);
 
         mListView.setVisibility(state.mode == MODE_LIST ? View.VISIBLE : View.GONE);
         mGridView.setVisibility(state.mode == MODE_GRID ? View.VISIBLE : View.GONE);
 
+        mFilter = new MimePredicate(state.acceptMimes);
+
         final int choiceMode;
         if (state.allowMultiple) {
             choiceMode = ListView.CHOICE_MODE_MULTIPLE_MODAL;
@@ -288,7 +264,8 @@
     private OnItemClickListener mItemListener = new OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-            final Document doc = mAdapter.getItem(position);
+            final Cursor cursor = mAdapter.getItem(position);
+            final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
             if (mFilter.apply(doc)) {
                 ((DocumentsActivity) getActivity()).onDocumentPicked(doc);
             }
@@ -304,7 +281,7 @@
 
         @Override
         public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-            final DisplayState state = getDisplayState(DirectoryFragment.this);
+            final State state = getDisplayState(DirectoryFragment.this);
 
             final MenuItem open = menu.findItem(R.id.menu_open);
             final MenuItem share = menu.findItem(R.id.menu_share);
@@ -321,11 +298,12 @@
         @Override
         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
             final SparseBooleanArray checked = mCurrentView.getCheckedItemPositions();
-            final ArrayList<Document> docs = Lists.newArrayList();
+            final ArrayList<DocumentInfo> docs = Lists.newArrayList();
             final int size = checked.size();
             for (int i = 0; i < size; i++) {
                 if (checked.valueAt(i)) {
-                    final Document doc = mAdapter.getItem(checked.keyAt(i));
+                    final Cursor cursor = mAdapter.getItem(checked.keyAt(i));
+                    final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
                     docs.add(doc);
                 }
             }
@@ -333,14 +311,17 @@
             final int id = item.getItemId();
             if (id == R.id.menu_open) {
                 DocumentsActivity.get(DirectoryFragment.this).onDocumentsPicked(docs);
+                mode.finish();
                 return true;
 
             } else if (id == R.id.menu_share) {
                 onShareDocuments(docs);
+                mode.finish();
                 return true;
 
             } else if (id == R.id.menu_delete) {
                 onDeleteDocuments(docs);
+                mode.finish();
                 return true;
 
             } else {
@@ -358,8 +339,9 @@
                 ActionMode mode, int position, long id, boolean checked) {
             if (checked) {
                 // Directories cannot be checked
-                final Document doc = mAdapter.getItem(position);
-                if (doc.isDirectory()) {
+                final Cursor cursor = mAdapter.getItem(position);
+                final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+                if (Document.MIME_TYPE_DIR.equals(docMimeType)) {
                     mCurrentView.setItemChecked(position, false);
                 }
             }
@@ -369,49 +351,54 @@
         }
     };
 
-    private void onShareDocuments(List<Document> docs) {
-        final ArrayList<Uri> uris = Lists.newArrayList();
-        for (Document doc : docs) {
-            uris.add(doc.uri);
-        }
+    private void onShareDocuments(List<DocumentInfo> docs) {
+        Intent intent;
+        if (docs.size() == 1) {
+            final DocumentInfo doc = docs.get(0);
 
-        final Intent intent;
-        if (uris.size() > 1) {
-            intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
-            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-            intent.addCategory(Intent.CATEGORY_DEFAULT);
-            // TODO: find common mimetype
-            intent.setType("*/*");
-            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
-        } else {
             intent = new Intent(Intent.ACTION_SEND);
             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
             intent.addCategory(Intent.CATEGORY_DEFAULT);
-            intent.setData(uris.get(0));
+            intent.setType(doc.mimeType);
+            intent.putExtra(Intent.EXTRA_STREAM, doc.uri);
+
+        } else if (docs.size() > 1) {
+            intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
+            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            intent.addCategory(Intent.CATEGORY_DEFAULT);
+
+            final ArrayList<String> mimeTypes = Lists.newArrayList();
+            final ArrayList<Uri> uris = Lists.newArrayList();
+            for (DocumentInfo doc : docs) {
+                mimeTypes.add(doc.mimeType);
+                uris.add(doc.uri);
+            }
+
+            intent.setType(findCommonMimeType(mimeTypes));
+            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
+
+        } else {
+            return;
         }
 
+        intent = Intent.createChooser(intent, getActivity().getText(R.string.share_via));
         startActivity(intent);
     }
 
-    private void onDeleteDocuments(List<Document> docs) {
+    private void onDeleteDocuments(List<DocumentInfo> docs) {
         final Context context = getActivity();
         final ContentResolver resolver = context.getContentResolver();
 
         boolean hadTrouble = false;
-        for (Document doc : docs) {
+        for (DocumentInfo doc : docs) {
             if (!doc.isDeleteSupported()) {
                 Log.w(TAG, "Skipping " + doc);
                 hadTrouble = true;
                 continue;
             }
 
-            try {
-                if (resolver.delete(doc.uri, null, null) != 1) {
-                    Log.w(TAG, "Failed to delete " + doc);
-                    hadTrouble = true;
-                }
-            } catch (Exception e) {
-                Log.w(TAG, "Failed to delete " + doc + ": " + e);
+            if (!DocumentsContract.deleteDocument(resolver, doc.uri)) {
+                Log.w(TAG, "Failed to delete " + doc);
                 hadTrouble = true;
             }
         }
@@ -421,20 +408,89 @@
         }
     }
 
-    private static DisplayState getDisplayState(Fragment fragment) {
+    private static State getDisplayState(Fragment fragment) {
         return ((DocumentsActivity) fragment.getActivity()).getDisplayState();
     }
 
-    private class DocumentsAdapter extends BaseAdapter {
-        private List<Document> mDocuments;
+    private interface Footer {
+        public View getView(View convertView, ViewGroup parent);
+    }
 
-        public DocumentsAdapter() {
+    private static class LoadingFooter implements Footer {
+        @Override
+        public View getView(View convertView, ViewGroup parent) {
+            final Context context = parent.getContext();
+            if (convertView == null) {
+                final LayoutInflater inflater = LayoutInflater.from(context);
+                convertView = inflater.inflate(R.layout.item_loading, parent, false);
+            }
+            return convertView;
+        }
+    }
+
+    private class MessageFooter implements Footer {
+        private final int mIcon;
+        private final String mMessage;
+
+        public MessageFooter(int icon, String message) {
+            mIcon = icon;
+            mMessage = message;
         }
 
-        public void swapDocuments(List<Document> documents) {
-            mDocuments = documents;
+        @Override
+        public View getView(View convertView, ViewGroup parent) {
+            final Context context = parent.getContext();
+            final State state = getDisplayState(DirectoryFragment.this);
 
-            if (mDocuments != null && mDocuments.isEmpty()) {
+            if (convertView == null) {
+                final LayoutInflater inflater = LayoutInflater.from(context);
+                if (state.mode == MODE_LIST) {
+                    convertView = inflater.inflate(R.layout.item_message_list, parent, false);
+                } else if (state.mode == MODE_GRID) {
+                    convertView = inflater.inflate(R.layout.item_message_grid, parent, false);
+                } else {
+                    throw new IllegalStateException();
+                }
+            }
+
+            final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon);
+            final TextView title = (TextView) convertView.findViewById(android.R.id.title);
+            icon.setImageResource(mIcon);
+            title.setText(mMessage);
+            return convertView;
+        }
+    }
+
+    private class DocumentsAdapter extends BaseAdapter {
+        private Cursor mCursor;
+        private int mCursorCount;
+
+        private List<Footer> mFooters = Lists.newArrayList();
+
+        public void swapCursor(Cursor cursor) {
+            mCursor = cursor;
+            mCursorCount = cursor != null ? cursor.getCount() : 0;
+
+            mFooters.clear();
+
+            final Bundle extras = cursor != null ? cursor.getExtras() : null;
+            if (extras != null) {
+                final String info = extras.getString(DocumentsContract.EXTRA_INFO);
+                if (info != null) {
+                    mFooters.add(new MessageFooter(
+                            com.android.internal.R.drawable.ic_menu_info_details, info));
+                }
+                final String error = extras.getString(DocumentsContract.EXTRA_ERROR);
+                if (error != null) {
+                    mFooters.add(new MessageFooter(
+                            com.android.internal.R.drawable.ic_dialog_alert, error));
+                }
+                if (extras.getBoolean(DocumentsContract.EXTRA_LOADING, false)) {
+                    mFooters.add(new LoadingFooter());
+                }
+            }
+
+            if (isEmpty()) {
                 mEmptyView.setVisibility(View.VISIBLE);
             } else {
                 mEmptyView.setVisibility(View.GONE);
@@ -445,8 +501,17 @@
 
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
+            if (position < mCursorCount) {
+                return getDocumentView(position, convertView, parent);
+            } else {
+                position -= mCursorCount;
+                return mFooters.get(position).getView(convertView, parent);
+            }
+        }
+
+        private View getDocumentView(int position, View convertView, ViewGroup parent) {
             final Context context = parent.getContext();
-            final DisplayState state = getDisplayState(DirectoryFragment.this);
+            final State state = getDisplayState(DirectoryFragment.this);
 
             final RootsCache roots = DocumentsApplication.getRootsCache(context);
             final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache(
@@ -463,7 +528,18 @@
                 }
             }
 
-            final Document doc = getItem(position);
+            final Cursor cursor = getItem(position);
+
+            final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY);
+            final String docRootId = getCursorString(cursor, RootCursorWrapper.COLUMN_ROOT_ID);
+            final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
+            final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+            final String docDisplayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
+            final long docLastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
+            final int docIcon = getCursorInt(cursor, Document.COLUMN_ICON);
+            final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS);
+            final String docSummary = getCursorString(cursor, Document.COLUMN_SUMMARY);
+            final long docSize = getCursorLong(cursor, Document.COLUMN_SIZE);
 
             final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon);
             final TextView title = (TextView) convertView.findViewById(android.R.id.title);
@@ -478,37 +554,39 @@
                 oldTask.cancel(false);
             }
 
-            if (doc.isThumbnailSupported()) {
-                final Bitmap cachedResult = thumbs.get(doc.uri);
+            if ((docFlags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0) {
+                final Uri uri = DocumentsContract.buildDocumentUri(docAuthority, docId);
+                final Bitmap cachedResult = thumbs.get(uri);
                 if (cachedResult != null) {
                     icon.setImageBitmap(cachedResult);
                 } else {
                     final ThumbnailAsyncTask task = new ThumbnailAsyncTask(icon, mThumbSize);
                     icon.setImageBitmap(null);
                     icon.setTag(task);
-                    task.execute(doc.uri);
+                    task.execute(uri);
                 }
+            } else if (docIcon != 0) {
+                icon.setImageDrawable(DocumentInfo.loadIcon(context, docAuthority, docIcon));
             } else {
-                icon.setImageDrawable(roots.resolveDocumentIcon(
-                        context, doc.uri.getAuthority(), doc.mimeType));
+                icon.setImageDrawable(RootsCache.resolveDocumentIcon(context, docMimeType));
             }
 
-            title.setText(doc.displayName);
+            title.setText(docDisplayName);
 
-            if (mType == TYPE_NORMAL || mType == TYPE_SEARCH) {
+            if (mType == TYPE_RECENT_OPEN) {
+                final RootInfo root = roots.getRoot(docAuthority, docRootId);
+                icon1.setVisibility(View.VISIBLE);
+                icon1.setImageDrawable(root.loadIcon(context));
+                summary.setText(root.getDirectoryString());
+                summary.setVisibility(View.VISIBLE);
+            } else {
                 icon1.setVisibility(View.GONE);
-                if (doc.summary != null) {
-                    summary.setText(doc.summary);
+                if (docSummary != null) {
+                    summary.setText(docSummary);
                     summary.setVisibility(View.VISIBLE);
                 } else {
                     summary.setVisibility(View.INVISIBLE);
                 }
-            } else if (mType == TYPE_RECENT_OPEN) {
-                final Root root = roots.findRoot(doc);
-                icon1.setVisibility(View.VISIBLE);
-                icon1.setImageDrawable(root.icon);
-                summary.setText(root.getDirectoryString());
-                summary.setVisibility(View.VISIBLE);
             }
 
             if (summaryGrid != null) {
@@ -516,18 +594,18 @@
                         (summary.getVisibility() == View.VISIBLE) ? View.VISIBLE : View.GONE);
             }
 
-            if (doc.lastModified == -1) {
+            if (docLastModified == -1) {
                 date.setText(null);
             } else {
-                date.setText(formatTime(context, doc.lastModified));
+                date.setText(formatTime(context, docLastModified));
             }
 
             if (state.showSize) {
                 size.setVisibility(View.VISIBLE);
-                if (doc.isDirectory() || doc.size == -1) {
+                if (Document.MIME_TYPE_DIR.equals(docMimeType) || docSize == -1) {
                     size.setText(null);
                 } else {
-                    size.setText(Formatter.formatFileSize(context, doc.size));
+                    size.setText(Formatter.formatFileSize(context, docSize));
                 }
             } else {
                 size.setVisibility(View.GONE);
@@ -538,17 +616,41 @@
 
         @Override
         public int getCount() {
-            return mDocuments != null ? mDocuments.size() : 0;
+            return mCursorCount + mFooters.size();
         }
 
         @Override
-        public Document getItem(int position) {
-            return mDocuments.get(position);
+        public Cursor getItem(int position) {
+            if (position < mCursorCount) {
+                mCursor.moveToPosition(position);
+                return mCursor;
+            } else {
+                return null;
+            }
         }
 
         @Override
         public long getItemId(int position) {
-            return getItem(position).uri.hashCode();
+            return position;
+        }
+
+        @Override
+        public int getItemViewType(int position) {
+            if (position < mCursorCount) {
+                return 0;
+            } else {
+                return IGNORE_ITEM_VIEW_TYPE;
+            }
+        }
+
+        @Override
+        public boolean areAllItemsEnabled() {
+            return false;
+        }
+
+        @Override
+        public boolean isEnabled(int position) {
+            return position < mCursorCount;
         }
     }
 
@@ -573,8 +675,8 @@
 
             Bitmap result = null;
             try {
-                result = DocumentsContract.getThumbnail(
-                        context.getContentResolver(), uri, mThumbSize);
+                result = DocumentsContract.getDocumentThumbnail(
+                        context.getContentResolver(), uri, mThumbSize, null);
                 if (result != null) {
                     final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache(
                             context, mThumbSize);
@@ -615,4 +717,28 @@
 
         return DateUtils.formatDateTime(context, when, flags);
     }
+
+    private String findCommonMimeType(List<String> mimeTypes) {
+        String[] commonType = mimeTypes.get(0).split("/");
+        if (commonType.length != 2) {
+            return "*/*";
+        }
+
+        for (int i = 1; i < mimeTypes.size(); i++) {
+            String[] type = mimeTypes.get(i).split("/");
+            if (type.length != 2) continue;
+
+            if (!commonType[1].equals(type[1])) {
+                commonType[1] = "*";
+            }
+
+            if (!commonType[0].equals(type[0])) {
+                commonType[0] = "*";
+                commonType[1] = "*";
+                break;
+            }
+        }
+
+        return commonType[0] + "/" + commonType[1];
+    }
 }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
index 14d6fd5..6ea57d7 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java
@@ -16,110 +16,156 @@
 
 package com.android.documentsui;
 
-import static com.android.documentsui.DirectoryFragment.TYPE_NORMAL;
-import static com.android.documentsui.DirectoryFragment.TYPE_RECENT_OPEN;
-import static com.android.documentsui.DirectoryFragment.TYPE_SEARCH;
-import static com.android.documentsui.DocumentsActivity.TAG;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_DISPLAY_NAME;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_SIZE;
 
-import android.content.ContentResolver;
+import android.content.AsyncTaskLoader;
+import android.content.ContentProviderClient;
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.CancellationSignal;
-import android.provider.DocumentsContract.DocumentColumns;
-import android.util.Log;
-
-import com.android.documentsui.model.Document;
-import com.android.internal.util.Predicate;
-import com.google.android.collect.Lists;
+import android.os.OperationCanceledException;
+import android.provider.DocumentsContract.Document;
 
 import libcore.io.IoUtils;
 
-import java.io.FileNotFoundException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
 class DirectoryResult implements AutoCloseable {
+    ContentProviderClient client;
     Cursor cursor;
-    List<Document> contents = Lists.newArrayList();
-    Exception e;
+    Exception exception;
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         IoUtils.closeQuietly(cursor);
+        ContentProviderClient.closeQuietly(client);
+        cursor = null;
+        client = null;
     }
 }
 
-public class DirectoryLoader extends UriDerivativeLoader<Uri, DirectoryResult> {
+public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
+    private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
 
-    private final int mType;
-    private Predicate<Document> mFilter;
-    private Comparator<Document> mSortOrder;
+    private final String mRootId;
+    private final Uri mUri;
+    private final int mSortOrder;
 
-    public DirectoryLoader(Context context, Uri uri, int type, Predicate<Document> filter,
-            Comparator<Document> sortOrder) {
-        super(context, uri);
-        mType = type;
-        mFilter = filter;
+    private CancellationSignal mSignal;
+    private DirectoryResult mResult;
+
+    public DirectoryLoader(Context context, String rootId, Uri uri, int sortOrder) {
+        super(context);
+        mRootId = rootId;
+        mUri = uri;
         mSortOrder = sortOrder;
     }
 
     @Override
-    public DirectoryResult loadInBackground(Uri uri, CancellationSignal signal) {
+    public final DirectoryResult loadInBackground() {
+        synchronized (this) {
+            if (isLoadInBackgroundCanceled()) {
+                throw new OperationCanceledException();
+            }
+            mSignal = new CancellationSignal();
+        }
         final DirectoryResult result = new DirectoryResult();
+        final String authority = mUri.getAuthority();
         try {
-            loadInBackgroundInternal(result, uri, signal);
+            result.client = getContext()
+                    .getContentResolver().acquireUnstableContentProviderClient(authority);
+            final Cursor cursor = result.client.query(
+                    mUri, null, null, null, getQuerySortOrder(mSortOrder), mSignal);
+            cursor.registerContentObserver(mObserver);
+
+            final Cursor withRoot = new RootCursorWrapper(mUri.getAuthority(), mRootId, cursor, -1);
+            final Cursor sorted = new SortingCursorWrapper(withRoot, mSortOrder);
+
+            result.cursor = sorted;
         } catch (Exception e) {
-            result.e = e;
+            result.exception = e;
+            ContentProviderClient.closeQuietly(result.client);
+        } finally {
+            synchronized (this) {
+                mSignal = null;
+            }
         }
         return result;
     }
 
-    private void loadInBackgroundInternal(
-            DirectoryResult result, Uri uri, CancellationSignal signal) {
-        final ContentResolver resolver = getContext().getContentResolver();
-        final Cursor cursor = resolver.query(uri, null, null, null, getQuerySortOrder(), signal);
-        result.cursor = cursor;
-        result.cursor.registerContentObserver(mObserver);
+    @Override
+    public void cancelLoadInBackground() {
+        super.cancelLoadInBackground();
 
-        while (cursor.moveToNext()) {
-            Document doc = null;
-            switch (mType) {
-                case TYPE_NORMAL:
-                case TYPE_SEARCH:
-                    doc = Document.fromDirectoryCursor(uri, cursor);
-                    break;
-                case TYPE_RECENT_OPEN:
-                    try {
-                        doc = Document.fromRecentOpenCursor(resolver, cursor);
-                    } catch (FileNotFoundException e) {
-                        Log.w(TAG, "Failed to find recent: " + e);
-                    }
-                    break;
-                default:
-                    throw new IllegalArgumentException("Unknown type");
+        synchronized (this) {
+            if (mSignal != null) {
+                mSignal.cancel();
             }
-
-            if (doc != null && (mFilter == null || mFilter.apply(doc))) {
-                result.contents.add(doc);
-            }
-        }
-
-        if (mSortOrder != null) {
-            Collections.sort(result.contents, mSortOrder);
         }
     }
 
-    private String getQuerySortOrder() {
-        if (mSortOrder instanceof Document.DateComparator) {
-            return DocumentColumns.LAST_MODIFIED + " DESC";
-        } else if (mSortOrder instanceof Document.NameComparator) {
-            return DocumentColumns.DISPLAY_NAME + " ASC";
-        } else if (mSortOrder instanceof Document.SizeComparator) {
-            return DocumentColumns.SIZE + " DESC";
-        } else {
-            return null;
+    @Override
+    public void deliverResult(DirectoryResult result) {
+        if (isReset()) {
+            IoUtils.closeQuietly(result);
+            return;
+        }
+        DirectoryResult oldResult = mResult;
+        mResult = result;
+
+        if (isStarted()) {
+            super.deliverResult(result);
+        }
+
+        if (oldResult != null && oldResult != result) {
+            IoUtils.closeQuietly(oldResult);
+        }
+    }
+
+    @Override
+    protected void onStartLoading() {
+        if (mResult != null) {
+            deliverResult(mResult);
+        }
+        if (takeContentChanged() || mResult == null) {
+            forceLoad();
+        }
+    }
+
+    @Override
+    protected void onStopLoading() {
+        cancelLoad();
+    }
+
+    @Override
+    public void onCanceled(DirectoryResult result) {
+        IoUtils.closeQuietly(result);
+    }
+
+    @Override
+    protected void onReset() {
+        super.onReset();
+
+        // Ensure the loader is stopped
+        onStopLoading();
+
+        IoUtils.closeQuietly(mResult);
+        mResult = null;
+
+        getContext().getContentResolver().unregisterContentObserver(mObserver);
+    }
+
+    public static String getQuerySortOrder(int sortOrder) {
+        switch (sortOrder) {
+            case SORT_ORDER_DISPLAY_NAME:
+                return Document.COLUMN_DISPLAY_NAME + " ASC";
+            case SORT_ORDER_LAST_MODIFIED:
+                return Document.COLUMN_LAST_MODIFIED + " DESC";
+            case SORT_ORDER_SIZE:
+                return Document.COLUMN_SIZE + " DESC";
+            default:
+                return null;
         }
     }
 }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java
index 72afd9e..54f62ef 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentChangedReceiver.java
@@ -23,10 +23,8 @@
 import android.content.Intent;
 import android.util.Log;
 
-import com.android.documentsui.model.Root;
-
 /**
- * Handles {@link Root} changes which invalidate cached data.
+ * Handles changes which invalidate cached data.
  */
 public class DocumentChangedReceiver extends BroadcastReceiver {
     @Override
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
index 22e3b98..4da6567 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
@@ -16,13 +16,13 @@
 
 package com.android.documentsui;
 
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_CREATE;
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_GET_CONTENT;
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_MANAGE;
-import static com.android.documentsui.DocumentsActivity.DisplayState.ACTION_OPEN;
-import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_GRID;
-import static com.android.documentsui.DocumentsActivity.DisplayState.MODE_LIST;
-import static com.android.documentsui.DocumentsActivity.DisplayState.SORT_ORDER_DATE;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_CREATE;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_GET_CONTENT;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_MANAGE;
+import static com.android.documentsui.DocumentsActivity.State.ACTION_OPEN;
+import static com.android.documentsui.DocumentsActivity.State.MODE_GRID;
+import static com.android.documentsui.DocumentsActivity.State.MODE_LIST;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
 
 import android.app.ActionBar;
 import android.app.ActionBar.OnNavigationListener;
@@ -40,8 +40,8 @@
 import android.graphics.drawable.ColorDrawable;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Parcel;
 import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.DocumentColumns;
 import android.support.v4.app.ActionBarDrawerToggle;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.widget.DrawerLayout;
@@ -59,33 +59,33 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.android.documentsui.model.Document;
+import com.android.documentsui.model.DocumentInfo;
 import com.android.documentsui.model.DocumentStack;
-import com.android.documentsui.model.Root;
+import com.android.documentsui.model.DurableUtils;
+import com.android.documentsui.model.RootInfo;
+
+import libcore.io.IoUtils;
 
 import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 
 public class DocumentsActivity extends Activity {
     public static final String TAG = "Documents";
 
-    private int mAction;
-
     private SearchView mSearchView;
 
     private View mRootsContainer;
     private DrawerLayout mDrawerLayout;
     private ActionBarDrawerToggle mDrawerToggle;
 
-    private final DisplayState mDisplayState = new DisplayState();
+    private static final String EXTRA_STATE = "state";
+
+    private boolean mIgnoreNextNavigation;
 
     private RootsCache mRoots;
-
-    /** Current user navigation stack; empty implies recents. */
-    private DocumentStack mStack = new DocumentStack();
-    /** Currently active search, overriding any stack. */
-    private String mCurrentSearch;
+    private State mState;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -93,59 +93,9 @@
 
         mRoots = DocumentsApplication.getRootsCache(this);
 
-        final Intent intent = getIntent();
-        final String action = intent.getAction();
-        if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
-            mAction = ACTION_OPEN;
-        } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) {
-            mAction = ACTION_CREATE;
-        } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
-            mAction = ACTION_GET_CONTENT;
-        } else if (Intent.ACTION_MANAGE_DOCUMENT.equals(action)) {
-            mAction = ACTION_MANAGE;
-        }
-
-        // TODO: unify action in single place
-        mDisplayState.action = mAction;
-
-        if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
-            mDisplayState.allowMultiple = intent.getBooleanExtra(
-                    Intent.EXTRA_ALLOW_MULTIPLE, false);
-        }
-
-        if (mAction == ACTION_MANAGE) {
-            mDisplayState.acceptMimes = new String[] { "*/*" };
-            mDisplayState.allowMultiple = true;
-        } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
-            mDisplayState.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
-        } else {
-            mDisplayState.acceptMimes = new String[] { intent.getType() };
-        }
-
-        mDisplayState.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false);
-
         setResult(Activity.RESULT_CANCELED);
         setContentView(R.layout.activity);
 
-        if (mAction == ACTION_CREATE) {
-            final String mimeType = getIntent().getType();
-            final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE);
-            SaveFragment.show(getFragmentManager(), mimeType, title);
-        }
-
-        if (mAction == ACTION_GET_CONTENT) {
-            final Intent moreApps = new Intent(getIntent());
-            moreApps.setComponent(null);
-            moreApps.setPackage(null);
-            RootsFragment.show(getFragmentManager(), moreApps);
-        } else if (mAction == ACTION_OPEN || mAction == ACTION_CREATE) {
-            RootsFragment.show(getFragmentManager(), null);
-        }
-
-        if (mAction == ACTION_MANAGE) {
-            mDisplayState.sortOrder = SORT_ORDER_DATE;
-        }
-
         mRootsContainer = findViewById(R.id.container_roots);
 
         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
@@ -156,14 +106,73 @@
         mDrawerLayout.setDrawerListener(mDrawerListener);
         mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
 
-        if (mAction == ACTION_MANAGE) {
+        if (icicle != null) {
+            mState = icicle.getParcelable(EXTRA_STATE);
+        } else {
+            buildDefaultState();
+        }
+
+        if (mState.action == ACTION_MANAGE) {
             mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
+        }
 
+        if (mState.action == ACTION_CREATE) {
+            final String mimeType = getIntent().getType();
+            final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE);
+            SaveFragment.show(getFragmentManager(), mimeType, title);
+        }
+
+        if (mState.action == ACTION_GET_CONTENT) {
+            final Intent moreApps = new Intent(getIntent());
+            moreApps.setComponent(null);
+            moreApps.setPackage(null);
+            RootsFragment.show(getFragmentManager(), moreApps);
+        } else if (mState.action == ACTION_OPEN || mState.action == ACTION_CREATE) {
+            RootsFragment.show(getFragmentManager(), null);
+        }
+
+        onCurrentDirectoryChanged();
+    }
+
+    private void buildDefaultState() {
+        mState = new State();
+
+        final Intent intent = getIntent();
+        final String action = intent.getAction();
+        if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
+            mState.action = ACTION_OPEN;
+        } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) {
+            mState.action = ACTION_CREATE;
+        } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
+            mState.action = ACTION_GET_CONTENT;
+        } else if (DocumentsContract.ACTION_MANAGE_DOCUMENTS.equals(action)) {
+            mState.action = ACTION_MANAGE;
+        }
+
+        if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
+            mState.allowMultiple = intent.getBooleanExtra(
+                    Intent.EXTRA_ALLOW_MULTIPLE, false);
+        }
+
+        if (mState.action == ACTION_MANAGE) {
+            mState.acceptMimes = new String[] { "*/*" };
+            mState.allowMultiple = true;
+        } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
+            mState.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
+        } else {
+            mState.acceptMimes = new String[] { intent.getType() };
+        }
+
+        mState.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false);
+        mState.showAdvanced = SettingsActivity.getDisplayAdvancedDevices(this);
+
+        if (mState.action == ACTION_MANAGE) {
+            mState.sortOrder = SORT_ORDER_LAST_MODIFIED;
+        }
+
+        if (mState.action == ACTION_MANAGE) {
             final Uri rootUri = intent.getData();
-            final String authority = rootUri.getAuthority();
-            final String rootId = DocumentsContract.getRootId(rootUri);
-
-            final Root root = mRoots.findRoot(authority, rootId);
+            final RootInfo root = mRoots.findRoot(rootUri);
             if (root != null) {
                 onRootPicked(root, true);
             } else {
@@ -172,8 +181,6 @@
             }
 
         } else {
-            mDrawerLayout.openDrawer(mRootsContainer);
-
             // Restore last stack for calling package
             // TODO: move into async loader
             final String packageName = getCallingPackage();
@@ -181,17 +188,27 @@
                     .query(RecentsProvider.buildResume(packageName), null, null, null, null);
             try {
                 if (cursor.moveToFirst()) {
-                    final String raw = cursor.getString(
+                    final byte[] rawStack = cursor.getBlob(
                             cursor.getColumnIndex(RecentsProvider.COL_PATH));
-                    mStack = DocumentStack.deserialize(getContentResolver(), raw);
+                    DurableUtils.readFromArray(rawStack, mState.stack);
                 }
-            } catch (FileNotFoundException e) {
+            } catch (IOException e) {
                 Log.w(TAG, "Failed to resume", e);
             } finally {
-                cursor.close();
+                IoUtils.closeQuietly(cursor);
             }
 
-            onCurrentDirectoryChanged();
+            // If restored root isn't valid, fall back to recents
+            final RootInfo root = getCurrentRoot();
+            final List<RootInfo> matchingRoots = mRoots.getMatchingRoots(mState);
+            if (!matchingRoots.contains(root)) {
+                mState.stack.clear();
+            }
+
+            // Only open drawer when showing recents
+            if (mState.stack.isRecents()) {
+                mDrawerLayout.openDrawer(mRootsContainer);
+            }
         }
     }
 
@@ -199,10 +216,10 @@
     public void onStart() {
         super.onStart();
 
-        if (mAction == ACTION_MANAGE) {
-            mDisplayState.showSize = true;
+        if (mState.action == ACTION_MANAGE) {
+            mState.showSize = true;
         } else {
-            mDisplayState.showSize = SettingsActivity.getDisplayFileSize(this);
+            mState.showSize = SettingsActivity.getDisplayFileSize(this);
         }
     }
 
@@ -241,42 +258,36 @@
 
         actionBar.setDisplayShowHomeEnabled(true);
 
+        if (mState.action == ACTION_MANAGE) {
+            actionBar.setDisplayHomeAsUpEnabled(false);
+            mDrawerToggle.setDrawerIndicatorEnabled(false);
+        } else {
+            actionBar.setDisplayHomeAsUpEnabled(true);
+            mDrawerToggle.setDrawerIndicatorEnabled(true);
+        }
+
         if (mDrawerLayout.isDrawerOpen(mRootsContainer)) {
             actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
             actionBar.setIcon(new ColorDrawable());
 
-            if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
+            if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
                 actionBar.setTitle(R.string.title_open);
-            } else if (mAction == ACTION_CREATE) {
+            } else if (mState.action == ACTION_CREATE) {
                 actionBar.setTitle(R.string.title_save);
             }
-
-            actionBar.setDisplayHomeAsUpEnabled(true);
-            mDrawerToggle.setDrawerIndicatorEnabled(true);
-
         } else {
-            final Root root = getCurrentRoot();
-            actionBar.setIcon(root != null ? root.icon : null);
+            final RootInfo root = getCurrentRoot();
+            actionBar.setIcon(root != null ? root.loadIcon(this) : null);
 
-            if (root.isRecents) {
+            if (mState.stack.size() <= 1) {
                 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
                 actionBar.setTitle(root.title);
             } else {
+                mIgnoreNextNavigation = true;
                 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
                 actionBar.setTitle(null);
-                actionBar.setListNavigationCallbacks(mSortAdapter, mSortListener);
-                actionBar.setSelectedNavigationItem(mDisplayState.sortOrder);
-            }
-
-            if (mStack.size() > 1) {
-                actionBar.setDisplayHomeAsUpEnabled(true);
-                mDrawerToggle.setDrawerIndicatorEnabled(false);
-            } else if (mAction == ACTION_MANAGE) {
-                actionBar.setDisplayHomeAsUpEnabled(false);
-                mDrawerToggle.setDrawerIndicatorEnabled(false);
-            } else {
-                actionBar.setDisplayHomeAsUpEnabled(true);
-                mDrawerToggle.setDrawerIndicatorEnabled(true);
+                actionBar.setListNavigationCallbacks(mStackAdapter, mStackListener);
+                actionBar.setSelectedNavigationItem(mStackAdapter.getCount() - 1);
             }
         }
     }
@@ -291,7 +302,7 @@
         mSearchView.setOnQueryTextListener(new OnQueryTextListener() {
             @Override
             public boolean onQueryTextSubmit(String query) {
-                mCurrentSearch = query;
+                mState.currentSearch = query;
                 onCurrentDirectoryChanged();
                 mSearchView.setIconified(true);
                 return true;
@@ -306,7 +317,7 @@
         mSearchView.setOnCloseListener(new OnCloseListener() {
             @Override
             public boolean onClose() {
-                mCurrentSearch = null;
+                mState.currentSearch = null;
                 onCurrentDirectoryChanged();
                 return false;
             }
@@ -320,19 +331,26 @@
         super.onPrepareOptionsMenu(menu);
 
         final FragmentManager fm = getFragmentManager();
-        final Document cwd = getCurrentDirectory();
+        final DocumentInfo cwd = getCurrentDirectory();
 
         final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
         final MenuItem search = menu.findItem(R.id.menu_search);
-        final MenuItem grid =  menu.findItem(R.id.menu_grid);
+        final MenuItem sort = menu.findItem(R.id.menu_sort);
+        final MenuItem sortSize = menu.findItem(R.id.menu_sort_size);
+        final MenuItem grid = menu.findItem(R.id.menu_grid);
         final MenuItem list = menu.findItem(R.id.menu_list);
         final MenuItem settings = menu.findItem(R.id.menu_settings);
 
-        grid.setVisible(mDisplayState.mode != MODE_GRID);
-        list.setVisible(mDisplayState.mode != MODE_LIST);
+        grid.setVisible(mState.mode != MODE_GRID);
+        list.setVisible(mState.mode != MODE_LIST);
+
+        // No sorting in recents
+        sort.setVisible(cwd != null);
+        // Only sort by size when visible
+        sortSize.setVisible(mState.showSize);
 
         final boolean searchVisible;
-        if (mAction == ACTION_CREATE) {
+        if (mState.action == ACTION_CREATE) {
             createDir.setVisible(cwd != null && cwd.isCreateSupported());
             searchVisible = false;
 
@@ -351,7 +369,7 @@
         // TODO: close any search in-progress when hiding
         search.setVisible(searchVisible);
 
-        settings.setVisible(mAction != ACTION_MANAGE);
+        settings.setVisible(mState.action != ACTION_MANAGE);
 
         return true;
     }
@@ -371,15 +389,27 @@
             return true;
         } else if (id == R.id.menu_search) {
             return false;
+        } else if (id == R.id.menu_sort_name) {
+            mState.sortOrder = State.SORT_ORDER_DISPLAY_NAME;
+            updateDisplayState();
+            return true;
+        } else if (id == R.id.menu_sort_date) {
+            mState.sortOrder = State.SORT_ORDER_LAST_MODIFIED;
+            updateDisplayState();
+            return true;
+        } else if (id == R.id.menu_sort_size) {
+            mState.sortOrder = State.SORT_ORDER_SIZE;
+            updateDisplayState();
+            return true;
         } else if (id == R.id.menu_grid) {
             // TODO: persist explicit user mode for cwd
-            mDisplayState.mode = MODE_GRID;
+            mState.mode = MODE_GRID;
             updateDisplayState();
             invalidateOptionsMenu();
             return true;
         } else if (id == R.id.menu_list) {
             // TODO: persist explicit user mode for cwd
-            mDisplayState.mode = MODE_LIST;
+            mState.mode = MODE_LIST;
             updateDisplayState();
             invalidateOptionsMenu();
             return true;
@@ -393,9 +423,9 @@
 
     @Override
     public void onBackPressed() {
-        final int size = mStack.size();
+        final int size = mState.stack.size();
         if (size > 1) {
-            mStack.pop();
+            mState.stack.pop();
             onCurrentDirectoryChanged();
         } else if (size == 1 && !mDrawerLayout.isDrawerOpen(mRootsContainer)) {
             // TODO: open root drawer once we can capture back key
@@ -405,25 +435,27 @@
         }
     }
 
-    // TODO: support additional sort orders
-    private BaseAdapter mSortAdapter = new BaseAdapter() {
+    @Override
+    protected void onSaveInstanceState(Bundle state) {
+        super.onSaveInstanceState(state);
+        state.putParcelable(EXTRA_STATE, mState);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Bundle state) {
+        super.onRestoreInstanceState(state);
+        updateActionBar();
+    }
+
+    private BaseAdapter mStackAdapter = new BaseAdapter() {
         @Override
         public int getCount() {
-            return mDisplayState.showSize ? 3 : 2;
+            return mState.stack.size();
         }
 
         @Override
-        public Object getItem(int position) {
-            switch (position) {
-                case 0:
-                    return getText(R.string.sort_name);
-                case 1:
-                    return getText(R.string.sort_date);
-                case 2:
-                    return getText(R.string.sort_size);
-                default:
-                    return null;
-            }
+        public DocumentInfo getItem(int position) {
+            return mState.stack.get(mState.stack.size() - position - 1);
         }
 
         @Override
@@ -439,18 +471,15 @@
             }
 
             final TextView title = (TextView) convertView.findViewById(android.R.id.title);
-            final TextView summary = (TextView) convertView.findViewById(android.R.id.summary);
+            final DocumentInfo doc = getItem(position);
 
-            final Document cwd = getCurrentDirectory();
-            if (cwd != null) {
-                title.setText(cwd.displayName);
+            if (position == 0) {
+                final RootInfo root = getCurrentRoot();
+                title.setText(root.title);
             } else {
-                // No directory means recents
-                title.setText(R.string.root_recent);
+                title.setText(doc.displayName);
             }
 
-            summary.setText((String) getItem(position));
-
             return convertView;
         }
 
@@ -462,53 +491,66 @@
             }
 
             final TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
-            text1.setText((String) getItem(position));
+            final DocumentInfo doc = getItem(position);
+
+            if (position == 0) {
+                final RootInfo root = getCurrentRoot();
+                text1.setText(root.title);
+            } else {
+                text1.setText(doc.displayName);
+            }
 
             return convertView;
         }
     };
 
-    private OnNavigationListener mSortListener = new OnNavigationListener() {
+    private OnNavigationListener mStackListener = new OnNavigationListener() {
         @Override
         public boolean onNavigationItemSelected(int itemPosition, long itemId) {
-            mDisplayState.sortOrder = itemPosition;
-            updateDisplayState();
+            if (mIgnoreNextNavigation) {
+                mIgnoreNextNavigation = false;
+                return false;
+            }
+
+            while (mState.stack.size() > itemPosition + 1) {
+                mState.stack.pop();
+            }
+            onCurrentDirectoryChanged();
             return true;
         }
     };
 
-    public Root getCurrentRoot() {
-        final Document cwd = getCurrentDirectory();
-        if (cwd != null) {
-            return mRoots.findRoot(cwd);
+    public RootInfo getCurrentRoot() {
+        if (mState.stack.size() > 0) {
+            return mState.stack.getRoot(mRoots);
         } else {
             return mRoots.getRecentsRoot();
         }
     }
 
-    public Document getCurrentDirectory() {
-        return mStack.peek();
+    public DocumentInfo getCurrentDirectory() {
+        return mState.stack.peek();
     }
 
-    public DisplayState getDisplayState() {
-        return mDisplayState;
+    public State getDisplayState() {
+        return mState;
     }
 
     private void onCurrentDirectoryChanged() {
         final FragmentManager fm = getFragmentManager();
-        final Document cwd = getCurrentDirectory();
+        final DocumentInfo cwd = getCurrentDirectory();
 
         if (cwd == null) {
             // No directory means recents
-            if (mAction == ACTION_CREATE) {
+            if (mState.action == ACTION_CREATE) {
                 RecentsCreateFragment.show(fm);
             } else {
                 DirectoryFragment.showRecentsOpen(fm);
             }
         } else {
-            if (mCurrentSearch != null) {
+            if (mState.currentSearch != null) {
                 // Ongoing search
-                DirectoryFragment.showSearch(fm, cwd.uri, mCurrentSearch);
+                DirectoryFragment.showSearch(fm, cwd.uri, mState.currentSearch);
             } else {
                 // Normal boring directory
                 DirectoryFragment.showNormal(fm, cwd.uri);
@@ -516,7 +558,7 @@
         }
 
         // Forget any replacement target
-        if (mAction == ACTION_CREATE) {
+        if (mState.action == ACTION_CREATE) {
             final SaveFragment save = SaveFragment.get(fm);
             if (save != null) {
                 save.setReplaceTarget(null);
@@ -534,17 +576,18 @@
     }
 
     public void onStackPicked(DocumentStack stack) {
-        mStack = stack;
+        mState.stack = stack;
         onCurrentDirectoryChanged();
     }
 
-    public void onRootPicked(Root root, boolean closeDrawer) {
+    public void onRootPicked(RootInfo root, boolean closeDrawer) {
         // Clear entire backstack and start in new root
-        mStack.clear();
+        mState.stack.clear();
 
-        if (!root.isRecents) {
+        if (!mRoots.isRecentsRoot(root)) {
             try {
-                onDocumentPicked(Document.fromRoot(getContentResolver(), root));
+                final Uri uri = DocumentsContract.buildDocumentUri(root.authority, root.documentId);
+                onDocumentPicked(DocumentInfo.fromUri(getContentResolver(), uri));
             } catch (FileNotFoundException e) {
             }
         } else {
@@ -565,24 +608,24 @@
         finish();
     }
 
-    public void onDocumentPicked(Document doc) {
+    public void onDocumentPicked(DocumentInfo doc) {
         final FragmentManager fm = getFragmentManager();
         if (doc.isDirectory()) {
             // TODO: query display mode user preference for this dir
             if (doc.isGridPreferred()) {
-                mDisplayState.mode = MODE_GRID;
+                mState.mode = MODE_GRID;
             } else {
-                mDisplayState.mode = MODE_LIST;
+                mState.mode = MODE_LIST;
             }
-            mStack.push(doc);
+            mState.stack.push(doc);
             onCurrentDirectoryChanged();
-        } else if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
+        } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
             // Explicit file picked, return
             onFinished(doc.uri);
-        } else if (mAction == ACTION_CREATE) {
+        } else if (mState.action == ACTION_CREATE) {
             // Replace selected file
             SaveFragment.get(fm).setReplaceTarget(doc);
-        } else if (mAction == ACTION_MANAGE) {
+        } else if (mState.action == ACTION_MANAGE) {
             // Open the document
             final Intent intent = new Intent(Intent.ACTION_VIEW);
             intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -595,8 +638,8 @@
         }
     }
 
-    public void onDocumentsPicked(List<Document> docs) {
-        if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
+    public void onDocumentsPicked(List<DocumentInfo> docs) {
+        if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
             final int size = docs.size();
             final Uri[] uris = new Uri[size];
             for (int i = 0; i < size; i++) {
@@ -606,17 +649,16 @@
         }
     }
 
-    public void onSaveRequested(Document replaceTarget) {
+    public void onSaveRequested(DocumentInfo replaceTarget) {
         onFinished(replaceTarget.uri);
     }
 
     public void onSaveRequested(String mimeType, String displayName) {
-        final ContentValues values = new ContentValues();
-        values.put(DocumentColumns.MIME_TYPE, mimeType);
-        values.put(DocumentColumns.DISPLAY_NAME, displayName);
+        final DocumentInfo cwd = getCurrentDirectory();
+        final String authority = cwd.uri.getAuthority();
 
-        final Document cwd = getCurrentDirectory();
-        final Uri childUri = getContentResolver().insert(cwd.uri, values);
+        final Uri childUri = DocumentsContract.createDocument(
+                getContentResolver(), cwd.uri, mimeType, displayName);
         if (childUri != null) {
             onFinished(childUri);
         } else {
@@ -630,14 +672,14 @@
         final ContentResolver resolver = getContentResolver();
         final ContentValues values = new ContentValues();
 
-        final String rawStack = DocumentStack.serialize(mStack);
-        if (mAction == ACTION_CREATE) {
+        final byte[] rawStack = DurableUtils.writeToArrayOrNull(mState.stack);
+        if (mState.action == ACTION_CREATE) {
             // Remember stack for last create
             values.clear();
             values.put(RecentsProvider.COL_PATH, rawStack);
             resolver.insert(RecentsProvider.buildRecentCreate(), values);
 
-        } else if (mAction == ACTION_OPEN || mAction == ACTION_GET_CONTENT) {
+        } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
             // Remember opened items
             for (Uri uri : uris) {
                 values.clear();
@@ -657,14 +699,14 @@
             intent.setData(uris[0]);
         } else if (uris.length > 1) {
             final ClipData clipData = new ClipData(
-                    null, mDisplayState.acceptMimes, new ClipData.Item(uris[0]));
+                    null, mState.acceptMimes, new ClipData.Item(uris[0]));
             for (int i = 1; i < uris.length; i++) {
                 clipData.addItem(new ClipData.Item(uris[i]));
             }
             intent.setClipData(clipData);
         }
 
-        if (mAction == ACTION_GET_CONTENT) {
+        if (mState.action == ACTION_GET_CONTENT) {
             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         } else {
             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
@@ -676,14 +718,20 @@
         finish();
     }
 
-    public static class DisplayState {
+    public static class State implements android.os.Parcelable {
         public int action;
         public int mode = MODE_LIST;
         public String[] acceptMimes;
-        public int sortOrder = SORT_ORDER_NAME;
+        public int sortOrder = SORT_ORDER_DISPLAY_NAME;
         public boolean allowMultiple = false;
         public boolean showSize = false;
         public boolean localOnly = false;
+        public boolean showAdvanced = false;
+
+        /** Current user navigation stack; empty implies recents. */
+        public DocumentStack stack = new DocumentStack();
+        /** Currently active search, overriding any stack. */
+        public String currentSearch;
 
         public static final int ACTION_OPEN = 1;
         public static final int ACTION_CREATE = 2;
@@ -693,14 +741,56 @@
         public static final int MODE_LIST = 0;
         public static final int MODE_GRID = 1;
 
-        public static final int SORT_ORDER_NAME = 0;
-        public static final int SORT_ORDER_DATE = 1;
+        public static final int SORT_ORDER_DISPLAY_NAME = 0;
+        public static final int SORT_ORDER_LAST_MODIFIED = 1;
         public static final int SORT_ORDER_SIZE = 2;
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel out, int flags) {
+            out.writeInt(action);
+            out.writeInt(mode);
+            out.writeStringArray(acceptMimes);
+            out.writeInt(sortOrder);
+            out.writeInt(allowMultiple ? 1 : 0);
+            out.writeInt(showSize ? 1 : 0);
+            out.writeInt(localOnly ? 1 : 0);
+            out.writeInt(showAdvanced ? 1 : 0);
+            DurableUtils.writeToParcel(out, stack);
+            out.writeString(currentSearch);
+        }
+
+        public static final Creator<State> CREATOR = new Creator<State>() {
+            @Override
+            public State createFromParcel(Parcel in) {
+                final State state = new State();
+                state.action = in.readInt();
+                state.mode = in.readInt();
+                state.acceptMimes = in.readStringArray();
+                state.sortOrder = in.readInt();
+                state.allowMultiple = in.readInt() != 0;
+                state.showSize = in.readInt() != 0;
+                state.localOnly = in.readInt() != 0;
+                state.showAdvanced = in.readInt() != 0;
+                DurableUtils.readFromParcel(in, state.stack);
+                state.currentSearch = in.readString();
+                return state;
+            }
+
+            @Override
+            public State[] newArray(int size) {
+                return new State[size];
+            }
+        };
     }
 
     private void dumpStack() {
         Log.d(TAG, "Current stack:");
-        for (Document doc : mStack) {
+        for (DocumentInfo doc : mState.stack) {
             Log.d(TAG, "--> " + doc);
         }
     }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java
index a9929de..15ad061 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java
@@ -16,10 +16,10 @@
 
 package com.android.documentsui;
 
-import com.android.documentsui.model.Document;
+import com.android.documentsui.model.DocumentInfo;
 import com.android.internal.util.Predicate;
 
-public class MimePredicate implements Predicate<Document> {
+public class MimePredicate implements Predicate<DocumentInfo> {
     private final String[] mFilters;
 
     public MimePredicate(String[] filters) {
@@ -27,7 +27,7 @@
     }
 
     @Override
-    public boolean apply(Document doc) {
+    public boolean apply(DocumentInfo doc) {
         if (doc.isDirectory()) {
             return true;
         }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
new file mode 100644
index 0000000..756a297
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package com.android.documentsui;
+
+import static com.android.documentsui.DocumentsActivity.TAG;
+
+import android.content.AsyncTaskLoader;
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.MergeCursor;
+import android.net.Uri;
+import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Root;
+import android.util.Log;
+
+import com.android.documentsui.DocumentsActivity.State;
+import com.android.documentsui.model.RootInfo;
+import com.google.android.collect.Maps;
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.AbstractFuture;
+
+import libcore.io.IoUtils;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
+
+    public static final int MAX_OUTSTANDING_RECENTS = 2;
+
+    /**
+     * Time to wait for first pass to complete before returning partial results.
+     */
+    public static final int MAX_FIRST_PASS_WAIT_MILLIS = 500;
+
+    /**
+     * Maximum documents from a single root.
+     */
+    public static final int MAX_DOCS_FROM_ROOT = 24;
+
+    private static final ExecutorService sExecutor = buildExecutor();
+
+    /**
+     * Create a bounded thread pool for fetching recents; it creates threads as
+     * needed (up to maximum) and reclaims them when finished.
+     */
+    private static ExecutorService buildExecutor() {
+        // Create a bounded thread pool for fetching recents; it creates
+        // threads as needed (up to maximum) and reclaims them when finished.
+        final ThreadPoolExecutor executor = new ThreadPoolExecutor(
+                MAX_OUTSTANDING_RECENTS, MAX_OUTSTANDING_RECENTS, 10, TimeUnit.SECONDS,
+                new LinkedBlockingQueue<Runnable>());
+        executor.allowCoreThreadTimeOut(true);
+        return executor;
+    }
+
+    private final List<RootInfo> mRoots;
+
+    private final HashMap<RootInfo, RecentTask> mTasks = Maps.newHashMap();
+
+    private final int mSortOrder = State.SORT_ORDER_LAST_MODIFIED;
+
+    private CountDownLatch mFirstPassLatch;
+    private volatile boolean mFirstPassDone;
+
+    private DirectoryResult mResult;
+
+    // TODO: create better transfer of ownership around cursor to ensure its
+    // closed in all edge cases.
+
+    public class RecentTask extends AbstractFuture<Cursor> implements Runnable, Closeable {
+        public final String authority;
+        public final String rootId;
+
+        private Cursor mWithRoot;
+
+        public RecentTask(String authority, String rootId) {
+            this.authority = authority;
+            this.rootId = rootId;
+        }
+
+        @Override
+        public void run() {
+            if (isCancelled()) return;
+
+            final ContentResolver resolver = getContext().getContentResolver();
+            final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
+                    authority);
+            try {
+                final Uri uri = DocumentsContract.buildRecentDocumentsUri(authority, rootId);
+                final Cursor cursor = client.query(
+                        uri, null, null, null, DirectoryLoader.getQuerySortOrder(mSortOrder));
+                mWithRoot = new RootCursorWrapper(authority, rootId, cursor, MAX_DOCS_FROM_ROOT);
+                set(mWithRoot);
+
+                mFirstPassLatch.countDown();
+                if (mFirstPassDone) {
+                    onContentChanged();
+                }
+
+            } catch (Exception e) {
+                setException(e);
+            } finally {
+                ContentProviderClient.closeQuietly(client);
+            }
+        }
+
+        @Override
+        public void close() throws IOException {
+            IoUtils.closeQuietly(mWithRoot);
+        }
+    }
+
+    public RecentLoader(Context context, List<RootInfo> roots) {
+        super(context);
+        mRoots = roots;
+    }
+
+    @Override
+    public DirectoryResult loadInBackground() {
+        if (mFirstPassLatch == null) {
+            // First time through we kick off all the recent tasks, and wait
+            // around to see if everyone finishes quickly.
+
+            for (RootInfo root : mRoots) {
+                if ((root.flags & Root.FLAG_SUPPORTS_RECENTS) != 0) {
+                    final RecentTask task = new RecentTask(root.authority, root.rootId);
+                    mTasks.put(root, task);
+                }
+            }
+
+            mFirstPassLatch = new CountDownLatch(mTasks.size());
+            for (RecentTask task : mTasks.values()) {
+                sExecutor.execute(task);
+            }
+
+            try {
+                mFirstPassLatch.await(MAX_FIRST_PASS_WAIT_MILLIS, TimeUnit.MILLISECONDS);
+                mFirstPassDone = true;
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        // Collect all finished tasks
+        List<Cursor> cursors = Lists.newArrayList();
+        for (RecentTask task : mTasks.values()) {
+            if (task.isDone()) {
+                try {
+                    cursors.add(task.get());
+                } catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                } catch (ExecutionException e) {
+                    Log.w(TAG, "Failed to load " + task.authority + ", " + task.rootId, e);
+                }
+            }
+        }
+
+        final DirectoryResult result = new DirectoryResult();
+        if (cursors.size() > 0) {
+            final MergeCursor merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()]));
+            final SortingCursorWrapper sorted = new SortingCursorWrapper(
+                    merged, State.SORT_ORDER_LAST_MODIFIED) {
+                @Override
+                public void close() {
+                    // Ignored, since we manage cursor lifecycle internally
+                }
+            };
+            result.cursor = sorted;
+        }
+        return result;
+    }
+
+    @Override
+    public void cancelLoadInBackground() {
+        super.cancelLoadInBackground();
+    }
+
+    @Override
+    public void deliverResult(DirectoryResult result) {
+        if (isReset()) {
+            IoUtils.closeQuietly(result);
+            return;
+        }
+        DirectoryResult oldResult = mResult;
+        mResult = result;
+
+        if (isStarted()) {
+            super.deliverResult(result);
+        }
+
+        if (oldResult != null && oldResult != result) {
+            IoUtils.closeQuietly(oldResult);
+        }
+    }
+
+    @Override
+    protected void onStartLoading() {
+        if (mResult != null) {
+            deliverResult(mResult);
+        }
+        if (takeContentChanged() || mResult == null) {
+            forceLoad();
+        }
+    }
+
+    @Override
+    protected void onStopLoading() {
+        cancelLoad();
+    }
+
+    @Override
+    public void onCanceled(DirectoryResult result) {
+        IoUtils.closeQuietly(result);
+    }
+
+    @Override
+    protected void onReset() {
+        super.onReset();
+
+        // Ensure the loader is stopped
+        onStopLoading();
+
+        for (RecentTask task : mTasks.values()) {
+            IoUtils.closeQuietly(task);
+        }
+
+        IoUtils.closeQuietly(mResult);
+        mResult = null;
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
index 5466dbf..fd7293d 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
@@ -42,12 +42,14 @@
 import android.widget.TextView;
 
 import com.android.documentsui.model.DocumentStack;
-import com.android.documentsui.model.Root;
+import com.android.documentsui.model.RootInfo;
 import com.google.android.collect.Lists;
 
 import libcore.io.IoUtils;
 
-import java.io.FileNotFoundException;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -138,12 +140,13 @@
                     uri, null, null, null, RecentsProvider.COL_TIMESTAMP + " DESC", signal);
             try {
                 while (cursor != null && cursor.moveToNext()) {
-                    final String rawStack = cursor.getString(
+                    final byte[] raw = cursor.getBlob(
                             cursor.getColumnIndex(RecentsProvider.COL_PATH));
                     try {
-                        final DocumentStack stack = DocumentStack.deserialize(resolver, rawStack);
+                        final DocumentStack stack = new DocumentStack();
+                        stack.read(new DataInputStream(new ByteArrayInputStream(raw)));
                         result.add(stack);
-                    } catch (FileNotFoundException e) {
+                    } catch (IOException e) {
                         Log.w(TAG, "Failed to resolve stack: " + e);
                     }
                 }
@@ -181,8 +184,8 @@
             final View summaryList = convertView.findViewById(R.id.summary_list);
 
             final DocumentStack stack = getItem(position);
-            final Root root = roots.findRoot(stack.peek());
-            icon.setImageDrawable(root != null ? root.icon : null);
+            final RootInfo root = stack.getRoot(roots);
+            icon.setImageDrawable(root.loadIcon(context));
 
             final StringBuilder builder = new StringBuilder();
             for (int i = stack.size() - 1; i >= 0; i--) {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
index dbcb039..0c87783 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
@@ -61,6 +61,7 @@
     public static final String COL_PACKAGE_NAME = "package_name";
     public static final String COL_TIMESTAMP = "timestamp";
 
+    @Deprecated
     public static Uri buildRecentOpen() {
         return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
                 .authority(AUTHORITY).appendPath("recent_open").build();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java
new file mode 100644
index 0000000..0b58218
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package com.android.documentsui;
+
+import android.database.AbstractCursor;
+import android.database.Cursor;
+import android.os.Bundle;
+
+/**
+ * Cursor wrapper that adds columns to identify which root a document came from.
+ */
+public class RootCursorWrapper extends AbstractCursor {
+    private final String mAuthority;
+    private final String mRootId;
+
+    private final Cursor mCursor;
+    private final int mCount;
+
+    private final String[] mColumnNames;
+
+    private final int mAuthorityIndex;
+    private final int mRootIdIndex;
+
+    public static final String COLUMN_AUTHORITY = "android:authority";
+    public static final String COLUMN_ROOT_ID = "android:rootId";
+
+    public RootCursorWrapper(String authority, String rootId, Cursor cursor, int maxCount) {
+        mAuthority = authority;
+        mRootId = rootId;
+        mCursor = cursor;
+
+        final int count = cursor.getCount();
+        if (maxCount > 0 && count > maxCount) {
+            mCount = maxCount;
+        } else {
+            mCount = count;
+        }
+
+        if (cursor.getColumnIndex(COLUMN_AUTHORITY) != -1
+                || cursor.getColumnIndex(COLUMN_ROOT_ID) != -1) {
+            throw new IllegalArgumentException("Cursor contains internal columns!");
+        }
+        final String[] before = cursor.getColumnNames();
+        mColumnNames = new String[before.length + 2];
+        System.arraycopy(before, 0, mColumnNames, 0, before.length);
+        mAuthorityIndex = before.length;
+        mRootIdIndex = before.length + 1;
+        mColumnNames[mAuthorityIndex] = COLUMN_AUTHORITY;
+        mColumnNames[mRootIdIndex] = COLUMN_ROOT_ID;
+    }
+
+    @Override
+    public Bundle getExtras() {
+        return mCursor.getExtras();
+    }
+
+    @Override
+    public void close() {
+        super.close();
+        mCursor.close();
+    }
+
+    @Override
+    public boolean onMove(int oldPosition, int newPosition) {
+        return mCursor.moveToPosition(newPosition);
+    }
+
+    @Override
+    public String[] getColumnNames() {
+        return mColumnNames;
+    }
+
+    @Override
+    public int getCount() {
+        return mCount;
+    }
+
+    @Override
+    public double getDouble(int column) {
+        return mCursor.getDouble(column);
+    }
+
+    @Override
+    public float getFloat(int column) {
+        return mCursor.getFloat(column);
+    }
+
+    @Override
+    public int getInt(int column) {
+        return mCursor.getInt(column);
+    }
+
+    @Override
+    public long getLong(int column) {
+        return mCursor.getLong(column);
+    }
+
+    @Override
+    public short getShort(int column) {
+        return mCursor.getShort(column);
+    }
+
+    @Override
+    public String getString(int column) {
+        if (column == mAuthorityIndex) {
+            return mAuthority;
+        } else if (column == mRootIdIndex) {
+            return mRootId;
+        } else {
+            return mCursor.getString(column);
+        }
+    }
+
+    @Override
+    public int getType(int column) {
+        return mCursor.getType(column);
+    }
+
+    @Override
+    public boolean isNull(int column) {
+        return mCursor.isNull(column);
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
index c3b498e..0b10f19 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
@@ -18,6 +18,8 @@
 
 import static com.android.documentsui.DocumentsActivity.TAG;
 
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -27,21 +29,19 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.Documents;
+import android.provider.DocumentsContract.Document;
+import android.provider.DocumentsContract.Root;
 import android.util.Log;
-import android.util.Pair;
 
-import com.android.documentsui.model.Document;
-import com.android.documentsui.model.DocumentsProviderInfo;
-import com.android.documentsui.model.DocumentsProviderInfo.Icon;
-import com.android.documentsui.model.Root;
+import com.android.documentsui.DocumentsActivity.State;
+import com.android.documentsui.model.RootInfo;
 import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Objects;
 import com.google.android.collect.Lists;
-import com.google.android.collect.Maps;
+
+import libcore.io.IoUtils;
 
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -52,16 +52,13 @@
     // TODO: cache roots in local provider to avoid spinning up backends
     // TODO: root updates should trigger UI refresh
 
+    private static final boolean RECENTS_ENABLED = true;
+
     private final Context mContext;
 
-    /** Map from authority to cached info */
-    private HashMap<String, DocumentsProviderInfo> mProviders = Maps.newHashMap();
-    /** Map from (authority+rootId) to cached info */
-    private HashMap<Pair<String, String>, Root> mRoots = Maps.newHashMap();
+    public List<RootInfo> mRoots = Lists.newArrayList();
 
-    public ArrayList<Root> mRootsList = Lists.newArrayList();
-
-    private Root mRecentsRoot;
+    private RootInfo mRecentsRoot;
 
     public RootsCache(Context context) {
         mContext = context;
@@ -73,96 +70,146 @@
      */
     @GuardedBy("ActivityThread")
     public void update() {
-        mProviders.clear();
         mRoots.clear();
-        mRootsList.clear();
 
-        {
+        if (RECENTS_ENABLED) {
             // Create special root for recents
-            final Root root = Root.buildRecents(mContext);
-            mRootsList.add(root);
+            final RootInfo root = new RootInfo();
+            root.rootType = Root.ROOT_TYPE_SHORTCUT;
+            root.icon = R.drawable.ic_dir;
+            root.flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_CREATE;
+            root.title = mContext.getString(R.string.root_recent);
+            root.availableBytes = -1;
+
+            mRoots.add(root);
             mRecentsRoot = root;
         }
 
         // Query for other storage backends
+        final ContentResolver resolver = mContext.getContentResolver();
         final PackageManager pm = mContext.getPackageManager();
         final List<ProviderInfo> providers = pm.queryContentProviders(
                 null, -1, PackageManager.GET_META_DATA);
-        for (ProviderInfo providerInfo : providers) {
-            if (providerInfo.metaData != null && providerInfo.metaData.containsKey(
+        for (ProviderInfo info : providers) {
+            if (info.metaData != null && info.metaData.containsKey(
                     DocumentsContract.META_DATA_DOCUMENT_PROVIDER)) {
-                final DocumentsProviderInfo info = DocumentsProviderInfo.parseInfo(
-                        mContext, providerInfo);
-                if (info == null) {
-                    Log.w(TAG, "Missing info for " + providerInfo);
-                    continue;
-                }
 
-                mProviders.put(info.providerInfo.authority, info);
-
+                // TODO: remove deprecated customRoots flag
+                // TODO: populate roots on background thread, and cache results
+                final Uri rootsUri = DocumentsContract.buildRootsUri(info.authority);
+                final ContentProviderClient client = resolver
+                        .acquireUnstableContentProviderClient(info.authority);
+                Cursor cursor = null;
                 try {
-                    // TODO: remove deprecated customRoots flag
-                    // TODO: populate roots on background thread, and cache results
-                    final Uri uri = DocumentsContract.buildRootsUri(providerInfo.authority);
-                    final Cursor cursor = mContext.getContentResolver()
-                            .query(uri, null, null, null, null);
-                    try {
-                        while (cursor.moveToNext()) {
-                            final Root root = Root.fromCursor(mContext, info, cursor);
-                            mRoots.put(Pair.create(info.providerInfo.authority, root.rootId), root);
-                            mRootsList.add(root);
-                        }
-                    } finally {
-                        cursor.close();
+                    cursor = client.query(rootsUri, null, null, null, null);
+                    while (cursor.moveToNext()) {
+                        final RootInfo root = RootInfo.fromRootsCursor(info.authority, cursor);
+                        mRoots.add(root);
                     }
                 } catch (Exception e) {
-                    Log.w(TAG, "Failed to load some roots from " + info.providerInfo.authority
-                            + ": " + e);
+                    Log.w(TAG, "Failed to load some roots from " + info.authority + ": " + e);
+                } finally {
+                    IoUtils.closeQuietly(cursor);
+                    ContentProviderClient.closeQuietly(client);
                 }
             }
         }
     }
 
-    @GuardedBy("ActivityThread")
-    public DocumentsProviderInfo findProvider(String authority) {
-        return mProviders.get(authority);
+    @Deprecated
+    public RootInfo findRoot(Uri uri) {
+        final String authority = uri.getAuthority();
+        final String docId = DocumentsContract.getDocumentId(uri);
+        for (RootInfo root : mRoots) {
+            if (Objects.equal(root.authority, authority) && Objects.equal(root.documentId, docId)) {
+                return root;
+            }
+        }
+        return null;
     }
 
     @GuardedBy("ActivityThread")
-    public Root findRoot(String authority, String rootId) {
-        return mRoots.get(Pair.create(authority, rootId));
+    public RootInfo getRoot(String authority, String rootId) {
+        for (RootInfo root : mRoots) {
+            if (Objects.equal(root.authority, authority) && Objects.equal(root.rootId, rootId)) {
+                return root;
+            }
+        }
+        return null;
     }
 
     @GuardedBy("ActivityThread")
-    public Root findRoot(Document doc) {
-        final String authority = doc.uri.getAuthority();
-        final String rootId = DocumentsContract.getRootId(doc.uri);
-        return findRoot(authority, rootId);
-    }
-
-    @GuardedBy("ActivityThread")
-    public Root getRecentsRoot() {
+    public RootInfo getRecentsRoot() {
         return mRecentsRoot;
     }
 
     @GuardedBy("ActivityThread")
-    public Collection<Root> getRoots() {
-        return mRootsList;
+    public boolean isRecentsRoot(RootInfo root) {
+        return mRecentsRoot == root;
     }
 
     @GuardedBy("ActivityThread")
-    public Drawable resolveDocumentIcon(Context context, String authority, String mimeType) {
-        // Custom icons take precedence
-        final DocumentsProviderInfo info = mProviders.get(authority);
-        if (info != null) {
-            for (Icon icon : info.customIcons) {
-                if (MimePredicate.mimeMatches(icon.mimeType, mimeType)) {
-                    return icon.icon;
-                }
+    public List<RootInfo> getRoots() {
+        return mRoots;
+    }
+
+    /**
+     * Flags that declare explicit content types.
+     */
+    private static final int FLAGS_CONTENT_MASK = Root.FLAG_PROVIDES_IMAGES
+            | Root.FLAG_PROVIDES_AUDIO | Root.FLAG_PROVIDES_VIDEO;
+
+    @GuardedBy("ActivityThread")
+    public List<RootInfo> getMatchingRoots(State state) {
+
+        // Determine acceptable content flags
+        int includeFlags = 0;
+        for (String acceptMime : state.acceptMimes) {
+            final String[] type = acceptMime.split("/");
+            if (type.length != 2) continue;
+
+            if ("image".equals(type[0])) {
+                includeFlags |= Root.FLAG_PROVIDES_IMAGES;
+            } else if ("audio".equals(type[0])) {
+                includeFlags |= Root.FLAG_PROVIDES_AUDIO;
+            } else if ("video".equals(type[0])) {
+                includeFlags |= Root.FLAG_PROVIDES_VIDEO;
+            } else if ("*".equals(type[0])) {
+                includeFlags |= Root.FLAG_PROVIDES_IMAGES | Root.FLAG_PROVIDES_AUDIO
+                        | Root.FLAG_PROVIDES_VIDEO;
             }
         }
 
-        if (Documents.MIME_TYPE_DIR.equals(mimeType)) {
+        ArrayList<RootInfo> matching = Lists.newArrayList();
+        for (RootInfo root : mRoots) {
+            final boolean supportsCreate = (root.flags & Root.FLAG_SUPPORTS_CREATE) != 0;
+            final boolean advanced = (root.flags & Root.FLAG_ADVANCED) != 0;
+            final boolean localOnly = (root.flags & Root.FLAG_LOCAL_ONLY) != 0;
+
+            // Exclude read-only devices when creating
+            if (state.action == State.ACTION_CREATE && !supportsCreate) continue;
+            // Exclude advanced devices when not requested
+            if (!state.showAdvanced && advanced) continue;
+            // Exclude non-local devices when local only
+            if (state.localOnly && !localOnly) continue;
+
+            if ((root.flags & FLAGS_CONTENT_MASK) != 0) {
+                // This root offers specific content, so only include if the
+                // caller asked for that content type.
+                if ((root.flags & includeFlags) == 0) {
+                    // Sorry, no overlap.
+                    continue;
+                }
+            }
+
+            matching.add(root);
+        }
+        return matching;
+    }
+
+    @GuardedBy("ActivityThread")
+    public static Drawable resolveDocumentIcon(Context context, String mimeType) {
+        if (Document.MIME_TYPE_DIR.equals(mimeType)) {
             return context.getResources().getDrawable(R.drawable.ic_dir);
         } else {
             final PackageManager pm = context.getPackageManager();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
index 8a48e2a..ef3a31d 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java
@@ -16,8 +16,6 @@
 
 package com.android.documentsui;
 
-import static com.android.documentsui.DocumentsActivity.TAG;
-
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
@@ -26,9 +24,8 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.Bundle;
-import android.provider.DocumentsContract.Roots;
+import android.provider.DocumentsContract.Root;
 import android.text.format.Formatter;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -39,11 +36,12 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import com.android.documentsui.DocumentsActivity.State;
 import com.android.documentsui.SectionedListAdapter.SectionAdapter;
-import com.android.documentsui.model.Root;
-import com.android.documentsui.model.Root.RootComparator;
+import com.android.documentsui.model.DocumentInfo;
+import com.android.documentsui.model.RootInfo;
 
-import java.util.Collection;
+import java.util.Comparator;
 import java.util.List;
 
 /**
@@ -76,24 +74,31 @@
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         final Context context = inflater.getContext();
-        final RootsCache roots = DocumentsApplication.getRootsCache(context);
 
         final View view = inflater.inflate(R.layout.fragment_roots, container, false);
         mList = (ListView) view.findViewById(android.R.id.list);
         mList.setOnItemClickListener(mItemListener);
 
-        final Intent includeApps = getArguments().getParcelable(EXTRA_INCLUDE_APPS);
-        mAdapter = new SectionedRootsAdapter(context, roots.getRoots(), includeApps);
-
         return view;
     }
 
     @Override
     public void onStart() {
         super.onStart();
+        updateRootsAdapter();
+    }
 
+    private void updateRootsAdapter() {
         final Context context = getActivity();
-        mAdapter.updateVisible(SettingsActivity.getDisplayAdvancedDevices(context));
+
+        final State state = ((DocumentsActivity) context).getDisplayState();
+        state.showAdvanced = SettingsActivity.getDisplayAdvancedDevices(context);
+
+        final RootsCache roots = DocumentsApplication.getRootsCache(context);
+        final List<RootInfo> matchingRoots = roots.getMatchingRoots(state);
+        final Intent includeApps = getArguments().getParcelable(EXTRA_INCLUDE_APPS);
+
+        mAdapter = new SectionedRootsAdapter(context, matchingRoots, includeApps);
         mList.setAdapter(mAdapter);
     }
 
@@ -102,8 +107,8 @@
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             final DocumentsActivity activity = DocumentsActivity.get(RootsFragment.this);
             final Object item = mAdapter.getItem(position);
-            if (item instanceof Root) {
-                activity.onRootPicked((Root) item, true);
+            if (item instanceof RootInfo) {
+                activity.onRootPicked((RootInfo) item, true);
             } else if (item instanceof ResolveInfo) {
                 activity.onAppPicked((ResolveInfo) item);
             } else {
@@ -112,7 +117,7 @@
         }
     };
 
-    private static class RootsAdapter extends ArrayAdapter<Root> implements SectionAdapter {
+    private static class RootsAdapter extends ArrayAdapter<RootInfo> implements SectionAdapter {
         private int mHeaderId;
 
         public RootsAdapter(Context context, int headerId) {
@@ -132,15 +137,13 @@
             final TextView title = (TextView) convertView.findViewById(android.R.id.title);
             final TextView summary = (TextView) convertView.findViewById(android.R.id.summary);
 
-            final Root root = getItem(position);
-            icon.setImageDrawable(root.icon);
+            final RootInfo root = getItem(position);
+            icon.setImageDrawable(root.loadIcon(context));
             title.setText(root.title);
 
             // Device summary is always available space
             final String summaryText;
-            if ((root.rootType == Roots.ROOT_TYPE_DEVICE
-                    || root.rootType == Roots.ROOT_TYPE_DEVICE_ADVANCED)
-                    && root.availableBytes >= 0) {
+            if (root.rootType == Root.ROOT_TYPE_DEVICE && root.availableBytes >= 0) {
                 summaryText = context.getString(R.string.root_available_bytes,
                         Formatter.formatFileSize(context, root.availableBytes));
             } else {
@@ -213,31 +216,24 @@
         private final RootsAdapter mServices;
         private final RootsAdapter mShortcuts;
         private final RootsAdapter mDevices;
-        private final RootsAdapter mDevicesAdvanced;
         private final AppsAdapter mApps;
 
-        public SectionedRootsAdapter(Context context, Collection<Root> roots, Intent includeApps) {
+        public SectionedRootsAdapter(Context context, List<RootInfo> roots, Intent includeApps) {
             mServices = new RootsAdapter(context, R.string.root_type_service);
             mShortcuts = new RootsAdapter(context, R.string.root_type_shortcut);
             mDevices = new RootsAdapter(context, R.string.root_type_device);
-            mDevicesAdvanced = new RootsAdapter(context, R.string.root_type_device);
             mApps = new AppsAdapter(context);
 
-            for (Root root : roots) {
-                Log.d(TAG, "Found rootType=" + root.rootType);
+            for (RootInfo root : roots) {
                 switch (root.rootType) {
-                    case Roots.ROOT_TYPE_SERVICE:
+                    case Root.ROOT_TYPE_SERVICE:
                         mServices.add(root);
                         break;
-                    case Roots.ROOT_TYPE_SHORTCUT:
+                    case Root.ROOT_TYPE_SHORTCUT:
                         mShortcuts.add(root);
                         break;
-                    case Roots.ROOT_TYPE_DEVICE:
+                    case Root.ROOT_TYPE_DEVICE:
                         mDevices.add(root);
-                        mDevicesAdvanced.add(root);
-                        break;
-                    case Roots.ROOT_TYPE_DEVICE_ADVANCED:
-                        mDevicesAdvanced.add(root);
                         break;
                 }
             }
@@ -259,26 +255,37 @@
             mServices.sort(comp);
             mShortcuts.sort(comp);
             mDevices.sort(comp);
-            mDevicesAdvanced.sort(comp);
-        }
 
-        public void updateVisible(boolean showAdvanced) {
-            clearSections();
             if (mServices.getCount() > 0) {
                 addSection(mServices);
             }
             if (mShortcuts.getCount() > 0) {
                 addSection(mShortcuts);
             }
-
-            final RootsAdapter devices = showAdvanced ? mDevicesAdvanced : mDevices;
-            if (devices.getCount() > 0) {
-                addSection(devices);
+            if (mDevices.getCount() > 0) {
+                addSection(mDevices);
             }
-
             if (mApps.getCount() > 0) {
                 addSection(mApps);
             }
         }
     }
+
+    public static class RootComparator implements Comparator<RootInfo> {
+        @Override
+        public int compare(RootInfo lhs, RootInfo rhs) {
+            if (lhs.authority == null) {
+                return -1;
+            } else if (rhs.authority == null) {
+                return 1;
+            }
+
+            final int score = DocumentInfo.compareToIgnoreCaseNullable(lhs.title, rhs.title);
+            if (score != 0) {
+                return score;
+            } else {
+                return DocumentInfo.compareToIgnoreCaseNullable(lhs.summary, rhs.summary);
+            }
+        }
+    }
 }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java b/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java
index 8eb81b8..8b0a974 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java
@@ -31,7 +31,7 @@
 import android.widget.EditText;
 import android.widget.ImageView;
 
-import com.android.documentsui.model.Document;
+import com.android.documentsui.model.DocumentInfo;
 
 /**
  * Display document title editor and save button.
@@ -39,7 +39,7 @@
 public class SaveFragment extends Fragment {
     public static final String TAG = "SaveFragment";
 
-    private Document mReplaceTarget;
+    private DocumentInfo mReplaceTarget;
     private EditText mDisplayName;
     private Button mSave;
     private boolean mIgnoreNextEdit;
@@ -73,8 +73,8 @@
         final View view = inflater.inflate(R.layout.fragment_save, container, false);
 
         final ImageView icon = (ImageView) view.findViewById(android.R.id.icon);
-        icon.setImageDrawable(roots.resolveDocumentIcon(
-                context, null, getArguments().getString(EXTRA_MIME_TYPE)));
+        icon.setImageDrawable(
+                RootsCache.resolveDocumentIcon(context, getArguments().getString(EXTRA_MIME_TYPE)));
 
         mDisplayName = (EditText) view.findViewById(android.R.id.title);
         mDisplayName.addTextChangedListener(mDisplayNameWatcher);
@@ -128,7 +128,7 @@
      * without changing the filename. Can be set to {@code null} if user
      * navigates outside the target directory.
      */
-    public void setReplaceTarget(Document replaceTarget) {
+    public void setReplaceTarget(DocumentInfo replaceTarget) {
         mReplaceTarget = replaceTarget;
 
         if (mReplaceTarget != null) {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java
new file mode 100644
index 0000000..19ad2e2
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/SortingCursorWrapper.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package com.android.documentsui;
+
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_DISPLAY_NAME;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
+import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_SIZE;
+
+import android.database.AbstractCursor;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.provider.DocumentsContract.Document;
+
+/**
+ * Cursor wrapper that presents a sorted view of the underlying cursor. Handles
+ * common {@link Document} sorting modes, such as ordering directories first.
+ */
+public class SortingCursorWrapper extends AbstractCursor {
+    private final Cursor mCursor;
+
+    private final int[] mPosition;
+    private final String[] mValueString;
+    private final long[] mValueLong;
+
+    public SortingCursorWrapper(Cursor cursor, int sortOrder) {
+        mCursor = cursor;
+
+        final int count = cursor.getCount();
+        mPosition = new int[count];
+        switch (sortOrder) {
+            case SORT_ORDER_DISPLAY_NAME:
+                mValueString = new String[count];
+                mValueLong = null;
+                break;
+            case SORT_ORDER_LAST_MODIFIED:
+            case SORT_ORDER_SIZE:
+                mValueString = null;
+                mValueLong = new long[count];
+                break;
+            default:
+                throw new IllegalArgumentException();
+        }
+
+        cursor.moveToPosition(-1);
+        for (int i = 0; i < count; i++) {
+            cursor.moveToNext();
+            mPosition[i] = i;
+
+            switch (sortOrder) {
+                case SORT_ORDER_DISPLAY_NAME:
+                    final String mimeType = cursor.getString(
+                            cursor.getColumnIndex(Document.COLUMN_MIME_TYPE));
+                    final String displayName = cursor.getString(
+                            cursor.getColumnIndex(Document.COLUMN_DISPLAY_NAME));
+                    if (Document.MIME_TYPE_DIR.equals(mimeType)) {
+                        mValueString[i] = '\001' + displayName;
+                    } else {
+                        mValueString[i] = displayName;
+                    }
+                    break;
+                case SORT_ORDER_LAST_MODIFIED:
+                    mValueLong[i] = cursor.getLong(
+                            cursor.getColumnIndex(Document.COLUMN_LAST_MODIFIED));
+                    break;
+                case SORT_ORDER_SIZE:
+                    mValueLong[i] = cursor.getLong(cursor.getColumnIndex(Document.COLUMN_SIZE));
+                    break;
+            }
+        }
+
+        switch (sortOrder) {
+            case SORT_ORDER_DISPLAY_NAME:
+                synchronized (SortingCursorWrapper.class) {
+
+                    binarySort(mPosition, mValueString);
+                }
+                break;
+            case SORT_ORDER_LAST_MODIFIED:
+            case SORT_ORDER_SIZE:
+                binarySort(mPosition, mValueLong);
+                break;
+        }
+    }
+
+    @Override
+    public Bundle getExtras() {
+        return mCursor.getExtras();
+    }
+
+    @Override
+    public void close() {
+        super.close();
+        mCursor.close();
+    }
+
+    @Override
+    public boolean onMove(int oldPosition, int newPosition) {
+        return mCursor.moveToPosition(mPosition[newPosition]);
+    }
+
+    @Override
+    public String[] getColumnNames() {
+        return mCursor.getColumnNames();
+    }
+
+    @Override
+    public int getCount() {
+        return mCursor.getCount();
+    }
+
+    @Override
+    public double getDouble(int column) {
+        return mCursor.getDouble(column);
+    }
+
+    @Override
+    public float getFloat(int column) {
+        return mCursor.getFloat(column);
+    }
+
+    @Override
+    public int getInt(int column) {
+        return mCursor.getInt(column);
+    }
+
+    @Override
+    public long getLong(int column) {
+        return mCursor.getLong(column);
+    }
+
+    @Override
+    public short getShort(int column) {
+        return mCursor.getShort(column);
+    }
+
+    @Override
+    public String getString(int column) {
+        return mCursor.getString(column);
+    }
+
+    @Override
+    public int getType(int column) {
+        return mCursor.getType(column);
+    }
+
+    @Override
+    public boolean isNull(int column) {
+        return mCursor.isNull(column);
+    }
+
+    /**
+     * Borrowed from TimSort.binarySort(), but modified to sort two column
+     * dataset.
+     */
+    private static void binarySort(int[] position, String[] value) {
+        final int count = position.length;
+        for (int start = 1; start < count; start++) {
+            final int pivotPosition = position[start];
+            final String pivotValue = value[start];
+
+            int left = 0;
+            int right = start;
+
+            while (left < right) {
+                int mid = (left + right) >>> 1;
+
+                final String lhs = pivotValue;
+                final String rhs = value[mid];
+                final int compare;
+                if (lhs == null) {
+                    compare = -1;
+                } else if (rhs == null) {
+                    compare = 1;
+                } else {
+                    compare = lhs.compareToIgnoreCase(rhs);
+                }
+
+                if (compare < 0) {
+                    right = mid;
+                } else {
+                    left = mid + 1;
+                }
+            }
+
+            int n = start - left;
+            switch (n) {
+                case 2:
+                    position[left + 2] = position[left + 1];
+                    value[left + 2] = value[left + 1];
+                case 1:
+                    position[left + 1] = position[left];
+                    value[left + 1] = value[left];
+                    break;
+                default:
+                    System.arraycopy(position, left, position, left + 1, n);
+                    System.arraycopy(value, left, value, left + 1, n);
+            }
+
+            position[left] = pivotPosition;
+            value[left] = pivotValue;
+        }
+    }
+
+    /**
+     * Borrowed from TimSort.binarySort(), but modified to sort two column
+     * dataset.
+     */
+    private static void binarySort(int[] position, long[] value) {
+        final int count = position.length;
+        for (int start = 1; start < count; start++) {
+            final int pivotPosition = position[start];
+            final long pivotValue = value[start];
+
+            int left = 0;
+            int right = start;
+
+            while (left < right) {
+                int mid = (left + right) >>> 1;
+
+                final long lhs = pivotValue;
+                final long rhs = value[mid];
+                final int compare = Long.compare(lhs, rhs);
+                if (compare > 0) {
+                    right = mid;
+                } else {
+                    left = mid + 1;
+                }
+            }
+
+            int n = start - left;
+            switch (n) {
+                case 2:
+                    position[left + 2] = position[left + 1];
+                    value[left + 2] = value[left + 1];
+                case 1:
+                    position[left + 1] = position[left];
+                    value[left + 1] = value[left];
+                    break;
+                default:
+                    System.arraycopy(position, left, position, left + 1, n);
+                    System.arraycopy(value, left, value, left + 1, n);
+            }
+
+            position[left] = pivotPosition;
+            value[left] = pivotValue;
+        }
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
index f6548e8..2405cb5 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
@@ -32,7 +32,6 @@
 import libcore.io.IoUtils;
 import libcore.io.Streams;
 
-import java.io.IOException;
 import java.io.InputStream;
 
 public class TestActivity extends Activity {
@@ -50,8 +49,11 @@
         view.setOrientation(LinearLayout.VERTICAL);
 
         final CheckBox multiple = new CheckBox(context);
-        multiple.setText("ALLOW_MULTIPLE");
+        multiple.setText("\nALLOW_MULTIPLE\n");
         view.addView(multiple);
+        final CheckBox localOnly = new CheckBox(context);
+        localOnly.setText("\nLOCAL_ONLY\n");
+        view.addView(localOnly);
 
         Button button;
         button = new Button(context);
@@ -65,6 +67,9 @@
                 if (multiple.isChecked()) {
                     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                 }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(intent, 42);
             }
         });
@@ -81,6 +86,28 @@
                 if (multiple.isChecked()) {
                     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                 }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
+                startActivityForResult(intent, 42);
+            }
+        });
+        view.addView(button);
+
+        button = new Button(context);
+        button.setText("OPEN_DOC audio/ogg");
+        button.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+                intent.addCategory(Intent.CATEGORY_OPENABLE);
+                intent.setType("audio/ogg");
+                if (multiple.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
+                }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(intent, 42);
             }
         });
@@ -99,6 +126,9 @@
                 if (multiple.isChecked()) {
                     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                 }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(intent, 42);
             }
         });
@@ -113,6 +143,9 @@
                 intent.addCategory(Intent.CATEGORY_OPENABLE);
                 intent.setType("text/plain");
                 intent.putExtra(Intent.EXTRA_TITLE, "foobar.txt");
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(intent, 42);
             }
         });
@@ -129,6 +162,9 @@
                 if (multiple.isChecked()) {
                     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                 }
+                if (localOnly.isChecked()) {
+                    intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+                }
                 startActivityForResult(Intent.createChooser(intent, "Kittens!"), 42);
             }
         });
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/Document.java b/packages/DocumentsUI/src/com/android/documentsui/model/Document.java
deleted file mode 100644
index c0f21cb..0000000
--- a/packages/DocumentsUI/src/com/android/documentsui/model/Document.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package com.android.documentsui.model;
-
-import android.content.ContentResolver;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.DocumentColumns;
-import android.provider.DocumentsContract.Documents;
-
-import com.android.documentsui.RecentsProvider;
-
-import libcore.io.IoUtils;
-
-import java.io.FileNotFoundException;
-import java.util.Comparator;
-
-/**
- * Representation of a single document.
- */
-public class Document {
-    public final Uri uri;
-    public final String mimeType;
-    public final String displayName;
-    public final long lastModified;
-    public final int flags;
-    public final String summary;
-    public final long size;
-
-    private Document(Uri uri, String mimeType, String displayName, long lastModified, int flags,
-            String summary, long size) {
-        this.uri = uri;
-        this.mimeType = mimeType;
-        this.displayName = displayName;
-        this.lastModified = lastModified;
-        this.flags = flags;
-        this.summary = summary;
-        this.size = size;
-    }
-
-    public static Document fromRoot(ContentResolver resolver, Root root)
-            throws FileNotFoundException {
-        return fromUri(resolver, root.uri);
-    }
-
-    public static Document fromDirectoryCursor(Uri parent, Cursor cursor) {
-        final String authority = parent.getAuthority();
-        final String rootId = DocumentsContract.getRootId(parent);
-        final String docId = getCursorString(cursor, DocumentColumns.DOC_ID);
-
-        final Uri uri = DocumentsContract.buildDocumentUri(authority, rootId, docId);
-        final String mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
-        final String displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
-        final long lastModified = getCursorLong(cursor, DocumentColumns.LAST_MODIFIED);
-        final int flags = getCursorInt(cursor, DocumentColumns.FLAGS);
-        final String summary = getCursorString(cursor, DocumentColumns.SUMMARY);
-        final long size = getCursorLong(cursor, DocumentColumns.SIZE);
-
-        return new Document(uri, mimeType, displayName, lastModified, flags, summary, size);
-    }
-
-    public static Document fromRecentOpenCursor(ContentResolver resolver, Cursor recentCursor)
-            throws FileNotFoundException {
-        final Uri uri = Uri.parse(getCursorString(recentCursor, RecentsProvider.COL_URI));
-        final long lastModified = getCursorLong(recentCursor, RecentsProvider.COL_TIMESTAMP);
-
-        Cursor cursor = null;
-        try {
-            cursor = resolver.query(uri, null, null, null, null);
-            if (!cursor.moveToFirst()) {
-                throw new FileNotFoundException("Missing details for " + uri);
-            }
-            final String mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
-            final String displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
-            final int flags = getCursorInt(cursor, DocumentColumns.FLAGS)
-                    & Documents.FLAG_SUPPORTS_THUMBNAIL;
-            final String summary = getCursorString(cursor, DocumentColumns.SUMMARY);
-            final long size = getCursorLong(cursor, DocumentColumns.SIZE);
-
-            return new Document(uri, mimeType, displayName, lastModified, flags, summary, size);
-        } catch (Throwable t) {
-            throw asFileNotFoundException(t);
-        } finally {
-            IoUtils.closeQuietly(cursor);
-        }
-    }
-
-    public static Document fromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException {
-        Cursor cursor = null;
-        try {
-            cursor = resolver.query(uri, null, null, null, null);
-            if (!cursor.moveToFirst()) {
-                throw new FileNotFoundException("Missing details for " + uri);
-            }
-            final String mimeType = getCursorString(cursor, DocumentColumns.MIME_TYPE);
-            final String displayName = getCursorString(cursor, DocumentColumns.DISPLAY_NAME);
-            final long lastModified = getCursorLong(cursor, DocumentColumns.LAST_MODIFIED);
-            final int flags = getCursorInt(cursor, DocumentColumns.FLAGS);
-            final String summary = getCursorString(cursor, DocumentColumns.SUMMARY);
-            final long size = getCursorLong(cursor, DocumentColumns.SIZE);
-
-            return new Document(uri, mimeType, displayName, lastModified, flags, summary, size);
-        } catch (Throwable t) {
-            throw asFileNotFoundException(t);
-        } finally {
-            IoUtils.closeQuietly(cursor);
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "Document{name=" + displayName + ", uri=" + uri + "}";
-    }
-
-    public boolean isCreateSupported() {
-        return (flags & Documents.FLAG_SUPPORTS_CREATE) != 0;
-    }
-
-    public boolean isSearchSupported() {
-        return (flags & Documents.FLAG_SUPPORTS_SEARCH) != 0;
-    }
-
-    public boolean isThumbnailSupported() {
-        return (flags & Documents.FLAG_SUPPORTS_THUMBNAIL) != 0;
-    }
-
-    public boolean isDirectory() {
-        return Documents.MIME_TYPE_DIR.equals(mimeType);
-    }
-
-    public boolean isGridPreferred() {
-        return (flags & Documents.FLAG_PREFERS_GRID) != 0;
-    }
-
-    public boolean isDeleteSupported() {
-        return (flags & Documents.FLAG_SUPPORTS_DELETE) != 0;
-    }
-
-    private static String getCursorString(Cursor cursor, String columnName) {
-        final int index = cursor.getColumnIndex(columnName);
-        return (index != -1) ? cursor.getString(index) : null;
-    }
-
-    /**
-     * Missing or null values are returned as -1.
-     */
-    private static long getCursorLong(Cursor cursor, String columnName) {
-        final int index = cursor.getColumnIndex(columnName);
-        if (index == -1) return -1;
-        final String value = cursor.getString(index);
-        if (value == null) return -1;
-        try {
-            return Long.parseLong(value);
-        } catch (NumberFormatException e) {
-            return -1;
-        }
-    }
-
-    private static int getCursorInt(Cursor cursor, String columnName) {
-        final int index = cursor.getColumnIndex(columnName);
-        return (index != -1) ? cursor.getInt(index) : 0;
-    }
-
-    public static class NameComparator implements Comparator<Document> {
-        @Override
-        public int compare(Document lhs, Document rhs) {
-            final boolean leftDir = lhs.isDirectory();
-            final boolean rightDir = rhs.isDirectory();
-
-            if (leftDir != rightDir) {
-                return leftDir ? -1 : 1;
-            } else {
-                return Root.compareToIgnoreCaseNullable(lhs.displayName, rhs.displayName);
-            }
-        }
-    }
-
-    public static class DateComparator implements Comparator<Document> {
-        @Override
-        public int compare(Document lhs, Document rhs) {
-            return Long.compare(rhs.lastModified, lhs.lastModified);
-        }
-    }
-
-    public static class SizeComparator implements Comparator<Document> {
-        @Override
-        public int compare(Document lhs, Document rhs) {
-            return Long.compare(rhs.size, lhs.size);
-        }
-    }
-
-    public static FileNotFoundException asFileNotFoundException(Throwable t)
-            throws FileNotFoundException {
-        if (t instanceof FileNotFoundException) {
-            throw (FileNotFoundException) t;
-        }
-        final FileNotFoundException fnfe = new FileNotFoundException(t.getMessage());
-        fnfe.initCause(t);
-        throw fnfe;
-    }
-}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
new file mode 100644
index 0000000..9874265
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package com.android.documentsui.model;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.database.Cursor;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Document;
+
+import com.android.documentsui.RootCursorWrapper;
+
+import libcore.io.IoUtils;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.ProtocolException;
+import java.util.Comparator;
+
+/**
+ * Representation of a {@link Document}.
+ */
+public class DocumentInfo implements Durable {
+    private static final int VERSION_INIT = 1;
+
+    public Uri uri;
+    public String mimeType;
+    public String displayName;
+    public long lastModified;
+    public int flags;
+    public String summary;
+    public long size;
+    public int icon;
+
+    public DocumentInfo() {
+        reset();
+    }
+
+    @Override
+    public void reset() {
+        uri = null;
+        mimeType = null;
+        displayName = null;
+        lastModified = -1;
+        flags = 0;
+        summary = null;
+        size = -1;
+        icon = 0;
+    }
+
+    @Override
+    public void read(DataInputStream in) throws IOException {
+        final int version = in.readInt();
+        switch (version) {
+            case VERSION_INIT:
+                final String rawUri = DurableUtils.readNullableString(in);
+                uri = rawUri != null ? Uri.parse(rawUri) : null;
+                mimeType = DurableUtils.readNullableString(in);
+                displayName = DurableUtils.readNullableString(in);
+                lastModified = in.readLong();
+                flags = in.readInt();
+                summary = DurableUtils.readNullableString(in);
+                size = in.readLong();
+                icon = in.readInt();
+                break;
+            default:
+                throw new ProtocolException("Unknown version " + version);
+        }
+    }
+
+    @Override
+    public void write(DataOutputStream out) throws IOException {
+        out.writeInt(VERSION_INIT);
+        DurableUtils.writeNullableString(out, uri.toString());
+        DurableUtils.writeNullableString(out, mimeType);
+        DurableUtils.writeNullableString(out, displayName);
+        out.writeLong(lastModified);
+        out.writeInt(flags);
+        DurableUtils.writeNullableString(out, summary);
+        out.writeLong(size);
+        out.writeInt(icon);
+    }
+
+    public static DocumentInfo fromDirectoryCursor(Cursor cursor) {
+        final DocumentInfo doc = new DocumentInfo();
+        final String authority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY);
+        final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
+        doc.uri = DocumentsContract.buildDocumentUri(authority, docId);
+        doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+        doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
+        doc.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
+        doc.flags = getCursorInt(cursor, Document.COLUMN_FLAGS);
+        doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY);
+        doc.size = getCursorLong(cursor, Document.COLUMN_SIZE);
+        doc.icon = getCursorInt(cursor, Document.COLUMN_ICON);
+        return doc;
+    }
+
+    public static DocumentInfo fromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException {
+        final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
+                uri.getAuthority());
+        Cursor cursor = null;
+        try {
+            cursor = client.query(uri, null, null, null, null);
+            if (!cursor.moveToFirst()) {
+                throw new FileNotFoundException("Missing details for " + uri);
+            }
+            final DocumentInfo doc = new DocumentInfo();
+            doc.uri = uri;
+            doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+            doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
+            doc.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
+            doc.flags = getCursorInt(cursor, Document.COLUMN_FLAGS);
+            doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY);
+            doc.size = getCursorLong(cursor, Document.COLUMN_SIZE);
+            doc.icon = getCursorInt(cursor, Document.COLUMN_ICON);
+            return doc;
+        } catch (Throwable t) {
+            throw asFileNotFoundException(t);
+        } finally {
+            IoUtils.closeQuietly(cursor);
+            ContentProviderClient.closeQuietly(client);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "Document{name=" + displayName + ", uri=" + uri + "}";
+    }
+
+    public boolean isCreateSupported() {
+        return (flags & Document.FLAG_DIR_SUPPORTS_CREATE) != 0;
+    }
+
+    public boolean isSearchSupported() {
+        return (flags & Document.FLAG_DIR_SUPPORTS_SEARCH) != 0;
+    }
+
+    public boolean isThumbnailSupported() {
+        return (flags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0;
+    }
+
+    public boolean isDirectory() {
+        return Document.MIME_TYPE_DIR.equals(mimeType);
+    }
+
+    public boolean isGridPreferred() {
+        return (flags & Document.FLAG_DIR_PREFERS_GRID) != 0;
+    }
+
+    public boolean isDeleteSupported() {
+        return (flags & Document.FLAG_SUPPORTS_DELETE) != 0;
+    }
+
+    public Drawable loadIcon(Context context) {
+        return loadIcon(context, uri.getAuthority(), icon);
+    }
+
+    public static Drawable loadIcon(Context context, String authority, int icon) {
+        if (icon != 0) {
+            if (authority != null) {
+                final PackageManager pm = context.getPackageManager();
+                final ProviderInfo info = pm.resolveContentProvider(authority, 0);
+                if (info != null) {
+                    return pm.getDrawable(info.packageName, icon, info.applicationInfo);
+                }
+            } else {
+                return context.getResources().getDrawable(icon);
+            }
+        }
+        return null;
+    }
+
+    public static String getCursorString(Cursor cursor, String columnName) {
+        final int index = cursor.getColumnIndex(columnName);
+        return (index != -1) ? cursor.getString(index) : null;
+    }
+
+    /**
+     * Missing or null values are returned as -1.
+     */
+    public static long getCursorLong(Cursor cursor, String columnName) {
+        final int index = cursor.getColumnIndex(columnName);
+        if (index == -1) return -1;
+        final String value = cursor.getString(index);
+        if (value == null) return -1;
+        try {
+            return Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            return -1;
+        }
+    }
+
+    public static int getCursorInt(Cursor cursor, String columnName) {
+        final int index = cursor.getColumnIndex(columnName);
+        return (index != -1) ? cursor.getInt(index) : 0;
+    }
+
+    @Deprecated
+    public static class DisplayNameComparator implements Comparator<DocumentInfo> {
+        @Override
+        public int compare(DocumentInfo lhs, DocumentInfo rhs) {
+            final boolean leftDir = lhs.isDirectory();
+            final boolean rightDir = rhs.isDirectory();
+
+            if (leftDir != rightDir) {
+                return leftDir ? -1 : 1;
+            } else {
+                return compareToIgnoreCaseNullable(lhs.displayName, rhs.displayName);
+            }
+        }
+    }
+
+    @Deprecated
+    public static class LastModifiedComparator implements Comparator<DocumentInfo> {
+        @Override
+        public int compare(DocumentInfo lhs, DocumentInfo rhs) {
+            return Long.compare(rhs.lastModified, lhs.lastModified);
+        }
+    }
+
+    @Deprecated
+    public static class SizeComparator implements Comparator<DocumentInfo> {
+        @Override
+        public int compare(DocumentInfo lhs, DocumentInfo rhs) {
+            return Long.compare(rhs.size, lhs.size);
+        }
+    }
+
+    public static FileNotFoundException asFileNotFoundException(Throwable t)
+            throws FileNotFoundException {
+        if (t instanceof FileNotFoundException) {
+            throw (FileNotFoundException) t;
+        }
+        final FileNotFoundException fnfe = new FileNotFoundException(t.getMessage());
+        fnfe.initCause(t);
+        throw fnfe;
+    }
+
+    public static int compareToIgnoreCaseNullable(String lhs, String rhs) {
+        if (lhs == null) return -1;
+        if (rhs == null) return 1;
+        return lhs.compareToIgnoreCase(rhs);
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
index d6c852e..33a1376 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
@@ -16,50 +16,69 @@
 
 package com.android.documentsui.model;
 
-import static com.android.documentsui.DocumentsActivity.TAG;
-import static com.android.documentsui.model.Document.asFileNotFoundException;
+import com.android.documentsui.RootsCache;
 
-import android.content.ContentResolver;
-import android.net.Uri;
-import android.util.Log;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-
-import java.io.FileNotFoundException;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.ProtocolException;
 import java.util.LinkedList;
 
 /**
- * Representation of a stack of {@link Document}, usually the result of a
+ * Representation of a stack of {@link DocumentInfo}, usually the result of a
  * user-driven traversal.
  */
-public class DocumentStack extends LinkedList<Document> {
+public class DocumentStack extends LinkedList<DocumentInfo> implements Durable {
+    private static final int VERSION_INIT = 1;
 
-    public static String serialize(DocumentStack stack) {
-        final JSONArray json = new JSONArray();
-        for (int i = 0; i < stack.size(); i++) {
-            json.put(stack.get(i).uri);
-        }
-        return json.toString();
+    public RootInfo getRoot(RootsCache roots) {
+        return roots.findRoot(getLast().uri);
     }
 
-    public static DocumentStack deserialize(ContentResolver resolver, String raw)
-            throws FileNotFoundException {
-        Log.d(TAG, "deserialize: " + raw);
-
-        final DocumentStack stack = new DocumentStack();
-        try {
-            final JSONArray json = new JSONArray(raw);
-            for (int i = 0; i < json.length(); i++) {
-                final Uri uri = Uri.parse(json.getString(i));
-                final Document doc = Document.fromUri(resolver, uri);
-                stack.add(doc);
-            }
-        } catch (JSONException e) {
-            throw asFileNotFoundException(e);
+    public String getTitle(RootsCache roots) {
+        if (size() == 1) {
+            return getRoot(roots).title;
+        } else if (size() > 1) {
+            return peek().displayName;
+        } else {
+            return null;
         }
+    }
 
-        // TODO: handle roots that have gone missing
-        return stack;
+    public boolean isRecents() {
+        return size() == 0;
+    }
+
+    @Override
+    public void reset() {
+        clear();
+    }
+
+    @Override
+    public void read(DataInputStream in) throws IOException {
+        final int version = in.readInt();
+        switch (version) {
+            case VERSION_INIT:
+                final int size = in.readInt();
+                for (int i = 0; i < size; i++) {
+                    final DocumentInfo doc = new DocumentInfo();
+                    doc.read(in);
+                    add(doc);
+                }
+                break;
+            default:
+                throw new ProtocolException("Unknown version " + version);
+        }
+    }
+
+    @Override
+    public void write(DataOutputStream out) throws IOException {
+        out.writeInt(VERSION_INIT);
+        final int size = size();
+        out.writeInt(size);
+        for (int i = 0; i < size; i++) {
+            final DocumentInfo doc = get(i);
+            doc.write(out);
+        }
     }
 }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentsProviderInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentsProviderInfo.java
deleted file mode 100644
index 96eb58e..0000000
--- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentsProviderInfo.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package com.android.documentsui.model;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ProviderInfo;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.graphics.drawable.Drawable;
-import android.provider.DocumentsContract;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.Xml;
-
-import com.android.documentsui.DocumentsActivity;
-import com.google.android.collect.Lists;
-
-import libcore.io.IoUtils;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Representation of a storage backend.
- */
-public class DocumentsProviderInfo {
-    private static final String TAG = DocumentsActivity.TAG;
-
-    public ProviderInfo providerInfo;
-    public boolean customRoots;
-    public List<Icon> customIcons;
-
-    public static class Icon {
-        public String mimeType;
-        public Drawable icon;
-    }
-
-    private static final String TAG_DOCUMENTS_PROVIDER = "documents-provider";
-    private static final String TAG_ICON = "icon";
-
-    public static DocumentsProviderInfo buildRecents(Context context, ProviderInfo providerInfo) {
-        final DocumentsProviderInfo info = new DocumentsProviderInfo();
-        info.providerInfo = providerInfo;
-        info.customRoots = false;
-        return info;
-    }
-
-    public static DocumentsProviderInfo parseInfo(Context context, ProviderInfo providerInfo) {
-        final DocumentsProviderInfo info = new DocumentsProviderInfo();
-        info.providerInfo = providerInfo;
-        info.customIcons = Lists.newArrayList();
-
-        final PackageManager pm = context.getPackageManager();
-        final Resources res;
-        try {
-            res = pm.getResourcesForApplication(providerInfo.applicationInfo);
-        } catch (NameNotFoundException e) {
-            Log.w(TAG, "Failed to find resources for " + providerInfo, e);
-            return null;
-        }
-
-        XmlResourceParser parser = null;
-        try {
-            parser = providerInfo.loadXmlMetaData(
-                    pm, DocumentsContract.META_DATA_DOCUMENT_PROVIDER);
-            AttributeSet attrs = Xml.asAttributeSet(parser);
-
-            int type = 0;
-            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
-                final String tag = parser.getName();
-                if (type == XmlPullParser.START_TAG && TAG_DOCUMENTS_PROVIDER.equals(tag)) {
-                    final TypedArray a = res.obtainAttributes(
-                            attrs, com.android.internal.R.styleable.DocumentsProviderInfo);
-                    info.customRoots = a.getBoolean(
-                            com.android.internal.R.styleable.DocumentsProviderInfo_customRoots,
-                            false);
-                    a.recycle();
-
-                } else if (type == XmlPullParser.START_TAG && TAG_ICON.equals(tag)) {
-                    final TypedArray a = res.obtainAttributes(
-                            attrs, com.android.internal.R.styleable.Icon);
-                    final Icon icon = new Icon();
-                    icon.mimeType = a.getString(com.android.internal.R.styleable.Icon_mimeType);
-                    icon.icon = a.getDrawable(com.android.internal.R.styleable.Icon_icon);
-                    info.customIcons.add(icon);
-                    a.recycle();
-                }
-            }
-        } catch (IOException e) {
-            Log.w(TAG, "Failed to parse metadata", e);
-            return null;
-        } catch (XmlPullParserException e) {
-            Log.w(TAG, "Failed to parse metadata", e);
-            return null;
-        } finally {
-            IoUtils.closeQuietly(parser);
-        }
-
-        return info;
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellCallback.java b/packages/DocumentsUI/src/com/android/documentsui/model/Durable.java
similarity index 60%
rename from tests/DumpRenderTree/src/com/android/dumprendertree/TestShellCallback.java
rename to packages/DocumentsUI/src/com/android/documentsui/model/Durable.java
index 5220d579..01633ed 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellCallback.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/Durable.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 The Android Open Source Project
+ * Copyright (C) 2013 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.
@@ -14,10 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.dumprendertree;
+package com.android.documentsui.model;
 
-public interface TestShellCallback {
-    public void finished();
-    public void dumpResult(String webViewDump);
-    public void timedOut(String url);
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public interface Durable {
+    public void reset();
+    public void read(DataInputStream in) throws IOException;
+    public void write(DataOutputStream out) throws IOException;
 }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DurableUtils.java b/packages/DocumentsUI/src/com/android/documentsui/model/DurableUtils.java
new file mode 100644
index 0000000..214fb14
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DurableUtils.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package com.android.documentsui.model;
+
+import static com.android.documentsui.DocumentsActivity.TAG;
+
+import android.os.BadParcelableException;
+import android.os.Parcel;
+import android.util.Log;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class DurableUtils {
+    public static <D extends Durable> byte[] writeToArray(D d) throws IOException {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        d.write(new DataOutputStream(out));
+        return out.toByteArray();
+    }
+
+    public static <D extends Durable> D readFromArray(byte[] data, D d) throws IOException {
+        final ByteArrayInputStream in = new ByteArrayInputStream(data);
+        d.reset();
+        try {
+            d.read(new DataInputStream(in));
+        } catch (IOException e) {
+            d.reset();
+            throw e;
+        }
+        return d;
+    }
+
+    public static <D extends Durable> byte[] writeToArrayOrNull(D d) {
+        try {
+            return writeToArray(d);
+        } catch (IOException e) {
+            Log.w(TAG, "Failed to write", e);
+            return null;
+        }
+    }
+
+    public static <D extends Durable> D readFromArrayOrNull(byte[] data, D d) {
+        try {
+            return readFromArray(data, d);
+        } catch (IOException e) {
+            Log.w(TAG, "Failed to read", e);
+            return null;
+        }
+    }
+
+    public static <D extends Durable> void writeToParcel(Parcel parcel, D d) {
+        try {
+            parcel.writeByteArray(writeToArray(d));
+        } catch (IOException e) {
+            throw new BadParcelableException(e);
+        }
+    }
+
+    public static <D extends Durable> D readFromParcel(Parcel parcel, D d) {
+        try {
+            return readFromArray(parcel.createByteArray(), d);
+        } catch (IOException e) {
+            throw new BadParcelableException(e);
+        }
+    }
+
+    public static void writeNullableString(DataOutputStream out, String value) throws IOException {
+        if (value != null) {
+            out.write(1);
+            out.writeUTF(value);
+        } else {
+            out.write(0);
+        }
+    }
+
+    public static String readNullableString(DataInputStream in) throws IOException {
+        if (in.read() != 0) {
+            return in.readUTF();
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/Root.java b/packages/DocumentsUI/src/com/android/documentsui/model/Root.java
deleted file mode 100644
index 23d16df..0000000
--- a/packages/DocumentsUI/src/com/android/documentsui/model/Root.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package com.android.documentsui.model;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Resources.NotFoundException;
-import android.database.Cursor;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.Documents;
-import android.provider.DocumentsContract.RootColumns;
-import android.provider.DocumentsContract.Roots;
-
-import com.android.documentsui.R;
-
-import java.util.Comparator;
-
-/**
- * Representation of a root under a storage backend.
- */
-public class Root {
-    public String rootId;
-    public int rootType;
-    public Uri uri;
-    public Drawable icon;
-    public String title;
-    public String summary;
-    public long availableBytes = -1;
-    public boolean isRecents;
-
-    public static Root buildRecents(Context context) {
-        final PackageManager pm = context.getPackageManager();
-        final Root root = new Root();
-        root.rootId = null;
-        root.rootType = Roots.ROOT_TYPE_SHORTCUT;
-        root.uri = null;
-        root.icon = context.getResources().getDrawable(R.drawable.ic_dir);
-        root.title = context.getString(R.string.root_recent);
-        root.summary = null;
-        root.availableBytes = -1;
-        root.isRecents = true;
-        return root;
-    }
-
-    public static Root fromCursor(
-            Context context, DocumentsProviderInfo info, Cursor cursor) {
-        final PackageManager pm = context.getPackageManager();
-
-        final Root root = new Root();
-        root.rootId = cursor.getString(cursor.getColumnIndex(RootColumns.ROOT_ID));
-        root.rootType = cursor.getInt(cursor.getColumnIndex(RootColumns.ROOT_TYPE));
-        root.uri = DocumentsContract.buildDocumentUri(
-                info.providerInfo.authority, root.rootId, Documents.DOC_ID_ROOT);
-        root.icon = info.providerInfo.loadIcon(pm);
-        root.title = info.providerInfo.loadLabel(pm).toString();
-        root.availableBytes = cursor.getLong(cursor.getColumnIndex(RootColumns.AVAILABLE_BYTES));
-        root.summary = null;
-
-        final int icon = cursor.getInt(cursor.getColumnIndex(RootColumns.ICON));
-        if (icon != 0) {
-            try {
-                root.icon = pm.getResourcesForApplication(info.providerInfo.applicationInfo)
-                        .getDrawable(icon);
-            } catch (NotFoundException e) {
-                throw new RuntimeException(e);
-            } catch (NameNotFoundException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        final String title = cursor.getString(cursor.getColumnIndex(RootColumns.TITLE));
-        if (title != null) {
-            root.title = title;
-        }
-
-        root.summary = cursor.getString(cursor.getColumnIndex(RootColumns.SUMMARY));
-        root.isRecents = false;
-
-        return root;
-    }
-
-    /**
-     * Return string most suited to showing in a directory listing.
-     */
-    public String getDirectoryString() {
-        return (summary != null) ? summary : title;
-    }
-
-    public static class RootComparator implements Comparator<Root> {
-        @Override
-        public int compare(Root lhs, Root rhs) {
-            final int score = compareToIgnoreCaseNullable(lhs.title, rhs.title);
-            if (score != 0) {
-                return score;
-            } else {
-                return compareToIgnoreCaseNullable(lhs.summary, rhs.summary);
-            }
-        }
-    }
-
-    public static int compareToIgnoreCaseNullable(String lhs, String rhs) {
-        if (lhs == null) return -1;
-        if (rhs == null) return 1;
-        return lhs.compareToIgnoreCase(rhs);
-    }
-}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
new file mode 100644
index 0000000..189284b
--- /dev/null
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package com.android.documentsui.model;
+
+import static com.android.documentsui.model.DocumentInfo.getCursorInt;
+import static com.android.documentsui.model.DocumentInfo.getCursorLong;
+import static com.android.documentsui.model.DocumentInfo.getCursorString;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.drawable.Drawable;
+import android.provider.DocumentsContract.Root;
+
+import java.util.Objects;
+
+/**
+ * Representation of a {@link Root}.
+ */
+public class RootInfo {
+    public String authority;
+    public String rootId;
+    public int rootType;
+    public int flags;
+    public int icon;
+    public String title;
+    public String summary;
+    public String documentId;
+    public long availableBytes;
+
+    public static RootInfo fromRootsCursor(String authority, Cursor cursor) {
+        final RootInfo root = new RootInfo();
+        root.authority = authority;
+        root.rootId = getCursorString(cursor, Root.COLUMN_ROOT_ID);
+        root.rootType = getCursorInt(cursor, Root.COLUMN_ROOT_TYPE);
+        root.flags = getCursorInt(cursor, Root.COLUMN_FLAGS);
+        root.icon = getCursorInt(cursor, Root.COLUMN_ICON);
+        root.title = getCursorString(cursor, Root.COLUMN_TITLE);
+        root.summary = getCursorString(cursor, Root.COLUMN_SUMMARY);
+        root.documentId = getCursorString(cursor, Root.COLUMN_DOCUMENT_ID);
+        root.availableBytes = getCursorLong(cursor, Root.COLUMN_AVAILABLE_BYTES);
+        return root;
+    }
+
+    public Drawable loadIcon(Context context) {
+        return DocumentInfo.loadIcon(context, authority, icon);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof RootInfo) {
+            final RootInfo root = (RootInfo) o;
+            return Objects.equals(authority, root.authority) && Objects.equals(rootId, root.rootId);
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(authority, rootId);
+    }
+
+    public String getDirectoryString() {
+        return (summary != null) ? summary : title;
+    }
+}
diff --git a/packages/ExternalStorageProvider/AndroidManifest.xml b/packages/ExternalStorageProvider/AndroidManifest.xml
index 8bd2a6d..7094efc 100644
--- a/packages/ExternalStorageProvider/AndroidManifest.xml
+++ b/packages/ExternalStorageProvider/AndroidManifest.xml
@@ -13,20 +13,20 @@
             android:permission="android.permission.MANAGE_DOCUMENTS">
             <meta-data
                 android:name="android.content.DOCUMENT_PROVIDER"
-                android:resource="@xml/document_provider" />
+                android:value="true" />
         </provider>
 
-        <!-- TODO: remove when we have real providers -->
+        <!-- TODO: find a better place for tests to live -->
         <provider
-            android:name=".CloudTestDocumentsProvider"
-            android:authorities="com.android.externalstorage.cloudtest"
+            android:name=".TestDocumentsProvider"
+            android:authorities="com.example.documents"
             android:grantUriPermissions="true"
             android:exported="true"
-            android:enabled="false"
-            android:permission="android.permission.MANAGE_DOCUMENTS">
+            android:permission="android.permission.MANAGE_DOCUMENTS"
+            android:enabled="false">
             <meta-data
                 android:name="android.content.DOCUMENT_PROVIDER"
-                android:resource="@xml/document_provider" />
+                android:value="true" />
         </provider>
     </application>
 </manifest>
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/CloudTestDocumentsProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/CloudTestDocumentsProvider.java
deleted file mode 100644
index 119d92e..0000000
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/CloudTestDocumentsProvider.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package com.android.externalstorage;
-
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.database.MatrixCursor.RowBuilder;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.ParcelFileDescriptor;
-import android.os.SystemClock;
-import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.DocumentColumns;
-import android.provider.DocumentsContract.Documents;
-import android.provider.DocumentsContract.RootColumns;
-import android.provider.DocumentsContract.Roots;
-import android.util.Log;
-
-import com.google.android.collect.Lists;
-
-import libcore.io.IoUtils;
-
-import java.io.FileNotFoundException;
-import java.util.List;
-
-public class CloudTestDocumentsProvider extends ContentProvider {
-    private static final String TAG = "CloudTest";
-
-    private static final String AUTHORITY = "com.android.externalstorage.cloudtest";
-
-    private static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-
-    private static final int URI_ROOTS = 1;
-    private static final int URI_ROOTS_ID = 2;
-    private static final int URI_DOCS_ID = 3;
-    private static final int URI_DOCS_ID_CONTENTS = 4;
-    private static final int URI_DOCS_ID_SEARCH = 5;
-
-    static {
-        sMatcher.addURI(AUTHORITY, "roots", URI_ROOTS);
-        sMatcher.addURI(AUTHORITY, "roots/*", URI_ROOTS_ID);
-        sMatcher.addURI(AUTHORITY, "roots/*/docs/*", URI_DOCS_ID);
-        sMatcher.addURI(AUTHORITY, "roots/*/docs/*/contents", URI_DOCS_ID_CONTENTS);
-        sMatcher.addURI(AUTHORITY, "roots/*/docs/*/search", URI_DOCS_ID_SEARCH);
-    }
-
-    private static final String[] ALL_ROOTS_COLUMNS = new String[] {
-            RootColumns.ROOT_ID, RootColumns.ROOT_TYPE, RootColumns.ICON, RootColumns.TITLE,
-            RootColumns.SUMMARY, RootColumns.AVAILABLE_BYTES
-    };
-
-    private static final String[] ALL_DOCUMENTS_COLUMNS = new String[] {
-            DocumentColumns.DOC_ID, DocumentColumns.DISPLAY_NAME, DocumentColumns.SIZE,
-            DocumentColumns.MIME_TYPE, DocumentColumns.LAST_MODIFIED, DocumentColumns.FLAGS
-    };
-
-    private List<String> mKnownDocs = Lists.newArrayList("meow.png", "kittens.pdf");
-
-    private int mPage;
-
-    @Override
-    public boolean onCreate() {
-        return true;
-    }
-
-    @Override
-    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
-        switch (sMatcher.match(uri)) {
-            case URI_ROOTS: {
-                final MatrixCursor result = new MatrixCursor(
-                        projection != null ? projection : ALL_ROOTS_COLUMNS);
-                includeDefaultRoot(result);
-                return result;
-            }
-            case URI_ROOTS_ID: {
-                final MatrixCursor result = new MatrixCursor(
-                        projection != null ? projection : ALL_ROOTS_COLUMNS);
-                includeDefaultRoot(result);
-                return result;
-            }
-            case URI_DOCS_ID: {
-                final String docId = DocumentsContract.getDocId(uri);
-                final MatrixCursor result = new MatrixCursor(
-                        projection != null ? projection : ALL_DOCUMENTS_COLUMNS);
-                includeDoc(result, docId);
-                return result;
-            }
-            case URI_DOCS_ID_CONTENTS: {
-                final CloudCursor result = new CloudCursor(
-                        projection != null ? projection : ALL_DOCUMENTS_COLUMNS, uri);
-                for (String docId : mKnownDocs) {
-                    includeDoc(result, docId);
-                }
-                if (mPage < 3) {
-                    result.setHasMore();
-                }
-                result.setNotificationUri(getContext().getContentResolver(), uri);
-                return result;
-            }
-            default: {
-                throw new UnsupportedOperationException("Unsupported Uri " + uri);
-            }
-        }
-    }
-
-    private void includeDefaultRoot(MatrixCursor result) {
-        final RowBuilder row = result.newRow();
-        row.offer(RootColumns.ROOT_ID, "testroot");
-        row.offer(RootColumns.ROOT_TYPE, Roots.ROOT_TYPE_SERVICE);
-        row.offer(RootColumns.TITLE, "_TestTitle");
-        row.offer(RootColumns.SUMMARY, "_TestSummary");
-    }
-
-    private void includeDoc(MatrixCursor result, String docId) {
-        int flags = 0;
-
-        final String mimeType;
-        if (Documents.DOC_ID_ROOT.equals(docId)) {
-            mimeType = Documents.MIME_TYPE_DIR;
-        } else {
-            mimeType = "application/octet-stream";
-        }
-
-        final RowBuilder row = result.newRow();
-        row.offer(DocumentColumns.DOC_ID, docId);
-        row.offer(DocumentColumns.DISPLAY_NAME, docId);
-        row.offer(DocumentColumns.MIME_TYPE, mimeType);
-        row.offer(DocumentColumns.LAST_MODIFIED, System.currentTimeMillis());
-        row.offer(DocumentColumns.FLAGS, flags);
-    }
-
-    private class CloudCursor extends MatrixCursor {
-        private final Uri mUri;
-        private Bundle mExtras = new Bundle();
-
-        public CloudCursor(String[] columnNames, Uri uri) {
-            super(columnNames);
-            mUri = uri;
-        }
-
-        public void setHasMore() {
-            mExtras.putBoolean(DocumentsContract.EXTRA_HAS_MORE, true);
-        }
-
-        @Override
-        public Bundle getExtras() {
-            Log.d(TAG, "getExtras() " + mExtras);
-            return mExtras;
-        }
-
-        @Override
-        public Bundle respond(Bundle extras) {
-            extras.size();
-            Log.d(TAG, "respond() " + extras);
-            if (extras.getBoolean(DocumentsContract.EXTRA_REQUEST_MORE, false)) {
-                new CloudTask().execute(mUri);
-            }
-            return Bundle.EMPTY;
-        }
-    }
-
-    private class CloudTask extends AsyncTask<Uri, Void, Void> {
-        @Override
-        protected Void doInBackground(Uri... uris) {
-            final Uri uri = uris[0];
-
-            SystemClock.sleep(1000);
-
-            // Grab some files from the cloud
-            for (int i = 0; i < 5; i++) {
-                mKnownDocs.add("cloud-page" + mPage + "-file" + i);
-            }
-            mPage++;
-
-            Log.d(TAG, "Loaded more; notifying " + uri);
-            getContext().getContentResolver().notifyChange(uri, null, false);
-            return null;
-        }
-    }
-
-    private interface TypeQuery {
-        final String[] PROJECTION = {
-                DocumentColumns.MIME_TYPE };
-
-        final int MIME_TYPE = 0;
-    }
-
-    @Override
-    public String getType(Uri uri) {
-        switch (sMatcher.match(uri)) {
-            case URI_ROOTS: {
-                return Roots.MIME_TYPE_DIR;
-            }
-            case URI_ROOTS_ID: {
-                return Roots.MIME_TYPE_ITEM;
-            }
-            case URI_DOCS_ID: {
-                final Cursor cursor = query(uri, TypeQuery.PROJECTION, null, null, null);
-                try {
-                    if (cursor.moveToFirst()) {
-                        return cursor.getString(TypeQuery.MIME_TYPE);
-                    } else {
-                        return null;
-                    }
-                } finally {
-                    IoUtils.closeQuietly(cursor);
-                }
-            }
-            default: {
-                throw new UnsupportedOperationException("Unsupported Uri " + uri);
-            }
-        }
-    }
-
-    @Override
-    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
-        throw new UnsupportedOperationException("Unsupported Uri " + uri);
-    }
-
-    @Override
-    public Uri insert(Uri uri, ContentValues values) {
-        throw new UnsupportedOperationException("Unsupported Uri " + uri);
-    }
-
-    @Override
-    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-        throw new UnsupportedOperationException("Unsupported Uri " + uri);
-    }
-
-    @Override
-    public int delete(Uri uri, String selection, String[] selectionArgs) {
-        throw new UnsupportedOperationException("Unsupported Uri " + uri);
-    }
-}
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 8843e19..bbe3b45 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -16,270 +16,316 @@
 
 package com.android.externalstorage;
 
-import android.content.ContentProvider;
 import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.UriMatcher;
 import android.content.res.AssetFileDescriptor;
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.database.MatrixCursor.RowBuilder;
+import android.graphics.Point;
 import android.media.ExifInterface;
-import android.net.Uri;
-import android.os.Bundle;
+import android.os.CancellationSignal;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
-import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.DocumentColumns;
-import android.provider.DocumentsContract.Documents;
-import android.provider.DocumentsContract.RootColumns;
-import android.provider.DocumentsContract.Roots;
-import android.util.Log;
+import android.provider.DocumentsContract.Document;
+import android.provider.DocumentsContract.Root;
+import android.provider.DocumentsProvider;
 import android.webkit.MimeTypeMap;
 
+import com.google.android.collect.Lists;
 import com.google.android.collect.Maps;
 
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.Map;
 
-public class ExternalStorageProvider extends ContentProvider {
+public class ExternalStorageProvider extends DocumentsProvider {
     private static final String TAG = "ExternalStorage";
 
-    private static final String AUTHORITY = "com.android.externalstorage.documents";
+    // docId format: root:path/to/file
 
-    // TODO: support multiple storage devices
+    private static final String[] DEFAULT_ROOT_PROJECTION = new String[] {
+            Root.COLUMN_ROOT_ID, Root.COLUMN_ROOT_TYPE, Root.COLUMN_FLAGS, Root.COLUMN_ICON,
+            Root.COLUMN_TITLE, Root.COLUMN_SUMMARY, Root.COLUMN_DOCUMENT_ID,
+            Root.COLUMN_AVAILABLE_BYTES,
+    };
 
-    private static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+    private static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] {
+            Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE, Document.COLUMN_DISPLAY_NAME,
+            Document.COLUMN_LAST_MODIFIED, Document.COLUMN_FLAGS, Document.COLUMN_SIZE,
+    };
 
-    private static final int URI_ROOTS = 1;
-    private static final int URI_ROOTS_ID = 2;
-    private static final int URI_DOCS_ID = 3;
-    private static final int URI_DOCS_ID_CONTENTS = 4;
-    private static final int URI_DOCS_ID_SEARCH = 5;
-
-    static {
-        sMatcher.addURI(AUTHORITY, "roots", URI_ROOTS);
-        sMatcher.addURI(AUTHORITY, "roots/*", URI_ROOTS_ID);
-        sMatcher.addURI(AUTHORITY, "roots/*/docs/*", URI_DOCS_ID);
-        sMatcher.addURI(AUTHORITY, "roots/*/docs/*/contents", URI_DOCS_ID_CONTENTS);
-        sMatcher.addURI(AUTHORITY, "roots/*/docs/*/search", URI_DOCS_ID_SEARCH);
-    }
-
-    private HashMap<String, Root> mRoots = Maps.newHashMap();
-
-    private static class Root {
+    private static class RootInfo {
+        public String rootId;
         public int rootType;
-        public String name;
-        public int icon = 0;
-        public String title = null;
-        public String summary = null;
-        public File path;
+        public int flags;
+        public int icon;
+        public String title;
+        public String docId;
     }
 
-    private static final String[] ALL_ROOTS_COLUMNS = new String[] {
-            RootColumns.ROOT_ID, RootColumns.ROOT_TYPE, RootColumns.ICON, RootColumns.TITLE,
-            RootColumns.SUMMARY, RootColumns.AVAILABLE_BYTES
-    };
-
-    private static final String[] ALL_DOCUMENTS_COLUMNS = new String[] {
-            DocumentColumns.DOC_ID, DocumentColumns.DISPLAY_NAME, DocumentColumns.SIZE,
-            DocumentColumns.MIME_TYPE, DocumentColumns.LAST_MODIFIED, DocumentColumns.FLAGS
-    };
+    private ArrayList<RootInfo> mRoots;
+    private HashMap<String, RootInfo> mIdToRoot;
+    private HashMap<String, File> mIdToPath;
 
     @Override
     public boolean onCreate() {
-        mRoots.clear();
+        mRoots = Lists.newArrayList();
+        mIdToRoot = Maps.newHashMap();
+        mIdToPath = Maps.newHashMap();
 
-        final Root root = new Root();
-        root.rootType = Roots.ROOT_TYPE_DEVICE_ADVANCED;
-        root.name = "primary";
-        root.title = getContext().getString(R.string.root_internal_storage);
-        root.path = Environment.getExternalStorageDirectory();
-        mRoots.put(root.name, root);
+        // TODO: support multiple storage devices
+
+        try {
+            final String rootId = "primary";
+            final File path = Environment.getExternalStorageDirectory();
+            mIdToPath.put(rootId, path);
+
+            final RootInfo root = new RootInfo();
+            root.rootId = "primary";
+            root.rootType = Root.ROOT_TYPE_DEVICE;
+            root.flags = Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY | Root.FLAG_ADVANCED;
+            root.icon = R.drawable.ic_pdf;
+            root.title = getContext().getString(R.string.root_internal_storage);
+            root.docId = getDocIdForFile(path);
+            mRoots.add(root);
+            mIdToRoot.put(rootId, root);
+        } catch (FileNotFoundException e) {
+            throw new IllegalStateException(e);
+        }
 
         return true;
     }
 
-    @Override
-    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
-        switch (sMatcher.match(uri)) {
-            case URI_ROOTS: {
-                final MatrixCursor result = new MatrixCursor(
-                        projection != null ? projection : ALL_ROOTS_COLUMNS);
-                for (Root root : mRoots.values()) {
-                    includeRoot(result, root);
-                }
-                return result;
-            }
-            case URI_ROOTS_ID: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-
-                final MatrixCursor result = new MatrixCursor(
-                        projection != null ? projection : ALL_ROOTS_COLUMNS);
-                includeRoot(result, root);
-                return result;
-            }
-            case URI_DOCS_ID: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-                final String docId = DocumentsContract.getDocId(uri);
-
-                final MatrixCursor result = new MatrixCursor(
-                        projection != null ? projection : ALL_DOCUMENTS_COLUMNS);
-                final File file = docIdToFile(root, docId);
-                includeFile(result, root, file);
-                return result;
-            }
-            case URI_DOCS_ID_CONTENTS: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-                final String docId = DocumentsContract.getDocId(uri);
-
-                final MatrixCursor result = new MatrixCursor(
-                        projection != null ? projection : ALL_DOCUMENTS_COLUMNS);
-                final File parent = docIdToFile(root, docId);
-
-                for (File file : parent.listFiles()) {
-                    includeFile(result, root, file);
-                }
-
-                return result;
-            }
-            case URI_DOCS_ID_SEARCH: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-                final String docId = DocumentsContract.getDocId(uri);
-                final String query = DocumentsContract.getSearchQuery(uri).toLowerCase();
-
-                final MatrixCursor result = new MatrixCursor(
-                        projection != null ? projection : ALL_DOCUMENTS_COLUMNS);
-                final File parent = docIdToFile(root, docId);
-
-                final LinkedList<File> pending = new LinkedList<File>();
-                pending.add(parent);
-                while (!pending.isEmpty() && result.getCount() < 20) {
-                    final File file = pending.removeFirst();
-                    if (file.isDirectory()) {
-                        for (File child : file.listFiles()) {
-                            pending.add(child);
-                        }
-                    } else {
-                        if (file.getName().toLowerCase().contains(query)) {
-                            includeFile(result, root, file);
-                        }
-                    }
-                }
-
-                return result;
-            }
-            default: {
-                throw new UnsupportedOperationException("Unsupported Uri " + uri);
-            }
-        }
+    private static String[] resolveRootProjection(String[] projection) {
+        return projection != null ? projection : DEFAULT_ROOT_PROJECTION;
     }
 
-    private String fileToDocId(Root root, File file) {
-        String rootPath = root.path.getAbsolutePath();
-        final String path = file.getAbsolutePath();
-        if (path.equals(rootPath)) {
-            return Documents.DOC_ID_ROOT;
+    private static String[] resolveDocumentProjection(String[] projection) {
+        return projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION;
+    }
+
+    private String getDocIdForFile(File file) throws FileNotFoundException {
+        String path = file.getAbsolutePath();
+
+        // Find the most-specific root path
+        Map.Entry<String, File> mostSpecific = null;
+        for (Map.Entry<String, File> root : mIdToPath.entrySet()) {
+            final String rootPath = root.getValue().getPath();
+            if (path.startsWith(rootPath) && (mostSpecific == null
+                    || rootPath.length() > mostSpecific.getValue().getPath().length())) {
+                mostSpecific = root;
+            }
         }
 
-        if (!rootPath.endsWith("/")) {
-            rootPath += "/";
+        if (mostSpecific == null) {
+            throw new FileNotFoundException("Failed to find root that contains " + path);
         }
-        if (!path.startsWith(rootPath)) {
-            throw new IllegalArgumentException("File " + path + " outside root " + root.path);
+
+        // Start at first char of path under root
+        final String rootPath = mostSpecific.getValue().getPath();
+        if (rootPath.equals(path)) {
+            path = "";
+        } else if (rootPath.endsWith("/")) {
+            path = path.substring(rootPath.length());
         } else {
-            return path.substring(rootPath.length());
+            path = path.substring(rootPath.length() + 1);
         }
+
+        return mostSpecific.getKey() + ':' + path;
     }
 
-    private File docIdToFile(Root root, String docId) {
-        if (Documents.DOC_ID_ROOT.equals(docId)) {
-            return root.path;
+    private File getFileForDocId(String docId) throws FileNotFoundException {
+        final int splitIndex = docId.indexOf(':', 1);
+        final String tag = docId.substring(0, splitIndex);
+        final String path = docId.substring(splitIndex + 1);
+
+        File target = mIdToPath.get(tag);
+        if (target == null) {
+            throw new FileNotFoundException("No root for " + tag);
+        }
+        target = new File(target, path);
+        if (!target.exists()) {
+            throw new FileNotFoundException("Missing file for " + docId + " at " + target);
+        }
+        return target;
+    }
+
+    private void includeFile(MatrixCursor result, String docId, File file)
+            throws FileNotFoundException {
+        if (docId == null) {
+            docId = getDocIdForFile(file);
         } else {
-            return new File(root.path, docId);
+            file = getFileForDocId(docId);
         }
-    }
 
-    private void includeRoot(MatrixCursor result, Root root) {
-        final RowBuilder row = result.newRow();
-        row.offer(RootColumns.ROOT_ID, root.name);
-        row.offer(RootColumns.ROOT_TYPE, root.rootType);
-        row.offer(RootColumns.ICON, root.icon);
-        row.offer(RootColumns.TITLE, root.title);
-        row.offer(RootColumns.SUMMARY, root.summary);
-        row.offer(RootColumns.AVAILABLE_BYTES, root.path.getFreeSpace());
-    }
-
-    private void includeFile(MatrixCursor result, Root root, File file) {
         int flags = 0;
 
         if (file.isDirectory()) {
-            flags |= Documents.FLAG_SUPPORTS_SEARCH;
+            flags |= Document.FLAG_DIR_SUPPORTS_SEARCH;
         }
         if (file.isDirectory() && file.canWrite()) {
-            flags |= Documents.FLAG_SUPPORTS_CREATE;
+            flags |= Document.FLAG_DIR_SUPPORTS_CREATE;
         }
         if (file.canWrite()) {
-            flags |= Documents.FLAG_SUPPORTS_WRITE;
-            flags |= Documents.FLAG_SUPPORTS_RENAME;
-            flags |= Documents.FLAG_SUPPORTS_DELETE;
+            flags |= Document.FLAG_SUPPORTS_WRITE;
+            flags |= Document.FLAG_SUPPORTS_DELETE;
         }
 
+        final String displayName = file.getName();
         final String mimeType = getTypeForFile(file);
         if (mimeType.startsWith("image/")) {
-            flags |= Documents.FLAG_SUPPORTS_THUMBNAIL;
-        }
-
-        final String docId = fileToDocId(root, file);
-        final String displayName;
-        if (Documents.DOC_ID_ROOT.equals(docId)) {
-            displayName = root.title;
-        } else {
-            displayName = file.getName();
+            flags |= Document.FLAG_SUPPORTS_THUMBNAIL;
         }
 
         final RowBuilder row = result.newRow();
-        row.offer(DocumentColumns.DOC_ID, docId);
-        row.offer(DocumentColumns.DISPLAY_NAME, displayName);
-        row.offer(DocumentColumns.SIZE, file.length());
-        row.offer(DocumentColumns.MIME_TYPE, mimeType);
-        row.offer(DocumentColumns.LAST_MODIFIED, file.lastModified());
-        row.offer(DocumentColumns.FLAGS, flags);
+        row.offer(Document.COLUMN_DOCUMENT_ID, docId);
+        row.offer(Document.COLUMN_DISPLAY_NAME, displayName);
+        row.offer(Document.COLUMN_SIZE, file.length());
+        row.offer(Document.COLUMN_MIME_TYPE, mimeType);
+        row.offer(Document.COLUMN_LAST_MODIFIED, file.lastModified());
+        row.offer(Document.COLUMN_FLAGS, flags);
     }
 
     @Override
-    public String getType(Uri uri) {
-        switch (sMatcher.match(uri)) {
-            case URI_ROOTS: {
-                return Roots.MIME_TYPE_DIR;
+    public Cursor queryRoots(String[] projection) throws FileNotFoundException {
+        final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection));
+        for (String rootId : mIdToPath.keySet()) {
+            final RootInfo root = mIdToRoot.get(rootId);
+            final File path = mIdToPath.get(rootId);
+
+            final RowBuilder row = result.newRow();
+            row.offer(Root.COLUMN_ROOT_ID, root.rootId);
+            row.offer(Root.COLUMN_ROOT_TYPE, root.rootType);
+            row.offer(Root.COLUMN_FLAGS, root.flags);
+            row.offer(Root.COLUMN_ICON, root.icon);
+            row.offer(Root.COLUMN_TITLE, root.title);
+            row.offer(Root.COLUMN_DOCUMENT_ID, root.docId);
+            row.offer(Root.COLUMN_AVAILABLE_BYTES, path.getFreeSpace());
+        }
+        return result;
+    }
+
+    @Override
+    public String createDocument(String docId, String mimeType, String displayName)
+            throws FileNotFoundException {
+        final File parent = getFileForDocId(docId);
+        displayName = validateDisplayName(mimeType, displayName);
+
+        final File file = new File(parent, displayName);
+        if (Document.MIME_TYPE_DIR.equals(mimeType)) {
+            if (!file.mkdir()) {
+                throw new IllegalStateException("Failed to mkdir " + file);
             }
-            case URI_ROOTS_ID: {
-                return Roots.MIME_TYPE_ITEM;
+        } else {
+            try {
+                if (!file.createNewFile()) {
+                    throw new IllegalStateException("Failed to touch " + file);
+                }
+            } catch (IOException e) {
+                throw new IllegalStateException("Failed to touch " + file + ": " + e);
             }
-            case URI_DOCS_ID: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-                final String docId = DocumentsContract.getDocId(uri);
-                return getTypeForFile(docIdToFile(root, docId));
-            }
-            default: {
-                throw new UnsupportedOperationException("Unsupported Uri " + uri);
-            }
+        }
+        return getDocIdForFile(file);
+    }
+
+    @Override
+    public void deleteDocument(String docId) throws FileNotFoundException {
+        final File file = getFileForDocId(docId);
+        if (!file.delete()) {
+            throw new IllegalStateException("Failed to delete " + file);
         }
     }
 
-    private String getTypeForFile(File file) {
+    @Override
+    public Cursor queryDocument(String documentId, String[] projection)
+            throws FileNotFoundException {
+        final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
+        includeFile(result, documentId, null);
+        return result;
+    }
+
+    @Override
+    public Cursor queryChildDocuments(
+            String parentDocumentId, String[] projection, String sortOrder)
+            throws FileNotFoundException {
+        final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
+        final File parent = getFileForDocId(parentDocumentId);
+        for (File file : parent.listFiles()) {
+            includeFile(result, null, file);
+        }
+        return result;
+    }
+
+    @Override
+    public Cursor querySearchDocuments(String parentDocumentId, String query, String[] projection)
+            throws FileNotFoundException {
+        final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
+        final File parent = getFileForDocId(parentDocumentId);
+
+        final LinkedList<File> pending = new LinkedList<File>();
+        pending.add(parent);
+        while (!pending.isEmpty() && result.getCount() < 20) {
+            final File file = pending.removeFirst();
+            if (file.isDirectory()) {
+                for (File child : file.listFiles()) {
+                    pending.add(child);
+                }
+            } else {
+                if (file.getName().toLowerCase().contains(query)) {
+                    includeFile(result, null, file);
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public String getDocumentType(String documentId) throws FileNotFoundException {
+        final File file = getFileForDocId(documentId);
+        return getTypeForFile(file);
+    }
+
+    @Override
+    public ParcelFileDescriptor openDocument(
+            String documentId, String mode, CancellationSignal signal)
+            throws FileNotFoundException {
+        final File file = getFileForDocId(documentId);
+        return ParcelFileDescriptor.open(file, ContentResolver.modeToMode(null, mode));
+    }
+
+    @Override
+    public AssetFileDescriptor openDocumentThumbnail(
+            String documentId, Point sizeHint, CancellationSignal signal)
+            throws FileNotFoundException {
+        final File file = getFileForDocId(documentId);
+        final ParcelFileDescriptor pfd = ParcelFileDescriptor.open(
+                file, ParcelFileDescriptor.MODE_READ_ONLY);
+
+        try {
+            final ExifInterface exif = new ExifInterface(file.getAbsolutePath());
+            final long[] thumb = exif.getThumbnailRange();
+            if (thumb != null) {
+                return new AssetFileDescriptor(pfd, thumb[0], thumb[1]);
+            }
+        } catch (IOException e) {
+        }
+
+        return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH);
+    }
+
+    private static String getTypeForFile(File file) {
         if (file.isDirectory()) {
-            return Documents.MIME_TYPE_DIR;
+            return Document.MIME_TYPE_DIR;
         } else {
             return getTypeForName(file.getName());
         }
     }
 
-    private String getTypeForName(String name) {
+    private static String getTypeForName(String name) {
         final int lastDot = name.lastIndexOf('.');
         if (lastDot >= 0) {
             final String extension = name.substring(lastDot + 1);
@@ -292,130 +338,8 @@
         return "application/octet-stream";
     }
 
-    @Override
-    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
-        switch (sMatcher.match(uri)) {
-            case URI_DOCS_ID: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-                final String docId = DocumentsContract.getDocId(uri);
-
-                final File file = docIdToFile(root, docId);
-                return ParcelFileDescriptor.open(file, ContentResolver.modeToMode(uri, mode));
-            }
-            default: {
-                throw new UnsupportedOperationException("Unsupported Uri " + uri);
-            }
-        }
-    }
-
-    @Override
-    public AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts)
-            throws FileNotFoundException {
-        if (opts == null || !opts.containsKey(DocumentsContract.EXTRA_THUMBNAIL_SIZE)) {
-            return super.openTypedAssetFile(uri, mimeTypeFilter, opts);
-        }
-
-        switch (sMatcher.match(uri)) {
-            case URI_DOCS_ID: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-                final String docId = DocumentsContract.getDocId(uri);
-
-                final File file = docIdToFile(root, docId);
-                final ParcelFileDescriptor pfd = ParcelFileDescriptor.open(
-                        file, ParcelFileDescriptor.MODE_READ_ONLY);
-
-                try {
-                    final ExifInterface exif = new ExifInterface(file.getAbsolutePath());
-                    final long[] thumb = exif.getThumbnailRange();
-                    if (thumb != null) {
-                        return new AssetFileDescriptor(pfd, thumb[0], thumb[1]);
-                    }
-                } catch (IOException e) {
-                }
-
-                return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH);
-            }
-            default: {
-                throw new UnsupportedOperationException("Unsupported Uri " + uri);
-            }
-        }
-    }
-
-    @Override
-    public Uri insert(Uri uri, ContentValues values) {
-        switch (sMatcher.match(uri)) {
-            case URI_DOCS_ID: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-                final String docId = DocumentsContract.getDocId(uri);
-
-                final File parent = docIdToFile(root, docId);
-
-                final String mimeType = values.getAsString(DocumentColumns.MIME_TYPE);
-                final String name = validateDisplayName(
-                        values.getAsString(DocumentColumns.DISPLAY_NAME), mimeType);
-
-                final File file = new File(parent, name);
-                if (Documents.MIME_TYPE_DIR.equals(mimeType)) {
-                    if (!file.mkdir()) {
-                        return null;
-                    }
-
-                } else {
-                    try {
-                        if (!file.createNewFile()) {
-                            return null;
-                        }
-                    } catch (IOException e) {
-                        Log.w(TAG, "Failed to create file", e);
-                        return null;
-                    }
-                }
-
-                final String newDocId = fileToDocId(root, file);
-                return DocumentsContract.buildDocumentUri(AUTHORITY, root.name, newDocId);
-            }
-            default: {
-                throw new UnsupportedOperationException("Unsupported Uri " + uri);
-            }
-        }
-    }
-
-    @Override
-    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-        switch (sMatcher.match(uri)) {
-            case URI_DOCS_ID: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-                final String docId = DocumentsContract.getDocId(uri);
-
-                final File file = docIdToFile(root, docId);
-                final File newFile = new File(
-                        file.getParentFile(), values.getAsString(DocumentColumns.DISPLAY_NAME));
-                return file.renameTo(newFile) ? 1 : 0;
-            }
-            default: {
-                throw new UnsupportedOperationException("Unsupported Uri " + uri);
-            }
-        }
-    }
-
-    @Override
-    public int delete(Uri uri, String selection, String[] selectionArgs) {
-        switch (sMatcher.match(uri)) {
-            case URI_DOCS_ID: {
-                final Root root = mRoots.get(DocumentsContract.getRootId(uri));
-                final String docId = DocumentsContract.getDocId(uri);
-
-                final File file = docIdToFile(root, docId);
-                return file.delete() ? 1 : 0;
-            }
-            default: {
-                throw new UnsupportedOperationException("Unsupported Uri " + uri);
-            }
-        }
-    }
-
-    private String validateDisplayName(String displayName, String mimeType) {
-        if (Documents.MIME_TYPE_DIR.equals(mimeType)) {
+    private static String validateDisplayName(String mimeType, String displayName) {
+        if (Document.MIME_TYPE_DIR.equals(mimeType)) {
             return displayName;
         } else {
             // Try appending meaningful extension if needed
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java
new file mode 100644
index 0000000..872974f
--- /dev/null
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+package com.android.externalstorage;
+
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.database.MatrixCursor.RowBuilder;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.ParcelFileDescriptor;
+import android.os.SystemClock;
+import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Document;
+import android.provider.DocumentsContract.Root;
+import android.provider.DocumentsProvider;
+import android.util.Log;
+
+import java.io.FileNotFoundException;
+import java.lang.ref.WeakReference;
+
+public class TestDocumentsProvider extends DocumentsProvider {
+    private static final String TAG = "TestDocuments";
+
+    private static final boolean CRASH_ROOTS = false;
+    private static final boolean CRASH_DOCUMENT = false;
+
+    private static final String MY_ROOT_ID = "myRoot";
+    private static final String MY_DOC_ID = "myDoc";
+    private static final String MY_DOC_NULL = "myNull";
+
+    private static final String[] DEFAULT_ROOT_PROJECTION = new String[] {
+            Root.COLUMN_ROOT_ID, Root.COLUMN_ROOT_TYPE, Root.COLUMN_FLAGS, Root.COLUMN_ICON,
+            Root.COLUMN_TITLE, Root.COLUMN_SUMMARY, Root.COLUMN_DOCUMENT_ID,
+            Root.COLUMN_AVAILABLE_BYTES,
+    };
+
+    private static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] {
+            Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE, Document.COLUMN_DISPLAY_NAME,
+            Document.COLUMN_LAST_MODIFIED, Document.COLUMN_FLAGS, Document.COLUMN_SIZE,
+    };
+
+    private static String[] resolveRootProjection(String[] projection) {
+        return projection != null ? projection : DEFAULT_ROOT_PROJECTION;
+    }
+
+    private static String[] resolveDocumentProjection(String[] projection) {
+        return projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION;
+    }
+
+    @Override
+    public Cursor queryRoots(String[] projection) throws FileNotFoundException {
+        if (CRASH_ROOTS) System.exit(12);
+
+        final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection));
+        final RowBuilder row = result.newRow();
+        row.offer(Root.COLUMN_ROOT_ID, MY_ROOT_ID);
+        row.offer(Root.COLUMN_ROOT_TYPE, Root.ROOT_TYPE_SERVICE);
+        row.offer(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_RECENTS);
+        row.offer(Root.COLUMN_TITLE, "_Test title which is really long");
+        row.offer(Root.COLUMN_SUMMARY, "_Summary which is also super long text");
+        row.offer(Root.COLUMN_DOCUMENT_ID, MY_DOC_ID);
+        row.offer(Root.COLUMN_AVAILABLE_BYTES, 1024);
+        return result;
+    }
+
+    @Override
+    public Cursor queryDocument(String documentId, String[] projection)
+            throws FileNotFoundException {
+        if (CRASH_DOCUMENT) System.exit(12);
+
+        final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
+        includeFile(result, documentId);
+        return result;
+    }
+
+    /**
+     * Holds any outstanding or finished "network" fetching.
+     */
+    private WeakReference<CloudTask> mTask;
+
+    private static class CloudTask implements Runnable {
+
+        private final ContentResolver mResolver;
+        private final Uri mNotifyUri;
+
+        private volatile boolean mFinished;
+
+        public CloudTask(ContentResolver resolver, Uri notifyUri) {
+            mResolver = resolver;
+            mNotifyUri = notifyUri;
+        }
+
+        @Override
+        public void run() {
+            // Pretend to do some network
+            Log.d(TAG, hashCode() + ": pretending to do some network!");
+            SystemClock.sleep(2000);
+            Log.d(TAG, hashCode() + ": network done!");
+
+            mFinished = true;
+
+            // Tell anyone remotely they should requery
+            mResolver.notifyChange(mNotifyUri, null, false);
+        }
+
+        public boolean includeIfFinished(MatrixCursor result) {
+            Log.d(TAG, hashCode() + ": includeIfFinished() found " + mFinished);
+            if (mFinished) {
+                includeFile(result, "_networkfile1");
+                includeFile(result, "_networkfile2");
+                includeFile(result, "_networkfile3");
+                return true;
+            } else {
+                return false;
+            }
+        }
+    }
+
+    private static class CloudCursor extends MatrixCursor {
+        public Object keepAlive;
+        public final Bundle extras = new Bundle();
+
+        public CloudCursor(String[] columnNames) {
+            super(columnNames);
+        }
+
+        @Override
+        public Bundle getExtras() {
+            return extras;
+        }
+    }
+
+    @Override
+    public Cursor queryChildDocuments(
+            String parentDocumentId, String[] projection, String sortOrder)
+            throws FileNotFoundException {
+
+        final ContentResolver resolver = getContext().getContentResolver();
+        final Uri notifyUri = DocumentsContract.buildDocumentUri(
+                "com.example.documents", parentDocumentId);
+
+        CloudCursor result = new CloudCursor(resolveDocumentProjection(projection));
+        result.setNotificationUri(resolver, notifyUri);
+
+        // Always include local results
+        includeFile(result, MY_DOC_NULL);
+        includeFile(result, "localfile1");
+        includeFile(result, "localfile2");
+
+        synchronized (this) {
+            // Try picking up an existing network fetch
+            CloudTask task = mTask != null ? mTask.get() : null;
+            if (task == null) {
+                Log.d(TAG, "No network task found; starting!");
+                task = new CloudTask(resolver, notifyUri);
+                mTask = new WeakReference<CloudTask>(task);
+                new Thread(task).start();
+
+                // Aggressively try freeing weak reference above
+                new Thread() {
+                    @Override
+                    public void run() {
+                        while (mTask.get() != null) {
+                            SystemClock.sleep(200);
+                            System.gc();
+                            System.runFinalization();
+                        }
+                        Log.d(TAG, "AHA! THE CLOUD TASK WAS GC'ED!");
+                    }
+                }.start();
+            }
+
+            // Blend in cloud results if ready
+            if (task.includeIfFinished(result)) {
+                result.extras.putString(DocumentsContract.EXTRA_INFO,
+                        "Everything Went Better Than Expected and this message is quite "
+                                + "long and verbose and maybe even too long");
+                result.extras.putString(DocumentsContract.EXTRA_ERROR,
+                        "But then again, maybe our server ran into an error, which means "
+                                + "we're going to have a bad time");
+            } else {
+                result.extras.putBoolean(DocumentsContract.EXTRA_LOADING, true);
+            }
+
+            // Tie the network fetch to the cursor GC lifetime
+            result.keepAlive = task;
+
+            return result;
+        }
+    }
+
+    @Override
+    public Cursor queryRecentDocuments(String rootId, String[] projection)
+            throws FileNotFoundException {
+        // Pretend to take a super long time to respond
+        SystemClock.sleep(3000);
+
+        final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection));
+        includeFile(result, "It was /worth/ the_wait for?the file:with the&incredibly long name");
+        return result;
+    }
+
+    @Override
+    public ParcelFileDescriptor openDocument(String docId, String mode, CancellationSignal signal)
+            throws FileNotFoundException {
+        throw new FileNotFoundException();
+    }
+
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    private static void includeFile(MatrixCursor result, String docId) {
+        final RowBuilder row = result.newRow();
+        row.offer(Document.COLUMN_DOCUMENT_ID, docId);
+        row.offer(Document.COLUMN_DISPLAY_NAME, docId);
+        row.offer(Document.COLUMN_LAST_MODIFIED, System.currentTimeMillis());
+
+        if (MY_DOC_ID.equals(docId)) {
+            row.offer(Document.COLUMN_MIME_TYPE, Document.MIME_TYPE_DIR);
+        } else if (MY_DOC_NULL.equals(docId)) {
+            // No MIME type
+        } else {
+            row.offer(Document.COLUMN_MIME_TYPE, "application/octet-stream");
+        }
+    }
+}
diff --git a/packages/Keyguard/AndroidManifest.xml b/packages/Keyguard/AndroidManifest.xml
index f3106da..7d77c48 100644
--- a/packages/Keyguard/AndroidManifest.xml
+++ b/packages/Keyguard/AndroidManifest.xml
@@ -38,9 +38,6 @@
     <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
     <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
 
-    <!-- Permission for the Hotword detector service -->
-    <uses-permission android:name="com.google.android.googlequicksearchbox.SEARCH_API" />
-
     <application android:label="@string/app_name"
         android:process="com.android.systemui"
         android:persistent="true" >
diff --git a/packages/Keyguard/src/com/android/keyguard/HotwordServiceClient.java b/packages/Keyguard/src/com/android/keyguard/HotwordServiceClient.java
deleted file mode 100644
index 94733d4..0000000
--- a/packages/Keyguard/src/com/android/keyguard/HotwordServiceClient.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-package com.android.keyguard;
-
-import android.app.SearchManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.util.Log;
-
-import com.google.android.search.service.IHotwordService;
-import com.google.android.search.service.IHotwordServiceCallback;
-
-/**
- * Utility class with its callbacks to simplify usage of {@link IHotwordService}.
- *
- * The client is meant to be used for a single hotword detection in a session.
- * start() -> stop(); client is asked to stop & disconnect from the service.
- * start() -> onHotwordDetected(); client disconnects from the service automatically.
- */
-public class HotwordServiceClient implements Handler.Callback {
-    private static final String TAG = "HotwordServiceClient";
-    private static final boolean DBG = true;
-    private static final String ACTION_HOTWORD =
-            "com.google.android.search.service.IHotwordService";
-
-    private static final int MSG_SERVICE_CONNECTED = 0;
-    private static final int MSG_SERVICE_DISCONNECTED = 1;
-    private static final int MSG_HOTWORD_STARTED = 2;
-    private static final int MSG_HOTWORD_STOPPED = 3;
-    private static final int MSG_HOTWORD_DETECTED = 4;
-
-    private final Context mContext;
-    private final Callback mClientCallback;
-    private final Handler mHandler;
-
-    private IHotwordService mService;
-
-    public HotwordServiceClient(Context context, Callback callback) {
-        mContext = context;
-        mClientCallback = callback;
-        mHandler = new Handler(this);
-    }
-
-    public interface Callback {
-        void onServiceConnected();
-        void onServiceDisconnected();
-        void onHotwordDetectionStarted();
-        void onHotwordDetectionStopped();
-        void onHotwordDetected(String action);
-    }
-
-    /**
-     * Binds to the {@link IHotwordService} and starts hotword detection
-     * when the service is connected.
-     *
-     * @return false if the service can't be bound to.
-     */
-    public synchronized boolean start() {
-        if (mService != null) {
-            if (DBG) Log.d(TAG, "Multiple call to start(), service was already bound");
-            return true;
-        } else {
-            // TODO: The hotword service is currently hosted within the search app
-            // so the component handling the assist intent should handle hotwording
-            // as well.
-            final Intent intent =
-                    ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
-                            .getAssistIntent(mContext, true, UserHandle.USER_CURRENT);
-            if (intent == null) {
-                return false;
-            }
-
-            Intent hotwordIntent = new Intent(ACTION_HOTWORD);
-            hotwordIntent.fillIn(intent, Intent.FILL_IN_PACKAGE);
-            return mContext.bindService(
-                    hotwordIntent,
-                   mConnection,
-                   Context.BIND_AUTO_CREATE);
-        }
-    }
-
-    /**
-     * Unbinds from the the {@link IHotwordService}.
-     */
-    public synchronized void stop() {
-        if (mService != null) {
-            mContext.unbindService(mConnection);
-            mService = null;
-        }
-    }
-
-    @Override
-    public boolean handleMessage(Message msg) {
-        switch (msg.what) {
-            case MSG_SERVICE_CONNECTED:
-                handleServiceConnected();
-                break;
-            case MSG_SERVICE_DISCONNECTED:
-                handleServiceDisconnected();
-                break;
-            case MSG_HOTWORD_STARTED:
-                handleHotwordDetectionStarted();
-                break;
-            case MSG_HOTWORD_STOPPED:
-                handleHotwordDetectionStopped();
-                break;
-            case MSG_HOTWORD_DETECTED:
-                handleHotwordDetected((String) msg.obj);
-                break;
-            default:
-                if (DBG) Log.e(TAG, "Unhandled message");
-                return false;
-        }
-        return true;
-    }
-
-    private void handleServiceConnected() {
-        if (DBG) Log.d(TAG, "handleServiceConnected()");
-        if (mClientCallback != null) mClientCallback.onServiceConnected();
-        try {
-            mService.requestHotwordDetection(mServiceCallback);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Exception while registering callback", e);
-            mHandler.sendEmptyMessage(MSG_SERVICE_DISCONNECTED);
-        }
-    }
-
-    private void handleServiceDisconnected() {
-        if (DBG) Log.d(TAG, "handleServiceDisconnected()");
-        mService = null;
-        if (mClientCallback != null) mClientCallback.onServiceDisconnected();
-    }
-
-    private void handleHotwordDetectionStarted() {
-        if (DBG) Log.d(TAG, "handleHotwordDetectionStarted()");
-        if (mClientCallback != null) mClientCallback.onHotwordDetectionStarted();
-    }
-
-    private void handleHotwordDetectionStopped() {
-        if (DBG) Log.d(TAG, "handleHotwordDetectionStopped()");
-        if (mClientCallback != null) mClientCallback.onHotwordDetectionStopped();
-    }
-
-    void handleHotwordDetected(final String action) {
-        if (DBG) Log.d(TAG, "handleHotwordDetected()");
-        if (mClientCallback != null) mClientCallback.onHotwordDetected(action);
-        stop();
-    }
-
-    /**
-     * Implements service connection methods.
-     */
-    private ServiceConnection mConnection = new ServiceConnection() {
-        /**
-         * Called when the service connects after calling bind().
-         */
-        public void onServiceConnected(ComponentName className, IBinder iservice) {
-            mService = IHotwordService.Stub.asInterface(iservice);
-            mHandler.sendEmptyMessage(MSG_SERVICE_CONNECTED);
-        }
-
-        /**
-         * Called if the service unexpectedly disconnects. This indicates an error.
-         */
-        public void onServiceDisconnected(ComponentName className) {
-            mService = null;
-            mHandler.sendEmptyMessage(MSG_SERVICE_DISCONNECTED);
-        }
-    };
-
-    /**
-     * Implements the AIDL IHotwordServiceCallback interface.
-     */
-    private final IHotwordServiceCallback mServiceCallback = new IHotwordServiceCallback.Stub() {
-
-        public void onHotwordDetectionStarted() {
-            mHandler.sendEmptyMessage(MSG_HOTWORD_STARTED);
-        }
-
-        public void onHotwordDetectionStopped() {
-            mHandler.sendEmptyMessage(MSG_HOTWORD_STOPPED);
-        }
-
-        public void onHotwordDetected(String action) {
-            mHandler.obtainMessage(MSG_HOTWORD_DETECTED, action).sendToTarget();
-        }
-    };
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
index d4b79b7..eedb7d0 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
@@ -1213,6 +1213,7 @@
 
     private void addWidgetsFromSettings() {
         if (mSafeModeEnabled || widgetsDisabled()) {
+            addDefaultStatusWidget(0);
             return;
         }
 
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java
index 4fe83fb..40d55cf 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java
@@ -16,16 +16,20 @@
 package com.android.keyguard;
 
 import android.animation.ObjectAnimator;
+import android.app.ActivityManager;
+import android.app.PendingIntent;
 import android.app.SearchManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
-import android.os.Build;
+import android.os.Bundle;
 import android.os.PowerManager;
 import android.os.UserHandle;
 import android.provider.Settings;
+import android.speech.hotword.HotwordRecognitionListener;
+import android.speech.hotword.HotwordRecognizer;
 import android.telephony.TelephonyManager;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -37,15 +41,18 @@
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.multiwaveview.GlowPadView;
 import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
-import com.android.keyguard.KeyguardHostView.OnDismissAction;
 
 public class KeyguardSelectorView extends LinearLayout implements KeyguardSecurityView {
     private static final boolean DEBUG = KeyguardHostView.DEBUG;
     private static final String TAG = "SecuritySelectorView";
     private static final String ASSIST_ICON_METADATA_NAME =
         "com.android.systemui.action_assist_icon";
-    // Flag to enable/disable hotword detection on lock screen.
-    private static final boolean FLAG_HOTWORD = false;
+
+    // Don't enable hotword on limited-memory devices.
+    private static final boolean ENABLE_HOTWORD = !ActivityManager.isLowRamDeviceStatic();
+
+    // TODO: Fix this to be non-static.
+    private static HotwordRecognizer sHotwordClient;
 
     private KeyguardSecurityCallback mCallback;
     private GlowPadView mGlowPadView;
@@ -57,15 +64,13 @@
     private LockPatternUtils mLockPatternUtils;
     private SecurityMessageDisplay mSecurityMessageDisplay;
     private Drawable mBouncerFrame;
-    private HotwordServiceClient mHotwordClient;
 
     OnTriggerListener mOnTriggerListener = new OnTriggerListener() {
 
         public void onTrigger(View v, int target) {
             final int resId = mGlowPadView.getResourceIdForTarget(target);
-            if (FLAG_HOTWORD) {
-                maybeStopHotwordDetector();
-            }
+            maybeStopHotwordDetector();
+
             switch (resId) {
                 case R.drawable.ic_action_assist_generic:
                     Intent assistIntent =
@@ -127,12 +132,10 @@
 
         @Override
         public void onPhoneStateChanged(int phoneState) {
-            if (FLAG_HOTWORD) {
-                // We need to stop the hotwording when a phone call comes in
-                // TODO(sansid): This is not really needed if onPause triggers
-                // when we navigate away from the keyguard
-                if (phoneState == TelephonyManager.CALL_STATE_RINGING) {
-                    if (DEBUG) Log.d(TAG, "Stopping due to CALL_STATE_RINGING");
+            if (ENABLE_HOTWORD) {
+                // We need to stop hotword detection when a call state is not idle anymore.
+                if (phoneState != TelephonyManager.CALL_STATE_IDLE) {
+                    if (DEBUG) Log.d(TAG, "Stopping due to call state not being idle");
                     maybeStopHotwordDetector();
                 }
             }
@@ -180,8 +183,8 @@
         mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
         View bouncerFrameView = findViewById(R.id.keyguard_selector_view_frame);
         mBouncerFrame = bouncerFrameView.getBackground();
-        if (FLAG_HOTWORD) {
-            mHotwordClient = new HotwordServiceClient(getContext(), mHotwordCallback);
+        if (ENABLE_HOTWORD && sHotwordClient == null) {
+            sHotwordClient = HotwordRecognizer.createHotwordRecognizer(getContext());
         }
     }
 
@@ -286,20 +289,19 @@
     @Override
     public void onPause() {
         KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mUpdateCallback);
+        maybeStopHotwordDetector();
     }
 
     @Override
     public void onResume(int reason) {
         KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mUpdateCallback);
         // TODO: Figure out if there's a better way to do it.
-        // Right now we don't get onPause at all, and onResume gets called
-        // multiple times (even when the screen is turned off with VIEW_REVEALED)
+        // onResume gets called multiple times, however we are interested in
+        // the reason to figure out when to start/stop hotword detection.
         if (reason == SCREEN_ON) {
             if (!KeyguardUpdateMonitor.getInstance(getContext()).isSwitchingUser()) {
                 maybeStartHotwordDetector();
             }
-        } else {
-            maybeStopHotwordDetector();
         }
     }
 
@@ -324,15 +326,15 @@
 
     /**
      * Start the hotword detector if:
-     * <li> HOTWORDING_ENABLED is true and
-     * <li> HotwordUnlock is initialized and
+     * <li> FLAG_HOTWORD is true and
+     * <li> Hotword detection is not already running and
      * <li> TelephonyManager is in CALL_STATE_IDLE
      *
      * If this method is called when the screen is off,
-     * it attempts to stop hotwording if it's running.
+     * it attempts to stop hotword detection if it's running.
      */
     private void maybeStartHotwordDetector() {
-        if (FLAG_HOTWORD && mHotwordClient != null) {
+        if (ENABLE_HOTWORD && sHotwordClient != null) {
             if (DEBUG) Log.d(TAG, "maybeStartHotwordDetector()");
             // Don't start it if the screen is off or not showing
             PowerManager powerManager = (PowerManager) getContext().getSystemService(
@@ -347,8 +349,13 @@
                 if (DEBUG) Log.d(TAG, "Call underway, not starting");
                 return;
             }
-            if (!mHotwordClient.start()) {
-                Log.w(TAG, "Failed to start the hotword detector");
+
+            try {
+                sHotwordClient.startRecognition(mHotwordCallback);
+            } catch(Exception ex) {
+                // Don't allow hotword errors to make the keyguard unusable
+                Log.e(TAG, "Failed to start hotword recognition", ex);
+                sHotwordClient = null;
             }
         }
     }
@@ -357,47 +364,59 @@
      * Stop hotword detector if HOTWORDING_ENABLED is true.
      */
     private void maybeStopHotwordDetector() {
-        if (FLAG_HOTWORD && mHotwordClient != null) {
+        if (ENABLE_HOTWORD && sHotwordClient != null) {
             if (DEBUG) Log.d(TAG, "maybeStopHotwordDetector()");
-            mHotwordClient.stop();
+            try {
+                sHotwordClient.stopRecognition();
+            } catch(Exception ex) {
+                // Don't allow hotword errors to make the keyguard unusable
+                Log.e(TAG, "Failed to start hotword recognition", ex);
+            } finally {
+                sHotwordClient = null;
+            }
         }
     }
 
-    private final HotwordServiceClient.Callback mHotwordCallback =
-            new HotwordServiceClient.Callback() {
-        private static final String TAG = "HotwordServiceClient.Callback";
+    private final HotwordRecognitionListener mHotwordCallback = new HotwordRecognitionListener() {
+        private static final String TAG = "HotwordRecognitionListener";
 
-        @Override
-        public void onServiceConnected() {
-            if (DEBUG) Log.d(TAG, "onServiceConnected()");
+        public void onHotwordRecognitionStarted() {
+            if (DEBUG) Log.d(TAG, "onHotwordRecognitionStarted()");
         }
 
-        @Override
-        public void onServiceDisconnected() {
-            if (DEBUG) Log.d(TAG, "onServiceDisconnected()");
+        public void onHotwordRecognitionStopped() {
+            if (DEBUG) Log.d(TAG, "onHotwordRecognitionStopped()");
         }
 
-        @Override
-        public void onHotwordDetectionStarted() {
-            if (DEBUG) Log.d(TAG, "onHotwordDetectionStarted()");
-            // TODO: Change the usage of SecurityMessageDisplay to a better visual indication.
-            mSecurityMessageDisplay.setMessage("\"Ok Google...\"", true);
+        public void onHotwordEvent(int eventType, Bundle eventBundle) {
+            if (DEBUG) Log.d(TAG, "onHotwordEvent: " + eventType);
+            if (eventType == HotwordRecognizer.EVENT_TYPE_STATE_CHANGED) {
+                if (eventBundle != null && eventBundle.containsKey(HotwordRecognizer.PROMPT_TEXT)) {
+                    mSecurityMessageDisplay.setMessage(
+                            eventBundle.getString(HotwordRecognizer.PROMPT_TEXT), true);
+                }
+            }
         }
 
-        @Override
-        public void onHotwordDetectionStopped() {
-            if (DEBUG) Log.d(TAG, "onHotwordDetectionStopped()");
-            // TODO: Change the usage of SecurityMessageDisplay to a better visual indication.
-        }
-
-        @Override
-        public void onHotwordDetected(String action) {
-            if (DEBUG) Log.d(TAG, "onHotwordDetected(" + action + ")");
-            if (action != null) {
-                Intent intent = new Intent(action);
-                mActivityLauncher.launchActivity(intent, true, true, null, null);
+        public void onHotwordRecognized(PendingIntent intent) {
+            if (DEBUG) Log.d(TAG, "onHotwordRecognized");
+            maybeStopHotwordDetector();
+            if (intent != null) {
+                try {
+                    intent.send();
+                } catch (PendingIntent.CanceledException e) {
+                    Log.w(TAG, "Failed to launch PendingIntent. Encountered CanceledException");
+                }
             }
             mCallback.userActivity(0);
+            mCallback.dismiss(false);
+        }
+
+        public void onHotwordError(int errorCode) {
+            if (DEBUG) Log.d(TAG, "onHotwordError: " + errorCode);
+            // TODO: Inspect the error code and handle the errors appropriately
+            // instead of blindly failing.
+            maybeStopHotwordDetector();
         }
     };
 }
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java
index 597fb3b..e746f72 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java
@@ -153,8 +153,6 @@
     private AlarmManager mAlarmManager;
     private AudioManager mAudioManager;
     private StatusBarManager mStatusBarManager;
-    private boolean mShowLockIcon;
-    private boolean mShowingLockIcon;
     private boolean mSwitchingUser;
 
     private boolean mSystemReady;
@@ -494,7 +492,6 @@
                 mLockPatternUtils);
 
         final ContentResolver cr = mContext.getContentResolver();
-        mShowLockIcon = (Settings.System.getInt(cr, "show_status_bar_lock", 0) == 1);
 
         mScreenOn = mPM.isScreenOn();
 
@@ -1227,25 +1224,6 @@
         if (mStatusBarManager == null) {
             Log.w(TAG, "Could not get status bar manager");
         } else {
-            if (mShowLockIcon) {
-                // Give feedback to user when secure keyguard is active and engaged
-                if (mShowing && isSecure()) {
-                    if (!mShowingLockIcon) {
-                        String contentDescription = mContext.getString(
-                                com.android.internal.R.string.status_bar_device_locked);
-                        mStatusBarManager.setIcon("secure",
-                                com.android.internal.R.drawable.stat_sys_secure, 0,
-                                contentDescription);
-                        mShowingLockIcon = true;
-                    }
-                } else {
-                    if (mShowingLockIcon) {
-                        mStatusBarManager.removeIcon("secure");
-                        mShowingLockIcon = false;
-                    }
-                }
-            }
-
             // Disable aspects of the system/status/navigation bars that must not be re-enabled by
             // windows that appear on top, ever
             int flags = StatusBarManager.DISABLE_NONE;
diff --git a/packages/Keyguard/src/com/google/android/search/service/IHotwordService.aidl b/packages/Keyguard/src/com/google/android/search/service/IHotwordService.aidl
deleted file mode 100644
index e053d7d..0000000
--- a/packages/Keyguard/src/com/google/android/search/service/IHotwordService.aidl
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package com.google.android.search.service;
-
-import com.google.android.search.service.IHotwordServiceCallback;
-
-/**
- * Interface exposing hotword detector as a service.
- */
-oneway interface IHotwordService {
-
-    /**
-     * Indicates a desire to start hotword detection.
-     * It's best-effort and the client should rely on
-     * the callbacks to figure out if hotwording was actually
-     * started or not.
-     *
-     * @param a callback to notify of hotword events.
-     */
-    void requestHotwordDetection(in IHotwordServiceCallback callback);
-}
diff --git a/packages/Keyguard/src/com/google/android/search/service/IHotwordServiceCallback.aidl b/packages/Keyguard/src/com/google/android/search/service/IHotwordServiceCallback.aidl
deleted file mode 100644
index 7b3765f..0000000
--- a/packages/Keyguard/src/com/google/android/search/service/IHotwordServiceCallback.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-package com.google.android.search.service;
-
-/**
- * Interface implemented by users of Hotword service to get callbacks
- * for hotword events.
- */
-oneway interface IHotwordServiceCallback {
-
-    /** Hotword detection start/stop callbacks */
-    void onHotwordDetectionStarted();
-    void onHotwordDetectionStopped();
-
-    /**
-     * Called back when hotword is detected.
-     * The action tells the client what action to take, post hotword-detection.
-     */
-    void onHotwordDetected(in String action);
-}
diff --git a/packages/PrintSpooler/Android.mk b/packages/PrintSpooler/Android.mk
index 8ae0302..f65fe4b 100644
--- a/packages/PrintSpooler/Android.mk
+++ b/packages/PrintSpooler/Android.mk
@@ -24,8 +24,6 @@
 
 LOCAL_JAVA_LIBRARIES := framework-base
 
-LOCAL_CERTIFICATE := platform
-
 LOCAL_PROGUARD_ENABLED := disabled
 
 include $(BUILD_PACKAGE)
diff --git a/packages/PrintSpooler/AndroidManifest.xml b/packages/PrintSpooler/AndroidManifest.xml
index ab7ea09..6fa3ed4 100644
--- a/packages/PrintSpooler/AndroidManifest.xml
+++ b/packages/PrintSpooler/AndroidManifest.xml
@@ -20,18 +20,22 @@
         package="com.android.printspooler"
         android:sharedUserId="android.uid.printspooler"
         android:versionName="1"
-        android:versionCode="1"
-        coreApp="true">
+        android:versionCode="1">
 
-    <uses-sdk android:minSdkVersion="18" android:targetSdkVersion="18"/>
+    <!-- Allows an application to call APIs that give it access to all print jobs
+         on the device. Usually an app can access only the print jobs it created.
+    -->
+    <permission
+        android:name="com.android.printspooler.permission.ACCESS_ALL_PRINT_JOBS"
+        android:label="@string/permlab_accessAllPrintJobs"
+        android:description="@string/permdesc_accessAllPrintJobs"
+        android:protectionLevel="signature" />
 
+    <uses-permission android:name="com.android.printspooler.permission.ACCESS_ALL_PRINT_JOBS"/>
     <uses-permission android:name="android.permission.ACCESS_ALL_PRINT_JOBS"/>
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
 
-    <permission android:name="android.permission.BIND_PRINT_SPOOLER_SERVICE"
-        android:label="@string/permlab_bindPrintSpoolerService"
-        android:description="@string/permdesc_bindPrintSpoolerService"
-        android:protectionLevel="signature" />
+    <uses-sdk android:minSdkVersion="18" android:targetSdkVersion="18"/>
 
     <application
             android:allowClearUserData="false"
diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_menu_add.png b/packages/PrintSpooler/res/drawable-hdpi/ic_menu_add.png
deleted file mode 100644
index 4b68f52..0000000
--- a/packages/PrintSpooler/res/drawable-hdpi/ic_menu_add.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_menu_add.png b/packages/PrintSpooler/res/drawable-mdpi/ic_menu_add.png
deleted file mode 100644
index 15ffadd..0000000
--- a/packages/PrintSpooler/res/drawable-mdpi/ic_menu_add.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_menu_add.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_menu_add.png
deleted file mode 100644
index 420510e..0000000
--- a/packages/PrintSpooler/res/drawable-xhdpi/ic_menu_add.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/menu/select_printer_activity.xml b/packages/PrintSpooler/res/menu/select_printer_activity.xml
index 28fbd35..d4ce1cf 100644
--- a/packages/PrintSpooler/res/menu/select_printer_activity.xml
+++ b/packages/PrintSpooler/res/menu/select_printer_activity.xml
@@ -29,7 +29,7 @@
     <item
         android:id="@+id/action_add_printer"
         android:title="@null"
-        android:icon="@drawable/ic_menu_add"
+        android:icon="@*android:drawable/create_contact"
         android:showAsAction="ifRoom"
         android:alphabeticShortcut="a">
     </item>
diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml
index ee3cf84..235a7a1 100644
--- a/packages/PrintSpooler/res/values/strings.xml
+++ b/packages/PrintSpooler/res/values/strings.xml
@@ -94,6 +94,9 @@
     <!-- Template for the notificaiton label for a failed print job. [CHAR LIMIT=25] -->
     <string name="failed_notification_title_template">Printer error <xliff:g id="print_job_name" example="foo.jpg">%1$s</xliff:g></string>
 
+    <!-- Template for the notificaiton label for a blocked print job. [CHAR LIMIT=25] -->
+    <string name="blocked_notification_title_template">Printer blocked <xliff:g id="print_job_name" example="foo.jpg">%1$s</xliff:g></string>
+
     <!-- Label for the notification button for cancelling a print job. [CHAR LIMIT=25] -->
     <string name="cancel">Cancel</string>
 
@@ -103,6 +106,9 @@
     <!-- Message that there is no connection to a printer. [CHAR LIMIT=40] -->
     <string name="no_connection_to_printer">No connection to printer</string>
 
+    <!-- Label for an unknown reason for failed or blocked print job. [CHAR LIMIT=25] -->
+    <string name="reason_unknown">unknown</string>
+
     <!-- Arrays -->
 
     <!-- Color mode labels. -->
@@ -129,12 +135,14 @@
         <item>Range</item>
     </string-array>
 
-    <!-- Title of an application permission, listed so the user can choose
-         whether they want to allow the application to do this. -->
-    <string name="permlab_bindPrintSpoolerService">bind to a print spooler service</string>
-    <!-- Description of an application permission, listed so the user can
-         choose whether they want to allow the application to do this. -->
-    <string name="permdesc_bindPrintSpoolerService">Allows the holder to bind to the top-level
-        interface of a print spooler service. Should never be needed for normal apps.</string>
+    <!-- Permissions -->
+
+    <!-- Title of an application permission, listed so the user can choose whether they want
+         to allow the application to do this. -->
+    <string name="permlab_accessAllPrintJobs">access all print jobs</string>
+    <!-- Description of an application permission, listed so the user can choose whether
+         they want to allow the application to do this. -->
+    <string name="permdesc_accessAllPrintJobs">Allows the holder to access print jobs
+        created by another app. Should never be needed for normal apps.</string>
 
 </resources>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
index 28fd0e0..88da21f 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
@@ -47,7 +47,6 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -66,14 +65,17 @@
 
     private static final int MAX_FAVORITE_PRINTER_COUNT = 4;
 
-    private final Map<PrinterId, PrinterInfo> mPrinters =
-            new LinkedHashMap<PrinterId, PrinterInfo>();
+    private final List<PrinterInfo> mPrinters =
+            new ArrayList<PrinterInfo>();
+
+    private final List<PrinterInfo> mFavoritePrinters =
+            new ArrayList<PrinterInfo>();
 
     private final PersistenceManager mPersistenceManager;
 
     private PrinterDiscoverySession mDiscoverySession;
 
-    private List<PrinterInfo> mFavoritePrinters;
+    private PrinterId mTrackedPrinter;
 
     public FusedPrintersProvider(Context context) {
         super(context);
@@ -84,15 +86,40 @@
         mPersistenceManager.addPrinterAndWritePrinterHistory(printer);
     }
 
-    public List<PrinterInfo> getPrinters() {
-        return new ArrayList<PrinterInfo>(mPrinters.values());
-    }
-
-    @Override
-    public void deliverResult(List<PrinterInfo> printers) {
-        if (isStarted()) {
-            super.deliverResult(printers);
+    private void computeAndDeliverResult() {
+        if (!isStarted()) {
+            return;
         }
+
+        List<PrinterInfo> printers = new ArrayList<PrinterInfo>();
+
+        // We want the first few favorite printers on top of the list.
+        final int favoriteCount = Math.min(mFavoritePrinters.size(),
+                MAX_FAVORITE_PRINTER_COUNT);
+        for (int i = 0; i < favoriteCount; i++) {
+            printers.add(mFavoritePrinters.get(i));
+        }
+
+        // Add discovered printers updating favorites if needed.
+        final int printerCount = mPrinters.size();
+        for (int i = 0; i < printerCount; i++) {
+            PrinterInfo discoveredPrinter = mPrinters.get(i);
+            boolean printerHandled = false;
+            for (int j = 0; j< favoriteCount; j++) {
+                PrinterInfo favoritePrinter = printers.get(j);
+                if (favoritePrinter.getId().equals(discoveredPrinter.getId())) {
+                    printers.set(j, discoveredPrinter);
+                    printerHandled = true;
+                    break;
+                }
+            }
+            if (!printerHandled) {
+                printers.add(discoveredPrinter);
+            }
+        }
+
+        // Deliver the printers.
+        deliverResult(printers);
     }
 
     @Override
@@ -102,14 +129,12 @@
         }
         // The contract is that if we already have a valid,
         // result the we have to deliver it immediately.
-        if (!mPrinters.isEmpty()) {
-            deliverResult(new ArrayList<PrinterInfo>(mPrinters.values()));
+        if (!mPrinters.isEmpty() || !mFavoritePrinters.isEmpty()) {
+            computeAndDeliverResult();
         }
-        // If the data has changed since the last load
-        // or is not available, start a load.
-        if (takeContentChanged() || mPrinters.isEmpty()) {
-            onForceLoad();
-        }
+        // Always load the data to ensure discovery period is
+        // started and to make sure obsolete printers are updated.
+        onForceLoad();
     }
 
     @Override
@@ -125,7 +150,6 @@
         if (DEBUG) {
             Log.i(LOG_TAG, "onForceLoad()" + FusedPrintersProvider.this.hashCode());
         }
-        onCancelLoad();
         loadInternal();
     }
 
@@ -137,8 +161,9 @@
             mDiscoverySession.setOnPrintersChangeListener(new OnPrintersChangeListener() {
                 @Override
                 public void onPrintersChanged() {
-                    deliverResult(new ArrayList<PrinterInfo>(
-                            mDiscoverySession.getPrinters()));
+                    mPrinters.clear();
+                    mPrinters.addAll(mDiscoverySession.getPrinters());
+                    computeAndDeliverResult();
                 }
             });
             mPersistenceManager.readPrinterHistory();
@@ -166,6 +191,10 @@
     private boolean cancelInternal() {
         if (mDiscoverySession != null
                 && mDiscoverySession.isPrinterDiscoveryStarted()) {
+            if (mTrackedPrinter != null) {
+                mDiscoverySession.stopPrinterStateTracking(mTrackedPrinter);
+                mTrackedPrinter = null;
+            }
             mDiscoverySession.stopPrinterDiscovery();
             return true;
         } else if (mPersistenceManager.isReadHistoryInProgress()) {
@@ -195,10 +224,14 @@
         onStopLoading();
     }
 
-    public void refreshPrinter(PrinterId printerId) {
+    public void setTrackedPrinter(PrinterId printerId) {
         if (isStarted() && mDiscoverySession != null
                 && mDiscoverySession.isPrinterDiscoveryStarted()) {
-            mDiscoverySession.requestPrinterUpdate(printerId);
+            if (mTrackedPrinter != null) {
+                mDiscoverySession.stopPrinterStateTracking(mTrackedPrinter);
+            }
+            mTrackedPrinter = printerId;
+            mDiscoverySession.startPrinterStateTracking(printerId);
         }
     }
 
@@ -234,27 +267,20 @@
             @Override
             protected void onPostExecute(List<PrinterInfo> printers) {
                 if (DEBUG) {
-                    Log.i(LOG_TAG, "read history completed" + FusedPrintersProvider.this.hashCode());
+                    Log.i(LOG_TAG, "read history completed"
+                            + FusedPrintersProvider.this.hashCode());
                 }
 
                 mHistoricalPrinters = printers;
 
                 // Compute the favorite printers.
-                mFavoritePrinters = computeFavoritePrinters(printers);
-
-                // We want the first few favorite printers on top of the list.
-                final int favoriteCount = Math.min(mFavoritePrinters.size(),
-                        MAX_FAVORITE_PRINTER_COUNT);
-                for (int i = 0; i < favoriteCount; i++) {
-                    PrinterInfo favoritePrinter = mFavoritePrinters.get(i);
-                    mPrinters.put(favoritePrinter.getId(), favoritePrinter);
-                }
+                mFavoritePrinters.addAll(computeFavoritePrinters(printers));
 
                 mReadHistoryInProgress = false;
                 mReadHistoryCompleted = true;
 
                 // Deliver the favorites.
-                deliverResult(mFavoritePrinters);
+                computeAndDeliverResult();
 
                 // Start loading the available printers.
                 loadInternal();
@@ -410,8 +436,9 @@
                         serializer.startTag(null, TAG_PRINTER);
 
                         serializer.attribute(null, ATTR_NAME, printer.getName());
+                        // Historical printers are always stored as unavailable.
                         serializer.attribute(null, ATTR_STATUS, String.valueOf(
-                                printer.getStatus()));
+                                PrinterInfo.STATUS_UNAVAILABLE));
                         String description = printer.getDescription();
                         if (description != null) {
                             serializer.attribute(null, ATTR_DESCRIPTION, description);
@@ -478,7 +505,8 @@
                 mHistoricalPrinters.remove(0);
             }
             mHistoricalPrinters.add(printer);
-            mWriteTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, mHistoricalPrinters);
+            mWriteTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,
+                    new ArrayList<PrinterInfo>(mHistoricalPrinters));
         }
 
         private List<PrinterInfo> computeFavoritePrinters(List<PrinterInfo> printers) {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
index c116d37..43a751c 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/NotificationController.java
@@ -32,6 +32,7 @@
 import android.print.IPrintManager;
 import android.print.PrintJobInfo;
 import android.print.PrintManager;
+import android.text.TextUtils;
 import android.util.Log;
 
 /**
@@ -64,22 +65,27 @@
                     + " state:" + PrintJobInfo.stateToString(printJob.getState()));
         }
         switch (printJob.getState()) {
-            case PrintJobInfo.STATE_QUEUED: {
-                createPrintingNotificaiton(printJob);
+            case PrintJobInfo.STATE_QUEUED:
+            case PrintJobInfo.STATE_STARTED: {
+                createPrintingNotification(printJob);
             } break;
 
             case PrintJobInfo.STATE_FAILED: {
-                createFailedNotificaiton(printJob);
+                createFailedNotification(printJob);
             } break;
 
             case PrintJobInfo.STATE_COMPLETED:
             case PrintJobInfo.STATE_CANCELED: {
                 removeNotification(printJob.getId());
             } break;
+
+            case PrintJobInfo.STATE_BLOCKED: {
+                createBlockedNotification(printJob);
+            } break;
         }
     }
 
-    private void createPrintingNotificaiton(PrintJobInfo printJob) {
+    private void createPrintingNotification(PrintJobInfo printJob) {
         Notification.Builder builder = new Notification.Builder(mContext)
                 .setSmallIcon(R.drawable.stat_notify_print)
                 .setContentTitle(mContext.getString(R.string.printing_notification_title_template,
@@ -93,17 +99,36 @@
         mNotificationManager.notify(printJob.getId(), builder.build());
     }
 
-    private void createFailedNotificaiton(PrintJobInfo printJob) {
+    private void createFailedNotification(PrintJobInfo printJob) {
+        String reason = !TextUtils.isEmpty(printJob.getStateReason())
+                ? printJob.getStateReason() : mContext.getString(R.string.reason_unknown);
+
         Notification.Builder builder = new Notification.Builder(mContext)
                 .setSmallIcon(R.drawable.stat_notify_error)
                 .setContentTitle(mContext.getString(R.string.failed_notification_title_template,
                         printJob.getLabel()))
                 .addAction(R.drawable.stat_notify_cancelling, mContext.getString(R.string.cancel),
                         createCancelIntent(printJob))
-                // TODO: Use appropriate icon when assets are ready
                 .addAction(android.R.drawable.ic_secure, mContext.getString(R.string.restart),
                         createRestartIntent(printJob.getId()))
-                .setContentText(printJob.getFailureReason())
+                .setContentText(reason)
+                .setWhen(System.currentTimeMillis())
+                .setOngoing(true)
+                .setShowWhen(true);
+        mNotificationManager.notify(printJob.getId(), builder.build());
+    }
+
+    private void createBlockedNotification(PrintJobInfo printJob) {
+        String reason = !TextUtils.isEmpty(printJob.getStateReason())
+                ? printJob.getStateReason() : mContext.getString(R.string.reason_unknown);
+
+        Notification.Builder builder = new Notification.Builder(mContext)
+                .setSmallIcon(R.drawable.stat_notify_error)
+                .setContentTitle(mContext.getString(R.string.blocked_notification_title_template,
+                        printJob.getLabel()))
+                .addAction(R.drawable.stat_notify_cancelling, mContext.getString(R.string.cancel),
+                        createCancelIntent(printJob))
+                .setContentText(reason)
                 .setWhen(System.currentTimeMillis())
                 .setOngoing(true)
                 .setShowWhen(true);
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 607be90..5361a1e 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -473,6 +473,11 @@
 
             mControllerState = CONTROLLER_STATE_WRITE_COMPLETED;
 
+            // Update the document size.
+            File file = PrintSpoolerService.peekInstance()
+                    .generateFileForPrintJob(mPrintJobId);
+            mDocument.info.setDataSize(file.length());
+
             // Update which pages we have fetched.
             mDocument.pages = PageRangeUtils.normalize(pages);
 
@@ -812,6 +817,10 @@
                     }
 
                     if (id == DEST_ADAPTER_ITEM_ID_ALL_PRINTERS) {
+                        // The selection changed to the all printers item. We
+                        // want to select back the last selected printer.
+                        mIgnoreNextDestinationChange = true;
+                        mEditor.selectPrinter(mCurrentPrinter.getId());
                         startSelectPrinterActivity();
                         return;
                     }
@@ -1019,7 +1028,7 @@
             mDestinationSpinnerAdapter.registerDataSetObserver(new DataSetObserver() {
                 @Override
                 public void onChanged() {
-                    // Initially, we have only sage to PDF as a printer but after some
+                    // Initially, we have only safe to PDF as a printer but after some
                     // printers are loaded we want to select the user's favorite one
                     // which is the first.
                     if (!mFavoritePrinterSelected && mDestinationSpinnerAdapter.getCount() > 2) {
@@ -1039,6 +1048,15 @@
                                     continue;
                                 }
 
+                                // If the current printer became available and has no
+                                // capabilities, we refresh it.
+                                if (mCurrentPrinter.getStatus() == PrinterInfo.STATUS_UNAVAILABLE
+                                        && printer.getStatus() != PrinterInfo.STATUS_UNAVAILABLE
+                                        && printer.getCapabilities() == null) {
+                                    refreshCurrentPrinter();
+                                    return;
+                                }
+
                                 // Update the UI if capabilities changed.
                                 boolean capabilitiesChanged = false;
 
@@ -1117,7 +1135,19 @@
                         (Loader<?>) getLoaderManager().getLoader(
                                 LOADER_ID_PRINTERS_LOADER);
                 if (printersLoader != null) {
-                    printersLoader.refreshPrinter(printer.getId());
+                    printersLoader.setTrackedPrinter(printer.getId());
+                }
+            }
+        }
+
+        public void addCurrentPrinterToHistory() {
+            PrinterInfo printer = (PrinterInfo) mDestinationSpinner.getSelectedItem();
+            if (printer != null) {
+                FusedPrintersProvider printersLoader = (FusedPrintersProvider)
+                        (Loader<?>) getLoaderManager().getLoader(
+                                LOADER_ID_PRINTERS_LOADER);
+                if (printersLoader != null) {
+                    printersLoader.addHistoricalPrinter(printer);
                 }
             }
         }
@@ -1343,6 +1373,7 @@
         }
 
         public void confirmPrint() {
+            addCurrentPrinterToHistory();
             mEditorState = EDITOR_STATE_CONFIRMED_PRINT;
             showUi(UI_GENERATING_PRINT_JOB, null);
         }
@@ -1351,10 +1382,6 @@
             return mEditorState == EDITOR_STATE_CONFIRMED_PRINT;
         }
 
-//        public void confirmPreview() {
-//            mEditorState = EDITOR_STATE_CONFIRMED_PREVIEW;
-//        }
-
         public PageRange[] getRequestedPages() {
             if (hasErrors()) {
                 return null;
@@ -1374,7 +1401,7 @@
                         toIndex = Integer.parseInt(range.substring(
                                 dashIndex + 1, range.length())) - 1;
                     } else {
-                        fromIndex = toIndex = Integer.parseInt(range);
+                        fromIndex = toIndex = Integer.parseInt(range) - 1;
                     }
 
                     PageRange pageRange = new PageRange(fromIndex, toIndex);
@@ -1771,7 +1798,6 @@
                     mPageRangeEditText.setVisibility(View.INVISIBLE);
                     mPageRangeTitle.setVisibility(View.INVISIBLE);
                 }
-                mRangeOptionsSpinner.setEnabled(true);
 
                 // Print/Print preview
                 if (mDestinationSpinner.getSelectedItemId()
@@ -1870,8 +1896,6 @@
         }
 
         private void startSelectPrinterActivity() {
-            mIgnoreNextDestinationChange = true;
-            mDestinationSpinner.setSelection(0);
             Intent intent = new Intent(PrintJobConfigActivity.this,
                     SelectPrinterActivity.class);
             startActivityForResult(intent, ACTIVITY_REQUEST_SELECT_PRINTER);
@@ -1958,6 +1982,9 @@
                     if (position == 0) {
                         return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF;
                     }
+                    if (position == 1) {
+                        return DEST_ADAPTER_ITEM_ID_ALL_PRINTERS;
+                    }
                 } else {
                     if (position == 1) {
                         return DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF;
@@ -2058,7 +2085,7 @@
                     PrinterInfo printer = (PrinterInfo) mPrinters.get(i);
                     if (printer.getId().equals(mLastShownPrinterId)) {
                         // If already in the list - do nothing.
-                        if (i < getCount() - 1) {
+                        if (i < getCount() - 2) {
                             return;
                         }
                         // Else replace the last one.
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
index c1f4180..dd2598c 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
@@ -335,7 +335,9 @@
                 final boolean sameState = (state == printJob.getState())
                         || (state == PrintJobInfo.STATE_ANY)
                         || (state == PrintJobInfo.STATE_ANY_VISIBLE_TO_CLIENTS
-                        && printJob.getState() > PrintJobInfo.STATE_CREATED);
+                            && isStateVisibleToUser(printJob.getState()))
+                        || (state == PrintJobInfo.STATE_ANY_ACTIVE
+                            && isActiveState(printJob.getState()));
                 if (sameComponent && sameAppId && sameState) {
                     if (foundPrintJobs == null) {
                         foundPrintJobs = new ArrayList<PrintJobInfo>();
@@ -347,6 +349,11 @@
         return foundPrintJobs;
     }
 
+    private boolean isStateVisibleToUser(int state) {
+        return (isActiveState(state) && (state == PrintJobInfo.STATE_FAILED
+                || state == PrintJobInfo.STATE_COMPLETED|| state == PrintJobInfo.STATE_CANCELED));
+    }
+
     public PrintJobInfo getPrintJobInfo(int printJobId, int appId) {
         synchronized (mLock) {
             final int printJobCount = mPrintJobs.size();
@@ -389,14 +396,12 @@
 
             switch (printJob.getState()) {
                 case PrintJobInfo.STATE_QUEUED:
-                case PrintJobInfo.STATE_STARTED: {
-                    // We have a print job that was queued or started in the
-                    // past
-                    // but the device battery died or a crash occurred. In this
-                    // case
-                    // we assume the print job failed and let the user decide
-                    // whether
-                    // to restart the job or just
+                case PrintJobInfo.STATE_STARTED:
+                case PrintJobInfo.STATE_BLOCKED: {
+                    // We have a print job that was queued or started or blocked in
+                    // the past but the device battery died or a crash occurred. In
+                    // this case we assume the print job failed and let the user
+                    // decide whether to restart the job or just cancel it.
                     setPrintJobState(printJob.getId(), PrintJobInfo.STATE_FAILED,
                             getString(R.string.no_connection_to_printer));
                 }
@@ -501,7 +506,7 @@
                 success = true;
 
                 printJob.setState(state);
-                printJob.setFailureReason(error);
+                printJob.setStateReason(error);
                 mNotificationController.onPrintJobStateChanged(printJob);
 
                 if (DEBUG_PRINT_JOB_LIFECYCLE) {
@@ -568,7 +573,8 @@
     private boolean isActiveState(int printJobState) {
         return printJobState == PrintJobInfo.STATE_CREATED
                 || printJobState == PrintJobInfo.STATE_QUEUED
-                || printJobState == PrintJobInfo.STATE_STARTED;
+                || printJobState == PrintJobInfo.STATE_STARTED
+                || printJobState == PrintJobInfo.STATE_BLOCKED;
     }
 
     public boolean setPrintJobTag(int printJobId, String tag) {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 6753922..a5dab33 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -33,6 +33,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
 import android.content.res.AssetFileDescriptor;
 import android.database.AbstractCursor;
 import android.database.Cursor;
@@ -477,6 +478,13 @@
         try {
             final String value = c.moveToNext() ? c.getString(0) : null;
             if (value == null) {
+                // sanity-check the user before touching the db
+                final UserInfo user = mUserManager.getUserInfo(userHandle);
+                if (user == null) {
+                    // can happen due to races when deleting users; treat as benign
+                    return false;
+                }
+
                 final SecureRandom random = new SecureRandom();
                 final String newAndroidIdValue = Long.toHexString(random.nextLong());
                 final ContentValues values = new ContentValues();
@@ -490,7 +498,7 @@
                 Slog.d(TAG, "Generated and saved new ANDROID_ID [" + newAndroidIdValue
                         + "] for user " + userHandle);
                 // Write a dropbox entry if it's a restricted profile
-                if (mUserManager.getUserInfo(userHandle).isRestricted()) {
+                if (user.isRestricted()) {
                     DropBoxManager dbm = (DropBoxManager)
                             getContext().getSystemService(Context.DROPBOX_SERVICE);
                     if (dbm != null && dbm.isTagEnabled(DROPBOX_TAG_USERLOG)) {
diff --git a/packages/SystemUI/res/drawable-hdpi/arrow_dashed.png b/packages/SystemUI/res/drawable-hdpi/arrow_dashed.png
deleted file mode 100644
index a8075d5..0000000
--- a/packages/SystemUI/res/drawable-hdpi/arrow_dashed.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/btn_cling_normal.9.png b/packages/SystemUI/res/drawable-hdpi/btn_cling_normal.9.png
deleted file mode 100644
index aea8beb..0000000
--- a/packages/SystemUI/res/drawable-hdpi/btn_cling_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/btn_cling_pressed.9.png b/packages/SystemUI/res/drawable-hdpi/btn_cling_pressed.9.png
deleted file mode 100644
index ebefd20..0000000
--- a/packages/SystemUI/res/drawable-hdpi/btn_cling_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal.9.png
deleted file mode 100644
index 6f456f3..0000000
--- a/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable.9.png
deleted file mode 100644
index e592ae6..0000000
--- a/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable_focused.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable_focused.9.png
deleted file mode 100644
index c1f87a7..0000000
--- a/packages/SystemUI/res/drawable-hdpi/btn_default_small_normal_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_pressed.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_pressed.9.png
deleted file mode 100644
index 2d16eda..0000000
--- a/packages/SystemUI/res/drawable-hdpi/btn_default_small_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/btn_default_small_selected.9.png b/packages/SystemUI/res/drawable-hdpi/btn_default_small_selected.9.png
deleted file mode 100644
index 0749413..0000000
--- a/packages/SystemUI/res/drawable-hdpi/btn_default_small_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png
index 7056abeb..c561446 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png
index b55b441..7570610 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_location_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_location_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_location_on.png
index a2863642..0df2411 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_location_on.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_location_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
index 7494147..8b6ecc2 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_blue_glow.9.png b/packages/SystemUI/res/drawable-hdpi/recents_blue_glow.9.png
deleted file mode 100644
index b5d85188..0000000
--- a/packages/SystemUI/res/drawable-hdpi/recents_blue_glow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_dragging.9.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_dragging.9.png
index 652f66f..080f2f2 100644
--- a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_dragging.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_dragging.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_normal.9.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_normal.9.png
index d000f7e..8b45500 100644
--- a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_normal.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_normal.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.9.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.9.png
index 288d818..e591a7b 100644
--- a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/screenshot_panel.9.png b/packages/SystemUI/res/drawable-hdpi/screenshot_panel.9.png
index 2509321..da56dcc 100644
--- a/packages/SystemUI/res/drawable-hdpi/screenshot_panel.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/screenshot_panel.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png
index 773d418..2c55017 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png
index 140bba3..be6bad3 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png
index d4c767b..5382e0a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png
index 80e00cc..4c60c68 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png
index 742ec7c..f526262 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png
index 9182f26..dffa104 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png
index b798c5c..5870080 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png
index 5e85afa..017e5a1 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png
index b2fb2c6..362b38d 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png
index 9d8d881..b225e7f 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png
index b39817e..e676c2a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png
index fb3e80d..b76a124 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png
index d5458a5..843b833 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png
index 1ddef7b..ac0b5ef 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png
index f8cf27b..807fdc5 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png
index 7bd14f1..cdbdea2 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png
index f2190c7..269eab1 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
index 46a71f3..1489b90 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png
index 203b0f9..073f285 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png
index 98d1418..83759be 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png
index 3d2d921..bec5e3b 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png
index 7737dad..cbf2cc7 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png
index 77d1c18..90cb8c3 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png
index 104797d..24d0606 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_lte.png
index 19df124..1b1ac75 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_roam.png
index 2c81288..1e66cb9 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_device_access_location_found.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_device_access_location_found.png
index ddf6b12..9befc34 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_device_access_location_found.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_device_access_location_found.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png
index b217592..fe7d280 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png
index 859f7b1..58f67d0 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png
index 2f2f291..b794c9a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png
index de6988f..6253d9a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png
index e322aa1..6253d9a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png
index cf9c992..0bed6d9 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png
index 4892842..0b27331 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png
index 4273a52..6bb92a3 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png
index 201689b..c77c37f 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png
index 0457c50..92e6837 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png
index 22dc516..269eae2 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png
index 2fdea79..ac2eaf0 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png
index 8c4ed12..d9da0d9 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
index 56c497a..e02a84b 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png
index 9013bc6..2dc2b17 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png
index 38d04f2..70f839f 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
index 80d3e75..986e7fb 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png
index 7d8b7bec..a5795ed 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
index d3039d7..b647f45 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png
index 7760ba9..02144e5 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
index 491496b..7eb285f 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png
index c9ccc9c..20364a3 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
index eb46a00..169d684 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png
index c54d565..850150a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
index df18ccc..7279d5a 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
index 88dfcb5..546a222 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_bg_tile.png b/packages/SystemUI/res/drawable-hdpi/status_bar_bg_tile.png
deleted file mode 100644
index aee197c..0000000
--- a/packages/SystemUI/res/drawable-hdpi/status_bar_bg_tile.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_close_off.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_close_off.9.png
index 0c301ab..6feb622 100644
--- a/packages/SystemUI/res/drawable-hdpi/status_bar_close_off.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_close_off.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
index ec0424a..eeee60f 100644
--- a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png b/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png
deleted file mode 100644
index 4650417..0000000
--- a/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_1x.png
index ff8fd17..60a7341 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_3g.png
index 23a41ea..23b47b6 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_4g.png
index ba6aa1b..6601913 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_e.png
index a767c99..2334bfc 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_g.png
index 5126b1c..b410ee1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_h.png
index e38a907..91810f8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_lte.png
index 75d22cf..6a7eb08 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_roam.png
index bf7c364..1c69293 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
index 7a89d58..4ecb2a8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
index 062b5a5..f0b0588 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png
index 9f782ea..2c86ddf 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
index c36ced8..508a073 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png
index 47c4492..6232c94 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
index 440288c..73c5c2c 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png
index 23cde12..49c0c0b 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
index 4b657fc..a03ac38 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png
index 6f0c344..21e5ae8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
index d221ab7..8cfc0f8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
index d0970d9..ecca5d5 100644
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_1x.png
index 4881c911..7f0e705 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_3g.png
index e130066..b4ee3ff 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_4g.png
index 468ad9e..38e009f 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_e.png
index 0acd2ec..8cb3f6a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_g.png
index b6bf038..bc68ae6 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_h.png
index f4a0192..65bc672 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_lte.png
index f2324d2..a3c5aca 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_roam.png
index aa12d4f..7234f40 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
index ae17e09..bea4247 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
index fd018d4..3fda61d 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png
index 366b0f5..28dd0ab 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
index 41afb7d..7c01b40 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png
index 9ae4486..dbd3c59 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
index 9d1dfb8..2cf3eff 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png
index 6bcd8dd..19cdc61 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
index f062aa0..0478d4a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png
index a7cc078..126e31d 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
index c396935..d32e309 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
index da9ba59..b961902 100644
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_1x.png
index 803c9de..fe0bb54 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_3g.png
index 0faddb6..d9f6f33 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_4g.png
index 669b15e..75bb86a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_e.png
index 2389b7d..0318f1a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_g.png
index 64332d1..ef2f061 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_h.png
index c48ae79..6fbcc0e 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_lte.png
index 8370507..1b6f7f5 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_roam.png
index 098e702..2ccb681 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
index e36ccf5..dca7457 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
index 194610a..474795c 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png
index bcade5d..8718fa8 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
index 69558d8..6710650 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png
index 2b894ba..dcfd2d1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
index 72a4bbf..caa4189 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png
index 1c385ea..69cc6c4 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
index 6a7efed..7e0158f 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png
index a56bcdb..9d5b2c7 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
index b9c504a..03b5c55 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
index 29b85f6..2ef75ac 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_1x.png
index 5eb8c7d..6ba908b 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_3g.png
index 6756bbe..c4de9e5 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_4g.png
index 68cf3fd..c5b5ec3 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_e.png
index 5f733a0..80d8b40 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_g.png
index 0a45a9e..03377e2 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_h.png
index b483c2f..4dca8f2 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_lte.png
index 227402b..9d3346fb 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_roam.png
index c54954b..dd0d6b5 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
index 783c194..db8d8c1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
index 49e847d..db8d8c1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png
index 8e88258..1d21ea1 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
index f6ea918..d1609d6 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png
index e31b4f2..fe80d3d 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
index e583414..ef731236 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png
index d030c84..a80d45a 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
index 03a0f619..d40cb3f 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png
index 48bcd0b..880a735 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
index bb7e7e3..f11bfff 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
index 8e41679..e0c5408 100644
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/arrow_dashed.png b/packages/SystemUI/res/drawable-mdpi/arrow_dashed.png
deleted file mode 100644
index c17c668d..0000000
--- a/packages/SystemUI/res/drawable-mdpi/arrow_dashed.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/btn_cling_normal.9.png b/packages/SystemUI/res/drawable-mdpi/btn_cling_normal.9.png
deleted file mode 100644
index 43a407e..0000000
--- a/packages/SystemUI/res/drawable-mdpi/btn_cling_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/btn_cling_pressed.9.png b/packages/SystemUI/res/drawable-mdpi/btn_cling_pressed.9.png
deleted file mode 100644
index bf0c8cb..0000000
--- a/packages/SystemUI/res/drawable-mdpi/btn_cling_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal.9.png
deleted file mode 100644
index 9b59b05..0000000
--- a/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable.9.png
deleted file mode 100644
index b517af6..0000000
--- a/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable_focused.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable_focused.9.png
deleted file mode 100644
index 019f33a..0000000
--- a/packages/SystemUI/res/drawable-mdpi/btn_default_small_normal_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_pressed.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_pressed.9.png
deleted file mode 100644
index 6ce1bd3..0000000
--- a/packages/SystemUI/res/drawable-mdpi/btn_default_small_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/btn_default_small_selected.9.png b/packages/SystemUI/res/drawable-mdpi/btn_default_small_selected.9.png
deleted file mode 100644
index 0633543..0000000
--- a/packages/SystemUI/res/drawable-mdpi/btn_default_small_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png
index 273acd2..e285bba 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png
index 60849b8..7c73ace 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_location_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_location_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_location_on.png
index 9b09e13..c6f41d2 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_location_on.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_location_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
index 5875419..021ae6d 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_blue_glow.9.png b/packages/SystemUI/res/drawable-mdpi/recents_blue_glow.9.png
deleted file mode 100644
index 5744885..0000000
--- a/packages/SystemUI/res/drawable-mdpi/recents_blue_glow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_dragging.9.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_dragging.9.png
index 6f4d658..60dc3f2 100644
--- a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_dragging.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_dragging.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_normal.9.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_normal.9.png
index f19dc93..4b7de52 100644
--- a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_normal.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_normal.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.9.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.9.png
index 10e4fd2..7dfea4c 100644
--- a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/screenshot_panel.9.png b/packages/SystemUI/res/drawable-mdpi/screenshot_panel.9.png
index be1cd31..295e91f 100644
--- a/packages/SystemUI/res/drawable-mdpi/screenshot_panel.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/screenshot_panel.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png
index 7640c87..c6dc466 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png
index b3211ea..017023e 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png
index 71c2b02..09f30c3 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png
index 31a88ba..580a81c 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png
index bf61fb0..6b4383d 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png
index 712b5f9..9d30447 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png
index 50ee052..3c4c07f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png
index d29047b..b543639 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png
index 9fb80df..3c59cbb 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png
index 97bce0c..3ae1228 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png
index ab917d7..cc4d343 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png
index a170663..e26142f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png
index 38589cf..f088b6b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png
index 3e4b7be..bbbe14a 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png
index ad69401..d4370fd 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png
index 0985b4e..82057f8 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png
index d0700fbd..faacde9 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
index 891123e..a28235b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png
index 3dfe53a..a4c7ed0e 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png
index 0f3350b..11e4762f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png
index 3ae9b4d..503e155 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png
index d110a86..2be8a4f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png
index da23dd8..8efc4ed 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png
index 7b3bdba..e691780 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_lte.png
index 6f07f33..df01445 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_roam.png
index ff107ca..0bc6e31 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_device_access_location_found.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_device_access_location_found.png
index f698605..2e24f6f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_device_access_location_found.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_device_access_location_found.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png
index 362dcd4..6a08773 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png
index 24717d7..1e05a91 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_silent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png
index a77fe7f..f4afa52 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
index 43f5468..55173f8 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
index cadcd03..55173f8 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png
index 54e0685..6649d7c 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
index 2efaf45..dcfe5b4 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png
index d3bc458..be3fe62 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
index 9c3f44c..734c52a 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png
index a7ba08a..0deb868 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
index e16bee6..d808990b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png
index 7e1e8de..f890c2b 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
index e599443..0e11ce8 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
index 688b6d6..1ffeaa3 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png
index 1cacf93..ad5b2ff 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png
index 5425af4..6db607d 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
index 0999ac1..716cc7c 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png
index f0cbe4b..5891ff0 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
index d495b0d..188ea3d 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png
index 970aee9..b42650f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
index 33e8390..17680ce 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png
index c1e5118..add0a93 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
index ce25a0b..7023c4f0 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png
index b4d24d11..6f2a767 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
index c4b47e0..318bfd5 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
index e1f2b75..26ea7b6 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_bg_tile.png b/packages/SystemUI/res/drawable-mdpi/status_bar_bg_tile.png
deleted file mode 100644
index 6579ff9..0000000
--- a/packages/SystemUI/res/drawable-mdpi/status_bar_bg_tile.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_close_off.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_close_off.9.png
index 5c577cb..bd1cd12 100644
--- a/packages/SystemUI/res/drawable-mdpi/status_bar_close_off.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_close_off.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
index 7efb502..c73ff35 100644
--- a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png b/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png
deleted file mode 100644
index f334023..0000000
--- a/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-xxhdpi/heads_up_window_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-xxhdpi/heads_up_window_bg.9.png
new file mode 100644
index 0000000..586a738
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw600dp-xxhdpi/heads_up_window_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-xxhdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-xxhdpi/notification_panel_bg.9.png
new file mode 100644
index 0000000..8703e1d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-sw600dp-xxhdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/notify_panel_clock_bg_normal.9.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/notify_panel_clock_bg_normal.9.png
deleted file mode 100644
index 88137e8..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-hdpi/notify_panel_clock_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/notify_panel_clock_bg_pressed.9.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/notify_panel_clock_bg_pressed.9.png
deleted file mode 100644
index 6507a51..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-hdpi/notify_panel_clock_bg_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/recents_blue_glow.9.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/recents_blue_glow.9.png
deleted file mode 100644
index 4ac131a..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-hdpi/recents_blue_glow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/sysbar_notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/sysbar_notification_panel_bg.9.png
deleted file mode 100644
index 0c20ba2..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-hdpi/sysbar_notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-mdpi/notify_panel_clock_bg_normal.9.png b/packages/SystemUI/res/drawable-sw720dp-mdpi/notify_panel_clock_bg_normal.9.png
deleted file mode 100644
index 798f589..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-mdpi/notify_panel_clock_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-mdpi/notify_panel_clock_bg_pressed.9.png b/packages/SystemUI/res/drawable-sw720dp-mdpi/notify_panel_clock_bg_pressed.9.png
deleted file mode 100644
index 73247e5..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-mdpi/notify_panel_clock_bg_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-mdpi/recents_blue_glow.9.png b/packages/SystemUI/res/drawable-sw720dp-mdpi/recents_blue_glow.9.png
deleted file mode 100644
index 4362836..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-mdpi/recents_blue_glow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-mdpi/sysbar_notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw720dp-mdpi/sysbar_notification_panel_bg.9.png
deleted file mode 100644
index 56cd238..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-mdpi/sysbar_notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-tvdpi/sysbar_notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw720dp-tvdpi/sysbar_notification_panel_bg.9.png
deleted file mode 100644
index 571a7a5..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-tvdpi/sysbar_notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/notify_panel_clock_bg_normal.9.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/notify_panel_clock_bg_normal.9.png
deleted file mode 100644
index 2b46c89..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-xhdpi/notify_panel_clock_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/notify_panel_clock_bg_pressed.9.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/notify_panel_clock_bg_pressed.9.png
deleted file mode 100644
index dd476b7..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-xhdpi/notify_panel_clock_bg_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/recents_blue_glow.9.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/recents_blue_glow.9.png
deleted file mode 100644
index 3938502..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-xhdpi/recents_blue_glow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/sysbar_notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/sysbar_notification_panel_bg.9.png
deleted file mode 100644
index 3f05767..0000000
--- a/packages/SystemUI/res/drawable-sw720dp-xhdpi/sysbar_notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/arrow_dashed.png b/packages/SystemUI/res/drawable-xhdpi/arrow_dashed.png
deleted file mode 100644
index c26ed9c..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/arrow_dashed.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/btn_cling_normal.9.png b/packages/SystemUI/res/drawable-xhdpi/btn_cling_normal.9.png
deleted file mode 100644
index 35511d6..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/btn_cling_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/btn_cling_pressed.9.png b/packages/SystemUI/res/drawable-xhdpi/btn_cling_pressed.9.png
deleted file mode 100644
index a38b40f..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/btn_cling_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_normal.9.png b/packages/SystemUI/res/drawable-xhdpi/btn_default_small_normal.9.png
deleted file mode 100644
index 5e601d2..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_normal_disable.9.png b/packages/SystemUI/res/drawable-xhdpi/btn_default_small_normal_disable.9.png
deleted file mode 100644
index ed92cd0..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_normal_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png b/packages/SystemUI/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png
deleted file mode 100644
index f77dbfb..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_pressed.9.png b/packages/SystemUI/res/drawable-xhdpi/btn_default_small_pressed.9.png
deleted file mode 100644
index e34107b..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_selected.9.png b/packages/SystemUI/res/drawable-xhdpi/btn_default_small_selected.9.png
deleted file mode 100644
index 8f70177..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/btn_default_small_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png
index 35a27da..a52dc8d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png
new file mode 100644
index 0000000..466470c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_on.png
new file mode 100644
index 0000000..77c3ec0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
index 2c44011..e888ac2 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/recents_blue_glow.9.png b/packages/SystemUI/res/drawable-xhdpi/recents_blue_glow.9.png
deleted file mode 100644
index e1e08c6..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/recents_blue_glow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_dragging.9.png b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_dragging.9.png
index 1d097c5..79d1b3c 100644
--- a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_dragging.9.png
+++ b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_dragging.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_normal.9.png b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_normal.9.png
index 80fc849..c57ec67 100644
--- a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_normal.9.png
+++ b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_normal.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_press.9.png b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_press.9.png
index 5bae56d..f01a79e 100644
--- a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_press.9.png
+++ b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_press.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/screenshot_panel.9.png b/packages/SystemUI/res/drawable-xhdpi/screenshot_panel.9.png
index c096c7a..511537a 100644
--- a/packages/SystemUI/res/drawable-xhdpi/screenshot_panel.9.png
+++ b/packages/SystemUI/res/drawable-xhdpi/screenshot_panel.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png
index c8882e0..8bca860 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png
index f3ccfd4..11305ea 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png
index d6d9f61..9cd3dbb 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png
index d81a581..2c6a018 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png
index 66bcba5..045a080 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png
index f2472944..91d9694 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png
index f175737..c87bbf2 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png
index b3b7f29..d629095 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png
index 816f0ae..da7dc8f 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png
index 1fbd6fc..3350a2d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png
index 6a1df52..8af8515 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png
index 9a8e6b0..af3f5f5 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png
index 428aa4f..919e71d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png
index f13d8b9..4d92503 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png
index 8f2332f..b7aa3d1 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png
index 33a2a24..0b25ab3 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png
index ef398fa..b699296 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png
index 61c5ee7..0896225 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png
index 51a3c79..33c2b82 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png
index 8e62d51..7a1d8d6 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png
index 4546ad1..554953a 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png
index 112293d..b9e3b88 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png
index 79d9447..137f76e4 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png
index 4dafeba..e8b6d40 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_lte.png
index 92e3873..227a105 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_roam.png
index a4cb86b..bdaafc9 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_device_access_location_found.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_device_access_location_found.png
index dbd370d..a7f0017 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_device_access_location_found.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_device_access_location_found.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png
index 8bba3c8..eeac6ad 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_silent.png
index 19fa2e8..662d062 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_silent.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_silent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png
index bc41395..18be9c0 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_roaming_cdma_0.png
index fbec7c3..f0c2f05 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_roaming_cdma_0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_roaming_cdma_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png
index f5843ad..8b34373 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png
index df5138e..8b34373 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png
index 41a46ed..610e78f 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png
index a76bca3..f682a0e 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png
index d4dca0b..5bb372e 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png
index a91f099..ef05975 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png
index 33e8072..d556733 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png
index e1c0f71..c5088b5 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png
index cad7427..e1bd8bd 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png
index c36c6d9..c82a435 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png
index 674be33..298b27d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png
index ab6f812..75b002d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png
index a7780cf..6276f47 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
index b609d3c..0ae59e3 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png
index 6d5454d..172ab5b 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
index 6eb8410..0368f172 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png
index 7ab5f6a..669750f 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
index e865805..2813464 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png
index a77bceb..5e11523 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
index 5cf396b..811038c 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png
index 056bec6..b6b6555 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
index e8d66bc..b4821d7 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
index ebc2d32..bdf7bca 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/status_bar_bg_tile.png b/packages/SystemUI/res/drawable-xhdpi/status_bar_bg_tile.png
deleted file mode 100644
index d01b117..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/status_bar_bg_tile.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/status_bar_close_off.9.png b/packages/SystemUI/res/drawable-xhdpi/status_bar_close_off.9.png
index 98d0cfb..1fed081 100644
--- a/packages/SystemUI/res/drawable-xhdpi/status_bar_close_off.9.png
+++ b/packages/SystemUI/res/drawable-xhdpi/status_bar_close_off.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png
index 17f4169..e931314 100644
--- a/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png
+++ b/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/title_bar_shadow.9.png b/packages/SystemUI/res/drawable-xhdpi/title_bar_shadow.9.png
deleted file mode 100644
index 89f14db..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/title_bar_shadow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/heads_up_window_bg.9.png b/packages/SystemUI/res/drawable-xxhdpi/heads_up_window_bg.9.png
new file mode 100644
index 0000000..586a738
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/heads_up_window_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_menu_share.png b/packages/SystemUI/res/drawable-xxhdpi/ic_menu_share.png
new file mode 100644
index 0000000..d450531
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_menu_share.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_15.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_15.png
new file mode 100644
index 0000000..0a46dde
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_bang_orange.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_bang_orange.png
new file mode 100644
index 0000000..2b333d7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_bang_orange.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_bang_red.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_bang_red.png
new file mode 100644
index 0000000..4c71154
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_bang_red.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_bang_white.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_bang_white.png
new file mode 100644
index 0000000..976a36b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_bang_white.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_charge_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_charge_0.png
new file mode 100644
index 0000000..82d4806
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_charge_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_charge_15.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_charge_15.png
new file mode 100644
index 0000000..96d39db
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_battery_charge_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location.png
index 79dbdbf..3175636 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png
new file mode 100644
index 0000000..920407d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_on.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_on.png
new file mode 100644
index 0000000..3175636
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_location_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_settings.png
index 4cf6794..d1a72be 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_highlight.png b/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_highlight.png
new file mode 100644
index 0000000..0df6203
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_highlight.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_highlight_land.png b/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_highlight_land.png
new file mode 100644
index 0000000..b400b14
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_highlight_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-xxhdpi/notification_panel_bg.9.png
new file mode 100644
index 0000000..adcdcb7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_dragging.9.png b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_dragging.9.png
new file mode 100644
index 0000000..c424ffe
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_dragging.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_normal.9.png b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_normal.9.png
new file mode 100644
index 0000000..a446448
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_normal.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_press.9.png b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_press.9.png
new file mode 100644
index 0000000..b7bbd82
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_press.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/screenshot_panel.9.png b/packages/SystemUI/res/drawable-xxhdpi/screenshot_panel.9.png
new file mode 100644
index 0000000..45259d7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/screenshot_panel.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_alarm.png
index ed4b8c4..d42d9d6 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_alarm.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_alarm.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png
index 0c96e54..0795f3a 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png
index 4a5ede4..5b002df 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png
index eb3d607..c03248aa 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png
index 6f61b8e..e489d2c 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png
index 4eaf0e6..68a1be8 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png
index e1297ed..e5f639d 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png
index 8e58b76..ddfa424 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png
index 5e55b28..3b3025b 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png
index 0fce153..7ece3af 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png
index 4cb166a..2f4cf03 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png
index 0239c15..8179eba 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png
index 96d2bd8..5c925c1 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png
index 2d3ca6c..f527679 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png
index d825f86..fab08f4 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png
index 6f22b47..1f8dc5e 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png
index 0077f86..7f1f977 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png
index 235f756..b9825f9 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_1x.png
index 2776d03..9baa623 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_1x.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_3g.png
index 59309b0..af3a0d9 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_3g.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_4g.png
index f95e3f1..717895b 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_4g.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_e.png
index ca93fac..989b236 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_e.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_g.png
index d2efd69..49cce0d 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_g.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_h.png
index 9f4ee4cc..caa5552 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_h.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_lte.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_lte.png
index cfdbe63..a0beb07 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_lte.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_lte.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_roam.png
index b04e4b0..9cc3184 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_roam.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_connected_roam.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_device_access_location_found.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_device_access_location_found.png
index 8e00f6d..ad34d49 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_device_access_location_found.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_device_access_location_found.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png
index a5031a3..32415c2 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_silent.png
index 4e511c6..aabf0aa 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_silent.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_silent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_vibrate.png
index efd0ca6..654c2a5 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_vibrate.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_ringer_vibrate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_roaming_cdma_0.png
index 9de3e9f..1c544c4 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_roaming_cdma_0.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_roaming_cdma_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png
index 18f63e5..361ff48 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png
index 8106087..937839b 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png
index d863597..d185a4d 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png
index 01fce1a..2bd6eb1 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png
index f9ee187..9594607 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png
index e72fda6..aad369e 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png
index a1540d7..6f9f50c45 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png
index eebc585..c76e188 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png
index bf22fbb..75a182f 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png
index 754e3b9..188981315 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png
index 78e94c6..b388b8f 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png
index e36bf10..99b2fff 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png
index 274b02f..2f6a4c0 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
index c694e8b..93fd9b6 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png
index 9051ce9..a8681ec 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
index f696027..47a04cb 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png
index e3e0eaf..343eef9 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
index 5df60a1..033bced 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png
index e969dda..168f8ff 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
index 635989c..c546e08 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png
index 0c28616..a7b32c9 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
index 1c63257..1126d9b 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
index 19ee69e..5f8e67b 100644
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
+++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_off.9.png b/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_off.9.png
new file mode 100644
index 0000000..d50ff85
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_off.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_on.9.png
new file mode 100644
index 0000000..5d27ccd
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/title_bar_shadow.9.png b/packages/SystemUI/res/drawable-xxhdpi/title_bar_shadow.9.png
new file mode 100644
index 0000000..e86f891
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/title_bar_shadow.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/btn_default_small.xml b/packages/SystemUI/res/drawable/btn_default_small.xml
deleted file mode 100644
index 5485ea0..0000000
--- a/packages/SystemUI/res/drawable/btn_default_small.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_window_focused="false" android:state_enabled="true"
-        android:drawable="@drawable/btn_default_small_normal" />
-    <item android:state_window_focused="false" android:state_enabled="false"
-        android:drawable="@drawable/btn_default_small_normal_disable" />
-    <item android:state_pressed="true" 
-        android:drawable="@drawable/btn_default_small_pressed" />
-    <item android:state_focused="true" android:state_enabled="true"
-        android:drawable="@drawable/btn_default_small_selected" />
-    <item android:state_enabled="true"
-        android:drawable="@drawable/btn_default_small_normal" />
-    <item android:state_focused="true"
-        android:drawable="@drawable/btn_default_small_normal_disable_focused" />
-    <item
-         android:drawable="@drawable/btn_default_small_normal_disable" />
-</selector>
-
diff --git a/packages/SystemUI/res/drawable/cling_button_bg.xml b/packages/SystemUI/res/drawable/cling_button_bg.xml
deleted file mode 100644
index d175f53..0000000
--- a/packages/SystemUI/res/drawable/cling_button_bg.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_pressed="true" android:drawable="@drawable/btn_cling_pressed" />
-    <item android:drawable="@drawable/btn_cling_normal" />
-</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/notify_panel_clock_bg.xml b/packages/SystemUI/res/drawable/notify_panel_clock_bg.xml
deleted file mode 100644
index c83d878..0000000
--- a/packages/SystemUI/res/drawable/notify_panel_clock_bg.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_pressed="true"
-        android:drawable="@drawable/notify_panel_clock_bg_pressed" />
-    <item android:drawable="@drawable/notify_panel_clock_bg_normal" />
-</selector>
-
diff --git a/packages/SystemUI/res/drawable/status_bar_bg.xml b/packages/SystemUI/res/drawable/status_bar_bg.xml
deleted file mode 100644
index 403493b..0000000
--- a/packages/SystemUI/res/drawable/status_bar_bg.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-
-<bitmap
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:tileMode="repeat"
-    android:src="@drawable/status_bar_bg_tile"
-    />
diff --git a/packages/SystemUI/res/layout-land/status_bar_help.xml b/packages/SystemUI/res/layout-land/status_bar_help.xml
deleted file mode 100644
index a885b86..0000000
--- a/packages/SystemUI/res/layout-land/status_bar_help.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, 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.
-*/
--->
-
-<!-- This is the combined status bar / notification panel window. -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/status_bar_cling"
-    android:paddingStart="40dp"
-    android:paddingEnd="40dp"
-    android:background="#DD000000"
-    android:focusable="true"
-    android:orientation="horizontal" 
-    android:gravity="top|start"
-    >
-
-    <ImageView
-        android:layout_width="wrap_content"
-        android:layout_weight="0"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="50dp"
-        android:gravity="center"
-        android:src="@drawable/arrow_dashed"
-        tools:ignore="ContentDescription" />
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:orientation="vertical"
-        android:layout_marginTop="40dp"
-        >
-        <TextView
-            style="@style/ClingTitleText"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/status_bar_help_title" />
-
-        <TextView
-            style="@style/ClingText"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="30dp"
-            android:text="@string/status_bar_help_text" />
-
-        <Button
-            android:id="@+id/ok"
-            style="@style/ClingButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:paddingStart="50dp"
-            android:paddingEnd="50dp"
-            android:text="@android:string/ok" />
-    </LinearLayout>
-</LinearLayout>
diff --git a/packages/SystemUI/res/layout/status_bar_help.xml b/packages/SystemUI/res/layout/status_bar_help.xml
deleted file mode 100644
index f638767..0000000
--- a/packages/SystemUI/res/layout/status_bar_help.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, 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.
-*/
--->
-
-<!-- This is the combined status bar / notification panel window. -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/status_bar_cling"
-    android:paddingStart="40dp"
-    android:paddingEnd="40dp"
-    android:background="#DD000000"
-    android:focusable="true"
-    android:orientation="vertical" 
-    android:gravity="top|start"
-    >
-
-    <ImageView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="50dp"
-        android:gravity="center"
-        android:src="@drawable/arrow_dashed"
-        tools:ignore="ContentDescription" />
-
-    <TextView
-        style="@style/ClingTitleText"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/status_bar_help_title" />
-
-    <TextView
-        style="@style/ClingText"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="30dp"
-        android:text="@string/status_bar_help_text" />
-
-    <Button
-        android:id="@+id/ok"
-        style="@style/ClingButton"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:paddingStart="50dp"
-        android:paddingEnd="50dp"
-        android:text="@android:string/ok" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index c0473c2..28128da 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -197,12 +197,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Draadlose aansig"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helderheid"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Kennisgewings verskyn hier"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Verkry enige tyd toegang tot hulle deur af te sleep.\nSleep weer af vir stelselkontroles."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Netwerk kan dalk gemonitor word"</string>
     <string name="done_button" msgid="1759387181766603361">"Klaar"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Netwerkmonitering"</string>
-    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Hierdie toestel word bestuur deur: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nJou administrator is bevoeg om jou netwerkaktiwiteit te monitor, insluitend e-pos, programme en veilige webwerwe.\n\nKontak jou administrator vir meer inligting."</string>
-    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"\'n Derdeparty is bevoeg om jou netwerk\n-aktiwiteit te monitor, insluitend e-pos, programme en veilige webwerwe.\n\n\'n Vertroude eiebewys wat op jou toestel geïnstalleer is, maak dit moontlik."</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Hierdie toestel word bestuur deur: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nJou administrateur kan jou netwerkaktiwiteit monitor, insluitend e-pos, programme en veilige webwerwe.\n\nKontak jou administrateur vir meer inligting."</string>
+    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"\'n Derdeparty kan jou netwerk\n-aktiwiteit monitor, insluitend e-pos, programme en veilige webwerwe.\n\n\'n Vertroude eiebewys wat op jou toestel geïnstalleer is, maak dit moontlik."</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"Gaan vertroude eiebewyse na"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index c562f52..40479b5 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -197,12 +197,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"ገመድ አልባ ማሳያ"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ብሩህነት"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ራስ-ሰር"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"ማሳወቂያዎች እዚህ ላይ ይታያሉ"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"ወደ ታች በማንሸራተት በማንኛውም ጊዜ ይድረሱባቸው።\nSwipe የስርዓት መቆጣጠሪያዎችን ለማምጣት እንደገና ወደ ታች ያንሸራትቱ።"</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"አውታረ መረብ በክትትል ውስጥ ሊሆን ይችላል"</string>
     <string name="done_button" msgid="1759387181766603361">"ተከናውኗል"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"የአውታረ መረብ ክትትል"</string>
-    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"መሳሪያው የሚተዳደረው በሚከተለው ነው፦ <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>። \n\nአስተዳዳሪዎ ኢሜይሎችዎን፣ መተግበሪያዎችዎን እና ደህንነታቸው አስተማማኝ የሆኑ ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ይችላል።\n\nለተጨማሪ መረጃ አስተዳዳሪዎን ያግኙ።"</string>
-    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"ሶስተኛ ወገን ኢሜይሎችዎን፣ መተግበሪያዎችዎን እና ደህንነታቸው አስተማማኝ የሆኑ ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ\n እንቅስቃሴዎን መከታተል ይችላል።\n\nበመሳሪያዎ ላይ የተጫነ የታመነ ምስክርነት ይህን የሚቻል አድርጎታል።"</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"መሳሪያው የሚተዳደረው፦ በ<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>። \n\nአስተዳዳሪዎ ኢሜይሎችዎን፣ መተግበሪያዎችዎን እና ደህንነታቸው አስተማማኝ የሆኑ ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ይችላል።\n\nለተጨማሪ መረጃ አስተዳዳሪዎን ያግኙ።"</string>
+    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"ሶስተኛ ወገን ኢሜይሎችዎን፣ መተግበሪያዎችዎን እና ደህንነታቸው አስተማማኝ የሆኑ\nድር ጣቢያዎችን ጨምሮ አውታረ መረብ እንቅስቃሴዎን መከታተል ይችላል።\n\nበመሳሪያዎ ላይ የተጫነ የታመነ ምስክርነት ይህን የሚቻል አድርጎታል።"</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"የታመኑ ምስክርነቶችን ይፈትሹ"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index fcc4696..93a9164 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"عرض شاشة لاسلكي"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"السطوع"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"تلقائي"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"تظهر الإشعارات هنا"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"يمكنك الدخول إليها في أي وقت بالتمرير السريع إلى أسفل.\nيمكنك التمرير السريع إلى أسفل مرة أخرى للوصول إلى عناصر تحكم النظام."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"قد تكون الشبكة مراقبة"</string>
     <string name="done_button" msgid="1759387181766603361">"تم"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"مراقبة الشبكات"</string>
diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..9565eee
--- /dev/null
+++ b/packages/SystemUI/res/values-az-rAZ/strings.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * 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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="7164937344850004466">"Sistemin İstifadə İnterfeysi"</string>
+    <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Təmizlə"</string>
+    <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Siyahıdan sil"</string>
+    <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Tətbiq infosu"</string>
+    <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Yeni tətbiq yoxdur"</string>
+    <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Son tətbiqləri kənarlaşdır"</string>
+  <plurals name="status_bar_accessibility_recent_apps">
+    <item quantity="one" msgid="5854176083865845541">"1 son tətbiq"</item>
+    <item quantity="other" msgid="1040784359794890744">"%d son tətbiq"</item>
+  </plurals>
+    <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bildiriş yoxdu"</string>
+    <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Davam edir"</string>
+    <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirişlər"</string>
+    <string name="battery_low_title" msgid="2783104807551211639">"Adapteri qoşun"</string>
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Batareya azalır."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> qalıb"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"USB ilə elektrik doldurma dəstəklənmir.\nYalnız adapter istifadə edin."</string>
+    <string name="battery_low_why" msgid="7279169609518386372">"Batareya istifadəsi"</string>
+    <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ayarlar"</string>
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+    <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Təyyarə rejimi"</string>
+    <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ekranın avto-dönüşü"</string>
+    <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SUSDUR"</string>
+    <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AVTO"</string>
+    <string name="status_bar_settings_notifications" msgid="397146176280905137">"Bildirişlər"</string>
+    <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth tezerinq"</string>
+    <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Daxiletmə metodlarını ayarlayın"</string>
+    <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Fiziki klaviatura"</string>
+    <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g> tətbiqinə USB cihazına daxil olmağa icazə verilsin?"</string>
+    <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> tətbiqinə USB aksesuarına qoşulmağa icazə verirsiniz?"</string>
+    <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"USB cihaz qoşulu olan zaman <xliff:g id="ACTIVITY">%1$s</xliff:g> açılsın mı?"</string>
+    <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"USB aksesuar qoşulu olan zaman <xliff:g id="ACTIVITY">%1$s</xliff:g> açılsın mı?"</string>
+    <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Heç bir quraşdırılmış tətbiq bu USB aksesuar ilə işləmir. Bu aksesuar haqqında daha ətraflı məlumatı <xliff:g id="URL">%1$s</xliff:g> adresindən öyrənin"</string>
+    <string name="title_usb_accessory" msgid="4966265263465181372">"USB aksesuar"</string>
+    <string name="label_view" msgid="6304565553218192990">"Göstər"</string>
+    <string name="always_use_device" msgid="1450287437017315906">"Bu USB cihaz üçün defolt olaraq istifadə edin."</string>
+    <string name="always_use_accessory" msgid="1210954576979621596">"Bu USB aksesuar üçün defolt istifadə edin"</string>
+    <string name="usb_debugging_title" msgid="4513918393387141949">"USB sazlamaya icazə verilsin?"</string>
+    <string name="usb_debugging_message" msgid="2220143855912376496">"Kompüterin RSA barmaq izi: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+    <string name="usb_debugging_always" msgid="303335496705863070">"Bu kompüterdən həmişə icazə verilsin"</string>
+    <string name="compat_mode_on" msgid="6623839244840638213">"Ekranı doldurmaq üçün yaxınlaşdır"</string>
+    <string name="compat_mode_off" msgid="4434467572461327898">"Ekranı doldurmaq üçün uzat"</string>
+    <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skrinşot yadda saxlanılır..."</string>
+    <string name="screenshot_saving_title" msgid="8242282144535555697">"Skrinşot yadda saxlanır..."</string>
+    <string name="screenshot_saving_text" msgid="2419718443411738818">"Skrinşot yadda saxlanır."</string>
+    <string name="screenshot_saved_title" msgid="6461865960961414961">"Skrinşot çəkildi."</string>
+    <string name="screenshot_saved_text" msgid="1152839647677558815">"Skrinşotunuza baxmaq üçün toxunun"</string>
+    <string name="screenshot_failed_title" msgid="705781116746922771">"Skrinşot götürülə bilinmədi."</string>
+    <string name="screenshot_failed_text" msgid="8134011269572415402">"Skrinşotu yadda saxlamaq alınmadı, yəqin yaddaş istifadə olunur."</string>
+    <string name="usb_preference_title" msgid="6551050377388882787">"USB fayl transferi seçimləri"</string>
+    <string name="use_mtp_button_title" msgid="4333504413563023626">"Media pleyer (MTP) kimi montaj edin"</string>
+    <string name="use_ptp_button_title" msgid="7517127540301625751">"Kamera kimi birləşdir (PTP)"</string>
+    <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac üçün Android File Transfer tətbiqini quraşdırın"</string>
+    <string name="accessibility_back" msgid="567011538994429120">"Geri"</string>
+    <string name="accessibility_home" msgid="8217216074895377641">"Ana səhifə"</string>
+    <string name="accessibility_menu" msgid="316839303324695949">"Menyu"</string>
+    <string name="accessibility_recent" msgid="8571350598987952883">"Son tətbiqlər"</string>
+    <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Daxiletmə metodu düyməsinə keç"</string>
+    <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Uyğunluq zoom düyməsi."</string>
+    <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Daha böyük ekranda uzaqlaşdır."</string>
+    <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth qoşulub."</string>
+    <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth əlaqəsi kəsildi."</string>
+    <string name="accessibility_no_battery" msgid="358343022352820946">"Batareya yoxdur."</string>
+    <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Batareya bir xətdir."</string>
+    <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Batareya iki xətdir."</string>
+    <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Batareya üç xətdir."</string>
+    <string name="accessibility_battery_full" msgid="8909122401720158582">"Batareya doludur"</string>
+    <string name="accessibility_no_phone" msgid="4894708937052611281">"Telefon yoxdur."</string>
+    <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Şəbəkə bir xətdir."</string>
+    <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Şəbəkə iki xətdir."</string>
+    <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Şəbəkə üç xətdir."</string>
+    <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Tam şəbəkə."</string>
+    <string name="accessibility_no_data" msgid="4791966295096867555">"Məlumat yoxdur."</string>
+    <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Data bir xətdir."</string>
+    <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Data iki xətdir."</string>
+    <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Data üç xətdir."</string>
+    <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Data siqnalı tamdır."</string>
+    <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi sönülüdür."</string>
+    <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi bağlantı kəsildi."</string>
+    <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi bir xətdir."</string>
+    <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi iki xətdir."</string>
+    <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi üç xətdir."</string>
+    <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi siqnalı tamdır."</string>
+    <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX yoxdur."</string>
+    <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX bir xətt."</string>
+    <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX iki xətdir."</string>
+    <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX üç xətdir."</string>
+    <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX siqnalı tamdır."</string>
+    <string name="accessibility_no_signal" msgid="7064645320782585167">"Siqnal yoxdur."</string>
+    <string name="accessibility_not_connected" msgid="6395326276213402883">"Qoşulu deyil."</string>
+    <string name="accessibility_zero_bars" msgid="3806060224467027887">"Sıfır xətt."</string>
+    <string name="accessibility_one_bar" msgid="1685730113192081895">"Bir xətt."</string>
+    <string name="accessibility_two_bars" msgid="6437363648385206679">"İki xətt."</string>
+    <string name="accessibility_three_bars" msgid="2648241415119396648">"Üç xətdir."</string>
+    <string name="accessibility_signal_full" msgid="9122922886519676839">"Siqnal tamdır."</string>
+    <string name="accessibility_desc_on" msgid="2385254693624345265">"Aktiv."</string>
+    <string name="accessibility_desc_off" msgid="6475508157786853157">"Deaktiv"</string>
+    <string name="accessibility_desc_connected" msgid="8366256693719499665">"Qoşuludur."</string>
+    <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+    <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+    <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+    <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+    <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+    <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+    <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+    <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+    <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Rouminq"</string>
+    <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+    <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+    <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM yoxdur"</string>
+    <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tezering."</string>
+    <string name="accessibility_airplane_mode" msgid="834748999790763092">"Uçuş rejimi"</string>
+    <string name="accessibility_battery_level" msgid="7451474187113371965">"Batareya <xliff:g id="NUMBER">%d</xliff:g> faizdir."</string>
+    <string name="accessibility_settings_button" msgid="799583911231893380">"Sistem parametrləri"</string>
+    <string name="accessibility_notifications_button" msgid="4498000369779421892">"Bildirişlər."</string>
+    <string name="accessibility_remove_notification" msgid="3603099514902182350">"Bildirişi təmizlə."</string>
+    <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS aktivdir."</string>
+    <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS əldə edilir."</string>
+    <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter aktivləşdirilib."</string>
+    <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Zəng vibrasiyası"</string>
+    <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Zəngvuran səssiz."</string>
+    <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> çıxarıldı."</string>
+    <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Bildiriş uzaqlaşdırıldı."</string>
+    <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bildiriş kölgəsi."</string>
+    <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tez ayarlar."</string>
+    <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Axırıncı tətbiqlər."</string>
+    <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"İstifadəçi <xliff:g id="USER">%s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+    <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobil <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batareya <xliff:g id="STATE">%s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Təyyarə Rejimi <xliff:g id="STATE">%s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Alarm <xliff:g id="TIME">%s</xliff:g> üçün qurulub."</string>
+    <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G data qeyri-aktivdir"</string>
+    <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G data deaktiv edildi"</string>
+    <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobil data qeyri-aktivdir"</string>
+    <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Data qeyri-aktivdir"</string>
+    <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Göstərilmiş data istifadə limitinə çatdınız.\n\nƏgər datanı yenidən aktivləşdirsəniz, operator tərəfindən əlavə tariflər tətbiq oluna bilər."</string>
+    <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Datanı yenidən aktiv et"</string>
+    <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"İnternet bağlantısı yoxdur"</string>
+    <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi qoşulub"</string>
+    <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS Axtarışı"</string>
+    <string name="gps_notification_found_text" msgid="4619274244146446464">"Yer GPS tərəfindən müəyyən edildi"</string>
+    <string name="accessibility_location_active" msgid="2427290146138169014">"Məkan sorğuları arxivi"</string>
+    <string name="accessibility_clear_all" msgid="5235938559247164925">"Bütün bildirişləri sil."</string>
+    <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Tətbiq infosu"</string>
+    <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekran avtomatik döndəriləcək."</string>
+    <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekran landşaft orientasiyasında kilidlənib."</string>
+    <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran portret orientasiyasında kilidlənib."</string>
+    <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+    <string name="start_dreams" msgid="7219575858348719790">"Xəyal"</string>
+    <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+    <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Uçuş rejimi"</string>
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Dolur, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Dolub"</string>
+    <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Cihaz)"</string>
+    <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth bağlıdır"</string>
+    <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Parlaqlıq"</string>
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Avtofırlanma"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Fırlatma kilidlidir"</string>
+    <string name="quick_settings_ime_label" msgid="7073463064369468429">"Daxiletmə metodu"</string>
+    <string name="quick_settings_location_label" msgid="5011327048748762257">"Yer"</string>
+    <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Yer Deaktiv"</string>
+    <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Media cihazı"</string>
+    <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+    <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Yalnız fövqəladə zənglər"</string>
+    <string name="quick_settings_settings_label" msgid="5326556592578065401">"Nizamlar"</string>
+    <string name="quick_settings_time_label" msgid="4635969182239736408">"Vaxt"</string>
+    <string name="quick_settings_user_label" msgid="5238995632130897840">"Mən"</string>
+    <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+    <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Bağlantı yoxdur"</string>
+    <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Şəbəkə yoxdur"</string>
+    <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi sönülüdür"</string>
+    <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi Ekran"</string>
+    <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Simsiz Ekran"</string>
+    <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Parlaqlıq"</string>
+    <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AVTO"</string>
+    <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Şəbəkə monitor edilə bilər"</string>
+    <string name="done_button" msgid="1759387181766603361">"Hazırdır"</string>
+    <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Şəbəkə Monitorinqi"</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Bu cihaz <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tərəfindən idarə edilir . \n \n Sizin administrator şəbəkə fəaliyyətinizin, həmçinin e-poçt, tətbiqlər və təhlükəsiz veb saytlarınızın monitorinqini etməyə qadirdir. \n \n Ətraflı məlumat üçün administrator ilə əlaqə saxlayın."</string>
+    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"Üçüncü tərəf \n şəbəkə fəaliyyətinizin, həmçinin e-poçt, tətbiqlər və təhlükəsiz veb saytlarınızın monitorinqini etməyə qadirdir. . \n \nCihanzınıza yüklənmiş etibarlı etimad bunu mümkün edir."</string>
+    <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"Etibarlı etimadları yoxlayın"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 29eed4e..eb455c1 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -202,8 +202,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Бесправадны дысплей"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яркасць"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АЎТА"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Апавяшчэнні з\'яўляюцца тут"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Атрымлівайце доступ да іх у любы час, праводзячы пальцам уніз.\nПравядзіце пальцам уніз яшчэ раз, каб атрымаць доступ да сродкаў кіравання сістэмай."</string>
     <!-- no translation found for ssl_ca_cert_warning (5848402127455021714) -->
     <skip />
     <!-- no translation found for done_button (1759387181766603361) -->
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index dbb12a5..e839143 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Безжичен дисплей"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яркост"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АВТ."</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Известията се показват тук"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Осъществявайте достъп до тях по всяко време, като прекарате пръст надолу.\nНаправете го отново за системните контроли."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Мрежата може да се наблюдава"</string>
     <string name="done_button" msgid="1759387181766603361">"Готово"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Наблюдение на мрежата"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 90edbee..f3b7714 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -199,9 +199,7 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Pantalla sense fil"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillantor"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÀTICA"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Les notificacions apareixen aquí"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Accedeix-hi en qualsevol moment: només has de fer lliscar el dit cap avall.\nTorna a fer lliscar el dit cap avall per fer que es mostrin els controls del sistema."</string>
-    <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Pot ser que se supervisi la xarxa."</string>
+    <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Pot ser que la xarxa se supervisi."</string>
     <string name="done_button" msgid="1759387181766603361">"Fet"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Supervisió de xarxes"</string>
     <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> administra aquest dispositiu.\n\nEl teu administrador té capacitat per supervisar la teva activitat de xarxa, inclosos els correus electrònics, les aplicacions i els llocs web segurs.\n\nPer obtenir més informació, contacta amb l\'administrador."</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index c8793c6..5977c35 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Bezdrátový displej"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jas"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATICKY"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Zde se zobrazují oznámení"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Můžete je kdykoli zobrazit tím, že přejedete prstem dolů.\nPřejedete-li prstem dolů ještě jednou, zobrazí se ovládací prvky systému."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Síť může být monitorována"</string>
     <string name="done_button" msgid="1759387181766603361">"Hotovo"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Monitorování sítě"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index d27a360..08c42d0 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -197,12 +197,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Trådløs skærm"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Lysstyrke"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Underretninger vises her"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Få adgang til dem når som helst ved at stryge ned.\nStryg ned igen for at komme til systemindstillingerne."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Netværket kan være overvåget"</string>
     <string name="done_button" msgid="1759387181766603361">"Udfør"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Overvågning af netværk"</string>
     <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Denne enhed er administreret af: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nDin administrator kan overvåge dine netværksaktiviteter, f.eks. e-mails, apps og sikre websites.\n\nFå flere oplysninger ved at kontakte din administrator."</string>
-    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"En tredjepart kan overvåge dine netværksaktiviteter, \nf.eks.e-mails, apps og sikre websites.\n\nBetroede loginoplysninger, der er installeret på enheden, gør dette muligt."</string>
+    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"En tredjepart kan overvåge dine netværksaktiviteter, \nf.eks.e-mails, apps og sikre websites.\n\nBetroede loginoplysninger, der er installeret på din enhed, gør dette muligt."</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"Kontrollér betroede loginoplysninger"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index df0913b..8b52a11 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Kabellose Übertragung (WiDi)"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helligkeit"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Benachrichtigungen erscheinen hier"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Greifen Sie jederzeit auf sie zu, indem Sie nach unten wischen.\nWischen Sie für Systemeinstellungen erneut nach unten."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Das Netzwerk wird möglicherweise überwacht."</string>
     <string name="done_button" msgid="1759387181766603361">"Fertig"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Netzwerküberwachung"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 37d557c..c437eb6 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -199,12 +199,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Ασύρματη οθόνη"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Φωτεινότητα"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ΑΥΤΟΜΑΤΗ"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Οι ειδοποιήσεις εμφανίζονται εδώ"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Μεταβείτε σε αυτές ανά πάσα στιγμή σύροντας προς τα κάτω.\nΣύρετε ξανά προς τα κάτω για τα στοιχεία ελέγχου συστήματος."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Το δίκτυο ενδέχεται να παρακολουθείται"</string>
     <string name="done_button" msgid="1759387181766603361">"Τέλος"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Παρακολούθηση δικτύου"</string>
-    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Η συσκευή αυτή υποβάλλεται σε διαχείριση από: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nΟ διαχειριστής σας έχει τη δυνατότητα παρακολούθησης της δραστηριότητας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ασφαλών ιστότοπων.\n\nΓια περισσότερες πληροφορίες επικοινωνήστε με το διαχειριστή σας."</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Η συσκευή αυτή διαχειρίζεται από: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nΟ διαχειριστής σας έχει τη δυνατότητα παρακολούθησης της δραστηριότητας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ασφαλών ιστότοπων.\n\nΓια περισσότερες πληροφορίες επικοινωνήστε με το διαχειριστή σας."</string>
     <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"Ένα τρίτο μέρος έχει δυνατότητα παρακολούθησης της δραστηριότητας\nδικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ασφαλών ιστότοπων.\n\nΈνα αξιόπιστο διαπιστευτήριο που έχει εγκατασταθεί στη συσκευή σας επιτρέπει κάτι τέτοιο."</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"Ελέγξτε τα αξιόπιστα διαπιστευτήρια"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 5fc3760..5255c44 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wireless Display"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brightness"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Notifications appear here"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Access them any time by swiping down.\nSwipe down again for system controls."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Network may be monitored"</string>
     <string name="done_button" msgid="1759387181766603361">"Finished"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Network Monitoring"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 5fc3760..5255c44 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wireless Display"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brightness"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Notifications appear here"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Access them any time by swiping down.\nSwipe down again for system controls."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Network may be monitored"</string>
     <string name="done_button" msgid="1759387181766603361">"Finished"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Network Monitoring"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 91da585..f5b2df7 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Pantalla inalámbrica"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillo"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÁTICO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Las notificaciones aparecen aquí."</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Desliza el dedo hacia abajo para acceder al contenido.\nVuelve a deslizar el dedo hacia abajo para acceder a los controles del sistema."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Es posible que la red esté supervisada."</string>
     <string name="done_button" msgid="1759387181766603361">"Listo"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Supervisión de red"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 9019b82..b81b487 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Pantalla inalámbrica"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillo"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Las notificaciones aparecen aquí"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Desliza el dedo hacia abajo para acceder al contenido.\nVuelve a deslizar el dedo hacia abajo para acceder a los controles del sistema."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Es posible que la red esté supervisada"</string>
     <string name="done_button" msgid="1759387181766603361">"Listo"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Supervisión de red"</string>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index cde1240..69da334 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Juhtmeta ekraaniühendus"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Heledus"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMAATNE"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Märguanded ilmuvad siia"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Juurdepääs igal ajal sõrmega alla pühkides.\nSüsteemi juhtnuppude jaoks pühkige uuesti alla."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Võrku võidakse jälgida"</string>
     <string name="done_button" msgid="1759387181766603361">"Valmis"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Võrgu jälgimine"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 40ed13d..412e749 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -197,12 +197,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"نمایش بدون سیم"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"روشنایی"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"خودکار"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"اعلان‌ها در اینجا نمایش داده می‌شوند"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"با کشیدن انگشت به طرف پایین به آنها دسترسی پیدا کنید.\nبرای کنترل‌های سیستم دوباره انگشت خود را به سمت پایین بکشید."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ممکن است شبکه نظارت شده باشد"</string>
     <string name="done_button" msgid="1759387181766603361">"انجام شد"</string>
-    <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"نظارت بر شبکه"</string>
-    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"مدیریت دستگاه توسط: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nسرپرست شما می‌تواند فعالیت شبکه شما را نظارت کند، از جمله ایمیل‌ها، برنامه‌ها، و وب‌سایت‌های ایمن.\n\nبرای کسب اطلاعات بیشتر، با سرپرستتان تماس بگیرید."</string>
-    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"یک شخص ثالث قادر به نظارت بر فعالیت\nشبکه شما، از جمله ایمیل‌ها، برنامه‌ها، و وب‌سایت‌های ایمن است.\n\nیک اعتبارنامه قابل اعتماد نصب شده بر روی دستگاه شما این کار را امکان‌پذیر می‌کند."</string>
+    <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"پایش شبکه"</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"این دستگاه توسط: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> مدیریت می‌شود.\n\nسرپرست شما می‌تواند فعالیتتان را در شبکه نظارت کند، از جمله ایمیل‌ها، برنامه‌ها، و وب‌سایت‌های ایمن.\n\nبرای کسب اطلاعات بیشتر، با سرپرستتان تماس بگیرید."</string>
+    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"یک شخص ثالث قادر به نظارت بر فعالیت\nشبکه شما، از جمله ایمیل‌ها، برنامه‌ها، و وب‌سایت‌های ایمن است.\n\nیک اعتبارنامه قابل اعتماد نصب شده بر روی دستگاهتان این کار را امکان‌پذیر می‌کند."</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"بررسی اعتبارنامه‌های قابل اعتماد"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 915ba23..dbd228e 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Langaton näyttö"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Kirkkaus"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Ilmoitukset näkyvät tässä"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Näet ilmoitukset liu\'uttamalla sormea alas ruudulla.\nVoit palauttaa järjestelmän ohjaimet näkyviin liu\'uttamalla sormea alas uudelleen."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Verkkoa saatetaan valvoa"</string>
     <string name="done_button" msgid="1759387181766603361">"Valmis"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Verkon valvonta"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 584e8b2..6071659 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Affichage sans fil"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminosité"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATIQUE"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Les notifications s’affichent ici"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Accédez-y à tout moment en faisant glisser le doigt vers le bas.\nRépétez l\'opération pour accéder aux commandes du système."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Le réseau peut être surveillé"</string>
     <string name="done_button" msgid="1759387181766603361">"Terminé"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Surveillance réseau"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index a96ea07..4982ed3 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Affichage sans fil"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminosité"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATIQUE"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Les notifications s’affichent ici"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Accédez-y à tout moment en faisant glisser le doigt vers le bas.\nRépétez l\'opération pour accéder aux commandes du système."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Il est possible que le réseau soit surveillé."</string>
     <string name="done_button" msgid="1759387181766603361">"OK"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Surveillance du réseau"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 0003133..91d4a96 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -169,7 +169,7 @@
     <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"स्‍क्रीन लैंडस्केप अभिविन्यास में लॉक है."</string>
     <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"स्‍क्रीन पोर्ट्रेट अभिविन्‍यास में लॉक है."</string>
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
-    <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+    <string name="start_dreams" msgid="7219575858348719790">"दिवास्वप्न"</string>
     <string name="ethernet_label" msgid="7967563676324087464">"ईथरनेट"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"हवाई जहाज़ मोड"</string>
     <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"चार्ज हो रही है, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"वायरलेस डिस्प्ले"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"चमक"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"स्वत:"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"सूचनाएं यहां दिखाई देती हैं"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"नीचे स्वाइप करके उन तक कभी भी पहुंचें.\nसिस्टम नियंत्रणों के लिए पुन: नीचे स्वाइप करें."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"नेटवर्क को मॉनिटर किया जा सकता है"</string>
     <string name="done_button" msgid="1759387181766603361">"पूर्ण"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"नेटवर्क मॉनिटरिंग"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index b9a5e1b..92e1b21 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Bežični prikaz"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Svjetlina"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATSKI"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Obavijesti se prikazuju ovdje"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Pristupite im u bilo kojem trenutku tako da prstom trznete prema dolje. \nPonovo prstom trznite prema dolje za kontrole sustava."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Mreža se možda nadzire"</string>
     <string name="done_button" msgid="1759387181766603361">"Završeno"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Nadzor mreže"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 32d3abe..ad9c7b7 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Vezeték nélküli kijelző"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Fényerő"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"automatikus"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Az értesítések itt jelennek meg."</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Bármikor elérheti őket, ha lefelé húzza az ujját.\nHúzza le az ujját még egyszer a rendszerbeállítások eléréséhez."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Lehet, hogy a hálózat felügyelt"</string>
     <string name="done_button" msgid="1759387181766603361">"Kész"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Hálózatfelügyelet"</string>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index 25af411..06b897a 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Անլար էկրան"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Պայծառություն"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"Ինքնաշխատ"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Ծանուցումները հայտնվում են այստեղ"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Դրանք մատչեք ցանկացած պահի` սահահարվածելով:\nԿրկին սահահարվածեք ներքև` համակարգային կառավարման համար:"</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Ցանցը կարող է վերահսկվել"</string>
     <string name="done_button" msgid="1759387181766603361">"Պատրաստ է"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Ցանցի մշտադիտարկում"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index fdbcbcc..3af3a34 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Layar Nirkabel"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Kecerahan"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OTOMATIS"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Pemberitahuan muncul di sini"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Akses kapan saja dengan menggesek ke bawah.\nGesek ke bawah sekali lagi untuk kontrol sistem."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Jaringan mungkin dipantau"</string>
     <string name="done_button" msgid="1759387181766603361">"Selesai"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Pemantauan Jaringan"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 37ef6c2..d936e5f 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Visualizzazione wireless"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminosità"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Le notifiche vengono visualizzate qui"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Puoi accedervi in qualsiasi momento scorrendo verso il basso.\nFai scorrere di nuovo verso il basso per visualizzare i controlli del sistema."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"La rete potrebbe essere monitorata"</string>
     <string name="done_button" msgid="1759387181766603361">"Fine"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Monitoraggio rete"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 6b87d92..3b5080e 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"תצוגת Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"בהירות"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"אוטומטי"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"הודעות מופיעות כאן"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"גש אליהם בכל עת על ידי החלקה למטה.\nהחלק למטה שוב למעבר למרכז הבקרה של המערכת."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ייתכן שהרשת מנוטרת"</string>
     <string name="done_button" msgid="1759387181766603361">"בוצע"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"ניטור רשתות"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 1c0093c..f42dd16 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"ワイヤレスディスプレイ"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"画面の明るさ"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"ここに通知が表示されます"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"下にスワイプすると、いつでも通知を表示できます。\nシステムを管理するにはもう一度下にスワイプしてください。"</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ネットワークが監視される場合があります"</string>
     <string name="done_button" msgid="1759387181766603361">"完了"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"ネットワーク監視"</string>
diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml
index 2349c32..b9963d5 100644
--- a/packages/SystemUI/res/values-ka-rGE/strings.xml
+++ b/packages/SystemUI/res/values-ka-rGE/strings.xml
@@ -42,7 +42,7 @@
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"თვითმფრინავის რეჟიმი"</string>
     <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ავტოროტაციის ეკრანი"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"დადუმება"</string>
-    <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ავტომატური"</string>
+    <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ავტო."</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"შეტყობინებები"</string>
     <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth მიერთებულია."</string>
     <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"შეყვანის მეთოდების დაყენება"</string>
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"უსადენო ეკრანი"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"განათება"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ავტომატურად"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"შეტყობინებები აქ გამოჩნდება"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"მათზე წვდომისათვის, ნებისმიერ დროს გადაფურცლეთ ქვემოთ.\nსისტემის კონტროლისთვისაც გადაფურცლეთ ქვემოთ."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"შესაძლოა ქსელი მონიტორინგის ქვეშ იმყოფება"</string>
     <string name="done_button" msgid="1759387181766603361">"დასრულდა"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"ქსელის მონიტორინგი"</string>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index 8fb09ad..211c286 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"​បង្ហាញ​បណ្ដាញ​ឥត​ខ្សែ"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ពន្លឺ"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ស្វ័យប្រវត្តិ"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"ការ​ជូន​ដំណឹង​​បង្ហាញ​​នៅ​ទីនេះ"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"ចូល​ដំណើរការ​ពួក​វា​ពេល​ណា​មួយ​ដោយ​អូស​ចុះក្រោម។\nអូស​ចុះក្រោម​ម្ដង​ទៀត​ ដើម្បី​ពិនិត្យ​ប្រព័ន្ធ។"</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"បណ្ដាញ​អាច​ត្រូវ​បាន​តាមដាន"</string>
     <string name="done_button" msgid="1759387181766603361">"រួចរាល់"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"ការ​ពិនិត្យ​បណ្ដាញ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 5472235..3b37888 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"무선 디스플레이"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"밝기"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"자동"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"알림이 여기에 표시됨"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"아래로 스와이프하여 언제든 액세스하세요.\n한 번 더 아래로 스와이프하면 시스템 관리로 이동합니다."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"네트워크가 모니터링될 수 있음"</string>
     <string name="done_button" msgid="1759387181766603361">"완료"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"네트워크 모니터링"</string>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index e17396f..968fee4 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"ການສະແດງຜົນໄຮ້ສາຍ"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ຄວາມແຈ້ງ"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ອັດຕະໂນມັດ"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"ການແຈ້ງເຕືອນຈະປາກົດບ່ອນນີ້"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"ເຂົ້າເຖິງໄດ້ທຸກເມື່ອໂດຍການປັດນິ້ວລົງ.\nປັດລົງອີກເທື່ອນຶ່ງສຳລັບການຄວບຄຸມລະບົບ."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ການນຳໃຊ້ເຄືອຂ່າຍອາດມີການກວດສອບຕິດຕາມ"</string>
     <string name="done_button" msgid="1759387181766603361">"ແລ້ວໆ"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"ການກວດສອບຕິດຕາມເຄືອຂ່າຍ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index ddafcb3..b0693d5 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Belaidis rodymas"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Skaistis"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATINIS"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Pranešimai rodomi čia"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Perbraukę žemyn bet kuriuo metu pasieksite pranešimus.\nJei norite naudoti sistemos valdiklius, perbraukite žemyn dar kartą."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Tinklas gali būti stebimas"</string>
     <string name="done_button" msgid="1759387181766603361">"Atlikta"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Tinklo stebėjimas"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 0a04619..b18bd6c 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Bezvadu attēlošana"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Spilgtums"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMĀTISKI"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Šeit tiek rādīti paziņojumi"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Piekļūstiet tiem jebkurā laikā, velkot uz leju.\nVēlreiz velciet, lai tiktu parādītas sistēmas vadīklas."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Iespējams, tīklā veiktās darbības tiek pārraudzītas."</string>
     <string name="done_button" msgid="1759387181766603361">"Gatavs"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Tīkla pārraudzība"</string>
diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..e5d2af3
--- /dev/null
+++ b/packages/SystemUI/res/values-mn-rMN/strings.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * 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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="7164937344850004466">"Систем UI"</string>
+    <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Цэвэрлэх"</string>
+    <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Жагсаалтаас устгах"</string>
+    <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Апп мэдээлэл"</string>
+    <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"Сүүлийн апп хоосон"</string>
+    <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Сүүлийн апп-уудыг хаах"</string>
+  <plurals name="status_bar_accessibility_recent_apps">
+    <item quantity="one" msgid="5854176083865845541">"1 сүүлийн апп"</item>
+    <item quantity="other" msgid="1040784359794890744">"%d сүүлийн апп"</item>
+  </plurals>
+    <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>
+    <string name="battery_low_title" msgid="2783104807551211639">"Цэнэглэгчийг холбоно уу"</string>
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Батерей дуусаж байна."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> үлдсэн"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"USB цэнэглэлт дэмжигдэхгүй байна.\nЗөвхөн нийлүүлэгдсэн цэнэглэгчийг ашиглана уу."</string>
+    <string name="battery_low_why" msgid="7279169609518386372">"Батерей ашиглах"</string>
+    <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Тохиргоо"</string>
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+    <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Нислэгийн горим"</string>
+    <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Дэлгэцийг автоматаар эргүүлэх"</string>
+    <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ХААХ"</string>
+    <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"АВТОМАТ"</string>
+    <string name="status_bar_settings_notifications" msgid="397146176280905137">"Мэдэгдэл"</string>
+    <string name="bluetooth_tethered" msgid="7094101612161133267">"Блютүүтыг модем болгож байна"</string>
+    <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Оруулах аргыг тохируулах"</string>
+    <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Бодит гар"</string>
+    <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g> апп-г USB төхөөрөмжид хандахыг зөвшөөрөх үү?"</string>
+    <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> апп-г USB төхөөрөмжид хандахыг зөвшөөрөх үү?"</string>
+    <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Энэ USB төхөөрөмж холбогдох үед <xliff:g id="ACTIVITY">%1$s</xliff:g>-г нээх үү?"</string>
+    <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Энэ USB төхөөрөмж холбогдох үед <xliff:g id="ACTIVITY">%1$s</xliff:g>-г нээх үү?"</string>
+    <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Энэ USB хэрэгсэл дээр суулгасан апп ажиллаагүй байна. Энэ хэрэгслийн талаар <xliff:g id="URL">%1$s</xliff:g>-с дэлгэрэнгүй үзнэ үү."</string>
+    <string name="title_usb_accessory" msgid="4966265263465181372">"USB төхөөрөмж"</string>
+    <string name="label_view" msgid="6304565553218192990">"Үзэх"</string>
+    <string name="always_use_device" msgid="1450287437017315906">"Энэ USB төхөөрөмжийг үндсэн болгон ашиглах"</string>
+    <string name="always_use_accessory" msgid="1210954576979621596">"Энэ USB төхөөрөмжийг үндсэн болгон ашиглах"</string>
+    <string name="usb_debugging_title" msgid="4513918393387141949">"USB дебаг хийхийг зөвшөөрөх үү?"</string>
+    <string name="usb_debugging_message" msgid="2220143855912376496">"Компьютерийн RSA түлхүүрийн хурууны хээ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+    <string name="usb_debugging_always" msgid="303335496705863070">"Энэ компьютерээс орохыг байнга зөвшөөрөх"</string>
+    <string name="compat_mode_on" msgid="6623839244840638213">"Дэлгэц дүүргэх бол өсгөнө үү"</string>
+    <string name="compat_mode_off" msgid="4434467572461327898">"Дэлгэц дүүргэх бол татна уу"</string>
+    <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Дэлгэцийн агшинг хадгалж байна…"</string>
+    <string name="screenshot_saving_title" msgid="8242282144535555697">"Дэлгэцийн агшинг хадгалж байна…"</string>
+    <string name="screenshot_saving_text" msgid="2419718443411738818">"Дэлгэцийн агшин хадгалагдав."</string>
+    <string name="screenshot_saved_title" msgid="6461865960961414961">"Дэлгэцийн агшинг авсан."</string>
+    <string name="screenshot_saved_text" msgid="1152839647677558815">"Дэлгэцийн агшныг харах бол хүрнэ үү."</string>
+    <string name="screenshot_failed_title" msgid="705781116746922771">"Дэлгэцийн агшинг авч чадсангүй."</string>
+    <string name="screenshot_failed_text" msgid="8134011269572415402">"Дэлгэцийн агшинг хадгалж чадсангүй. Сан ашиглагдаж байгаа бололтой."</string>
+    <string name="usb_preference_title" msgid="6551050377388882787">"USB файл шилжүүлэх сонголт"</string>
+    <string name="use_mtp_button_title" msgid="4333504413563023626">"Медиа тоглуулагч(MTP) болгон залгах"</string>
+    <string name="use_ptp_button_title" msgid="7517127540301625751">"Камер болгон(PTP) залгах"</string>
+    <string name="installer_cd_button_title" msgid="2312667578562201583">"Мас-д зориулсан  Андройд Файл Шилжүүлэх апп-г суулгана уу"</string>
+    <string name="accessibility_back" msgid="567011538994429120">"Буцах"</string>
+    <string name="accessibility_home" msgid="8217216074895377641">"Гэрийн"</string>
+    <string name="accessibility_menu" msgid="316839303324695949">"Цэс"</string>
+    <string name="accessibility_recent" msgid="8571350598987952883">"Сүүлийн апп"</string>
+    <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Оруулах аргыг сэлгэх товч."</string>
+    <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Тохиромжтой өсгөх товч."</string>
+    <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Жижгээс том дэлгэцрүү өсгөх."</string>
+    <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Блютүүт холбогдсон."</string>
+    <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Блютүүт тасрав."</string>
+    <string name="accessibility_no_battery" msgid="358343022352820946">"Батерей байхгүй."</string>
+    <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"Батерей нэг баганатай."</string>
+    <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"Батерей хоёр баганатай."</string>
+    <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"Батерей гурван баганатай."</string>
+    <string name="accessibility_battery_full" msgid="8909122401720158582">"Батерей дүүрэн."</string>
+    <string name="accessibility_no_phone" msgid="4894708937052611281">"Утас байхгүй."</string>
+    <string name="accessibility_phone_one_bar" msgid="687699278132664115">"Утас нэг баганатай."</string>
+    <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"Утас хоёр баганатай."</string>
+    <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"Утас гурван баганатай."</string>
+    <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"Утасны дохио дүүрэн."</string>
+    <string name="accessibility_no_data" msgid="4791966295096867555">"Дата байхгүй."</string>
+    <string name="accessibility_data_one_bar" msgid="1415625833238273628">"Дата нэг баганатай."</string>
+    <string name="accessibility_data_two_bars" msgid="6166018492360432091">"Дата хоёр баганатай."</string>
+    <string name="accessibility_data_three_bars" msgid="9167670452395038520">"Дата гурван баганатай."</string>
+    <string name="accessibility_data_signal_full" msgid="2708384608124519369">"Дата дохио дүүрэн."</string>
+    <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi унтарсан."</string>
+    <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi салав."</string>
+    <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi нэг баганатай."</string>
+    <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi хоёр баганатай."</string>
+    <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi гурван баганатай."</string>
+    <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi дохио дүүрэн."</string>
+    <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX байхгүй."</string>
+    <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAX нэг багана."</string>
+    <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX хоёр баганатай."</string>
+    <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX гурван баганатай."</string>
+    <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX дохио дүүрэн."</string>
+    <string name="accessibility_no_signal" msgid="7064645320782585167">"Дохио байхгүй."</string>
+    <string name="accessibility_not_connected" msgid="6395326276213402883">"Холбогдоогүй."</string>
+    <string name="accessibility_zero_bars" msgid="3806060224467027887">"Тэг баганатай."</string>
+    <string name="accessibility_one_bar" msgid="1685730113192081895">"Нэг баганатай."</string>
+    <string name="accessibility_two_bars" msgid="6437363648385206679">"Хоёр багана."</string>
+    <string name="accessibility_three_bars" msgid="2648241415119396648">"Гурван баганатай."</string>
+    <string name="accessibility_signal_full" msgid="9122922886519676839">"Дохио дүүрэн."</string>
+    <string name="accessibility_desc_on" msgid="2385254693624345265">"Идэвхижсэн."</string>
+    <string name="accessibility_desc_off" msgid="6475508157786853157">"Унтраах"</string>
+    <string name="accessibility_desc_connected" msgid="8366256693719499665">"Холбогдсон."</string>
+    <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+    <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+    <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+    <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+    <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+    <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+    <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+    <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+    <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Рүүминг"</string>
+    <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+    <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+    <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM байхгүй."</string>
+    <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Блютүүт модем болж байна."</string>
+    <string name="accessibility_airplane_mode" msgid="834748999790763092">"Нислэгийн горим"</string>
+    <string name="accessibility_battery_level" msgid="7451474187113371965">"Батерей <xliff:g id="NUMBER">%d</xliff:g> хувьтай."</string>
+    <string name="accessibility_settings_button" msgid="799583911231893380">"Системийн тохиргоо."</string>
+    <string name="accessibility_notifications_button" msgid="4498000369779421892">"Мэдэгдэл."</string>
+    <string name="accessibility_remove_notification" msgid="3603099514902182350">"Мэдэгдлийг цэвэрлэх."</string>
+    <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS идэвхтэй."</string>
+    <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS хайж байна."</string>
+    <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter идэвхтэй болов."</string>
+    <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Хонхны чичиргээ."</string>
+    <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Хонхыг хаах."</string>
+    <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> байхгүй."</string>
+    <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Мэдэгдэл хаагдсан."</string>
+    <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Мэдэгдлийн хураангуй самбар"</string>
+    <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Шуурхай тохиргоо."</string>
+    <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Сүүлийн апп"</string>
+    <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Хэрэглэгч <xliff:g id="USER">%s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string>
+    <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Мобайл <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Батерей <xliff:g id="STATE">%s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Нислэгийн горим <xliff:g id="STATE">%s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"Блютүүт <xliff:g id="STATE">%s</xliff:g>."</string>
+    <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Сэрүүлгийг <xliff:g id="TIME">%s</xliff:g>-д тохируулсан."</string>
+    <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G дата идэвхгүй болов"</string>
+    <string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G дата идэвхгүй байна"</string>
+    <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Мобайл дата идэвхгүй болов"</string>
+    <string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Дата идэвхгүй болов"</string>
+    <string name="data_usage_disabled_dialog" msgid="3853117269051806280">"Та заасан дата ашиглалтын хязгаарт хүрэв.\n\nХэрэв та датаг дахин идэвхжүүлбэл операторт төлбөр төлөх хэрэгтэй."</string>
+    <string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Дата дахин идэвхжүүлэх"</string>
+    <string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Интернет холболт байхгүй"</string>
+    <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi холбогдсон"</string>
+    <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS хайж байна"</string>
+    <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS байршил"</string>
+    <string name="accessibility_location_active" msgid="2427290146138169014">"Байршлын хүсэлтүүд идэвхтэй"</string>
+    <string name="accessibility_clear_all" msgid="5235938559247164925">"Бүх мэдэгдлийг цэвэрлэх."</string>
+    <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Апп мэдээлэл"</string>
+    <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Дэлгэц автоматаар эргэнэ."</string>
+    <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Дэлгэц хэвтээ чиглэлд түгжигдсэн."</string>
+    <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Дэлгэц босоо чиглэлээр түгжигдсэн."</string>
+    <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
+    <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string>
+    <string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string>
+    <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Нислэгийн горим"</string>
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Цэнэглэж байна, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Цэнэглэгдсэн"</string>
+    <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Блютүүт"</string>
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Блютүүт (<xliff:g id="NUMBER">%d</xliff:g> төхөөрөмж)"</string>
+    <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Блютүүт унтраалттай"</string>
+    <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Тодрол"</string>
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Автомат эргэх"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Эргүүлэлт түгжигдсэн"</string>
+    <string name="quick_settings_ime_label" msgid="7073463064369468429">"Оруулах арга"</string>
+    <string name="quick_settings_location_label" msgid="5011327048748762257">"Байршил"</string>
+    <string name="quick_settings_location_off_label" msgid="7464544086507331459">"Байршил идэвхгүй"</string>
+    <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Медиа төхөөрөмж"</string>
+    <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+    <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"Зөвхөн яаралтай дуудлага"</string>
+    <string name="quick_settings_settings_label" msgid="5326556592578065401">"Тохиргоо"</string>
+    <string name="quick_settings_time_label" msgid="4635969182239736408">"Цаг"</string>
+    <string name="quick_settings_user_label" msgid="5238995632130897840">"Би"</string>
+    <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+    <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Холбогдоогүй"</string>
+    <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Сүлжээгүй"</string>
+    <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi унтарсан"</string>
+    <string name="quick_settings_wifi_display_label" msgid="6893592964463624333">"Wi-Fi Дэлгэц"</string>
+    <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Утасгүй дэлгэц"</string>
+    <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Тодрол"</string>
+    <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АВТОМАТ"</string>
+    <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Сүлжээ хянагдаж байж болзошгүй"</string>
+    <string name="done_button" msgid="1759387181766603361">"Дууссан"</string>
+    <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Сүлжээний Хяналт"</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Энэ төхөөрөмжийг удирдагч: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nТаны админ имэйл, апп-ууд болон аюулгүй вебсайтуудыг оруулан таны сүлжээний үйл ажиллагааг хянах боломжтой.\n\nДэлгэрэнгүй мэдээллийг өөрийн админтай холбогдож авна уу."</string>
+    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"Гуравдагч талын этгээд таны сүлжээг хянаж байж болзошгүй\nүүнд имэйл, апп-ууд болон аюулгүй вебсайтууд багтана.\n\nТаны төхөөрөмж дээр суулгасан итгэмжлэгдсэн жуух энэ боломжоор хангаж байна."</string>
+    <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"Итгэмжлэгдсэн жуухуудыг шалгах"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
index cc99846..40468f5 100644
--- a/packages/SystemUI/res/values-ms-rMY/strings.xml
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -197,9 +197,7 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Paparan Wayarles"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Kecerahan"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Pemberitahuan dipaparkan di sini"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Akses panel pada bila-bila masa dengan meleret ke bawah.\nLeret ke bawah sekali lagi untuk mendapatkan kawalan sistem."</string>
-    <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Rangkaian boleh dipantau"</string>
+    <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Rangkaian mungkin dipantau"</string>
     <string name="done_button" msgid="1759387181766603361">"Selesai"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Pemantauan Rangkaian"</string>
     <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Peranti ini diuruskan oleh: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nPentadbir anda boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web selamat.\n\nUntuk maklumat lanjut, hubungi pentadbir anda."</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 6da69fb..cd463c8 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Trådløs skjerm"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Lysstyrke"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Varslene vises her"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Bruk dem når som helst ved å sveipe nedover.\nSveip nedover igjen for å gå til systemkontrollene."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Nettverket blir muligens overvåket"</string>
     <string name="done_button" msgid="1759387181766603361">"Fullført"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Nettverksovervåking"</string>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index 18dc0f9..19e2744 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -171,7 +171,7 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="7219575858348719790">"दिवासपना"</string>
     <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
-    <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"उडान मोड"</string>
+    <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"हवाइजहाज मोड"</string>
     <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"चार्ज हुँदै, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"चार्ज भयो"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ब्लुटुथ"</string>
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"ताररहित प्रदर्शन"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"उज्यालपन"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"स्वतः"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"यहाँ जानकारीहरू देखा पर्छन्"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"तल हुत्त्याएर तिनीहरूलाई सधैं पहुँच गर्नुहोस्\nप्रणाली नियन्त्रणको लागि पुनः तल हुत्त्याउनुहोस्"</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"सञ्जाल अनुगमित हुन सक्छ"</string>
     <string name="done_button" msgid="1759387181766603361">"भयो"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"सञ्जाल निगरानी"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 7e0d87a..0996392 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Draadloze display"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helderheid"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATISCH"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Meldingen worden hier weergegeven"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"U kunt de meldingen op elk gewenst moment openen door met uw vinger omlaag te vegen.\nVeeg nogmaals met uw vinger omlaag om de systeembesturingselementen weer te geven."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Netwerk kan worden gecontroleerd"</string>
     <string name="done_button" msgid="1759387181766603361">"Gereed"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Netwerkcontrole"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 9bcfb10..c3476e5 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wyświetlacz bezprzewodowy"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jasność"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATYCZNA"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Tutaj pokazują się powiadomienia"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Możesz je otworzyć w dowolnej chwili, przesuwając w dół.\nPrzesuń jeszcze raz w dół, by otworzyć ustawienia systemowe."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Sieć może być monitorowana"</string>
     <string name="done_button" msgid="1759387181766603361">"Gotowe"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Monitorowanie sieci"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 735733f..dac070f 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Display Sem Fios"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brilho"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÁTICO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"As notificações são apresentadas aqui"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Pode aceder em qualquer altura, deslizando rapidamente para baixo com o dedo.\nDeslize novamente para baixo para aceder aos controlos do sistema."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"A rede pode ser monitorizada"</string>
     <string name="done_button" msgid="1759387181766603361">"Concluído"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Monitorização da Rede"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 1dbf90e..711956e 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Display sem fio"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brilho"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"As notificações aparecem aqui"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Acesse a qualquer momento deslizando para baixo.\nDeslize para baixo novamente para acessar os controles do sistema."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"A rede pode ser monitorada"</string>
     <string name="done_button" msgid="1759387181766603361">"Concluído"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Monitoramento de rede"</string>
diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml
index 54ae2da..0a5689c 100644
--- a/packages/SystemUI/res/values-rm/strings.xml
+++ b/packages/SystemUI/res/values-rm/strings.xml
@@ -364,10 +364,6 @@
     <skip />
     <!-- no translation found for quick_settings_brightness_dialog_auto_brightness_label (5064982743784071218) -->
     <skip />
-    <!-- no translation found for status_bar_help_title (1199237744086469217) -->
-    <skip />
-    <!-- no translation found for status_bar_help_text (7874607155052076323) -->
-    <skip />
     <!-- no translation found for ssl_ca_cert_warning (5848402127455021714) -->
     <skip />
     <!-- no translation found for done_button (1759387181766603361) -->
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 5def87a..0b93f57 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -197,12 +197,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Ecran wireless"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminozitate"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMAT"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Notificările se afişează aici"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Accesaţi-le oricând glisând în jos.\nGlisaţi în jos din nou pentru comenzile sistemului."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Rețeaua poate fi monitorizată"</string>
     <string name="done_button" msgid="1759387181766603361">"Terminat"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Monitorizarea rețelei"</string>
-    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Acest dispozitiv este gestionat de: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nAdministratorul este capabil să monitorizeze activitatea dvs. în rețea, inclusiv mesajele e-mail, aplicațiile și site-urile sigure.\n\nPentru mai multe informații, contactați administratorul."</string>
-    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"O parte terță poate monitoriza activitatea dvs. în\nrețea, inclusiv mesajele e-mail, aplicațiile și site-urile sigure.\n\nAcest lucru este posibil deoarece există o acreditare de încredere instalată pe dispozitivul dvs."</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"Acest dispozitiv este gestionat de: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nAdministratorul este capabil să monitorizeze activitatea dvs. în rețea, inclusiv mesajele e-mail, aplicațiile și site-urile securizate.\n\nPentru mai multe informații, contactați administratorul."</string>
+    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"O terță parte poate monitoriza activitatea dvs. în\nrețea, inclusiv mesajele e-mail, aplicațiile și site-urile securizate.\n\nAcest lucru este posibil deoarece există o acreditare de încredere instalată pe dispozitivul dvs."</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"Verificați acreditările de încredere"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 215467a..520ffb4 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -201,8 +201,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wi-Fi-монитор"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яркость"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АВТОНАСТРОЙКА"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Это панель уведомлений"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Ее можно открыть, пролистнув экран вниз.\nЧтобы открыть настройки, проведите пальцем вниз ещё раз."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Действия в сети могут отслеживаться"</string>
     <string name="done_button" msgid="1759387181766603361">"Готово"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Мониторинг сети"</string>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
index 9aa0600..24accd1 100644
--- a/packages/SystemUI/res/values-si-rLK/strings.xml
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -197,12 +197,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"නොරැහැන් සංදර්ශකය"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"දීප්තිමත් බව"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ස්වයංක්‍රීය"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"දැනුම්දීම් මෙතන පෙන්නුම් කරයි"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"පහලට සර්පණය කිරීමෙන් ඕනෑම වෙලාවක ඒවා වෙත පිවිසෙන්න.\nපද්ධති පාලක සඳහා නැවත පහළට සර්පණය කරන්න."</string>
-    <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ජාලය අධීක්ෂණයවනවා විය හැක"</string>
+    <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ඇතැම් විට ජාලය නිරීක්ෂණය විය හැක"</string>
     <string name="done_button" msgid="1759387181766603361">"හරි"</string>
-    <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"ජාල අධීක්ෂණය"</string>
-    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"මෙම උපාංගය කළමනාකරණය කරනුයේ: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nඔබගේ පරිපාලකයා ඊ-තැපැල්, යෙදුම්, සහ ආරක්‍ෂිත වෙබ් අඩවි ඇතුළුව ඔබගේ ජාල ක්‍රියාකාරකම් අධීක්ෂණය කිරීමට හැකියාව ඇත.\n\nවැඩි විස්තර සඳහා, ඔබේ පරිපාලකයා සම්බන්ධ කරගන්න."</string>
-    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"තුන්වන පාර්ශවයකට ඔබගේ ජාලය අධීක්ෂණය කිරීමට හැකියාව ඇත\nක්‍රියාකාරකම්, ඊ-තැපැල්, යෙදුම් සහ ආරක්‍ෂිත වෙබ් අඩවි ඇතුළුව.\n\nඔබගේ උපාංගය මත ස්ථාපිත විශ්වාසදයී අක්තපත්‍ර මෙය සිදුවීමේ හැකියාව ඇතිකරයි."</string>
+    <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"ජාල නිරීක්ෂණය කිරීම"</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"මෙම උපාංගය කළමනාකරණය කරනුයේ: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>.\n\nඔබගේ පරිපාලකයා ඊ-තැපැල්, යෙදුම්, සහ ආරක්‍ෂිත වෙබ් අඩවි ඇතුළුව ඔබගේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කිරීමට හැකියාව ඇත.\n\nවැඩි විස්තර සඳහා, ඔබේ පරිපාලකයා සම්බන්ධ කරගන්න."</string>
+    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"තුන්වන පාර්ශවයකට ඔබගේ ජාලය නිරීක්ෂණය කිරීමට හැකියාව ඇත\nක්‍රියාකාරකම්, ඊ-තැපැල්, යෙදුම් සහ ආරක්‍ෂිත වෙබ් අඩවි ඇතුළුව.\n\nඔබගේ උපාංගය මත ස්ථාපිත විශ්වාසදයී අක්තපත්‍ර මෙය සිදුවීමේ හැකියාව ඇතිකරයි."</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"විශ්වාසදායී අක්තපත්‍ර පරික්ෂා කරන්න"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index c708bce..d036f0e 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Bezdrôtový displej"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jas"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATICKY"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Tu sa zobrazujú upozornenia"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Môžete ich kedykoľvek zobraziť tak, že posuniete prstom nadol.\nAk posuniete prstom nadol ešte raz, zobrazia sa ovládacie prvky systému."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Sieť môže byť monitorovaná"</string>
     <string name="done_button" msgid="1759387181766603361">"Hotovo"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Monitorovanie siete"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index b19e6e0..e0b215a 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Prikaz brezžičnih naprav"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Svetlost"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"SAMODEJNO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Obvestila so prikazana tukaj"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Do njih lahko kadar koli dostopate tako, da povlečete navzdol.\nZa prikaz sistemskih kontrolnikov znova povlecite navzdol."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Omrežje je lahko nadzorovano"</string>
     <string name="done_button" msgid="1759387181766603361">"Dokončano"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Nadzor omrežja"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 216dc0a..84d72df 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Бежични екран"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Осветљеност"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АУТОМАТСКА"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Обавештења се појављују овде"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Приступите им у било ком тренутку листањем надоле.\nПоново листајте надоле да би се приказале системске контроле."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Мрежа се можда надгледа"</string>
     <string name="done_button" msgid="1759387181766603361">"Готово"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Надгледање мреже"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 3b488a3..d27c9e4 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Trådlös skärm"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Ljusstyrka"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Meddelanden visas här"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Du kommer åt dem när som helst genom att dra nedåt.\nDra nedåt igen om du vill visa systemkontroller."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Nätverket kan vara övervakat"</string>
     <string name="done_button" msgid="1759387181766603361">"Klart"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Nätverksövervakning"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 3f2ac75..d3ac4c2 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -128,7 +128,7 @@
     <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
     <string name="accessibility_no_sim" msgid="8274017118472455155">"Hakuna SIM."</string>
     <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Shiriki intaneti kwa Bluetooth."</string>
-    <string name="accessibility_airplane_mode" msgid="834748999790763092">"Modi ya ndege."</string>
+    <string name="accessibility_airplane_mode" msgid="834748999790763092">"Hali ya ndege."</string>
     <string name="accessibility_battery_level" msgid="7451474187113371965">"Asilimia <xliff:g id="NUMBER">%d</xliff:g> ya betri"</string>
     <string name="accessibility_settings_button" msgid="799583911231893380">"Mipangilio ya mfumo."</string>
     <string name="accessibility_notifications_button" msgid="4498000369779421892">"Arifa."</string>
@@ -169,7 +169,7 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="7219575858348719790">"Hali Tulivu"</string>
     <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
-    <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modi ya ndege"</string>
+    <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Hali ya ndege"</string>
     <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Inachaji, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Imechajiwa"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
@@ -195,8 +195,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Uonyeshaji Pasiwaya"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Ung\'avu"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"KIOTOMATIKI"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Arifa zitaonekana hapa"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Zifikie wakati wowote kwa kutelezesha chini.\nTelezesha chini tena kupata vidhibiti vya mfumo."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Mtandao unaweza kufuatiliwa"</string>
     <string name="done_button" msgid="1759387181766603361">"Imekamilika"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Ufuatiliaji wa Mtandao"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index b1f9aa6..2eb8896 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -197,12 +197,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"จอแสดงผลไร้สาย"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ความสว่าง"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"อัตโนมัติ"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"การแจ้งเตือนจะแสดงขึ้นที่นี่"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"เข้าถึงได้ทุกเมื่อด้วยการกวาดนิ้วลง\nกวาดนิ้วลงอีกครั้งสำหรับการควบคุมระบบ"</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"เครือข่ายอาจได้รับการตรวจสอบ"</string>
     <string name="done_button" msgid="1759387181766603361">"เสร็จสิ้น"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"การตรวจสอบเครือข่าย"</string>
-    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"อุปกรณ์นี้ไดรับการจัดการโดย: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>\n\nผู้ดูแลระบบของคุณสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ ซึ่งรวมถึงอีเมล แอป และเว็บไซต์ที่มีการรักษาความปลอดภัย\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบของคุณ"</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"อุปกรณ์นี้ได้รับการจัดการโดย: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>\n\nผู้ดูแลระบบของคุณสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ ซึ่งรวมถึงอีเมล แอป และเว็บไซต์ที่มีการรักษาความปลอดภัย\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบของคุณ"</string>
     <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"บุคคลที่สามสามารถตรวจสอบกิจกรรมในเครือข่าย\nของคุณ ซึ่งรวมถึงอีเมล แอป และเว็บไซต์ที่มีการรักษาความปลอดภัย\n\nการดำเนินการนี้เกิดขึ้นได้ด้วยข้อมูลรับรองที่เชื่อถือได้ที่ติดตั้งอยู่ในอุปกรณ์ของคุณ"</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"ตรวจสอบข้อมูลรับรองที่เชื่อถือได้"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 99a4815..69b5aff 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Wireless Display"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brightness"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Dito lumalabas ang mga notification"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"I-access ang mga ito anumang oras sa pamamagitan ng pag-swipe pababa.\nMuling mag-swipe pababa para sa mga kontrol ng system."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Maaaring sinusubaybayan ang network"</string>
     <string name="done_button" msgid="1759387181766603361">"Tapos na"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Pagsubaybay sa Network"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 9ac21e9..67e2be2 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Kablosuz Ekran"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Parlaklık"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OTOMATİK"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Bildirimler burada görünür"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Aşağıya hızlıca kaydırarak bunlara istediğiniz zaman erişebilirsiniz.\nSistem denetimleri için tekrar hızlıca aşağı kaydırın."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Ağ izlenebilir"</string>
     <string name="done_button" msgid="1759387181766603361">"Bitti"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Ağ İzleme"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 6fb2b14..527525e 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Бездротове відображення"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яскравість"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АВТО"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Сповіщення з’являються тут"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Отримуйте до них доступ будь-коли, провівши пальцем униз.\nЗнову проведіть униз, щоб відкрити елементи керування системи."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Мережу можуть відстежувати"</string>
     <string name="done_button" msgid="1759387181766603361">"Готово"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Відстеження мережі"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 54897bb..4be1bf0 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Hiển thị không dây"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Độ sáng"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"TỰ ĐỘNG"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Thông báo xuất hiện tại đây"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Truy cập vào chúng bất kỳ lúc nào bằng cách vuốt xuống.\nVuốt lại xuống để hiển thị các điều khiển hệ thống."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Mạng có thể được giám sát"</string>
     <string name="done_button" msgid="1759387181766603361">"Xong"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Giám sát mạng"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 5c48b3e..1093d0c 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -199,12 +199,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"无线显示"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自动"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"通知会显示在这里"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"向下滑动可随时查看通知。\n再次向下滑动可使用系统控制功能。"</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"网络可能会受到监控"</string>
     <string name="done_button" msgid="1759387181766603361">"完成"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"网络监控"</string>
-    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"此设备由以下域管理:<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>。\n\n您的管理员可以监控您的网络活动,包括收发电子邮件、使用应用和浏览安全网站。\n\n有关详情,请与您的管理员联系。"</string>
+    <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"此设备由以下企业域管理:<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>。\n\n您的管理员可以监控您的网络活动,包括收发电子邮件、使用应用和浏览安全网站。\n\n如要了解详情,请与您的管理员联系。"</string>
     <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"第三方可以监控您的网络活动,包括\n收发电子邮件、使用应用和浏览安全网站。\n\n如果您在设备上安装受信任的凭据,就可能出现这种情况。"</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"查看受信任的凭据"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 9f8be31..daef9d2 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -199,12 +199,10 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"無線顯示"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"通知會在這裡顯示"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"向下快速滑動可隨時存取通知。\n再次向下快速滑動則可使用系統控制介面。"</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"網絡可能會受到監控"</string>
     <string name="done_button" msgid="1759387181766603361">"完成"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"網絡監控"</string>
     <string name="ssl_ca_cert_info_message" msgid="5430320539555358452">"這部裝置由下列網域管理:<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>。\n\n您的管理員可以監控您的網絡活動,包括收發電郵、使用應用程式及瀏覽安全網站。\n\n詳情請與您的管理員聯絡。"</string>
-    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"第三方可以監控您的網絡活動,\n包括收發電郵、使用應用程式及瀏覽安全網站。\n\n必須在您的裝置上安裝信任的憑證。"</string>
+    <string name="ssl_ca_cert_warning_message" msgid="2033091656129963669">"第三方可以監察您的網絡活動,\n包括收發電郵、使用應用程式及瀏覽安全網站。\n\n當裝置安裝了信任的憑證,便可能會出現這種情況。"</string>
     <string name="ssl_ca_cert_settings_button" msgid="7946956977377166709">"檢查信任的憑證"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index e10c6d8..73871c6 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -199,8 +199,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"無線螢幕分享"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"系統會在這裡顯示通知"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"向下滑動即可隨時存取通知。\n再次向下滑動即可使用系統控制項。"</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"網路可能會受到監控"</string>
     <string name="done_button" msgid="1759387181766603361">"完成"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"網路監控"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 296e65e..4dfad2f 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -197,8 +197,6 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="2355298740765736918">"Ukubonisa okungenazintambo"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Ukugqama"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OKUZENZAKALELAYO"</string>
-    <string name="status_bar_help_title" msgid="1199237744086469217">"Izaziso zivela lapha"</string>
-    <string name="status_bar_help_text" msgid="7874607155052076323">"Kufinyelele noma kunini ngokuswayiphela phansi.\nSwayiphela phansi futhi ngezilawuli zesistimu."</string>
     <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Inethiwekhi ingase inganyelwe"</string>
     <string name="done_button" msgid="1759387181766603361">"Kwenziwe"</string>
     <string name="ssl_ca_cert_dialog_title" msgid="1273796967092027291">"Ukwenganyelwa kwenethiwekhi"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 8fceaeb..f58872a 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -35,7 +35,7 @@
     <drawable name="notification_header_bg">#FF000000</drawable>
     <color name="notification_panel_scrim_color">#B0000000</color>
 
-    <color name="batterymeter_frame_color">#FF404040</color>
-    <color name="batterymeter_charge_color">#FF797979</color>
+    <color name="batterymeter_frame_color">#33FFFFFF</color>
+    <color name="batterymeter_charge_color">#7FFFFFFF</color>
     <color name="status_bar_clock_color">#FFFFFFFF</color>
 </resources>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
deleted file mode 100644
index d876a95..0000000
--- a/packages/SystemUI/res/values/ids.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2012 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.
--->
-
-<resources>
-    <item type="id" name="status_bar_cling_stub" />
-</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 8e88610..3ffa6f4 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -493,10 +493,6 @@
     <!-- QuickSettings: Brightness dialog auto brightness button [CHAR LIMIT=NONE] -->
     <string name="quick_settings_brightness_dialog_auto_brightness_label">AUTO</string>
 
-    <!-- Title of help text shown when the notification panel is pulled down for the very first time. [CHAR LIMIT=NONE] -->
-    <string name="status_bar_help_title">Notifications appear here</string>
-    <!-- Body of help text shown when the notification panel is pulled down for the very first time. [CHAR LIMIT=NONE] -->
-    <string name="status_bar_help_text">Access them anytime by swiping down.\nSwipe down again for system controls.</string>
 
     <!-- Glyph to be overlaid atop the battery when the level is extremely low. Do not translate. -->
     <string name="battery_meter_very_low_overlay_symbol">!</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index cd78041..134f228 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -159,33 +159,4 @@
         <item name="android:textSize">14dp</item>
     </style>
     
-    <style name="ClingButton">
-        <item name="android:layout_width">wrap_content</item>
-        <item name="android:layout_height">wrap_content</item>
-        <item name="android:paddingTop">10dp</item>
-        <item name="android:paddingBottom">15dp</item>
-        <item name="android:paddingLeft">35dp</item>
-        <item name="android:paddingRight">35dp</item>
-        <item name="android:textStyle">bold</item>
-        <item name="android:background">@drawable/cling_button_bg</item>
-    </style>
-    <style name="ClingTitleText">
-        <item name="android:layout_width">wrap_content</item>
-        <item name="android:layout_height">wrap_content</item>
-        <item name="android:layout_marginBottom">5dp</item>
-        <item name="android:textSize">23sp</item>
-        <item name="android:textColor">#49C0EC</item>
-        <item name="android:shadowColor">#000000</item>
-        <item name="android:shadowDy">2</item>
-        <item name="android:shadowRadius">2.0</item>
-    </style>
-    <style name="ClingText">
-        <item name="android:textSize">15sp</item>
-        <item name="android:textColor">#FFFFFF</item>
-        <item name="android:shadowColor">#000000</item>
-        <item name="android:shadowDy">2</item>
-        <item name="android:shadowRadius">2.0</item>
-        <item name="android:lineSpacingMultiplier">1.1</item>
-    </style>
-
 </resources>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 24f7d83..ff85cb4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -70,7 +70,6 @@
 import com.android.systemui.RecentsComponent;
 import com.android.systemui.SearchPanelView;
 import com.android.systemui.SystemUI;
-import com.android.systemui.statusbar.phone.BarTransitions;
 import com.android.systemui.statusbar.policy.NotificationRowLayout;
 
 import java.util.ArrayList;
@@ -828,7 +827,7 @@
         // Construct the icon.
         final StatusBarIconView iconView = new StatusBarIconView(mContext,
                 notification.getPackageName() + "/0x" + Integer.toHexString(notification.getId()),
-                notification.getNotification(), getStatusBarMode());
+                notification.getNotification());
         iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
 
         final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
@@ -851,10 +850,6 @@
         return entry;
     }
 
-    protected int getStatusBarMode() {
-        return BarTransitions.MODE_OPAQUE;
-    }
-
     protected void addNotificationViews(NotificationData.Entry entry) {
         // Add the expanded view and icon.
         int pos = mNotificationData.add(entry);
@@ -1102,11 +1097,7 @@
         return km.inKeyguardRestrictedInputMode();
     }
 
-    public void suspendAutohide() {
-        // hook for subclasses
-    }
-
-    public void resumeAutohide() {
+    public void setInteracting(boolean interacting) {
         // hook for subclasses
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
index 9648b11..eef4f44 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
@@ -86,9 +86,9 @@
         }
 
         if (action == MotionEvent.ACTION_DOWN) {
-            mBar.suspendAutohide();
+            mBar.setInteracting(true);
         } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
-            mBar.resumeAutohide();
+            mBar.setInteracting(false);
         }
 
         mDelegateView.getLocationOnScreen(mTempPoint);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 5689bfa..9f9524b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -16,11 +16,6 @@
 
 package com.android.systemui.statusbar;
 
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
-
-import android.animation.ObjectAnimator;
 import android.app.Notification;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -53,13 +48,10 @@
     private int mNumberY;
     private String mNumberText;
     private Notification mNotification;
-    private final float mAlphaWhenOpaque;
-    private final float mAlphaWhenTransparent = 1;
 
-    public StatusBarIconView(Context context, String slot, Notification notification, int mode) {
+    public StatusBarIconView(Context context, String slot, Notification notification) {
         super(context);
         final Resources res = context.getResources();
-        mAlphaWhenOpaque = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
         mSlot = slot;
         mNumberPain = new Paint();
         mNumberPain.setTextAlign(Paint.Align.CENTER);
@@ -76,7 +68,6 @@
             final float scale = (float)imageBounds / (float)outerBounds;
             setScaleX(scale);
             setScaleY(scale);
-            setAlpha(getAlphaFor(mode));
         }
 
         setScaleType(ImageView.ScaleType.CENTER);
@@ -85,22 +76,11 @@
     public StatusBarIconView(Context context, AttributeSet attrs) {
         super(context, attrs);
         final Resources res = context.getResources();
-        mAlphaWhenOpaque = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
         final int outerBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_size);
         final int imageBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size);
         final float scale = (float)imageBounds / (float)outerBounds;
         setScaleX(scale);
         setScaleY(scale);
-        setAlpha(getAlphaFor(MODE_OPAQUE));
-    }
-
-    public ObjectAnimator animateTransitionTo(int mode) {
-        return ObjectAnimator.ofFloat(this, "alpha", getAlpha(), getAlphaFor(mode));
-    }
-
-    public float getAlphaFor(int mode) {
-        final boolean isTransparent = mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT;
-        return isTransparent ? mAlphaWhenTransparent : mAlphaWhenOpaque;
     }
 
     private static boolean streq(String a, String b) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index 318ec51..6302244 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -64,17 +64,6 @@
         return mMode;
     }
 
-    public void setTransparent(Drawable transparent) {
-        mTransparent = transparent;
-        if (mMode == MODE_TRANSPARENT) {
-            transitionTo(MODE_TRANSPARENT);
-        }
-    }
-
-    public void transitionTo(int mode) {
-        transitionTo(mode, false);
-    }
-
     public void transitionTo(int mode, boolean animate) {
         if (mMode == mode) return;
         int oldMode = mMode;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 62f8596..850f94d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -112,9 +112,11 @@
     }
 
     private final class NavigationBarTransitions extends BarTransitions {
+        private static final boolean ENABLE_GRADIENT = false;  // until we can smooth transition
 
         private final Drawable mTransparentBottom;
         private final Drawable mTransparentRight;
+        private final int mTransparentColor;
 
         public NavigationBarTransitions(Context context) {
             super(context, NavigationBarView.this);
@@ -125,13 +127,21 @@
             };
             mTransparentBottom = new GradientDrawable(Orientation.BOTTOM_TOP, gradientColors);
             mTransparentRight = new GradientDrawable(Orientation.RIGHT_LEFT, gradientColors);
+            mTransparentColor = res.getColor(R.color.status_bar_background_transparent);
         }
 
         public void setVertical(boolean isVertical) {
+            if (!ENABLE_GRADIENT) return;
             mTransparent = isVertical ? mTransparentRight : mTransparentBottom;
         }
 
         @Override
+        protected Integer getBackgroundColor(int mode) {
+            if (!ENABLE_GRADIENT && mode == MODE_TRANSPARENT) return mTransparentColor;
+            return super.getBackgroundColor(mode);
+        }
+
+        @Override
         protected void onTransition(int oldMode, int newMode, boolean animate) {
             super.onTransition(oldMode, newMode, animate);
             final float alpha = newMode == MODE_OPAQUE ? KeyButtonView.DEFAULT_QUIESCENT_ALPHA : 1f;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index faf0368..bde3795 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.statusbar.phone;
 
+import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
+import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
 import static android.app.StatusBarManager.windowStateToString;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
@@ -35,7 +37,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.graphics.Canvas;
@@ -95,7 +96,6 @@
 import com.android.systemui.statusbar.policy.NetworkController;
 import com.android.systemui.statusbar.policy.NotificationRowLayout;
 import com.android.systemui.statusbar.policy.OnSizeChangedListener;
-import com.android.systemui.statusbar.policy.Prefs;
 import com.android.systemui.statusbar.policy.RotationLockController;
 
 import java.io.FileDescriptor;
@@ -109,11 +109,8 @@
     public static final boolean DUMPTRUCK = true; // extra dumpsys info
     public static final boolean DEBUG_GESTURES = false;
 
-    public static final boolean DEBUG_CLINGS = false;
     public static final boolean DEBUG_WINDOW_STATE = true;
 
-    public static final boolean ENABLE_NOTIFICATION_PANEL_CLING = false;
-
     public static final boolean SETTINGS_DRAG_SHORTCUT = true;
 
     // additional instrumentation for testing purposes; intended to be left on during development
@@ -170,7 +167,7 @@
 
     StatusBarWindowView mStatusBarWindow;
     PhoneStatusBarView mStatusBarView;
-    private int mStatusBarWindowState;
+    private int mStatusBarWindowState = WINDOW_STATE_SHOWING;
 
     int mPixelFormat;
     Object mQueueLock = new Object();
@@ -234,7 +231,7 @@
 
     // on-screen navigation buttons
     private NavigationBarView mNavigationBarView = null;
-    private int mNavigationBarWindowState;
+    private int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
 
     // the tracker view
     int mTrackingPosition; // the position of the top of the tracking view.
@@ -249,11 +246,6 @@
     boolean mTracking;
     VelocityTracker mVelocityTracker;
 
-    // help screen
-    private boolean mClingShown;
-    private ViewGroup mCling;
-    private boolean mSuppressStatusBarDrags; // while a cling is up, briefly deaden the bar to give things time to settle
-
     int[] mAbsPos = new int[2];
     Runnable mPostCollapseCleanup = null;
 
@@ -312,7 +304,10 @@
         }
     };
 
+    private boolean mInteracting;
     private boolean mAutohideSuspended;
+    private int mStatusBarMode;
+    private int mNavigationBarMode;
 
     private final Runnable mAutohide = new Runnable() {
         @Override
@@ -610,13 +605,6 @@
             }
         }
 
-        mClingShown = ! (DEBUG_CLINGS
-            || !Prefs.read(mContext).getBoolean(Prefs.SHOWN_QUICK_SETTINGS_HELP, false));
-
-        if (!ENABLE_NOTIFICATION_PANEL_CLING || ActivityManager.isRunningInTestHarness()) {
-            mClingShown = true;
-        }
-
 //        final ImageView wimaxRSSI =
 //                (ImageView)sb.findViewById(R.id.wimax_signal);
 //        if (wimaxRSSI != null) {
@@ -851,7 +839,7 @@
     public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
         if (SPEW) Log.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
                 + " icon=" + icon);
-        StatusBarIconView view = new StatusBarIconView(mContext, slot, null, getStatusBarMode());
+        StatusBarIconView view = new StatusBarIconView(mContext, slot, null);
         view.set(icon);
         mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconSize, mIconSize));
     }
@@ -1394,7 +1382,7 @@
 
         visibilityChanged(true);
 
-        suspendAutohide();
+        setInteracting(true);
     }
 
     public void animateCollapsePanels() {
@@ -1678,8 +1666,7 @@
             mPostCollapseCleanup = null;
         }
 
-        // Reschedule suspended auto-hide if necessary
-        resumeAutohide();
+        setInteracting(false);
     }
 
     /**
@@ -1729,63 +1716,6 @@
         }
     }
 
-    public boolean isClinging() {
-        return mCling != null && mCling.getVisibility() == View.VISIBLE;
-    }
-
-    public void hideCling() {
-        if (isClinging()) {
-            mCling.animate().alpha(0f).setDuration(250).start();
-            mCling.setVisibility(View.GONE);
-            mSuppressStatusBarDrags = false;
-        }
-    }
-
-    public void showCling() {
-        // lazily inflate this to accommodate orientation change
-        final ViewStub stub = (ViewStub) mStatusBarWindow.findViewById(R.id.status_bar_cling_stub);
-        if (stub == null) {
-            mClingShown = true;
-            return; // no clings on this device
-        }
-
-        mSuppressStatusBarDrags = true;
-
-        mHandler.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                mCling = (ViewGroup) stub.inflate();
-
-                mCling.setOnTouchListener(new View.OnTouchListener() {
-                    @Override
-                    public boolean onTouch(View v, MotionEvent event) {
-                        return true; // e eats everything
-                    }});
-                mCling.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        hideCling();
-                    }});
-
-                mCling.setAlpha(0f);
-                mCling.setVisibility(View.VISIBLE);
-                mCling.animate().alpha(1f);
-
-                mClingShown = true;
-                SharedPreferences.Editor editor = Prefs.edit(mContext);
-                editor.putBoolean(Prefs.SHOWN_QUICK_SETTINGS_HELP, true);
-                editor.apply();
-
-                makeExpandedVisible(); // enforce visibility in case the shade is still animating closed
-                animateExpandNotificationsPanel();
-
-                mSuppressStatusBarDrags = false;
-            }
-        }, 500);
-
-        animateExpandNotificationsPanel();
-    }
-
     public boolean interceptTouchEvent(MotionEvent event) {
         if (DEBUG_GESTURES) {
             if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
@@ -1811,22 +1741,9 @@
             mGestureRec.add(event);
         }
 
-        // Cling (first-run help) handling.
-        // The cling is supposed to show the first time you drag, or even tap, the status bar.
-        // It should show the notification panel, then fade in after half a second, giving you
-        // an explanation of what just happened, as well as teach you how to access quick
-        // settings (another drag). The user can dismiss the cling by clicking OK or by
-        // dragging quick settings into view.
-        final int act = event.getActionMasked();
-        if (mSuppressStatusBarDrags) {
-            return true;
-        } else if (act == MotionEvent.ACTION_UP && !mClingShown) {
-            showCling();
-        } else {
-            hideCling();
+        if (mStatusBarWindowState == WINDOW_STATE_SHOWING) {
+            setInteracting(true);
         }
-
-        suspendAutohide();
         return false;
     }
 
@@ -1843,17 +1760,17 @@
         if (mNavigationBarView != null) {
             mNavigationBarView.setNavigationIconHints(hints);
         }
+        checkBarModes();
     }
 
     @Override // CommandQueue
     public void setWindowState(int window, int state) {
-        boolean showing = state == StatusBarManager.WINDOW_STATE_SHOWING;
+        boolean showing = state == WINDOW_STATE_SHOWING;
         if (mStatusBarWindow != null
                 && window == StatusBarManager.WINDOW_STATUS_BAR
                 && mStatusBarWindowState != state) {
             mStatusBarWindowState = state;
             if (DEBUG_WINDOW_STATE) Log.d(TAG, "Status bar " + windowStateToString(state));
-            mStatusBarWindow.setEnabled(showing);
             if (!showing) {
                 mStatusBarView.collapseAllPanels(false);
             }
@@ -1863,7 +1780,6 @@
                 && mNavigationBarWindowState != state) {
             mNavigationBarWindowState = state;
             if (DEBUG_WINDOW_STATE) Log.d(TAG, "Navigation bar " + windowStateToString(state));
-            mNavigationBarView.setEnabled(showing);
         }
     }
 
@@ -1898,17 +1814,28 @@
             }
 
             // update status bar mode
-            int sbMode = updateBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(),
-                    View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS,
-                    mStatusBarWindowState);
+            final int sbMode = computeBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(),
+                    View.STATUS_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS);
 
             // update navigation bar mode
-            int nbMode = mNavigationBarView == null ? -1 : updateBarMode(
+            final int nbMode = mNavigationBarView == null ? -1 : computeBarMode(
                     oldVal, newVal, mNavigationBarView.getBarTransitions(),
-                    View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION,
-                    mNavigationBarWindowState);
-
-            if (sbMode != -1 || nbMode != -1) {
+                    View.NAVIGATION_BAR_TRANSIENT, View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION);
+            final boolean sbModeChanged = sbMode != -1;
+            final boolean nbModeChanged = nbMode != -1;
+            boolean checkBarModes = false;
+            if (sbModeChanged && sbMode != mStatusBarMode) {
+                mStatusBarMode = sbMode;
+                checkBarModes = true;
+            }
+            if (nbModeChanged && nbMode != mNavigationBarMode) {
+                mNavigationBarMode = nbMode;
+                checkBarModes = true;
+            }
+            if (checkBarModes) {
+                checkBarModes();
+            }
+            if (sbModeChanged || nbModeChanged) {
                 // update transient bar autohide
                 if (sbMode == MODE_SEMI_TRANSPARENT || nbMode == MODE_SEMI_TRANSPARENT) {
                     scheduleAutohide();
@@ -1930,20 +1857,13 @@
         }
     }
 
-    @Override
-    protected int getStatusBarMode() {
-        return mStatusBarView.getBarTransitions().getMode();
-    }
-
-    private int updateBarMode(int oldVis, int newVis, BarTransitions transitions,
-            int transientFlag, int transparentFlag, int windowState) {
+    private int computeBarMode(int oldVis, int newVis, BarTransitions transitions,
+            int transientFlag, int transparentFlag) {
         final int oldMode = barMode(oldVis, transientFlag, transparentFlag);
         final int newMode = barMode(newVis, transientFlag, transparentFlag);
         if (oldMode == newMode) {
             return -1; // no mode change
         }
-        final boolean animate = windowState == StatusBarManager.WINDOW_STATE_SHOWING;
-        transitions.transitionTo(newMode, animate);
         return newMode;
     }
 
@@ -1953,35 +1873,49 @@
                 : MODE_OPAQUE;
     }
 
-    private final Runnable mResumeSemiTransparent = new Runnable() {
+    private void checkBarModes() {
+        checkBarMode(mStatusBarMode, mStatusBarWindowState, mStatusBarView.getBarTransitions());
+        if (mNavigationBarView != null) {
+            checkBarMode(mNavigationBarMode,
+                    mNavigationBarWindowState, mNavigationBarView.getBarTransitions());
+        }
+    }
+
+    private void checkBarMode(int mode, int windowState, BarTransitions transitions) {
+        final boolean imeVisible = (mNavigationIconHints & NAVIGATION_HINT_BACK_ALT) != 0;
+        final int finalMode = imeVisible || mInteracting ? MODE_OPAQUE : mode;
+        final boolean animate = windowState == WINDOW_STATE_SHOWING;
+        transitions.transitionTo(finalMode, animate);
+    }
+
+    private final Runnable mCheckBarModes = new Runnable() {
         @Override
         public void run() {
-            if ((mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0) {
-                animateTransitionTo(BarTransitions.MODE_SEMI_TRANSPARENT);
-            }
+            checkBarModes();
         }};
 
     @Override
-    public void resumeAutohide() {
+    public void setInteracting(boolean interacting) {
+        mInteracting = interacting;
+        if (mInteracting) {
+            suspendAutohide();
+        } else {
+            resumeSuspendedAutohide();
+        }
+        checkBarModes();
+    }
+
+    private void resumeSuspendedAutohide() {
         if (mAutohideSuspended) {
             scheduleAutohide();
-            mHandler.postDelayed(mResumeSemiTransparent, 500); // longer than home -> launcher
+            mHandler.postDelayed(mCheckBarModes, 500); // longer than home -> launcher
         }
     }
 
-    private void animateTransitionTo(int newMode) {
-        mStatusBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
-        if (mNavigationBarView != null) {
-            mNavigationBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
-        }
-    }
-
-    @Override
-    public void suspendAutohide() {
+    private void suspendAutohide() {
         mHandler.removeCallbacks(mAutohide);
-        mHandler.removeCallbacks(mResumeSemiTransparent);
+        mHandler.removeCallbacks(mCheckBarModes);
         mAutohideSuspended = (mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0;
-        animateTransitionTo(BarTransitions.MODE_OPAQUE);
     }
 
     private void cancelAutohide() {
@@ -2087,8 +2021,8 @@
             || ((vis & InputMethodService.IME_VISIBLE) != 0);
 
         mCommandQueue.setNavigationIconHints(
-                altBack ? (mNavigationIconHints | StatusBarManager.NAVIGATION_HINT_BACK_ALT)
-                        : (mNavigationIconHints & ~StatusBarManager.NAVIGATION_HINT_BACK_ALT));
+                altBack ? (mNavigationIconHints | NAVIGATION_HINT_BACK_ALT)
+                        : (mNavigationIconHints & ~NAVIGATION_HINT_BACK_ALT));
         if (mQS != null) mQS.setImeWindowStatus(vis > 0);
     }
 
@@ -2186,12 +2120,17 @@
                     + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY());
         }
 
+        pw.print("  mInteracting="); pw.println(mInteracting);
         pw.print("  mStatusBarWindowState=");
         pw.println(windowStateToString(mStatusBarWindowState));
+        pw.print("  mStatusBarMode=");
+        pw.println(BarTransitions.modeToString(mStatusBarMode));
         dumpBarTransitions(pw, "mStatusBarView", mStatusBarView.getBarTransitions());
         if (mNavigationBarView != null) {
             pw.print("  mNavigationBarWindowState=");
             pw.println(windowStateToString(mNavigationBarWindowState));
+            pw.print("  mNavigationBarMode=");
+            pw.println(BarTransitions.modeToString(mNavigationBarMode));
             dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions());
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 2e9ee87..fa494c2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -16,8 +16,12 @@
 
 package com.android.systemui.statusbar.phone;
 
+import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
+import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
+
 import android.animation.Animator;
 import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
 import android.app.ActivityManager;
 import android.content.Context;
 import android.content.res.Resources;
@@ -27,15 +31,10 @@
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
 
 import com.android.systemui.EventLogTags;
 import com.android.systemui.R;
-import com.android.systemui.statusbar.StatusBarIconView;
-
-import java.util.ArrayList;
-import java.util.List;
 
 public class PhoneStatusBarView extends PanelBar {
     private static final String TAG = "PhoneStatusBarView";
@@ -56,11 +55,22 @@
 
     private final class StatusBarTransitions extends BarTransitions {
         private final int mTransparent;
+        private final float mAlphaWhenOpaque;
+        private final float mAlphaWhenTransparent = 1;
+        private View mLeftSide;
+        private View mRightSide;
 
         public StatusBarTransitions(Context context) {
             super(context, PhoneStatusBarView.this);
             final Resources res = context.getResources();
             mTransparent = res.getColor(R.color.status_bar_background_transparent);
+            mAlphaWhenOpaque = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
+        }
+
+        public void init() {
+            mLeftSide = findViewById(R.id.notification_icon_area);
+            mRightSide = findViewById(R.id.system_icon_area);
+            applyMode(getMode(), false /*animate*/);
         }
 
         @Override
@@ -69,41 +79,32 @@
             return super.getBackgroundColor(mode);
         }
 
+        public ObjectAnimator animateTransitionTo(View v, float toAlpha) {
+            return ObjectAnimator.ofFloat(v, "alpha", v.getAlpha(), toAlpha);
+        }
+
+        public float getAlphaFor(int mode) {
+            final boolean isTransparent = mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT;
+            return isTransparent ? mAlphaWhenTransparent : mAlphaWhenOpaque;
+        }
+
         @Override
         protected void onTransition(int oldMode, int newMode, boolean animate) {
             super.onTransition(oldMode, newMode, animate);
+            applyMode(newMode, animate);
+        }
+
+        private void applyMode(int mode, boolean animate) {
+            float newAlpha = getAlphaFor(mode);
             if (animate) {
-                List<Animator> animators = new ArrayList<Animator>();
-                for(StatusBarIconView icon : findStatusBarIcons()) {
-                    animators.add(icon.animateTransitionTo(newMode));
-                }
+                ObjectAnimator lhs = animateTransitionTo(mLeftSide, newAlpha);
+                ObjectAnimator rhs = animateTransitionTo(mRightSide, newAlpha);
                 AnimatorSet set = new AnimatorSet();
-                set.playTogether(animators);
+                set.playTogether(lhs, rhs);
                 set.start();
             } else {
-                for(StatusBarIconView icon : findStatusBarIcons()) {
-                    icon.setAlpha(icon.getAlphaFor(newMode));
-                }
-            }
-        }
-
-        private List<StatusBarIconView> findStatusBarIcons() {
-            List<StatusBarIconView> icons = new ArrayList<StatusBarIconView>();
-            findStatusBarIcons(icons, findViewById(R.id.moreIcon));
-            findStatusBarIcons(icons, findViewById(R.id.statusIcons));
-            findStatusBarIcons(icons, findViewById(R.id.notificationIcons));
-            return icons;
-        }
-
-        private void findStatusBarIcons(List<StatusBarIconView> icons, View v) {
-            if (v instanceof StatusBarIconView) {
-                icons.add((StatusBarIconView) v);
-            } else if (v instanceof ViewGroup) {
-                ViewGroup group = (ViewGroup) v;
-                final int N = group.getChildCount();
-                for (int i = 0; i < N; i++) {
-                    findStatusBarIcons(icons, group.getChildAt(i));
-                }
+                mLeftSide.setAlpha(newAlpha);
+                mRightSide.setAlpha(newAlpha);
             }
         }
     }
@@ -140,6 +141,7 @@
         for (PanelView pv : mPanels) {
             pv.setRubberbandingEnabled(!mFullWidthNotifications);
         }
+        mBarTransitions.init();
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
index 73979a6..f339401 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
@@ -22,8 +22,6 @@
 public class Prefs {
     private static final String SHARED_PREFS_NAME = "status_bar";
 
-    public static final String SHOWN_QUICK_SETTINGS_HELP = "shown_quick_settings_help";
-
     public static SharedPreferences read(Context context) {
         return context.getSharedPreferences(Prefs.SHARED_PREFS_NAME, Context.MODE_PRIVATE);
     }
diff --git a/policy/src/com/android/internal/policy/impl/BarController.java b/policy/src/com/android/internal/policy/impl/BarController.java
index 01c53fe..41b2fd1 100644
--- a/policy/src/com/android/internal/policy/impl/BarController.java
+++ b/policy/src/com/android/internal/policy/impl/BarController.java
@@ -51,7 +51,7 @@
     private IStatusBarService mStatusBarService;
 
     private WindowState mWin;
-    private int mState;
+    private int mState = StatusBarManager.WINDOW_STATE_SHOWING;
     private int mTransientBarState;
     private boolean mPendingShow;
     private long mLastTransparent;
@@ -110,7 +110,7 @@
         final boolean oldAnim = mWin.isAnimatingLw();
         final boolean rt = show ? mWin.showLw(true) : mWin.hideLw(true);
         final int state = computeState(oldVis, oldAnim, mWin.isVisibleLw(), mWin.isAnimatingLw());
-        if (state > -1) {
+        if (state > -1 && mWin.hasDrawnLw()) {
             updateState(state);
         }
         return rt;
@@ -146,7 +146,7 @@
     }
 
     public boolean checkHiddenLw() {
-        if (mWin != null) {
+        if (mWin != null && mWin.hasDrawnLw()) {
             if (!mWin.isVisibleLw() && !mWin.isAnimatingLw()) {
                 updateState(StatusBarManager.WINDOW_STATE_HIDDEN);
             }
@@ -230,9 +230,9 @@
     public void dump(PrintWriter pw, String prefix) {
         if (mWin != null) {
             pw.print(prefix); pw.println(mTag);
-            pw.print("  "); pw.print("mState"); pw.print('=');
+            pw.print(prefix); pw.print("  "); pw.print("mState"); pw.print('=');
             pw.println(StatusBarManager.windowStateToString(mState));
-            pw.print("  "); pw.print("mTransientBar"); pw.print('=');
+            pw.print(prefix); pw.print("  "); pw.print("mTransientBar"); pw.print('=');
             pw.println(transientBarStateToString(mTransientBarState));
         }
     }
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 8fc61155..c58ed6f 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -2692,7 +2692,7 @@
             final int sysui = mLastSystemUiFlags;
             boolean navVisible = (sysui & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
             boolean navTransparent = (sysui & View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION) != 0;
-            boolean transientAllowed = (sysui & View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT) != 0;
+            boolean transientAllowed = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
             navTransparent &= !transientAllowed;  // transient trumps transparent
 
             // When the navigation bar isn't visible, we put up a fake
@@ -2986,7 +2986,8 @@
             pf.left = df.left = of.left = cf.left = vf.left = mDockLeft;
             pf.top = df.top = of.top = cf.top = vf.top = mDockTop;
             pf.right = df.right = of.right = cf.right = vf.right = mDockRight;
-            pf.bottom = df.bottom = of.bottom = cf.bottom = vf.bottom = mDockBottom;
+            // IM dock windows always go above the nav bar.
+            pf.bottom = df.bottom = of.bottom = cf.bottom = vf.bottom = mStableBottom;
             // IM dock windows always go to the bottom of the screen.
             attrs.gravity = Gravity.BOTTOM;
             mDockLayer = win.getSurfaceLayer();
@@ -5054,13 +5055,13 @@
         if (statusBarHasFocus) {
             int flags = View.SYSTEM_UI_FLAG_FULLSCREEN
                     | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
-                    | View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT;
+                    | View.SYSTEM_UI_FLAG_IMMERSIVE;
             vis = (vis & ~flags) | (mLastSystemUiFlags & flags);
         }
 
         // update status bar
         boolean transientAllowed =
-                (vis & View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT) != 0;
+                (vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
         boolean hideStatusBarWM =
                 (mFocusedWindow.getAttrs().flags
                         & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0;
@@ -5105,7 +5106,7 @@
     private boolean isTransientNavigationAllowed(int vis) {
         return mNavigationBar != null
                 && (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0
-                && (vis & View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT) != 0;
+                && (vis & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0;
     }
 
     // Temporary helper that allows testing immersive mode on existing apps
@@ -5133,7 +5134,7 @@
             if (sForced.contains(parseActivity(focused))) {
                 vis |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                        View.SYSTEM_UI_FLAG_FULLSCREEN |
-                       View.SYSTEM_UI_FLAG_ALLOW_TRANSIENT;
+                       View.SYSTEM_UI_FLAG_IMMERSIVE;
             }
             return vis;
         }
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 136a85e..9c14654 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -36,6 +36,7 @@
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.bluetooth.BluetoothTetheringDataTracker;
+import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -152,6 +153,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -424,9 +426,6 @@
 
     TelephonyManager mTelephonyManager;
 
-    // We only want one checkMobileProvisioning after booting.
-    volatile boolean mFirstProvisioningCheckStarted = false;
-
     public ConnectivityService(Context context, INetworkManagementService netd,
             INetworkStatsService statsService, INetworkPolicyManager policyManager) {
         // Currently, omitting a NetworkFactory will create one internally
@@ -656,9 +655,6 @@
         mSettingsObserver = new SettingsObserver(mHandler, EVENT_APPLY_GLOBAL_HTTP_PROXY);
         mSettingsObserver.observe(mContext);
 
-        mCaptivePortalTracker = CaptivePortalTracker.makeCaptivePortalTracker(mContext, this);
-        loadGlobalProxy();
-
         mDataConnectionStats = new DataConnectionStats(mContext);
         mDataConnectionStats.startMonitoring();
 
@@ -686,6 +682,10 @@
                 new IntentFilter(filter));
 
         mPacManager = new PacManager(mContext);
+
+        filter = new IntentFilter();
+        filter.addAction(CONNECTED_TO_PROVISIONING_NETWORK_ACTION);
+        mContext.registerReceiver(mProvisioningReceiver, filter);
     }
 
     /**
@@ -954,6 +954,46 @@
         return getNetworkInfo(mActiveDefaultNetwork, uid);
     }
 
+    /**
+     * Find the first Provisioning network.
+     *
+     * @return NetworkInfo or null if none.
+     */
+    private NetworkInfo getProvisioningNetworkInfo() {
+        enforceAccessPermission();
+
+        // Find the first Provisioning Network
+        NetworkInfo provNi = null;
+        for (NetworkInfo ni : getAllNetworkInfo()) {
+            if (ni.getDetailedState()
+                    == NetworkInfo.DetailedState.CONNECTED_TO_PROVISIONING_NETWORK) {
+                provNi = ni;
+                break;
+            }
+        }
+        if (DBG) log("getProvisioningNetworkInfo: X provNi=" + provNi);
+        return provNi;
+    }
+
+    /**
+     * Find the first Provisioning network or the ActiveDefaultNetwork
+     * if there is no Provisioning network
+     *
+     * @return NetworkInfo or null if none.
+     */
+    @Override
+    public NetworkInfo getProvisioningOrActiveNetworkInfo() {
+        enforceAccessPermission();
+
+        NetworkInfo provNi = getProvisioningNetworkInfo();
+        if (provNi == null) {
+            final int uid = Binder.getCallingUid();
+            provNi = getNetworkInfo(mActiveDefaultNetwork, uid);
+        }
+        if (DBG) log("getProvisioningOrActiveNetworkInfo: X provNi=" + provNi);
+        return provNi;
+    }
+
     public NetworkInfo getActiveNetworkInfoUnfiltered() {
         enforceAccessPermission();
         if (isNetworkTypeValid(mActiveDefaultNetwork)) {
@@ -1316,8 +1356,10 @@
                                 feature);
                     }
                     if (network.reconnect()) {
+                        if (DBG) log("startUsingNetworkFeature X: return APN_REQUEST_STARTED");
                         return PhoneConstants.APN_REQUEST_STARTED;
                     } else {
+                        if (DBG) log("startUsingNetworkFeature X: return APN_REQUEST_FAILED");
                         return PhoneConstants.APN_REQUEST_FAILED;
                     }
                 } else {
@@ -1329,9 +1371,11 @@
                             mNetRequestersPids[usedNetworkType].add(currentPid);
                         }
                     }
+                    if (DBG) log("startUsingNetworkFeature X: return -1 unsupported feature.");
                     return -1;
                 }
             }
+            if (DBG) log("startUsingNetworkFeature X: return APN_TYPE_NOT_AVAILABLE");
             return PhoneConstants.APN_TYPE_NOT_AVAILABLE;
          } finally {
             if (DBG) {
@@ -1365,11 +1409,12 @@
             }
         }
         if (found && u != null) {
+            if (VDBG) log("stopUsingNetworkFeature: X");
             // stop regardless of how many other time this proc had called start
             return stopUsingNetworkFeature(u, true);
         } else {
             // none found!
-            if (VDBG) log("stopUsingNetworkFeature - not a live request, ignoring");
+            if (VDBG) log("stopUsingNetworkFeature: X not a live request, ignoring");
             return 1;
         }
     }
@@ -1952,6 +1997,9 @@
          */
         if (mNetConfigs[prevNetType].isDefault()) {
             if (mActiveDefaultNetwork == prevNetType) {
+                if (DBG) {
+                    log("tryFailover: set mActiveDefaultNetwork=-1, prevNetType=" + prevNetType);
+                }
                 mActiveDefaultNetwork = -1;
             }
 
@@ -2146,6 +2194,9 @@
     }
 
     void systemReady() {
+        mCaptivePortalTracker = CaptivePortalTracker.makeCaptivePortalTracker(mContext, this);
+        loadGlobalProxy();
+
         synchronized(this) {
             mSystemReady = true;
             if (mInitialBroadcast != null) {
@@ -2176,10 +2227,11 @@
     };
 
     private boolean isNewNetTypePreferredOverCurrentNetType(int type) {
-        if ((type != mNetworkPreference &&
-                    mNetConfigs[mActiveDefaultNetwork].priority >
-                    mNetConfigs[type].priority) ||
-                mNetworkPreference == mActiveDefaultNetwork) return false;
+        if (((type != mNetworkPreference)
+                      && (mNetConfigs[mActiveDefaultNetwork].priority > mNetConfigs[type].priority))
+                   || (mNetworkPreference == mActiveDefaultNetwork)) {
+            return false;
+        }
         return true;
     }
 
@@ -2193,6 +2245,11 @@
         final NetworkStateTracker thisNet = mNetTrackers[newNetType];
         final String thisIface = thisNet.getLinkProperties().getInterfaceName();
 
+        if (VDBG) {
+            log("handleConnect: E newNetType=" + newNetType + " thisIface=" + thisIface
+                    + " isFailover" + isFailover);
+        }
+
         // if this is a default net and other default is running
         // kill the one not preferred
         if (mNetConfigs[newNetType].isDefault()) {
@@ -2355,6 +2412,10 @@
     private void handleConnectivityChange(int netType, boolean doReset) {
         int resetMask = doReset ? NetworkUtils.RESET_ALL_ADDRESSES : 0;
         boolean exempt = ConnectivityManager.isNetworkTypeExempt(netType);
+        if (VDBG) {
+            log("handleConnectivityChange: netType=" + netType + " doReset=" + doReset
+                    + " resetMask=" + resetMask);
+        }
 
         /*
          * If a non-default network is enabled, add the host routes that
@@ -2422,7 +2483,9 @@
         boolean resetDns = updateRoutes(newLp, curLp, mNetConfigs[netType].isDefault(), exempt);
 
         if (resetMask != 0 || resetDns) {
+            if (VDBG) log("handleConnectivityChange: resetting");
             if (curLp != null) {
+                if (VDBG) log("handleConnectivityChange: resetting curLp=" + curLp);
                 for (String iface : curLp.getAllInterfaceNames()) {
                     if (TextUtils.isEmpty(iface) == false) {
                         if (resetMask != 0) {
@@ -2459,6 +2522,7 @@
         // Update 464xlat state.
         NetworkStateTracker tracker = mNetTrackers[netType];
         if (mClat.requiresClat(netType, tracker)) {
+
             // If the connection was previously using clat, but is not using it now, stop the clat
             // daemon. Normally, this happens automatically when the connection disconnects, but if
             // the disconnect is not reported, or if the connection's LinkProperties changed for
@@ -2512,6 +2576,7 @@
 
         for (RouteInfo r : routeDiff.removed) {
             if (isLinkDefault || ! r.isDefaultRoute()) {
+                if (VDBG) log("updateRoutes: default remove route r=" + r);
                 removeRoute(curLp, r, TO_DEFAULT_TABLE);
             }
             if (isLinkDefault == false) {
@@ -2849,9 +2914,8 @@
         public void handleMessage(Message msg) {
             NetworkInfo info;
             switch (msg.what) {
-                case NetworkStateTracker.EVENT_STATE_CHANGED:
+                case NetworkStateTracker.EVENT_STATE_CHANGED: {
                     info = (NetworkInfo) msg.obj;
-                    int type = info.getType();
                     NetworkInfo.State state = info.getState();
 
                     if (VDBG || (state == NetworkInfo.State.CONNECTED) ||
@@ -2861,15 +2925,17 @@
                             state + "/" + info.getDetailedState());
                     }
 
-                    // After booting we'll check once for mobile provisioning
-                    // if we've provisioned by and connected.
-                    if (!mFirstProvisioningCheckStarted
+                    // Since mobile has the notion of a network/apn that can be used for
+                    // provisioning we need to check every time we're connected as
+                    // CaptiveProtalTracker won't detected it because DCT doesn't report it
+                    // as connected as ACTION_ANY_DATA_CONNECTION_STATE_CHANGED instead its
+                    // reported as ACTION_DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN. Which
+                    // is received by MDST and sent here as EVENT_STATE_CHANGED.
+                    if (ConnectivityManager.isNetworkTypeMobile(info.getType())
                             && (0 != Settings.Global.getInt(mContext.getContentResolver(),
                                         Settings.Global.DEVICE_PROVISIONED, 0))
                             && (state == NetworkInfo.State.CONNECTED)) {
-                        log("check provisioning after booting");
-                        mFirstProvisioningCheckStarted = true;
-                        checkMobileProvisioning(true, CheckMp.MAX_TIMEOUT_MS, null);
+                        checkMobileProvisioning(CheckMp.MAX_TIMEOUT_MS);
                     }
 
                     EventLogTags.writeConnectivityStateChanged(
@@ -2881,6 +2947,30 @@
                     } else if (info.getDetailedState() ==
                             DetailedState.CAPTIVE_PORTAL_CHECK) {
                         handleCaptivePortalTrackerCheck(info);
+                    } else if (info.getDetailedState() ==
+                            DetailedState.CONNECTED_TO_PROVISIONING_NETWORK) {
+                        /**
+                         * TODO: Create ConnectivityManager.TYPE_MOBILE_PROVISIONING
+                         * for now its an in between network, its a network that
+                         * is actually a default network but we don't want it to be
+                         * announced as such to keep background applications from
+                         * trying to use it. It turns out that some still try so we
+                         * take the additional step of clearing any default routes
+                         * to the link that may have incorrectly setup by the lower
+                         * levels.
+                         */
+                        LinkProperties lp = getLinkProperties(info.getType());
+                        if (DBG) {
+                            log("EVENT_STATE_CHANGED: connected to provisioning network, lp=" + lp);
+                        }
+
+                        // Clear any default routes setup by the radio so
+                        // any activity by applications trying to use this
+                        // connection will fail until the provisioning network
+                        // is enabled.
+                        for (RouteInfo r : lp.getRoutes()) {
+                            removeRoute(lp, r, TO_DEFAULT_TABLE);
+                        }
                     } else if (state == NetworkInfo.State.DISCONNECTED) {
                         handleDisconnect(info);
                     } else if (state == NetworkInfo.State.SUSPENDED) {
@@ -2899,18 +2989,21 @@
                         mLockdownTracker.onNetworkInfoChanged(info);
                     }
                     break;
-                case NetworkStateTracker.EVENT_CONFIGURATION_CHANGED:
+                }
+                case NetworkStateTracker.EVENT_CONFIGURATION_CHANGED: {
                     info = (NetworkInfo) msg.obj;
                     // TODO: Temporary allowing network configuration
                     //       change not resetting sockets.
                     //       @see bug/4455071
                     handleConnectivityChange(info.getType(), false);
                     break;
-                case NetworkStateTracker.EVENT_NETWORK_SUBTYPE_CHANGED:
+                }
+                case NetworkStateTracker.EVENT_NETWORK_SUBTYPE_CHANGED: {
                     info = (NetworkInfo) msg.obj;
-                    type = info.getType();
+                    int type = info.getType();
                     updateNetworkSettings(mNetTrackers[type]);
                     break;
+                }
             }
         }
     }
@@ -3806,76 +3899,153 @@
                          enabled));
     }
 
+    private boolean isMobileDataStateTrackerReady() {
+        MobileDataStateTracker mdst =
+                (MobileDataStateTracker) mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI];
+        return (mdst != null) && (mdst.isReady());
+    }
+
+    /**
+     * The ResultReceiver resultCode for checkMobileProvisioning (CMP_RESULT_CODE)
+     */
+
+    /**
+     * No connection was possible to the network.
+     */
+    public static final int CMP_RESULT_CODE_NO_CONNECTION = 0;
+
+    /**
+     * A connection was made to the internet, all is well.
+     */
+    public static final int CMP_RESULT_CODE_CONNECTABLE = 1;
+
+    /**
+     * A connection was made but there was a redirection, we appear to be in walled garden.
+     * This is an indication of a warm sim on a mobile network.
+     */
+    public static final int CMP_RESULT_CODE_REDIRECTED = 2;
+
+    /**
+     * A connection was made but no dns server was available to resolve a name to address.
+     * This is an indication of a warm sim on a mobile network.
+     */
+    public static final int CMP_RESULT_CODE_NO_DNS = 3;
+
+    /**
+     * A connection was made but could not open a TCP connection.
+     * This is an indication of a warm sim on a mobile network.
+     */
+    public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4;
+
+    /**
+     * The mobile network is a provisioning network.
+     * This is an indication of a warm sim on a mobile network.
+     */
+    public static final int CMP_RESULT_CODE_PROVISIONING_NETWORK = 5;
+
+    AtomicBoolean mIsCheckingMobileProvisioning = new AtomicBoolean(false);
+
     @Override
-    public int checkMobileProvisioning(final boolean sendNotification, int suggestedTimeOutMs,
-            final ResultReceiver resultReceiver) {
-        log("checkMobileProvisioning: E sendNotification=" + sendNotification
-                + " suggestedTimeOutMs=" + suggestedTimeOutMs
-                + " resultReceiver=" + resultReceiver);
-        enforceChangePermission();
-
-        mFirstProvisioningCheckStarted = true;
-
-        int timeOutMs = suggestedTimeOutMs;
-        if (suggestedTimeOutMs > CheckMp.MAX_TIMEOUT_MS) {
-            timeOutMs = CheckMp.MAX_TIMEOUT_MS;
-        }
-
-        // Check that mobile networks are supported
-        if (!isNetworkSupported(ConnectivityManager.TYPE_MOBILE)
-                || !isNetworkSupported(ConnectivityManager.TYPE_MOBILE_HIPRI)) {
-            log("checkMobileProvisioning: X no mobile network");
-            if (resultReceiver != null) {
-                resultReceiver.send(ConnectivityManager.CMP_RESULT_CODE_NO_CONNECTION, null);
-            }
-            return timeOutMs;
-        }
+    public int checkMobileProvisioning(int suggestedTimeOutMs) {
+        int timeOutMs = -1;
+        if (DBG) log("checkMobileProvisioning: E suggestedTimeOutMs=" + suggestedTimeOutMs);
+        enforceConnectivityInternalPermission();
 
         final long token = Binder.clearCallingIdentity();
         try {
+            timeOutMs = suggestedTimeOutMs;
+            if (suggestedTimeOutMs > CheckMp.MAX_TIMEOUT_MS) {
+                timeOutMs = CheckMp.MAX_TIMEOUT_MS;
+            }
+
+            // Check that mobile networks are supported
+            if (!isNetworkSupported(ConnectivityManager.TYPE_MOBILE)
+                    || !isNetworkSupported(ConnectivityManager.TYPE_MOBILE_HIPRI)) {
+                if (DBG) log("checkMobileProvisioning: X no mobile network");
+                return timeOutMs;
+            }
+
+            // If we're already checking don't do it again
+            // TODO: Add a queue of results...
+            if (mIsCheckingMobileProvisioning.getAndSet(true)) {
+                if (DBG) log("checkMobileProvisioning: X already checking ignore for the moment");
+                return timeOutMs;
+            }
+
+            // Start off with notification off
+            setProvNotificationVisible(false, ConnectivityManager.TYPE_NONE, null, null);
+
+            // See if we've alreadying determined if we've got a provsioning connection
+            // if so we don't need to do anything active
+            MobileDataStateTracker mdstDefault = (MobileDataStateTracker)
+                    mNetTrackers[ConnectivityManager.TYPE_MOBILE];
+            boolean isDefaultProvisioning = mdstDefault.isProvisioningNetwork();
+
+            MobileDataStateTracker mdstHipri = (MobileDataStateTracker)
+                    mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI];
+            boolean isHipriProvisioning = mdstHipri.isProvisioningNetwork();
+
+            if (isDefaultProvisioning || isHipriProvisioning) {
+                if (mIsNotificationVisible) {
+                    if (DBG) {
+                        log("checkMobileProvisioning: provisioning-ignore notification is visible");
+                    }
+                } else {
+                    NetworkInfo ni = null;
+                    if (isDefaultProvisioning) {
+                        ni = mdstDefault.getNetworkInfo();
+                    }
+                    if (isHipriProvisioning) {
+                        ni = mdstHipri.getNetworkInfo();
+                    }
+                    String url = getMobileProvisioningUrl();
+                    if ((ni != null) && (!TextUtils.isEmpty(url))) {
+                        setProvNotificationVisible(true, ni.getType(), ni.getExtraInfo(), url);
+                    } else {
+                        if (DBG) log("checkMobileProvisioning: provisioning but no url, ignore");
+                    }
+                }
+                mIsCheckingMobileProvisioning.set(false);
+                return timeOutMs;
+            }
+
             CheckMp checkMp = new CheckMp(mContext, this);
             CheckMp.CallBack cb = new CheckMp.CallBack() {
                 @Override
                 void onComplete(Integer result) {
-                    log("CheckMp.onComplete: result=" + result);
-                    if (resultReceiver != null) {
-                        log("CheckMp.onComplete: send result");
-                        resultReceiver.send(result, null);
-                    }
-                    if (!sendNotification) {
-                        log("CheckMp.onComplete: done, not sending notification");
-                        return;
-                    }
+                    if (DBG) log("CheckMp.onComplete: result=" + result);
                     NetworkInfo ni =
                             mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI].getNetworkInfo();
                     switch(result) {
-                        case ConnectivityManager.CMP_RESULT_CODE_CONNECTABLE:
-                        case ConnectivityManager.CMP_RESULT_CODE_NO_CONNECTION: {
-                            log("CheckMp.onComplete: ignore, connected or no connection");
+                        case CMP_RESULT_CODE_CONNECTABLE:
+                        case CMP_RESULT_CODE_NO_CONNECTION: {
+                            if (DBG) log("CheckMp.onComplete: ignore, connected or no connection");
                             break;
                         }
-                        case ConnectivityManager.CMP_RESULT_CODE_REDIRECTED: {
-                            log("CheckMp.onComplete: warm sim");
+                        case CMP_RESULT_CODE_REDIRECTED: {
+                            if (DBG) log("CheckMp.onComplete: warm sim");
                             String url = getMobileProvisioningUrl();
                             if (TextUtils.isEmpty(url)) {
                                 url = getMobileRedirectedProvisioningUrl();
                             }
                             if (TextUtils.isEmpty(url) == false) {
-                                log("CheckMp.onComplete: warm sim (redirected), url=" + url);
-                                setNotificationVisible(true, ni, url);
+                                if (DBG) log("CheckMp.onComplete: warm (redirected), url=" + url);
+                                setProvNotificationVisible(true, ni.getType(), ni.getExtraInfo(),
+                                        url);
                             } else {
-                                log("CheckMp.onComplete: warm sim (redirected), no url");
+                                if (DBG) log("CheckMp.onComplete: warm (redirected), no url");
                             }
                             break;
                         }
-                        case ConnectivityManager.CMP_RESULT_CODE_NO_DNS:
-                        case ConnectivityManager.CMP_RESULT_CODE_NO_TCP_CONNECTION: {
+                        case CMP_RESULT_CODE_NO_DNS:
+                        case CMP_RESULT_CODE_NO_TCP_CONNECTION: {
                             String url = getMobileProvisioningUrl();
                             if (TextUtils.isEmpty(url) == false) {
-                                log("CheckMp.onComplete: warm sim (no dns/tcp), url=" + url);
-                                setNotificationVisible(true, ni, url);
+                                if (DBG) log("CheckMp.onComplete: warm (no dns/tcp), url=" + url);
+                                setProvNotificationVisible(true, ni.getType(), ni.getExtraInfo(),
+                                        url);
                             } else {
-                                log("CheckMp.onComplete: warm sim (no dns/tcp), no url");
+                                if (DBG) log("CheckMp.onComplete: warm (no dns/tcp), no url");
                             }
                             break;
                         }
@@ -3884,16 +4054,16 @@
                             break;
                         }
                     }
+                    mIsCheckingMobileProvisioning.set(false);
                 }
             };
             CheckMp.Params params =
                     new CheckMp.Params(checkMp.getDefaultUrl(), timeOutMs, cb);
-            log("checkMobileProvisioning: params=" + params);
-            setNotificationVisible(false, null, null);
+            if (DBG) log("checkMobileProvisioning: params=" + params);
             checkMp.execute(params);
         } finally {
             Binder.restoreCallingIdentity(token);
-            log("checkMobileProvisioning: X");
+            if (DBG) log("checkMobileProvisioning: X");
         }
         return timeOutMs;
     }
@@ -3965,26 +4135,38 @@
          * a known address that fetches the data we expect.
          */
         private synchronized Integer isMobileOk(Params params) {
-            Integer result = ConnectivityManager.CMP_RESULT_CODE_NO_CONNECTION;
+            Integer result = CMP_RESULT_CODE_NO_CONNECTION;
             Uri orgUri = Uri.parse(params.mUrl);
             Random rand = new Random();
             mParams = params;
 
             if (mCs.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false) {
                 log("isMobileOk: not mobile capable");
-                result = ConnectivityManager.CMP_RESULT_CODE_NO_CONNECTION;
+                result = CMP_RESULT_CODE_NO_CONNECTION;
                 return result;
             }
 
             try {
-                // Enable fail fast as we'll do retries here and use a
-                // hipri connection so the default connection stays active.
-                log("isMobileOk: start hipri url=" + params.mUrl);
-                mCs.setEnableFailFastMobileData(DctConstants.ENABLED);
-
                 // Continue trying to connect until time has run out
                 long endTime = SystemClock.elapsedRealtime() + params.mTimeOutMs;
 
+                if (!mCs.isMobileDataStateTrackerReady()) {
+                    // Wait for MobileDataStateTracker to be ready.
+                    if (DBG) log("isMobileOk: mdst is not ready");
+                    while(SystemClock.elapsedRealtime() < endTime) {
+                        if (mCs.isMobileDataStateTrackerReady()) {
+                            // Enable fail fast as we'll do retries here and use a
+                            // hipri connection so the default connection stays active.
+                            if (DBG) log("isMobileOk: mdst ready, enable fail fast of mobile data");
+                            mCs.setEnableFailFastMobileData(DctConstants.ENABLED);
+                            break;
+                        }
+                        sleep(1);
+                    }
+                }
+
+                log("isMobileOk: start hipri url=" + params.mUrl);
+
                 // First wait until we can start using hipri
                 Binder binder = new Binder();
                 while(SystemClock.elapsedRealtime() < endTime) {
@@ -3996,7 +4178,7 @@
                             break;
                     }
                     if (VDBG) log("isMobileOk: hipri not started yet");
-                    result = ConnectivityManager.CMP_RESULT_CODE_NO_CONNECTION;
+                    result = CMP_RESULT_CODE_NO_CONNECTION;
                     sleep(1);
                 }
 
@@ -4009,15 +4191,26 @@
                         NetworkInfo.State state = mCs
                                 .getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState();
                         if (state != NetworkInfo.State.CONNECTED) {
-                            if (VDBG) {
+                            if (true/*VDBG*/) {
                                 log("isMobileOk: not connected ni=" +
                                     mCs.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI));
                             }
                             sleep(1);
-                            result = ConnectivityManager.CMP_RESULT_CODE_NO_CONNECTION;
+                            result = CMP_RESULT_CODE_NO_CONNECTION;
                             continue;
                         }
 
+                        // Hipri has started check if this is a provisioning url
+                        MobileDataStateTracker mdst = (MobileDataStateTracker)
+                                mCs.mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI];
+                        if (mdst.isProvisioningNetwork()) {
+                            if (DBG) log("isMobileOk: isProvisioningNetwork is true, no TCP conn");
+                            result = CMP_RESULT_CODE_NO_TCP_CONNECTION;
+                            return result;
+                        } else {
+                            if (DBG) log("isMobileOk: isProvisioningNetwork is false, continue");
+                        }
+
                         // Get of the addresses associated with the url host. We need to use the
                         // address otherwise HttpURLConnection object will use the name to get
                         // the addresses and is will try every address but that will bypass the
@@ -4028,7 +4221,7 @@
                             addresses = InetAddress.getAllByName(orgUri.getHost());
                         } catch (UnknownHostException e) {
                             log("isMobileOk: UnknownHostException");
-                            result = ConnectivityManager.CMP_RESULT_CODE_NO_DNS;
+                            result = CMP_RESULT_CODE_NO_DNS;
                             return result;
                         }
                         log("isMobileOk: addresses=" + inetAddressesToString(addresses));
@@ -4093,9 +4286,9 @@
                                 urlConn.setRequestProperty("Connection", "close");
                                 int responseCode = urlConn.getResponseCode();
                                 if (responseCode == 204) {
-                                    result = ConnectivityManager.CMP_RESULT_CODE_CONNECTABLE;
+                                    result = CMP_RESULT_CODE_CONNECTABLE;
                                 } else {
-                                    result = ConnectivityManager.CMP_RESULT_CODE_REDIRECTED;
+                                    result = CMP_RESULT_CODE_REDIRECTED;
                                 }
                                 log("isMobileOk: connected responseCode=" + responseCode);
                                 urlConn.disconnect();
@@ -4109,7 +4302,7 @@
                                 }
                             }
                         }
-                        result = ConnectivityManager.CMP_RESULT_CODE_NO_TCP_CONNECTION;
+                        result = CMP_RESULT_CODE_NO_TCP_CONNECTION;
                         log("isMobileOk: loops|timed out");
                         return result;
                     } catch (Exception e) {
@@ -4123,6 +4316,23 @@
                 mCs.setEnableFailFastMobileData(DctConstants.DISABLED);
                 mCs.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
                         Phone.FEATURE_ENABLE_HIPRI);
+
+                // Wait for hipri to disconnect.
+                long endTime = SystemClock.elapsedRealtime() + 5000;
+
+                while(SystemClock.elapsedRealtime() < endTime) {
+                    NetworkInfo.State state = mCs
+                            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState();
+                    if (state != NetworkInfo.State.DISCONNECTED) {
+                        if (VDBG) {
+                            log("isMobileOk: connected ni=" +
+                                mCs.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI));
+                        }
+                        sleep(1);
+                        continue;
+                    }
+                }
+
                 log("isMobileOk: X result=" + result);
             }
             return result;
@@ -4188,10 +4398,55 @@
         }
     }
 
-    private static final String NOTIFICATION_ID = "CaptivePortal.Notification";
+    // TODO: Move to ConnectivityManager and make public?
+    private static final String CONNECTED_TO_PROVISIONING_NETWORK_ACTION =
+            "com.android.server.connectivityservice.CONNECTED_TO_PROVISIONING_NETWORK_ACTION";
 
-    private void setNotificationVisible(boolean visible, NetworkInfo networkInfo, String url) {
-        log("setNotificationVisible: E visible=" + visible + " ni=" + networkInfo + " url=" + url);
+    private BroadcastReceiver mProvisioningReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(CONNECTED_TO_PROVISIONING_NETWORK_ACTION)) {
+                handleMobileProvisioningAction(intent.getStringExtra("EXTRA_URL"));
+            }
+        }
+    };
+
+    private void handleMobileProvisioningAction(String url) {
+        // Notication mark notification as not visible
+        setProvNotificationVisible(false, ConnectivityManager.TYPE_NONE, null, null);
+
+        // If provisioning network handle as a special case,
+        // otherwise launch browser with the intent directly.
+        NetworkInfo ni = getProvisioningNetworkInfo();
+        if ((ni != null) && ni.getDetailedState() ==
+                    NetworkInfo.DetailedState.CONNECTED_TO_PROVISIONING_NETWORK) {
+            if (DBG) log("handleMobileProvisioningAction: on provisioning network");
+            MobileDataStateTracker mdst = (MobileDataStateTracker)
+                    mNetTrackers[ConnectivityManager.TYPE_MOBILE];
+            mdst.enableMobileProvisioning(url);
+        } else {
+            if (DBG) log("handleMobileProvisioningAction: on default network");
+            Intent newIntent =
+                    new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+            newIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
+                    Intent.FLAG_ACTIVITY_NEW_TASK);
+            try {
+                mContext.startActivity(newIntent);
+            } catch (ActivityNotFoundException e) {
+                loge("handleMobileProvisioningAction: startActivity failed" + e);
+            }
+        }
+    }
+
+    private static final String NOTIFICATION_ID = "CaptivePortal.Notification";
+    private volatile boolean mIsNotificationVisible = false;
+
+    private void setProvNotificationVisible(boolean visible, int networkType, String extraInfo,
+            String url) {
+        if (DBG) {
+            log("setProvNotificationVisible: E visible=" + visible + " networkType=" + networkType
+                + " extraInfo=" + extraInfo + " url=" + url);
+        }
 
         Resources r = Resources.getSystem();
         NotificationManager notificationManager = (NotificationManager) mContext
@@ -4201,50 +4456,64 @@
             CharSequence title;
             CharSequence details;
             int icon;
-            switch (networkInfo.getType()) {
+            Intent intent;
+            Notification notification = new Notification();
+            switch (networkType) {
                 case ConnectivityManager.TYPE_WIFI:
-                    log("setNotificationVisible: TYPE_WIFI");
                     title = r.getString(R.string.wifi_available_sign_in, 0);
                     details = r.getString(R.string.network_available_sign_in_detailed,
-                            networkInfo.getExtraInfo());
+                            extraInfo);
                     icon = R.drawable.stat_notify_wifi_in_range;
+                    intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+                    intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
+                            Intent.FLAG_ACTIVITY_NEW_TASK);
+                    notification.contentIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
                     break;
                 case ConnectivityManager.TYPE_MOBILE:
                 case ConnectivityManager.TYPE_MOBILE_HIPRI:
-                    log("setNotificationVisible: TYPE_MOBILE|HIPRI");
                     title = r.getString(R.string.network_available_sign_in, 0);
                     // TODO: Change this to pull from NetworkInfo once a printable
                     // name has been added to it
                     details = mTelephonyManager.getNetworkOperatorName();
                     icon = R.drawable.stat_notify_rssi_in_range;
+                    intent = new Intent(CONNECTED_TO_PROVISIONING_NETWORK_ACTION);
+                    intent.putExtra("EXTRA_URL", url);
+                    intent.setFlags(0);
+                    notification.contentIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
                     break;
                 default:
-                    log("setNotificationVisible: other type=" + networkInfo.getType());
                     title = r.getString(R.string.network_available_sign_in, 0);
                     details = r.getString(R.string.network_available_sign_in_detailed,
-                            networkInfo.getExtraInfo());
+                            extraInfo);
                     icon = R.drawable.stat_notify_rssi_in_range;
+                    intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+                    intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
+                            Intent.FLAG_ACTIVITY_NEW_TASK);
+                    notification.contentIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
                     break;
             }
 
-            Notification notification = new Notification();
             notification.when = 0;
             notification.icon = icon;
             notification.flags = Notification.FLAG_AUTO_CANCEL;
-            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
-            intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT |
-                    Intent.FLAG_ACTIVITY_NEW_TASK);
-            notification.contentIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
             notification.tickerText = title;
             notification.setLatestEventInfo(mContext, title, details, notification.contentIntent);
 
-            log("setNotificaitionVisible: notify notificaiton=" + notification);
-            notificationManager.notify(NOTIFICATION_ID, 1, notification);
+            try {
+                notificationManager.notify(NOTIFICATION_ID, 1, notification);
+            } catch (NullPointerException npe) {
+                loge("setNotificaitionVisible: visible notificationManager npe=" + npe);
+                npe.printStackTrace();
+            }
         } else {
-            log("setNotificaitionVisible: cancel");
-            notificationManager.cancel(NOTIFICATION_ID, 1);
+            try {
+                notificationManager.cancel(NOTIFICATION_ID, 1);
+            } catch (NullPointerException npe) {
+                loge("setNotificaitionVisible: cancel notificationManager npe=" + npe);
+                npe.printStackTrace();
+            }
         }
-        log("setNotificationVisible: X visible=" + visible + " ni=" + networkInfo + " url=" + url);
+        mIsNotificationVisible = visible;
     }
 
     /** Location to an updatable file listing carrier provisioning urls.
@@ -4373,6 +4642,13 @@
         return url;
     }
 
+    @Override
+    public void setProvisioningNotificationVisible(boolean visible, int networkType,
+            String extraInfo, String url) {
+        enforceConnectivityInternalPermission();
+        setProvNotificationVisible(visible, networkType, extraInfo, url);
+    }
+
     private void onUserStart(int userId) {
         synchronized(mVpns) {
             Vpn userVpn = mVpns.get(userId);
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index 95c768f..de29155 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -1156,6 +1156,8 @@
         if (changesMade) {
             mContext.sendBroadcastAsUser(new Intent(LocationManager.PROVIDERS_CHANGED_ACTION),
                     UserHandle.ALL);
+            mContext.sendBroadcastAsUser(new Intent(LocationManager.MODE_CHANGED_ACTION),
+                    UserHandle.ALL);
         }
     }
 
diff --git a/services/java/com/android/server/PreferredComponent.java b/services/java/com/android/server/PreferredComponent.java
index bb22545..134b198 100644
--- a/services/java/com/android/server/PreferredComponent.java
+++ b/services/java/com/android/server/PreferredComponent.java
@@ -33,8 +33,16 @@
 import java.util.List;
 
 public class PreferredComponent {
+    private static final String TAG_SET = "set";
+    private static final String ATTR_ALWAYS = "always"; // boolean
+    private static final String ATTR_MATCH = "match"; // number
+    private static final String ATTR_NAME = "name"; // component name
+    private static final String ATTR_SET = "set"; // number
+
     public final int mMatch;
     public final ComponentName mComponent;
+    // Whether this is to be the one that's always chosen. If false, it's the most recently chosen.
+    public boolean mAlways;
 
     private final String[] mSetPackages;
     private final String[] mSetClasses;
@@ -50,10 +58,11 @@
     }
 
     public PreferredComponent(Callbacks callbacks, int match, ComponentName[] set,
-            ComponentName component) {
+            ComponentName component, boolean always) {
         mCallbacks = callbacks;
         mMatch = match&IntentFilter.MATCH_CATEGORY_MASK;
         mComponent = component;
+        mAlways = always;
         mShortComponent = component.flattenToShortString();
         mParseError = null;
         if (set != null) {
@@ -86,15 +95,17 @@
     public PreferredComponent(Callbacks callbacks, XmlPullParser parser)
             throws XmlPullParserException, IOException {
         mCallbacks = callbacks;
-        mShortComponent = parser.getAttributeValue(null, "name");
+        mShortComponent = parser.getAttributeValue(null, ATTR_NAME);
         mComponent = ComponentName.unflattenFromString(mShortComponent);
         if (mComponent == null) {
             mParseError = "Bad activity name " + mShortComponent;
         }
-        String matchStr = parser.getAttributeValue(null, "match");
+        String matchStr = parser.getAttributeValue(null, ATTR_MATCH);
         mMatch = matchStr != null ? Integer.parseInt(matchStr, 16) : 0;
-        String setCountStr = parser.getAttributeValue(null, "set");
+        String setCountStr = parser.getAttributeValue(null, ATTR_SET);
         int setCount = setCountStr != null ? Integer.parseInt(setCountStr) : 0;
+        String alwaysStr = parser.getAttributeValue(null, ATTR_ALWAYS);
+        mAlways = alwaysStr != null ? Boolean.parseBoolean(alwaysStr) : true;
 
         String[] myPackages = setCount > 0 ? new String[setCount] : null;
         String[] myClasses = setCount > 0 ? new String[setCount] : null;
@@ -115,8 +126,8 @@
             String tagName = parser.getName();
             //Log.i(TAG, "Parse outerDepth=" + outerDepth + " depth="
             //        + parser.getDepth() + " tag=" + tagName);
-            if (tagName.equals("set")) {
-                String name = parser.getAttributeValue(null, "name");
+            if (tagName.equals(TAG_SET)) {
+                String name = parser.getAttributeValue(null, ATTR_NAME);
                 if (name == null) {
                     if (mParseError == null) {
                         mParseError = "No name in set tag in preferred activity "
@@ -166,16 +177,17 @@
 
     public void writeToXml(XmlSerializer serializer, boolean full) throws IOException {
         final int NS = mSetClasses != null ? mSetClasses.length : 0;
-        serializer.attribute(null, "name", mShortComponent);
+        serializer.attribute(null, ATTR_NAME, mShortComponent);
         if (full) {
             if (mMatch != 0) {
-                serializer.attribute(null, "match", Integer.toHexString(mMatch));
+                serializer.attribute(null, ATTR_MATCH, Integer.toHexString(mMatch));
             }
-            serializer.attribute(null, "set", Integer.toString(NS));
+            serializer.attribute(null, ATTR_ALWAYS, Boolean.toString(mAlways));
+            serializer.attribute(null, ATTR_SET, Integer.toString(NS));
             for (int s=0; s<NS; s++) {
-                serializer.startTag(null, "set");
-                serializer.attribute(null, "name", mSetComponents[s]);
-                serializer.endTag(null, "set");
+                serializer.startTag(null, TAG_SET);
+                serializer.attribute(null, ATTR_NAME, mSetComponents[s]);
+                serializer.endTag(null, TAG_SET);
             }
         }
     }
diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java
index 8fb3998..1b8876d 100644
--- a/services/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/java/com/android/server/accessibility/TouchExplorer.java
@@ -417,9 +417,6 @@
                     mSendTouchInteractionEndDelayed.forceSendAndRemove();
                 }
 
-                // Cache the event until we discern exploration from gesturing.
-                mSendHoverEnterAndMoveDelayed.addEvent(event);
-
                 // If we have the first tap, schedule a long press and break
                 // since we do not want to schedule hover enter because
                 // the delayed callback will kick in before the long click.
@@ -432,11 +429,16 @@
                     break;
                 }
                 if (!mTouchExplorationInProgress) {
-                    // Deliver hover enter with a delay to have a chance
-                    // to detect what the user is trying to do.
-                    final int pointerId = receivedTracker.getPrimaryPointerId();
-                    final int pointerIdBits = (1 << pointerId);
-                    mSendHoverEnterAndMoveDelayed.post(event, true, pointerIdBits, policyFlags);
+                    if (!mSendHoverEnterAndMoveDelayed.isPending()) {
+                        // Deliver hover enter with a delay to have a chance
+                        // to detect what the user is trying to do.
+                        final int pointerId = receivedTracker.getPrimaryPointerId();
+                        final int pointerIdBits = (1 << pointerId);
+                        mSendHoverEnterAndMoveDelayed.post(event, true, pointerIdBits,
+                                policyFlags);
+                    }
+                    // Cache the event until we discern exploration from gesturing.
+                    mSendHoverEnterAndMoveDelayed.addEvent(event);
                 }
             } break;
             case MotionEvent.ACTION_POINTER_DOWN: {
@@ -1719,7 +1721,7 @@
                 } break;
             }
             if (DEBUG) {
-                Slog.i(LOG_TAG_RECEIVED_POINTER_TRACKER, "Received pointer: " + toString());
+                Slog.i(LOG_TAG_RECEIVED_POINTER_TRACKER, "Received pointer:\n" + toString());
             }
         }
 
@@ -1777,7 +1779,7 @@
          */
         public int getPrimaryPointerId() {
             if (mPrimaryPointerId == INVALID_POINTER_ID) {
-                mPrimaryPointerId = findPrimaryPointer();
+                mPrimaryPointerId = findPrimaryPointerId();
             }
             return mPrimaryPointerId;
         }
@@ -1861,17 +1863,21 @@
         }
 
         /**
-         * @return The primary pointer.
+         * @return The primary pointer id.
          */
-        private int findPrimaryPointer() {
+        private int findPrimaryPointerId() {
             int primaryPointerId = INVALID_POINTER_ID;
             long minDownTime = Long.MAX_VALUE;
+
             // Find the pointer that went down first.
-            for (int i = 0, count = mReceivedPointerDownTime.length; i < count; i++) {
-                final long downPointerTime = mReceivedPointerDownTime[i];
+            int pointerIdBits = mReceivedPointersDown;
+            while (pointerIdBits > 0) {
+                final int pointerId = Integer.numberOfTrailingZeros(pointerIdBits);
+                pointerIdBits &= ~(1 << pointerId);
+                final long downPointerTime = mReceivedPointerDownTime[pointerId];
                 if (downPointerTime < minDownTime) {
                     minDownTime = downPointerTime;
-                    primaryPointerId = i;
+                    primaryPointerId = pointerId;
                 }
             }
             return primaryPointerId;
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 4678b85..75cf5d0 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -407,12 +407,13 @@
         @Override
         public void run() {
             if (activityExtras == null) {
-                Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from " + activity);
+                Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from activtity "
+                        + activity);
             }
             for (int i = 0; i < services.size(); i++) {
                 if (servicesExtras[i] == null) {
-                    Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from "
-                            + services.get(i));
+                    Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from service "
+                            + i + " " + services.get(i));
                 }
             }
             synchronized (this) {
@@ -6517,8 +6518,11 @@
                     }
                 }
                 final long origId = Binder.clearCallingIdentity();
-                stack.moveTaskToBackLocked(taskId, null);
-                Binder.restoreCallingIdentity(origId);
+                try {
+                    stack.moveTaskToBackLocked(taskId, null);
+                } finally {
+                    Binder.restoreCallingIdentity(origId);
+                }
             }
         }
     }
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 2fefadf..8d27c5c 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -255,7 +255,7 @@
         //public Handler() {
         //    if (localLOGV) Slog.v(TAG, "Handler started!");
         //}
-        public ActivityStackHandler(Looper looper) {
+        ActivityStackHandler(Looper looper) {
             super(looper);
         }
 
@@ -331,7 +331,6 @@
         mWindowManager = service.mWindowManager;
         mStackSupervisor = service.mStackSupervisor;
         mContext = context;
-        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
         mStackId = stackId;
         mCurrentUser = service.mCurrentUserId;
     }
@@ -837,7 +836,7 @@
         }
     }
 
-    private final void completePauseLocked() {
+    private void completePauseLocked() {
         ActivityRecord prev = mPausingActivity;
         if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev);
 
@@ -1765,7 +1764,7 @@
         for (int taskNdx = 0; taskNdx < numTasks; ++taskNdx) {
             TaskRecord task = mTaskHistory.get(taskNdx);
             final ArrayList<ActivityRecord> activities = task.mActivities;
-            if (activities.size() == 0) {
+            if (activities.isEmpty()) {
                 continue;
             }
             TaskGroup group = new TaskGroup();
@@ -2335,7 +2334,7 @@
 
         finishActivityResultsLocked(r, resultCode, resultData);
 
-        if (mService.mPendingThumbnails.size() > 0) {
+        if (!mService.mPendingThumbnails.isEmpty()) {
             // There are clients waiting to receive thumbnails so, in case
             // this is an activity that someone is waiting for, add it
             // to the pending list so we can correctly update the clients.
@@ -2561,7 +2560,7 @@
             cleanUpActivityServicesLocked(r);
         }
 
-        if (mService.mPendingThumbnails.size() > 0) {
+        if (!mService.mPendingThumbnails.isEmpty()) {
             // There are clients waiting to receive thumbnails so, in case
             // this is an activity that someone is waiting for, add it
             // to the pending list so we can correctly update the clients.
@@ -2698,7 +2697,7 @@
                     mService.mHandler.sendEmptyMessage(
                             ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
                 }
-                if (r.app.activities.size() == 0) {
+                if (r.app.activities.isEmpty()) {
                     // No longer have activities, so update oom adj.
                     mService.updateOomAdjLocked();
                 }
@@ -3009,9 +3008,38 @@
         if (tr == null) {
             return false;
         }
+
         mTaskHistory.remove(tr);
         mTaskHistory.add(0, tr);
 
+        // There is an assumption that moving a task to the back moves it behind the home activity.
+        // We make sure here that some activity in the stack will launch home.
+        ActivityRecord lastActivity = null;
+        int numTasks = mTaskHistory.size();
+        int taskNdx;
+        for (taskNdx = numTasks - 1; taskNdx >= 1; --taskNdx) {
+            final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
+            int activityNdx;
+            for (activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
+                final ActivityRecord r = activities.get(activityNdx);
+                if (r.mLaunchHomeTaskNext) {
+                    break;
+                }
+                if (taskNdx == 1 && activityNdx == 0) {
+                    // Final activity before tr task.
+                    lastActivity = r;
+                }
+            }
+            if (activityNdx >= 0) {
+                // Early exit, we found an activity that will launchHomeTaskNext.
+                break;
+            }
+        }
+        if (lastActivity != null) {
+            // No early exit, we did not find an activity that will launchHomeTaskNext, set one.
+            lastActivity.mLaunchHomeTaskNext = true;
+        }
+
         if (reason != null &&
                 (reason.intent.getFlags() & Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
             mWindowManager.prepareAppTransition(AppTransition.TRANSIT_NONE, false);
@@ -3020,8 +3048,7 @@
                 mNoAnimActivities.add(r);
             }
         } else {
-            mWindowManager.prepareAppTransition(
-                    AppTransition.TRANSIT_TASK_TO_BACK, false);
+            mWindowManager.prepareAppTransition(AppTransition.TRANSIT_TASK_TO_BACK, false);
         }
         mWindowManager.moveTaskToBottom(task);
 
@@ -3029,9 +3056,8 @@
             validateAppTokensLocked();
         }
 
-        if (mResumedActivity != null && mResumedActivity.task == tr &&
-                mResumedActivity.mLaunchHomeTaskNext) {
-            // TODO: Can we skip the next line and just pass mResumedAct. to resumeHomeAct.()?
+        if (numTasks <= 1 || (mResumedActivity != null && mResumedActivity.task == tr &&
+                mResumedActivity.mLaunchHomeTaskNext)) {
             mResumedActivity.mLaunchHomeTaskNext = false;
             return mStackSupervisor.resumeHomeActivity(null);
         }
@@ -3175,7 +3201,7 @@
         return true;
     }
 
-    private final boolean relaunchActivityLocked(ActivityRecord r,
+    private boolean relaunchActivityLocked(ActivityRecord r,
             int changes, boolean andResume) {
         List<ResultInfo> results = null;
         List<Intent> newIntents = null;
@@ -3487,7 +3513,7 @@
 
     boolean removeTask(TaskRecord task) {
         mTaskHistory.remove(task);
-        return mTaskHistory.size() == 0;
+        return mTaskHistory.isEmpty();
     }
 
     TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent, boolean toTop) {
diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java
index 250ab4a..3e0b5eb 100644
--- a/services/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1426,8 +1426,7 @@
                             if ((launchFlags &
                                     (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
                                     == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
-                                // Caller wants to appear on home activity, so before starting
-                                // their own activity we will bring home to the front.
+                                // Caller wants to appear on home activity.
                                 r.mLaunchHomeTaskNext = true;
                             }
                             targetStack.moveTaskToFrontLocked(intentActivity.task, r, options);
@@ -1541,6 +1540,8 @@
                         // don't use that intent!)  And for paranoia, make
                         // sure we have correctly resumed the top activity.
                         if (doResume) {
+                            // Reset flag so it gets correctly reevaluated.
+                            intentActivity.mLaunchHomeTaskNext = false;
                             setLaunchHomeTaskNextFlag(sourceRecord, intentActivity, targetStack);
                             targetStack.resumeTopActivityLocked(null, options);
                         } else {
diff --git a/services/java/com/android/server/content/ContentService.java b/services/java/com/android/server/content/ContentService.java
index a56af08..7c82821 100644
--- a/services/java/com/android/server/content/ContentService.java
+++ b/services/java/com/android/server/content/ContentService.java
@@ -19,7 +19,6 @@
 import android.Manifest;
 import android.accounts.Account;
 import android.app.ActivityManager;
-import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.IContentService;
@@ -363,8 +362,8 @@
             if (syncManager != null) {
                 if (request.hasAuthority()) {
                     // Sync Adapter registered with the system - old API.
-                    final  Account account = request.getProviderInfo().first;
-                    final String provider = request.getProviderInfo().second;
+                    final  Account account = request.getAccount();
+                    final String provider = request.getProvider();
                     if (request.isPeriodic()) {
                         mContext.enforceCallingOrSelfPermission(
                                 Manifest.permission.WRITE_SYNC_SETTINGS,
@@ -386,20 +385,7 @@
                                 false /* onlyThoseWithUnknownSyncableState */);
                     }
                 } else {
-                    // Anonymous sync - new API.
-                    final ComponentName syncService = request.getService();
-                    if (request.isPeriodic()) {
-                        throw new RuntimeException("Periodic anonymous syncs not implemented yet.");
-                    } else {
-                        long beforeRuntimeMillis = (flextime) * 1000;
-                        long runtimeMillis = runAtTime * 1000;
-                        syncManager.scheduleSync(
-                              syncService, userId, uId, extras,
-                              beforeRuntimeMillis,
-                              runtimeMillis,
-                              false /* onlyThoseWithUnknownSyncableState */); // Empty function.
-                        throw new RuntimeException("One-off anonymous syncs not implemented yet.");
-                    }
+                    Log.w(TAG, "Unrecognised sync parameters, doing nothing.");
                 }
             }
         } finally {
diff --git a/services/java/com/android/server/content/SyncManager.java b/services/java/com/android/server/content/SyncManager.java
index a6b69a2..9a41166 100644
--- a/services/java/com/android/server/content/SyncManager.java
+++ b/services/java/com/android/server/content/SyncManager.java
@@ -87,6 +87,7 @@
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -539,177 +540,6 @@
     }
 
     /**
-     * Initiate a sync using the new anonymous service API.
-     * TODO: Implement.
-     * @param cname SyncService component bound to in order to perform the sync. 
-     * @param userId the id of the user whose accounts are to be synced. If userId is USER_ALL,
-     *          then all users' accounts are considered.
-     * @param uid Linux uid of the application that is performing the sync. 
-     * @param extras a Map of SyncAdapter-specific information to control
-     *          syncs of a specific provider. Can be null.
-     * @param beforeRunTimeMillis
-     *  @param runtimeMillis
-     */
-    public void scheduleSync(ComponentName cname, int userId, int uid, Bundle extras,
-            long beforeRunTimeMillis, long runtimeMillis,
-            boolean onlyThoseWithUnknownSyncableState) {
-/**
-        boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
-
-        final boolean backgroundDataUsageAllowed = !mBootCompleted ||
-                getConnectivityManager().getBackgroundDataSetting();
-
-        if (extras == null) {
-            extras = new Bundle();
-        }
-        if (isLoggable) {
-            Log.e(TAG, requestedAccount + " " + extras.toString() + " " + requestedAuthority);
-        }
-        Boolean expedited = extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
-        if (expedited) {
-            runtimeMillis = -1; // this means schedule at the front of the queue
-        }
-
-        AccountAndUser[] accounts;
-        if (requestedAccount != null && userId != UserHandle.USER_ALL) {
-            accounts = new AccountAndUser[] { new AccountAndUser(requestedAccount, userId) };
-        } else {
-            // if the accounts aren't configured yet then we can't support an account-less
-            // sync request
-            accounts = mRunningAccounts;
-            if (accounts.length == 0) {
-                if (isLoggable) {
-                    Log.v(TAG, "scheduleSync: no accounts configured, dropping");
-                }
-                return;
-            }
-        }
-
-        final boolean uploadOnly = extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, false);
-        final boolean manualSync = extras.getBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
-        if (manualSync) {
-            extras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, true);
-            extras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);
-        }
-        final boolean ignoreSettings =
-                extras.getBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, false);
-
-        int source;
-        if (uploadOnly) {
-            source = SyncStorageEngine.SOURCE_LOCAL;
-        } else if (manualSync) {
-            source = SyncStorageEngine.SOURCE_USER;
-        } else if (requestedAuthority == null) {
-            source = SyncStorageEngine.SOURCE_POLL;
-        } else {
-            // this isn't strictly server, since arbitrary callers can (and do) request
-            // a non-forced two-way sync on a specific url
-            source = SyncStorageEngine.SOURCE_SERVER;
-        }
-
-        for (AccountAndUser account : accounts) {
-            // Compile a list of authorities that have sync adapters.
-            // For each authority sync each account that matches a sync adapter.
-            final HashSet<String> syncableAuthorities = new HashSet<String>();
-            for (RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapter :
-                    mSyncAdapters.getAllServices(account.userId)) {
-                syncableAuthorities.add(syncAdapter.type.authority);
-            }
-
-            // if the url was specified then replace the list of authorities
-            // with just this authority or clear it if this authority isn't
-            // syncable
-            if (requestedAuthority != null) {
-                final boolean hasSyncAdapter = syncableAuthorities.contains(requestedAuthority);
-                syncableAuthorities.clear();
-                if (hasSyncAdapter) syncableAuthorities.add(requestedAuthority);
-            }
-
-            for (String authority : syncableAuthorities) {
-                int isSyncable = getIsSyncable(account.account, account.userId,
-                        authority);
-                if (isSyncable == 0) {
-                    continue;
-                }
-                final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
-                syncAdapterInfo = mSyncAdapters.getServiceInfo(
-                        SyncAdapterType.newKey(authority, account.account.type), account.userId);
-                if (syncAdapterInfo == null) {
-                    continue;
-                }
-                final boolean allowParallelSyncs = syncAdapterInfo.type.allowParallelSyncs();
-                final boolean isAlwaysSyncable = syncAdapterInfo.type.isAlwaysSyncable();
-                if (isSyncable < 0 && isAlwaysSyncable) {
-                    mSyncStorageEngine.setIsSyncable(account.account, account.userId, authority, 1);
-                    isSyncable = 1;
-                }
-                if (onlyThoseWithUnkownSyncableState && isSyncable >= 0) {
-                    continue;
-                }
-                if (!syncAdapterInfo.type.supportsUploading() && uploadOnly) {
-                    continue;
-                }
-
-                // always allow if the isSyncable state is unknown
-                boolean syncAllowed =
-                        (isSyncable < 0)
-                        || ignoreSettings
-                        || (backgroundDataUsageAllowed
-                                && mSyncStorageEngine.getMasterSyncAutomatically(account.userId)
-                                && mSyncStorageEngine.getSyncAutomatically(account.account,
-                                        account.userId, authority));
-                if (!syncAllowed) {
-                    if (isLoggable) {
-                        Log.d(TAG, "scheduleSync: sync of " + account + ", " + authority
-                                + " is not allowed, dropping request");
-                    }
-                    continue;
-                }
-
-                Pair<Long, Long> backoff = mSyncStorageEngine
-                        .getBackoff(account.account, account.userId, authority);
-                long delayUntil = mSyncStorageEngine.getDelayUntilTime(account.account,
-                        account.userId, authority);
-                final long backoffTime = backoff != null ? backoff.first : 0;
-                if (isSyncable < 0) {
-                    // Initialisation sync.
-                    Bundle newExtras = new Bundle();
-                    newExtras.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true);
-                    if (isLoggable) {
-                        Log.v(TAG, "schedule initialisation Sync:"
-                                + ", delay until " + delayUntil
-                                + ", run by " + 0
-                                + ", source " + source
-                                + ", account " + account
-                                + ", authority " + authority
-                                + ", extras " + newExtras);
-                    }
-                    scheduleSyncOperation(
-                            new SyncOperation(account.account, account.userId, reason, source,
-                                    authority, newExtras, 0 /* immediate , 0 /* No flex time,
-                                    backoffTime, delayUntil, allowParallelSyncs));
-                }
-                if (!onlyThoseWithUnkownSyncableState) {
-                    if (isLoggable) {
-                        Log.v(TAG, "scheduleSync:"
-                                + " delay until " + delayUntil
-                                + " run by " + runtimeMillis
-                                + " flex " + beforeRuntimeMillis
-                                + ", source " + source
-                                + ", account " + account
-                                + ", authority " + authority
-                                + ", extras " + extras);
-                    }
-                    scheduleSyncOperation(
-                            new SyncOperation(account.account, account.userId, reason, source,
-                                    authority, extras, runtimeMillis, beforeRuntimeMillis,
-                                    backoffTime, delayUntil, allowParallelSyncs));
-                }
-            }
-        }*/
-    }
-
-    /**
      * Initiate a sync. This can start a sync for all providers
      * (pass null to url, set onlyTicklable to false), only those
      * providers that are marked as ticklable (pass null to url,
@@ -2190,17 +2020,14 @@
                 for (int i = 0, N = authorityInfo.periodicSyncs.size(); i < N; i++) {
                     final PeriodicSync sync = authorityInfo.periodicSyncs.get(i);
                     final Bundle extras = sync.extras;
-                    final Long periodInMillis = sync.period * 1000;
-                    final Long flexInMillis = sync.flexTime * 1000;
+                    final long periodInMillis = sync.period * 1000;
+                    final long flexInMillis = sync.flexTime * 1000;
                     // Skip if the period is invalid.
                     if (periodInMillis <= 0) {
                         continue;
                     }
                     // Find when this periodic sync was last scheduled to run.
                     final long lastPollTimeAbsolute = status.getPeriodicSyncTime(i);
-                    final long shiftedLastPollTimeAbsolute =
-                            (0 < lastPollTimeAbsolute - mSyncRandomOffsetMillis) ?
-                                    (lastPollTimeAbsolute - mSyncRandomOffsetMillis) : 0;
                     long remainingMillis
                         = periodInMillis - (shiftedNowAbsolute % periodInMillis);
                     long timeSinceLastRunMillis
@@ -2217,7 +2044,6 @@
                         + " remaining: " + (remainingMillis)
                         + " time_since_last: " + timeSinceLastRunMillis
                         + " last poll absol: " + lastPollTimeAbsolute
-                        + " last poll shifed: " + shiftedLastPollTimeAbsolute
                         + " shifted now: " + shiftedNowAbsolute
                         + " run_early: " + runEarly);
                     }
@@ -2392,6 +2218,15 @@
                         }
                         continue;
                     }
+
+                    // If the op isn't allowed on metered networks and we're on one, drop it.
+                    if (getConnectivityManager().isActiveNetworkMetered()
+                            && op.isMeteredDisallowed()) {
+                        operationIterator.remove();
+                        mSyncStorageEngine.deleteFromPending(op.pendingOperation);
+                        continue;
+                    }
+
                     // TODO: change this behaviour for non-registered syncs.
                     final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo;
                     syncAdapterInfo = mSyncAdapters.getServiceInfo(
diff --git a/services/java/com/android/server/content/SyncOperation.java b/services/java/com/android/server/content/SyncOperation.java
index ce1dde4..48567478 100644
--- a/services/java/com/android/server/content/SyncOperation.java
+++ b/services/java/com/android/server/content/SyncOperation.java
@@ -111,40 +111,6 @@
         this.key = toKey();
     }
 
-    public SyncOperation(SyncRequest request, int userId, int reason, int source, long backoff,
-            long delayUntil, boolean allowParallelSyncs) {
-        if (request.hasAuthority()) {
-            Pair<Account, String> providerInfo = request.getProviderInfo();
-            this.account = providerInfo.first;
-            this.authority = providerInfo.second;
-            this.service = null;
-        } else {
-            this.service = request.getService();
-            this.account = null;
-            this.authority = null;
-        }
-        this.userId = userId;
-        this.reason = reason;
-        this.syncSource = source;
-        this.allowParallelSyncs = allowParallelSyncs;
-        this.extras = new Bundle(extras);
-        cleanBundle(this.extras);
-        this.delayUntil = delayUntil;
-        this.backoff = backoff;
-        final long now = SystemClock.elapsedRealtime();
-        if (request.isExpedited()) {
-            this.expedited = true;
-            this.latestRunTime = now;
-            this.flexTime = 0;
-        } else {
-            this.expedited = false;
-            this.latestRunTime = now + (request.getSyncRunTime() * 1000);
-            this.flexTime = request.getSyncFlexTime() * 1000;
-        }
-        updateEffectiveRunTime();
-        this.key = toKey();
-    }
-
     /**
      * Make sure the bundle attached to this SyncOperation doesn't have unnecessary
      * flags set.
@@ -159,7 +125,7 @@
         removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS);
         removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_EXPEDITED);
         removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS);
-        removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_ALLOW_METERED);
+        removeFalseExtra(bundle, ContentResolver.SYNC_EXTRAS_DISALLOW_METERED);
 
         // Remove Config data.
         bundle.remove(ContentResolver.SYNC_EXTRAS_EXPECTED_UPLOAD);
@@ -245,8 +211,8 @@
         }
     }
 
-    public boolean isMetered() {
-        return extras.getBoolean(ContentResolver.SYNC_EXTRAS_ALLOW_METERED, false);
+    public boolean isMeteredDisallowed() {
+        return extras.getBoolean(ContentResolver.SYNC_EXTRAS_DISALLOW_METERED, false);
     }
 
     public boolean isInitialization() {
diff --git a/services/java/com/android/server/content/SyncStorageEngine.java b/services/java/com/android/server/content/SyncStorageEngine.java
index e3693f8..1b9ed98 100644
--- a/services/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/java/com/android/server/content/SyncStorageEngine.java
@@ -71,7 +71,7 @@
 public class SyncStorageEngine extends Handler {
 
     private static final String TAG = "SyncManager";
-    private static final boolean DEBUG = true;
+    private static final boolean DEBUG = false;
     private static final String TAG_FILE = "SyncManagerFile";
 
     private static final String XML_ATTR_NEXT_AUTHORITY_ID = "nextAuthorityId";
diff --git a/services/java/com/android/server/location/GeofenceProxy.java b/services/java/com/android/server/location/GeofenceProxy.java
index a86c923..bbc1f47 100644
--- a/services/java/com/android/server/location/GeofenceProxy.java
+++ b/services/java/com/android/server/location/GeofenceProxy.java
@@ -41,11 +41,15 @@
     private static final String TAG = "GeofenceProxy";
     private static final String SERVICE_ACTION =
             "com.android.location.service.GeofenceProvider";
-    private ServiceWatcher mServiceWatcher;
-    private Context mContext;
+    private final ServiceWatcher mServiceWatcher;
+    private final Context mContext;
+    private final IGpsGeofenceHardware mGpsGeofenceHardware;
+    private final IFusedGeofenceHardware mFusedGeofenceHardware;
+
+    private final Object mLock = new Object();
+
+    // Access to mGeofenceHardware needs to be synchronized by mLock.
     private IGeofenceHardware mGeofenceHardware;
-    private IGpsGeofenceHardware mGpsGeofenceHardware;
-    private IFusedGeofenceHardware mFusedGeofenceHardware;
 
     private static final int GEOFENCE_PROVIDER_CONNECTED = 1;
     private static final int GEOFENCE_HARDWARE_CONNECTED = 2;
@@ -90,10 +94,6 @@
         return mServiceWatcher.start();
     }
 
-    private IGeofenceProvider getGeofenceProviderService() {
-        return IGeofenceProvider.Stub.asInterface(mServiceWatcher.getBinder());
-    }
-
     private void bindHardwareGeofence() {
         mContext.bindServiceAsUser(new Intent(mContext, GeofenceHardwareService.class),
                 mServiceConnection, Context.BIND_AUTO_CREATE, UserHandle.OWNER);
@@ -102,26 +102,34 @@
     private ServiceConnection mServiceConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
-            mGeofenceHardware = IGeofenceHardware.Stub.asInterface(service);
-            mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_CONNECTED);
+            synchronized (mLock) {
+                mGeofenceHardware = IGeofenceHardware.Stub.asInterface(service);
+                mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_CONNECTED);
+            }
         }
 
         @Override
         public void onServiceDisconnected(ComponentName name) {
-            mGeofenceHardware = null;
-            mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_DISCONNECTED);
+            synchronized (mLock) {
+                mGeofenceHardware = null;
+                mHandler.sendEmptyMessage(GEOFENCE_HARDWARE_DISCONNECTED);
+            }
         }
     };
 
-    private void setGeofenceHardwareInProvider() {
+    private void setGeofenceHardwareInProviderLocked() {
         try {
-            getGeofenceProviderService().setGeofenceHardware(mGeofenceHardware);
+            IGeofenceProvider provider = IGeofenceProvider.Stub.asInterface(
+                      mServiceWatcher.getBinder());
+            if (provider != null) {
+                provider.setGeofenceHardware(mGeofenceHardware);
+            }
         } catch (RemoteException e) {
-            Log.e(TAG, "Remote Exception: setGeofenceHardwareInProvider: " + e);
+            Log.e(TAG, "Remote Exception: setGeofenceHardwareInProviderLocked: " + e);
         }
     }
 
-    private void setGpsGeofence() {
+    private void setGpsGeofenceLocked() {
         try {
             mGeofenceHardware.setGpsGeofenceHardware(mGpsGeofenceHardware);
         } catch (RemoteException e) {
@@ -129,7 +137,7 @@
         }
     }
 
-    private void setFusedGeofence() {
+    private void setFusedGeofenceLocked() {
         try {
             mGeofenceHardware.setFusedGeofenceHardware(mFusedGeofenceHardware);
         } catch(RemoteException e) {
@@ -140,30 +148,37 @@
     // This needs to be reworked, when more services get added,
     // Might need a state machine or add a framework utility class,
     private Handler mHandler = new Handler() {
-        private boolean mGeofenceHardwareConnected = false;
-        private boolean mGeofenceProviderConnected = false;
-
 
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case GEOFENCE_PROVIDER_CONNECTED:
-                    mGeofenceProviderConnected = true;
-                    if (mGeofenceHardwareConnected) {
-                        setGeofenceHardwareInProvider();
+                    synchronized (mLock) {
+                        if (mGeofenceHardware != null) {
+                            setGeofenceHardwareInProviderLocked();
+                        }
+                        // else: the geofence provider will be notified when the connection to
+                        // GeofenceHardwareService is established.
                     }
                     break;
                 case GEOFENCE_HARDWARE_CONNECTED:
-                    setGpsGeofence();
-                    setFusedGeofence();
-                    mGeofenceHardwareConnected = true;
-                    if (mGeofenceProviderConnected) {
-                        setGeofenceHardwareInProvider();
+                    synchronized (mLock) {
+                        // Theoretically this won't happen because once the GeofenceHardwareService
+                        // is connected to, we won't lose connection to it because it's a system
+                        // service. But this check does make the code more robust.
+                        if (mGeofenceHardware != null) {
+                            setGpsGeofenceLocked();
+                            setFusedGeofenceLocked();
+                            setGeofenceHardwareInProviderLocked();
+                        }
                     }
                     break;
                 case GEOFENCE_HARDWARE_DISCONNECTED:
-                    mGeofenceHardwareConnected = false;
-                    setGeofenceHardwareInProvider();
+                    synchronized (mLock) {
+                        if (mGeofenceHardware == null) {
+                            setGeofenceHardwareInProviderLocked();
+                        }
+                    }
                     break;
             }
         }
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 4942141..686b64e 100755
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -122,6 +122,7 @@
 import android.util.EventLog;
 import android.util.Log;
 import android.util.LogPrinter;
+import android.util.PrintStreamPrinter;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.Xml;
@@ -2595,6 +2596,37 @@
         return chooseBestActivity(intent, resolvedType, flags, query, userId);
     }
 
+    @Override
+    public void setLastChosenActivity(Intent intent, String resolvedType, int flags,
+            IntentFilter filter, int match, ComponentName activity) {
+        final int userId = UserHandle.getCallingUserId();
+        if (DEBUG_PREFERRED) {
+            Log.v(TAG, "setLastChosenActivity intent=" + intent
+                + " resolvedType=" + resolvedType
+                + " flags=" + flags
+                + " filter=" + filter
+                + " match=" + match
+                + " activity=" + activity);
+            filter.dump(new PrintStreamPrinter(System.out), "    ");
+        }
+        intent.setComponent(null);
+        List<ResolveInfo> query = queryIntentActivities(intent, resolvedType, flags, userId);
+        // Find any earlier preferred or last chosen entries and nuke them
+        findPreferredActivity(intent, resolvedType,
+                flags, query, 0, false, true, userId);
+        // Add the new activity as the last chosen for this filter
+        addPreferredActivityInternal(filter, match, null, activity, false, userId);
+    }
+
+    @Override
+    public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) {
+        final int userId = UserHandle.getCallingUserId();
+        if (DEBUG_PREFERRED) Log.v(TAG, "Querying last chosen activity for " + intent);
+        List<ResolveInfo> query = queryIntentActivities(intent, resolvedType, flags, userId);
+        return findPreferredActivity(intent, resolvedType, flags, query, 0,
+                false, false, userId);
+    }
+
     private ResolveInfo chooseBestActivity(Intent intent, String resolvedType,
             int flags, List<ResolveInfo> query, int userId) {
         if (query != null) {
@@ -2620,7 +2652,7 @@
                 // If we have saved a preference for a preferred activity for
                 // this Intent, use that.
                 ResolveInfo ri = findPreferredActivity(intent, resolvedType,
-                        flags, query, r0.priority, userId);
+                        flags, query, r0.priority, true, false, userId);
                 if (ri != null) {
                     return ri;
                 }
@@ -2639,16 +2671,18 @@
         return null;
     }
 
-    ResolveInfo findPreferredActivity(Intent intent, String resolvedType,
-            int flags, List<ResolveInfo> query, int priority, int userId) {
+    ResolveInfo findPreferredActivity(Intent intent, String resolvedType, int flags,
+            List<ResolveInfo> query, int priority, boolean always,
+            boolean removeMatches, int userId) {
         if (!sUserManager.exists(userId)) return null;
         // writer
         synchronized (mPackages) {
             if (intent.getSelector() != null) {
-                intent = intent.getSelector(); 
+                intent = intent.getSelector();
             }
             if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);
             PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId);
+            // Get the list of preferred activities that handle the intent
             List<PreferredActivity> prefs = pir != null
                     ? pir.queryIntent(intent, resolvedType,
                             (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId)
@@ -2683,7 +2717,25 @@
                 final int M = prefs.size();
                 for (int i=0; i<M; i++) {
                     final PreferredActivity pa = prefs.get(i);
+                    if (DEBUG_PREFERRED) {
+                        Log.v(TAG, "Checking PreferredActivity ds="
+                                + (pa.countDataSchemes() > 0 ? pa.getDataScheme(0) : "<none>")
+                                + "\n  component=" + pa.mPref.mComponent);
+                        pa.dump(new PrintStreamPrinter(System.out), "  ");
+                    }
                     if (pa.mPref.mMatch != match) {
+                        if (DEBUG_PREFERRED) {
+                            Log.v(TAG, "Skipping bad match "
+                                    + Integer.toHexString(pa.mPref.mMatch));
+                        }
+                        continue;
+                    }
+                    // If it's not an "always" type preferred activity and that's what we're
+                    // looking for, skip it.
+                    if (always && !pa.mPref.mAlways) {
+                        if (DEBUG_PREFERRED) {
+                            Log.v(TAG, "Skipping lastChosen entry");
+                        }
                         continue;
                     }
                     final ActivityInfo ai = getActivityInfo(pa.mPref.mComponent,
@@ -2717,22 +2769,41 @@
                             continue;
                         }
 
-                        // Okay we found a previously set preferred app.
+                        if (removeMatches) {
+                            pir.removeFilter(pa);
+                            if (DEBUG_PREFERRED) {
+                                Log.v(TAG, "Removing match " + pa.mPref.mComponent);
+                            }
+                            break;
+                        }
+
+                        // Okay we found a previously set preferred or last chosen app.
                         // If the result set is different from when this
                         // was created, we need to clear it and re-ask the
-                        // user their preference.
-                        if (!pa.mPref.sameSet(query, priority)) {
+                        // user their preference, if we're looking for an "always" type entry.
+                        if (always && !pa.mPref.sameSet(query, priority)) {
                             Slog.i(TAG, "Result set changed, dropping preferred activity for "
                                     + intent + " type " + resolvedType);
+                            if (DEBUG_PREFERRED) {
+                                Log.v(TAG, "Removing preferred activity since set changed "
+                                        + pa.mPref.mComponent);
+                            }
                             pir.removeFilter(pa);
+                            // Re-add the filter as a "last chosen" entry (!always)
+                            PreferredActivity lastChosen = new PreferredActivity(
+                                    pa, pa.mPref.mMatch, null, pa.mPref.mComponent, false);
+                            pir.addFilter(lastChosen);
+                            mSettings.writePackageRestrictionsLPr(userId);
                             return null;
                         }
 
-                        // Yay!
+                        // Yay! Either the set matched or we're looking for the last chosen
+                        mSettings.writePackageRestrictionsLPr(userId);
                         return ri;
                     }
                 }
             }
+            mSettings.writePackageRestrictionsLPr(userId);
         }
         return null;
     }
@@ -9606,9 +9677,14 @@
         }
         return Build.VERSION_CODES.CUR_DEVELOPMENT;
     }
-    
+
     public void addPreferredActivity(IntentFilter filter, int match,
             ComponentName[] set, ComponentName activity, int userId) {
+        addPreferredActivityInternal(filter, match, set, activity, true, userId);
+    }
+
+    private void addPreferredActivityInternal(IntentFilter filter, int match,
+            ComponentName[] set, ComponentName activity, boolean always, int userId) {
         // writer
         int callingUid = Binder.getCallingUid();
         enforceCrossUserPermission(callingUid, userId, true, "add preferred activity");
@@ -9629,7 +9705,7 @@
             Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :");
             filter.dump(new LogPrinter(Log.INFO, TAG), "  ");
             mSettings.editPreferredActivitiesLPw(userId).addFilter(
-                    new PreferredActivity(filter, match, set, activity));
+                    new PreferredActivity(filter, match, set, activity, always));
             mSettings.writePackageRestrictionsLPr(userId);
         }
     }
@@ -9691,7 +9767,7 @@
                     }
                 }
             }
-            addPreferredActivity(filter, match, set, activity, callingUserId);
+            addPreferredActivityInternal(filter, match, set, activity, true, callingUserId);
         }
     }
 
@@ -9736,8 +9812,11 @@
             Iterator<PreferredActivity> it = pir.filterIterator();
             while (it.hasNext()) {
                 PreferredActivity pa = it.next();
+                // Mark entry for removal only if it matches the package name
+                // and the entry is of type "always".
                 if (packageName == null ||
-                        pa.mPref.mComponent.getPackageName().equals(packageName)) {
+                        (pa.mPref.mComponent.getPackageName().equals(packageName)
+                                && pa.mPref.mAlways)) {
                     if (removed == null) {
                         removed = new ArrayList<PreferredActivity>();
                     }
@@ -9781,7 +9860,8 @@
                 while (it.hasNext()) {
                     final PreferredActivity pa = it.next();
                     if (packageName == null
-                            || pa.mPref.mComponent.getPackageName().equals(packageName)) {
+                            || (pa.mPref.mComponent.getPackageName().equals(packageName)
+                                    && pa.mPref.mAlways)) {
                         if (outFilters != null) {
                             outFilters.add(new IntentFilter(pa));
                         }
diff --git a/services/java/com/android/server/pm/PreferredActivity.java b/services/java/com/android/server/pm/PreferredActivity.java
index c655bb1..963cbe4 100644
--- a/services/java/com/android/server/pm/PreferredActivity.java
+++ b/services/java/com/android/server/pm/PreferredActivity.java
@@ -33,13 +33,13 @@
     private static final String TAG = "PreferredActivity";
 
     private static final boolean DEBUG_FILTERS = false;
-    static final String ATTR_USER_ID = "userId";
 
     final PreferredComponent mPref;
 
-    PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) {
+    PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity,
+            boolean always) {
         super(filter);
-        mPref = new PreferredComponent(this, match, set, activity);
+        mPref = new PreferredComponent(this, match, set, activity, always);
     }
 
     PreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException {
diff --git a/services/java/com/android/server/pm/PreferredIntentResolver.java b/services/java/com/android/server/pm/PreferredIntentResolver.java
index 7fe6a05..bce24d7 100644
--- a/services/java/com/android/server/pm/PreferredIntentResolver.java
+++ b/services/java/com/android/server/pm/PreferredIntentResolver.java
@@ -26,10 +26,12 @@
     protected PreferredActivity[] newArray(int size) {
         return new PreferredActivity[size];
     }
+
     @Override
     protected boolean isPackageForFilter(String packageName, PreferredActivity filter) {
         return packageName.equals(filter.mPref.mComponent.getPackageName());
     }
+
     @Override
     protected void dumpFilter(PrintWriter out, String prefix,
             PreferredActivity filter) {
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index e18202b..415cda1 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -1385,6 +1385,11 @@
 
                 StringBuilder sb = new StringBuilder();
                 for (final PackageSetting pkg : mPackages.values()) {
+                    if (pkg.pkg == null || pkg.pkg.applicationInfo == null) {
+                        Slog.w(TAG, "Skipping " + pkg + " due to missing metadata");
+                        continue;
+                    }
+
                     final ApplicationInfo ai = pkg.pkg.applicationInfo;
                     final String dataPath = ai.dataDir;
                     final boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
@@ -2071,7 +2076,7 @@
                 if (path != null) {
                     filter.addDataPath(path);
                 }
-                PreferredActivity pa = new PreferredActivity(filter, match, set, cn);
+                PreferredActivity pa = new PreferredActivity(filter, match, set, cn, true);
                 editPreferredActivitiesLPw(userId).addFilter(pa);
             } else if (!haveNonSys) {
                 Slog.w(TAG, "No component found for default preferred activity " + cn);
diff --git a/services/java/com/android/server/pm/UserManagerService.java b/services/java/com/android/server/pm/UserManagerService.java
index bb37917..af60f84 100644
--- a/services/java/com/android/server/pm/UserManagerService.java
+++ b/services/java/com/android/server/pm/UserManagerService.java
@@ -26,8 +26,6 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.RestrictionEntry;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -42,7 +40,6 @@
 import android.os.IUserManager;
 import android.os.Process;
 import android.os.RemoteException;
-import android.os.SystemClock;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.AtomicFile;
@@ -50,7 +47,6 @@
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
-import android.util.SparseLongArray;
 import android.util.TimeUtils;
 import android.util.Xml;
 
@@ -163,8 +159,6 @@
     private boolean mGuestEnabled;
     private int mNextSerialNumber;
     private int mUserVersion = 0;
-    // Temporary cleanup variable, this and associated code should be removed later.
-    private boolean mUnblockAppsTemp;
 
     private static UserManagerService sInstance;
 
@@ -241,8 +235,6 @@
         final Context context = ActivityThread.systemMain().getSystemContext();
         mUserPackageMonitor.register(context,
                 null, UserHandle.ALL, false);
-        context.registerReceiver(mBootCompletedReceiver,
-                new IntentFilter(Intent.ACTION_BOOT_COMPLETED));
         userForeground(UserHandle.USER_OWNER);
     }
 
@@ -502,12 +494,6 @@
         return mUserIds;
     }
 
-    private void readUserList() {
-        synchronized (mPackagesLock) {
-            readUserListLocked();
-        }
-    }
-
     private void readUserListLocked() {
         mGuestEnabled = false;
         if (!mUserListFile.exists()) {
@@ -601,20 +587,8 @@
             userVersion = 2;
         }
 
-        if (userVersion < 3) {
-            // Remove restrictions PIN for all users
-            for (int i = 0; i < mRestrictionsPinStates.size(); i++) {
-                int userId = mRestrictionsPinStates.keyAt(i);
-                RestrictionsPinState state = mRestrictionsPinStates.valueAt(i);
-                if (state.salt != 0 && state.pinHash != null) {
-                    removeRestrictionsForUser(userId, false);
-                }
-            }
-            userVersion = 3;
-        }
 
         if (userVersion < 4) {
-            mUnblockAppsTemp = true;
             userVersion = 4;
         }
 
@@ -634,6 +608,7 @@
                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY | UserInfo.FLAG_INITIALIZED);
         mUsers.put(0, primary);
         mNextSerialNumber = MIN_USER_ID;
+        mUserVersion = USER_VERSION;
 
         Bundle restrictions = new Bundle();
         mUserRestrictions.append(UserHandle.USER_OWNER, restrictions);
@@ -1588,19 +1563,4 @@
             }
         }
     };
-
-    private BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() {
-        @Override public void onReceive(Context context, Intent intent) {
-            // This code block can be removed after cleanup
-            if (mUnblockAppsTemp) {
-                synchronized (mPackagesLock) {
-                    // Unblock apps due to removal of restrictions feature
-                    for (int i = 0; i < mUsers.size(); i++) {
-                        int userId = mUsers.keyAt(i);
-                        unblockAllAppsForUser(userId);
-                    }
-                }
-            }
-        }
-    };
 }
diff --git a/services/java/com/android/server/print/PrintManagerService.java b/services/java/com/android/server/print/PrintManagerService.java
index 671a5dc..2563b58 100644
--- a/services/java/com/android/server/print/PrintManagerService.java
+++ b/services/java/com/android/server/print/PrintManagerService.java
@@ -254,7 +254,7 @@
     }
 
     @Override
-    public void requestPrinterUpdate(PrinterId printerId, int userId) {
+    public void validatePrinters(List<PrinterId> printerIds, int userId) {
         final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);
         final UserState userState;
         synchronized (mLock) {
@@ -262,7 +262,37 @@
         }
         final long identity = Binder.clearCallingIdentity();
         try {
-            userState.requestPrinterUpdate(printerId);
+            userState.validatePrinters(printerIds);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public void startPrinterStateTracking(PrinterId printerId, int userId) {
+        final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);
+        final UserState userState;
+        synchronized (mLock) {
+            userState = getOrCreateUserStateLocked(resolvedUserId);
+        }
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            userState.startPrinterStateTracking(printerId);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public void stopPrinterStateTracking(PrinterId printerId, int userId) {
+        final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);
+        final UserState userState;
+        synchronized (mLock) {
+            userState = getOrCreateUserStateLocked(resolvedUserId);
+        }
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            userState.stopPrinterStateTracking(printerId);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -432,10 +462,12 @@
         if (appId == callingAppId) {
             return appId;
         }
-        if (mContext.checkCallingPermission(Manifest.permission.ACCESS_ALL_PRINT_JOBS)
+        if (mContext.checkCallingPermission(
+                "com.android.printspooler.permission.ACCESS_ALL_PRINT_JOBS")
                 != PackageManager.PERMISSION_GRANTED) {
             throw new SecurityException("Call from app " + callingAppId + " as app "
-                    + appId + " without permission ACCESS_ALL_PRINT_JOBS");
+                    + appId + " without com.android.printspooler.permission"
+                    + ".ACCESS_ALL_PRINT_JOBS");
         }
         return appId;
     }
diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java
index 7f4b343..3c67aa9 100644
--- a/services/java/com/android/server/print/RemotePrintService.java
+++ b/services/java/com/android/server/print/RemotePrintService.java
@@ -25,6 +25,7 @@
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.IBinder.DeathRecipient;
+import android.os.AsyncTask;
 import android.os.Looper;
 import android.os.Message;
 import android.os.ParcelFileDescriptor;
@@ -38,6 +39,8 @@
 import android.printservice.IPrintServiceClient;
 import android.util.Slog;
 
+import com.android.internal.R;
+
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
@@ -121,6 +124,36 @@
         mHasPrinterDiscoverySession = false;
         mPendingCommands.clear();
         ensureUnbound();
+
+        // Makes sure all active print jobs are failed since the service
+        // just died. Do this off the main thread since we do to allow
+        // calls into the spooler on the main thread.
+        new AsyncTask<Void, Void, Void>() {
+            @Override
+            protected Void doInBackground(Void... params) {
+                failAllActivePrintJobs();
+                return null;
+            }
+        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
+    }
+
+    private void failAllActivePrintJobs() {
+        List<PrintJobInfo> printJobs = mSpooler.getPrintJobInfos(mComponentName,
+                PrintJobInfo.STATE_ANY_ACTIVE, PrintManager.APP_ID_ANY);
+        if (printJobs == null) {
+            return;
+        }
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            final int printJobCount = printJobs.size();
+            for (int i = 0; i < printJobCount; i++) {
+                PrintJobInfo printJob = printJobs.get(i);
+                mSpooler.setPrintJobState(printJob.getId(), PrintJobInfo.STATE_FAILED,
+                        mContext.getString(R.string.reason_unknown));
+            }
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
     }
 
     private void handleOnAllPrintJobsHandled() {
@@ -130,7 +163,7 @@
 
         if (isBound()) {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] handleOnAllPrintJobsHandled()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] onAllPrintJobsHandled()");
             }
 
             // If the service has a printer discovery session
@@ -152,7 +185,7 @@
         // which means that there are no print jobs to be cancelled.
         if (isBound()) {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] handleRequestCancelPrintJob()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] requestCancelPrintJob()");
             }
             try {
                 mPrintService.requestCancelPrintJob(printJob);
@@ -182,7 +215,7 @@
             });
         } else {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] handleOnPrintJobQueued()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] onPrintJobQueued()");
             }
             try {
                 mPrintService.onPrintJobQueued(printJob);
@@ -308,29 +341,83 @@
         }
     }
 
-    public void requestPrinterUpdate(PrinterId printerId) {
-        mHandler.obtainMessage(MyHandler.MSG_REQUEST_PRINTER_UPDATE,
-                printerId).sendToTarget();
+    public void validatePrinters(List<PrinterId> printerIds) {
+        mHandler.obtainMessage(MyHandler.MSG_VALIDATE_PRINTERS,
+                printerIds).sendToTarget();
     }
 
-    private void handleRequestPrinterUpdate(final PrinterId printerId) {
+    private void handleValidatePrinters(final List<PrinterId> printerIds) {
         throwIfDestroyed();
         if (!isBound()) {
             ensureBound();
             mPendingCommands.add(new Runnable() {
                 @Override
                 public void run() {
-                    handleRequestPrinterUpdate(printerId);
+                    handleValidatePrinters(printerIds);
                 }
             });
         } else {
             if (DEBUG) {
-                Slog.i(LOG_TAG, "[user: " + mUserId + "] requestPrinterUpdate()");
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] validatePrinters()");
             }
             try {
-                mPrintService.requestPrinterUpdate(printerId);
+                mPrintService.validatePrinters(printerIds);
             } catch (RemoteException re) {
-                Slog.e(LOG_TAG, "Error requesting a printer update.", re);
+                Slog.e(LOG_TAG, "Error requesting printers validation.", re);
+            }
+        }
+    }
+
+    public void startPrinterStateTracking(PrinterId printerId) {
+        mHandler.obtainMessage(MyHandler.MSG_START_PRINTER_STATE_TRACKING,
+                printerId).sendToTarget();
+    }
+
+    private void handleStartPrinterStateTracking(final PrinterId printerId) {
+        throwIfDestroyed();
+        if (!isBound()) {
+            ensureBound();
+            mPendingCommands.add(new Runnable() {
+                @Override
+                public void run() {
+                    handleStartPrinterStateTracking(printerId);
+                }
+            });
+        } else {
+            if (DEBUG) {
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] startPrinterTracking()");
+            }
+            try {
+                mPrintService.startPrinterStateTracking(printerId);
+            } catch (RemoteException re) {
+                Slog.e(LOG_TAG, "Error requesting start printer tracking.", re);
+            }
+        }
+    }
+
+    public void stopPrinterStateTracking(PrinterId printerId) {
+        mHandler.obtainMessage(MyHandler.MSG_STOP_PRINTER_STATE_TRACKING,
+                printerId).sendToTarget();
+    }
+
+    private void handleStopPrinterStateTracking(final PrinterId printerId) {
+        throwIfDestroyed();
+        if (!isBound()) {
+            ensureBound();
+            mPendingCommands.add(new Runnable() {
+                @Override
+                public void run() {
+                    handleStopPrinterStateTracking(printerId);
+                }
+            });
+        } else {
+            if (DEBUG) {
+                Slog.i(LOG_TAG, "[user: " + mUserId + "] stopPrinterTracking()");
+            }
+            try {
+                mPrintService.stopPrinterStateTracking(printerId);
+            } catch (RemoteException re) {
+                Slog.e(LOG_TAG, "Error requesting stop printer tracking.", re);
             }
         }
     }
@@ -417,12 +504,14 @@
         public static final int MSG_DESTROY_PRINTER_DISCOVERY_SESSION = 2;
         public static final int MSG_START_PRINTER_DISCOVERY = 3;
         public static final int MSG_STOP_PRINTER_DISCOVERY = 4;
-        public static final int MSG_REQUEST_PRINTER_UPDATE = 5;
-        public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 6;
-        public static final int MSG_ON_REQUEST_CANCEL_PRINT_JOB = 7;
-        public static final int MSG_ON_PRINT_JOB_QUEUED = 8;
-        public static final int MSG_DESTROY = 9;
-        public static final int MSG_BINDER_DIED = 10;
+        public static final int MSG_VALIDATE_PRINTERS = 5;
+        public static final int MSG_START_PRINTER_STATE_TRACKING = 6;
+        public static final int MSG_STOP_PRINTER_STATE_TRACKING = 7;
+        public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 8;
+        public static final int MSG_ON_REQUEST_CANCEL_PRINT_JOB = 9;
+        public static final int MSG_ON_PRINT_JOB_QUEUED = 10;
+        public static final int MSG_DESTROY = 11;
+        public static final int MSG_BINDER_DIED = 12;
 
         public MyHandler(Looper looper) {
             super(looper, null, false);
@@ -449,9 +538,19 @@
                     handleStopPrinterDiscovery();
                 } break;
 
-                case MSG_REQUEST_PRINTER_UPDATE: {
+                case MSG_VALIDATE_PRINTERS: {
+                    List<PrinterId> printerIds = (List<PrinterId>) message.obj;
+                    handleValidatePrinters(printerIds);
+                } break;
+
+                case MSG_START_PRINTER_STATE_TRACKING: {
                     PrinterId printerId = (PrinterId) message.obj;
-                    handleRequestPrinterUpdate(printerId);
+                    handleStartPrinterStateTracking(printerId);
+                } break;
+
+                case MSG_STOP_PRINTER_STATE_TRACKING: {
+                    PrinterId printerId = (PrinterId) message.obj;
+                    handleStopPrinterStateTracking(printerId);
                 } break;
 
                 case MSG_ON_ALL_PRINT_JOBS_HANDLED: {
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index c979a11..b9c676d 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -19,8 +19,10 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
 import android.os.Build;
 import android.os.Handler;
 import android.os.IBinder;
@@ -46,6 +48,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -59,7 +62,7 @@
 
     private static final boolean DEBUG = true && Build.IS_DEBUGGABLE;
 
-    private static final int MAX_ITEMS_PER_CALLBACK = 100;
+    private static final int MAX_ITEMS_PER_CALLBACK = 50;
 
     private static final char COMPONENT_NAME_SEPARATOR = ':';
 
@@ -95,6 +98,9 @@
         mUserId = userId;
         mLock = lock;
         mSpooler = new RemotePrintSpooler(context, userId, this);
+        synchronized (mLock) {
+            enableSystemPrintServicesOnFirstBootLocked();
+        }
     }
 
     @Override
@@ -190,7 +196,7 @@
         }
     }
 
-    public void requestPrinterUpdate(PrinterId printerId) {
+    public void validatePrinters(List<PrinterId> printerIds) {
         synchronized (mLock) {
             throwIfDestroyedLocked();
             // No services - nothing to do.
@@ -202,7 +208,39 @@
                 return;
             }
             // Request an updated.
-            mPrinterDiscoverySession.requestPrinterUpdateLocked(printerId);
+            mPrinterDiscoverySession.validatePrintersLocked(printerIds);
+        }
+    }
+
+    public void startPrinterStateTracking(PrinterId printerId) {
+        synchronized (mLock) {
+            throwIfDestroyedLocked();
+            // No services - nothing to do.
+            if (mActiveServices.isEmpty()) {
+                return;
+            }
+            // No session - nothing to do.
+            if (mPrinterDiscoverySession == null) {
+                return;
+            }
+            // Request start tracking the printer.
+            mPrinterDiscoverySession.startPrinterStateTrackingLocked(printerId);
+        }
+    }
+
+    public void stopPrinterStateTracking(PrinterId printerId) {
+        synchronized (mLock) {
+            throwIfDestroyedLocked();
+            // No services - nothing to do.
+            if (mActiveServices.isEmpty()) {
+                return;
+            }
+            // No session - nothing to do.
+            if (mPrinterDiscoverySession == null) {
+                return;
+            }
+            // Request stop tracking the printer.
+            mPrinterDiscoverySession.stopPrinterStateTrackingLocked(printerId);
         }
     }
 
@@ -336,11 +374,23 @@
         return false;
     }
 
+
     private boolean readEnabledPrintServicesLocked() {
         Set<ComponentName> tempEnabledServiceNameSet = new HashSet<ComponentName>();
+        readPrintServicesFromSettingLocked(Settings.Secure.ENABLED_PRINT_SERVICES,
+                tempEnabledServiceNameSet);
+        if (!tempEnabledServiceNameSet.equals(mEnabledServices)) {
+            mEnabledServices.clear();
+            mEnabledServices.addAll(tempEnabledServiceNameSet);
+            return true;
+        }
+        return false;
+    }
 
+    private void readPrintServicesFromSettingLocked(String setting,
+            Set<ComponentName> outServiceNames) {
         String settingValue = Settings.Secure.getStringForUser(mContext.getContentResolver(),
-                Settings.Secure.ENABLED_PRINT_SERVICES, mUserId);
+                setting, mUserId);
         if (!TextUtils.isEmpty(settingValue)) {
             TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
             splitter.setString(settingValue);
@@ -351,18 +401,72 @@
                 }
                 ComponentName componentName = ComponentName.unflattenFromString(string);
                 if (componentName != null) {
-                    tempEnabledServiceNameSet.add(componentName);
+                    outServiceNames.add(componentName);
+                }
+            }
+        }
+    }
+
+    private void enableSystemPrintServicesOnFirstBootLocked() {
+        // Load enabled and installed services.
+        readEnabledPrintServicesLocked();
+        readInstalledPrintServicesLocked();
+
+        // Load the system services once enabled on first boot.
+        Set<ComponentName> enabledOnFirstBoot = new HashSet<ComponentName>();
+        readPrintServicesFromSettingLocked(
+                Settings.Secure.ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES,
+                enabledOnFirstBoot);
+
+        StringBuilder builder = new StringBuilder();
+
+        final int serviceCount = mInstalledServices.size();
+        for (int i = 0; i < serviceCount; i++) {
+            ServiceInfo serviceInfo = mInstalledServices.get(i).getResolveInfo().serviceInfo;
+            // Enable system print services if we never did that and are not enabled.
+            if ((serviceInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                ComponentName serviceName = new ComponentName(
+                        serviceInfo.packageName, serviceInfo.name);
+                if (!mEnabledServices.contains(serviceName)
+                        && !enabledOnFirstBoot.contains(serviceName)) {
+                    if (builder.length() > 0) {
+                        builder.append(":");
+                    }
+                    builder.append(serviceName.flattenToString());
                 }
             }
         }
 
-        if (!tempEnabledServiceNameSet.equals(mEnabledServices)) {
-            mEnabledServices.clear();
-            mEnabledServices.addAll(tempEnabledServiceNameSet);
-            return true;
+        // Nothing to be enabled - done.
+        if (builder.length() <= 0) {
+            return;
         }
 
-        return false;
+        String servicesToEnable = builder.toString();
+
+        // Update the enabled services setting.
+        String enabledServices = Settings.Secure.getStringForUser(
+                mContext.getContentResolver(), Settings.Secure.ENABLED_PRINT_SERVICES, mUserId);
+        if (TextUtils.isEmpty(enabledServices)) {
+            enabledServices = servicesToEnable;
+        } else {
+            enabledServices = enabledServices + ":" + servicesToEnable;
+        }
+        Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_PRINT_SERVICES, enabledServices, mUserId);
+
+        // Update the enabled on first boot services setting.
+        String enabledOnFirstBootServices = Settings.Secure.getStringForUser(
+                mContext.getContentResolver(),
+                Settings.Secure.ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES, mUserId);
+        if (TextUtils.isEmpty(enabledOnFirstBootServices)) {
+            enabledOnFirstBootServices = servicesToEnable;
+        } else {
+            enabledOnFirstBootServices = enabledOnFirstBootServices + ":" + enabledServices;
+        }
+        Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES,
+                enabledOnFirstBootServices, mUserId);
     }
 
     private void onConfigurationChangedLocked() {
@@ -415,6 +519,8 @@
 
         private final List<IBinder> mStartedPrinterDiscoveryTokens = new ArrayList<IBinder>();
 
+        private final List<PrinterId> mStateTrackedPrinters = new ArrayList<PrinterId>();
+
         private final Handler mHandler;
 
         private boolean mIsDestroyed;
@@ -461,23 +567,21 @@
             }
 
             // If printer discovery is ongoing and the start request has a list
-            // of printer to be checked, then we just request refreshing each of
-            // them rather making another start discovery request.
+            // of printer to be checked, then we just request validating them.
             if (!mStartedPrinterDiscoveryTokens.isEmpty()
                     && priorityList != null && !priorityList.isEmpty()) {
-                final int priorityIdCount = priorityList.size();
-                for (int i = 0; i < priorityIdCount; i++) {
-                    requestPrinterUpdate(priorityList.get(i));
-                }
+                validatePrinters(priorityList);
                 return;
             }
 
             // Remember we got a start request to match with an end.
             mStartedPrinterDiscoveryTokens.add(observer.asBinder());
+
             // The service are already performing discovery - nothing to do.
             if (mStartedPrinterDiscoveryTokens.size() > 1) {
                 return;
             }
+
             List<RemotePrintService> services = new ArrayList<RemotePrintService>(
                     mActiveServices.values());
             SomeArgs args = SomeArgs.obtain();
@@ -508,22 +612,99 @@
                     .sendToTarget();
         }
 
-        public void requestPrinterUpdateLocked(PrinterId printerId) {
+        public void validatePrintersLocked(List<PrinterId> printerIds) {
             if (mIsDestroyed) {
-                Log.w(LOG_TAG, "Not updating pritner - session destroyed");
+                Log.w(LOG_TAG, "Not validating pritners - session destroyed");
                 return;
             }
-            RemotePrintService service = mActiveServices.get(printerId.getServiceName());
-            if (service != null) {
-                SomeArgs args = SomeArgs.obtain();
-                args.arg1 = service;
-                args.arg2 = printerId;
-                mHandler.obtainMessage(SessionHandler
-                        .MSG_REQUEST_PRINTER_UPDATE, args)
-                        .sendToTarget();
+
+            List<PrinterId> remainingList = new ArrayList<PrinterId>(printerIds);
+            while (!remainingList.isEmpty()) {
+                Iterator<PrinterId> iterator = remainingList.iterator();
+                // Gather the printers per service and request a validation.
+                List<PrinterId> updateList = new ArrayList<PrinterId>();
+                ComponentName serviceName = null;
+                while (iterator.hasNext()) {
+                    PrinterId printerId = iterator.next();
+                    if (updateList.isEmpty()) {
+                        updateList.add(printerId);
+                        serviceName = printerId.getServiceName();
+                        iterator.remove();
+                    } else if (printerId.getServiceName().equals(serviceName)) {
+                        updateList.add(printerId);
+                        iterator.remove();
+                    }
+                }
+                // Schedule a notification of the service.
+                RemotePrintService service = mActiveServices.get(serviceName);
+                if (service != null) {
+                    SomeArgs args = SomeArgs.obtain();
+                    args.arg1 = service;
+                    args.arg2 = updateList;
+                    mHandler.obtainMessage(SessionHandler
+                            .MSG_VALIDATE_PRINTERS, args)
+                            .sendToTarget();
+                }
             }
         }
 
+        public final void startPrinterStateTrackingLocked(PrinterId printerId) {
+            if (mIsDestroyed) {
+                Log.w(LOG_TAG, "Not starting printer state tracking - session destroyed");
+                return;
+            }
+            // If printer discovery is not started - nothing to do.
+            if (mStartedPrinterDiscoveryTokens.isEmpty()) {
+                return;
+            }
+            final boolean containedPrinterId = mStateTrackedPrinters.contains(printerId);
+            // Keep track of the number of requests to track this one.
+            mStateTrackedPrinters.add(printerId);
+            // If we were tracking this printer - nothing to do.
+            if (containedPrinterId) {
+                return;
+            }
+            // No service - nothing to do.
+            RemotePrintService service = mActiveServices.get(printerId.getServiceName());
+            if (service == null) {
+                return;
+            }
+            // Ask the service to start tracking.
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = service;
+            args.arg2 = printerId;
+            mHandler.obtainMessage(SessionHandler
+                    .MSG_START_PRINTER_STATE_TRACKING, args)
+                    .sendToTarget();
+        }
+
+        public final void stopPrinterStateTrackingLocked(PrinterId printerId) {
+            if (mIsDestroyed) {
+                Log.w(LOG_TAG, "Not stopping printer state tracking - session destroyed");
+                return;
+            }
+            // If printer discovery is not started - nothing to do.
+            if (mStartedPrinterDiscoveryTokens.isEmpty()) {
+                return;
+            }
+            // If we did not track this printer - nothing to do.
+            if (!mStateTrackedPrinters.remove(printerId)) {
+                return;
+            }
+            // No service - nothing to do.
+            RemotePrintService service = mActiveServices.get(printerId.getServiceName());
+            if (service == null) {
+                return;
+            }
+            // Ask the service to start tracking.
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = service;
+            args.arg2 = printerId;
+            mHandler.obtainMessage(SessionHandler
+                    .MSG_STOP_PRINTER_STATE_TRACKING, args)
+                    .sendToTarget();
+        }
+
         public void onDestroyed() {
             /* do nothing */
         }
@@ -533,6 +714,12 @@
                 Log.w(LOG_TAG, "Not destroying - session destroyed");
                 return;
             }
+            // Make sure printer tracking is stopped.
+            final int printerCount = mStateTrackedPrinters.size();
+            for (int i = 0; i < printerCount; i++) {
+                PrinterId printerId = mStateTrackedPrinters.get(i);
+                stopPrinterStateTracking(printerId);
+            }
             // Make sure discovery is stopped.
             final int observerCount = mStartedPrinterDiscoveryTokens.size();
             for (int i = 0; i < observerCount; i++) {
@@ -673,11 +860,7 @@
             final int observerCount = mDiscoveryObservers.beginBroadcast();
             for (int i = 0; i < observerCount; i++) {
                 IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i);
-                try {
-                    observer.onPrintersAdded(addedPrinters);
-                } catch (RemoteException re) {
-                    Log.i(LOG_TAG, "Error dispatching added printers", re);
-                }
+                handlePrintersAdded(observer, addedPrinters);
             }
             mDiscoveryObservers.finishBroadcast();
         }
@@ -686,11 +869,7 @@
             final int observerCount = mDiscoveryObservers.beginBroadcast();
             for (int i = 0; i < observerCount; i++) {
                 IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i);
-                try {
-                    observer.onPrintersRemoved(removedPrinterIds);
-                } catch (RemoteException re) {
-                    Log.i(LOG_TAG, "Error dispatching removed printers", re);
-                }
+                handlePrintersRemoved(observer, removedPrinterIds);
             }
             mDiscoveryObservers.finishBroadcast();
         }
@@ -699,11 +878,7 @@
             final int observerCount = mDiscoveryObservers.beginBroadcast();
             for (int i = 0; i < observerCount; i++) {
                 IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i);
-                try {
-                    observer.onPrintersUpdated(updatedPrinters);
-                } catch (RemoteException re) {
-                    Log.i(LOG_TAG, "Error dispatching updated printers", re);
-                }
+                handlePrintersUpdated(observer, updatedPrinters);
             }
             mDiscoveryObservers.finishBroadcast();
         }
@@ -744,9 +919,19 @@
             }
         }
 
-        private void handleRequestPrinterUpdate(RemotePrintService service,
+        private void handleValidatePrinters(RemotePrintService service,
+                List<PrinterId> printerIds) {
+            service.validatePrinters(printerIds);
+        }
+
+        private void handleStartPrinterStateTracking(RemotePrintService service,
                 PrinterId printerId) {
-            service.requestPrinterUpdate(printerId);
+            service.startPrinterStateTracking(printerId);
+        }
+
+        private void handleStopPrinterStateTracking(RemotePrintService service,
+                PrinterId printerId) {
+            service.stopPrinterStateTracking(printerId);
         }
 
         private void handlePrintersAdded(IPrinterDiscoveryObserver observer,
@@ -762,7 +947,7 @@
                         final int start = i * MAX_ITEMS_PER_CALLBACK;
                         final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount);
                         List<PrinterInfo> subPrinters = printers.subList(start, end);
-                        observer.onPrintersAdded(subPrinters);
+                        observer.onPrintersAdded(subPrinters); 
                     }
                 }
             } catch (RemoteException re) {
@@ -791,6 +976,27 @@
             }
         }
 
+        private void handlePrintersUpdated(IPrinterDiscoveryObserver observer,
+                List<PrinterInfo> updatedPrinters) {
+            try {
+                final int printerCount = updatedPrinters.size();
+                if (printerCount <= MAX_ITEMS_PER_CALLBACK) {
+                    observer.onPrintersUpdated(updatedPrinters);
+                } else {
+                    // Send the added printers in chunks avoiding the binder transaction limit.
+                    final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1;
+                    for (int i = 0; i < transactionCount; i++) {
+                        final int start = i * MAX_ITEMS_PER_CALLBACK;
+                        final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount);
+                        List<PrinterInfo> subPrinters = updatedPrinters.subList(start, end);
+                        observer.onPrintersUpdated(subPrinters); 
+                    }
+                }
+            } catch (RemoteException re) {
+                Log.e(LOG_TAG, "Error sending updated printers", re);
+            }
+        }
+
         private final class SessionHandler extends Handler {
             public static final int MSG_PRINTERS_ADDED = 1;
             public static final int MSG_PRINTERS_REMOVED = 2;
@@ -804,7 +1010,9 @@
             public static final int MSG_DISPATCH_DESTROY_PRINTER_DISCOVERY_SESSION = 9;
             public static final int MSG_DISPATCH_START_PRINTER_DISCOVERY = 10;
             public static final int MSG_DISPATCH_STOP_PRINTER_DISCOVERY = 11;
-            public static final int MSG_REQUEST_PRINTER_UPDATE = 12;
+            public static final int MSG_VALIDATE_PRINTERS = 12;
+            public static final int MSG_START_PRINTER_STATE_TRACKING = 13;
+            public static final int MSG_STOP_PRINTER_STATE_TRACKING = 14;
 
             SessionHandler(Looper looper) {
                 super(looper, null, false);
@@ -878,13 +1086,29 @@
                         handleDispatchStopPrinterDiscovery(services);
                     } break;
 
-                    case MSG_REQUEST_PRINTER_UPDATE: {
+                    case MSG_VALIDATE_PRINTERS: {
+                        SomeArgs args = (SomeArgs) message.obj;
+                        RemotePrintService service = (RemotePrintService) args.arg1;
+                        List<PrinterId> printerIds = (List<PrinterId>) args.arg2;
+                        args.recycle();
+                        handleValidatePrinters(service, printerIds);
+                    } break;
+
+                    case MSG_START_PRINTER_STATE_TRACKING: {
                         SomeArgs args = (SomeArgs) message.obj;
                         RemotePrintService service = (RemotePrintService) args.arg1;
                         PrinterId printerId = (PrinterId) args.arg2;
                         args.recycle();
-                        handleRequestPrinterUpdate(service, printerId);
+                        handleStartPrinterStateTracking(service, printerId);
                     } break;
+
+                    case MSG_STOP_PRINTER_STATE_TRACKING: {
+                        SomeArgs args = (SomeArgs) message.obj;
+                        RemotePrintService service = (RemotePrintService) args.arg1;
+                        PrinterId printerId = (PrinterId) args.arg2;
+                        args.recycle();
+                        handleStopPrinterStateTracking(service, printerId);
+                    }
                 }
             }
         }
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index 3ae2106..ab429fd 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -1805,7 +1805,7 @@
         String countryIso;
         CountryDetector detector = (CountryDetector) context.getSystemService(
                 Context.COUNTRY_DETECTOR);
-        if (detector != null) {
+        if (detector != null && detector.detectCountry() != null) {
             countryIso = detector.detectCountry().getCountryIso();
         } else {
             Locale locale = context.getResources().getConfiguration().locale;
diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java
index 4f1ae11..c661b00 100644
--- a/telephony/java/com/android/internal/telephony/DctConstants.java
+++ b/telephony/java/com/android/internal/telephony/DctConstants.java
@@ -94,6 +94,8 @@
     public static final int EVENT_DISCONNECT_DC_RETRYING = BASE + 34;
     public static final int EVENT_DATA_SETUP_COMPLETE_ERROR = BASE + 35;
     public static final int CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA = BASE + 36;
+    public static final int CMD_ENABLE_MOBILE_PROVISIONING = BASE + 37;
+    public static final int CMD_IS_PROVISIONING_APN = BASE + 38;
 
     /***** Constants *****/
 
@@ -113,4 +115,5 @@
     public static final int ENABLED = 1;
 
     public static final String APN_TYPE_KEY = "apnType";
+    public static final String PROVISIONING_URL_KEY = "provisioningUrl";
 }
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index 65bdacf..a7baf1c 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -145,6 +145,29 @@
     public static final String ACTION_ANY_DATA_CONNECTION_STATE_CHANGED
             = "android.intent.action.ANY_DATA_STATE";
 
+    /**
+     * Broadcast Action: Occurs when a data connection connects to a provisioning apn
+     * and is broadcast by the low level data connection code.
+     * The intent will have the following extra values:</p>
+     * <ul>
+     *   <li><em>apn</em> - A string that is the APN associated with this
+     *      connection.</li>
+     *   <li><em>apnType</em> - A string array of APN types associated with
+     *      this connection.  The APN type <code>"*"</code> is a special
+     *      type that means this APN services all types.</li>
+     *   <li><em>linkProperties</em> - The <code>LinkProperties</code> for this APN</li>
+     *   <li><em>linkCapabilities</em> - The <code>linkCapabilities</code> for this APN</li>
+     *   <li><em>iface</em> - A string that is the name of the interface</li>
+     * </ul>
+     *
+     * <p class="note">
+     * Requires the READ_PHONE_STATE permission.
+     *
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
+     */
+    public static final String ACTION_DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN
+            = "android.intent.action.DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN";
 
     /**
      * Broadcast Action: An attempt to establish a data connection has failed.
diff --git a/tests/DumpRenderTree/Android.mk b/tests/DumpRenderTree/Android.mk
deleted file mode 100644
index 505a436..0000000
--- a/tests/DumpRenderTree/Android.mk
+++ /dev/null
@@ -1,12 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-LOCAL_PACKAGE_NAME := DumpRenderTree
-
-include $(BUILD_PACKAGE)
diff --git a/tests/DumpRenderTree/AndroidManifest.xml b/tests/DumpRenderTree/AndroidManifest.xml
deleted file mode 100644
index bcb821b..0000000
--- a/tests/DumpRenderTree/AndroidManifest.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.dumprendertree">
-    <application android:name="HTMLHostApp">
-        <uses-library android:name="android.test.runner" />
-        <activity android:name="Menu" android:label="Dump Render Tree"
-          android:screenOrientation="portrait"
-          android:theme="@android:style/Theme.Light">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.TEST" />
-            </intent-filter>
-        </activity>
-        <activity android:name="TestShellActivity"
-          android:launchMode="singleTop"
-          android:hardwareAccelerated="true"
-          android:screenOrientation="portrait"
-          android:theme="@android:style/Theme.Light"/>
-        <activity android:name="ReliabilityTestActivity" android:screenOrientation="portrait"
-          android:theme="@android:style/Theme.Light"/>
-    </application>
-
-    <instrumentation android:name=".LayoutTestsAutoRunner"
-        android:targetPackage="com.android.dumprendertree"
-        android:label="Layout test automation runner"
-    />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.WRITE_SDCARD" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-sdk android:minSdkVersion="5"
-              android:targetSdkVersion="5" />
-</manifest>
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_crashed.txt b/tests/DumpRenderTree/assets/results/layout_tests_crashed.txt
deleted file mode 100644
index 89439d3..0000000
--- a/tests/DumpRenderTree/assets/results/layout_tests_crashed.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/basic-auth.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/failed-auth.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-origin-authorization.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-origin-no-authorization.html
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_failed.txt b/tests/DumpRenderTree/assets/results/layout_tests_failed.txt
deleted file mode 100644
index 5b64b9a..0000000
--- a/tests/DumpRenderTree/assets/results/layout_tests_failed.txt
+++ /dev/null
@@ -1,1010 +0,0 @@
-/sdcard/android/layout_tests/accessibility/onclick-handlers.html
-/sdcard/android/layout_tests/accessibility/textarea-insertion-point-line-number.html
-/sdcard/android/layout_tests/accessibility/aria-readonly.html
-/sdcard/android/layout_tests/accessibility/radio-button-checkbox-size.html
-/sdcard/android/layout_tests/accessibility/th-as-title-ui.html
-/sdcard/android/layout_tests/accessibility/visible-elements.html
-/sdcard/android/layout_tests/accessibility/iframe-bastardization.html
-/sdcard/android/layout_tests/accessibility/button-press-action.html
-/sdcard/android/layout_tests/accessibility/img-aria-button-alt-tag.html
-/sdcard/android/layout_tests/accessibility/input-image-alt.html
-/sdcard/android/layout_tests/accessibility/radio-button-title-label.html
-/sdcard/android/layout_tests/accessibility/aria-hidden.html
-/sdcard/android/layout_tests/accessibility/secure-textfield-title-ui.html
-/sdcard/android/layout_tests/accessibility/canvas.html
-/sdcard/android/layout_tests/accessibility/textarea-selected-text-range.html
-/sdcard/android/layout_tests/accessibility/language-attribute.html
-/sdcard/android/layout_tests/accessibility/table-nofirstbody.html
-/sdcard/android/layout_tests/accessibility/editable-webarea-context-menu-point.html
-/sdcard/android/layout_tests/accessibility/table-modification-crash.html
-/sdcard/android/layout_tests/accessibility/aria-link-supports-press.html
-/sdcard/android/layout_tests/accessibility/table-notbody.html
-/sdcard/android/layout_tests/accessibility/ignore-spacer-elements.html
-/sdcard/android/layout_tests/accessibility/transformed-element.html
-/sdcard/android/layout_tests/accessibility/aria-disabled.html
-/sdcard/android/layout_tests/accessibility/placeholder.html
-/sdcard/android/layout_tests/accessibility/non-data-table-cell-title-ui-element.html
-/sdcard/android/layout_tests/accessibility/aria-label.html
-/sdcard/android/layout_tests/accessibility/textarea-line-for-index.html
-/sdcard/android/layout_tests/accessibility/nochildren-elements.html
-/sdcard/android/layout_tests/animations/keyframes-to-missing.html
-/sdcard/android/layout_tests/animations/animation-hit-test.html
-/sdcard/android/layout_tests/animations/animation-hit-test-transform.html
-/sdcard/android/layout_tests/animations/animation-controller-drt-api.html
-/sdcard/android/layout_tests/animations/keyframes-from-missing.html
-/sdcard/android/layout_tests/animations/change-keyframes-name.html
-/sdcard/android/layout_tests/animations/change-keyframes.html
-/sdcard/android/layout_tests/editing/style/remove-underline-from-stylesheet.html
-/sdcard/android/layout_tests/editing/style/remove-underline-in-bold.html
-/sdcard/android/layout_tests/editing/style/apply-through-end-of-document.html
-/sdcard/android/layout_tests/editing/inserting/typing-tab-designmode.html
-/sdcard/android/layout_tests/editing/inserting/space-after-removeformat.html
-/sdcard/android/layout_tests/editing/inserting/insert-thai-characters-001.html
-/sdcard/android/layout_tests/editing/inserting/5994480-2.html
-/sdcard/android/layout_tests/editing/execCommand/queryCommandState-01.html
-/sdcard/android/layout_tests/editing/execCommand/4128080-2.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-6.html
-/sdcard/android/layout_tests/editing/execCommand/enabling-and-selection.html
-/sdcard/android/layout_tests/editing/execCommand/insert-line-break-no-scroll.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-3.html
-/sdcard/android/layout_tests/editing/execCommand/enabling-and-selection-2.html
-/sdcard/android/layout_tests/editing/execCommand/delete-no-scroll.html
-/sdcard/android/layout_tests/editing/execCommand/forward-delete-no-scroll.html
-/sdcard/android/layout_tests/editing/execCommand/switch-list-type.html
-/sdcard/android/layout_tests/editing/execCommand/19089.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-nested-lists-2.html
-/sdcard/android/layout_tests/editing/execCommand/unlink.html
-/sdcard/android/layout_tests/editing/execCommand/remove-list-1.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-5.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-2.html
-/sdcard/android/layout_tests/editing/execCommand/copy-without-selection.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-nested-lists-4.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-nested-lists-1.html
-/sdcard/android/layout_tests/editing/execCommand/findString-diacriticals.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-7.html
-/sdcard/android/layout_tests/editing/execCommand/createLink.html
-/sdcard/android/layout_tests/editing/execCommand/remove-list-items.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-4.html
-/sdcard/android/layout_tests/editing/execCommand/5939887.html
-/sdcard/android/layout_tests/editing/execCommand/insertHTML.html
-/sdcard/android/layout_tests/editing/execCommand/convert-style-elements-to-spans.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-lists-1.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-nested-lists-3.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-into-anchor-text.html
-/sdcard/android/layout_tests/editing/pasteboard/19644-1.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-crash.html
-/sdcard/android/layout_tests/editing/pasteboard/5665299.html
-/sdcard/android/layout_tests/editing/pasteboard/file-input-files-access.html
-/sdcard/android/layout_tests/editing/pasteboard/get-data-text-plain-drop.html
-/sdcard/android/layout_tests/editing/pasteboard/get-data-text-plain-paste.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-before-blockquote.html
-/sdcard/android/layout_tests/editing/pasteboard/5761530-1.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-in-password-field.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-plaintext-user-select-none.html
-/sdcard/android/layout_tests/editing/pasteboard/drag-image-in-about-blank-frame.html
-/sdcard/android/layout_tests/editing/pasteboard/4744008.html
-/sdcard/android/layout_tests/editing/pasteboard/4922709.html
-/sdcard/android/layout_tests/editing/pasteboard/19644-2.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-013.html
-/sdcard/android/layout_tests/editing/pasteboard/5780697-2.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-double-nested-blockquote-before-blockquote.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-paste-float.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-table-002.html
-/sdcard/android/layout_tests/editing/selection/click-outside-editable-div.html
-/sdcard/android/layout_tests/editing/selection/drag-text-delay.html
-/sdcard/android/layout_tests/editing/selection/anchor-focus3.html
-/sdcard/android/layout_tests/editing/selection/home-end.html
-/sdcard/android/layout_tests/editing/selection/user-drag-element-and-user-select-none.html
-/sdcard/android/layout_tests/editing/selection/drag-start-event-client-x-y.html
-/sdcard/android/layout_tests/editing/selection/extend-selection-bidi.html
-/sdcard/android/layout_tests/editing/selection/find-in-text-control.html
-/sdcard/android/layout_tests/editing/selection/5209984.html
-/sdcard/android/layout_tests/editing/selection/toString-1.html
-/sdcard/android/layout_tests/editing/selection/hit-test-anonymous.html
-/sdcard/android/layout_tests/editing/selection/move-begin-end.html
-/sdcard/android/layout_tests/editing/selection/doubleclick-whitespace-img-crash.html
-/sdcard/android/layout_tests/editing/selection/click-after-nested-block.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-003.html
-/sdcard/android/layout_tests/editing/selection/skip-non-editable-1.html
-/sdcard/android/layout_tests/editing/selection/anchor-focus1.html
-/sdcard/android/layout_tests/editing/selection/getRangeAt.html
-/sdcard/android/layout_tests/editing/selection/select-all-textarea.html
-/sdcard/android/layout_tests/editing/selection/doubleclick-whitespace.html
-/sdcard/android/layout_tests/editing/selection/move-paragraph-document-edges.html
-/sdcard/android/layout_tests/editing/selection/after-line-break.html
-/sdcard/android/layout_tests/editing/selection/legal-positions.html
-/sdcard/android/layout_tests/editing/selection/extend-selection-after-double-click.html
-/sdcard/android/layout_tests/editing/selection/select-line.html
-/sdcard/android/layout_tests/editing/selection/doubleclick-whitespace-crash.html
-/sdcard/android/layout_tests/editing/selection/toString.html
-/sdcard/android/layout_tests/editing/selection/inactive-selection.html
-/sdcard/android/layout_tests/editing/selection/click-in-margins-inside-editable-div.html
-/sdcard/android/layout_tests/editing/selection/removeAllRanges.html
-/sdcard/android/layout_tests/editing/selection/skip-non-editable-2.html
-/sdcard/android/layout_tests/editing/selection/anchor-focus2.html
-/sdcard/android/layout_tests/editing/selection/click-in-padding-with-multiple-line-boxes.html
-/sdcard/android/layout_tests/editing/selection/click-before-and-after-table.html
-/sdcard/android/layout_tests/editing/undo/undo-iframe-location-change.html
-/sdcard/android/layout_tests/editing/deleting/pruning-after-merge-1.html
-/sdcard/android/layout_tests/editing/deleting/5546763.html
-/sdcard/android/layout_tests/editing/deleting/5729680.html
-/sdcard/android/layout_tests/editing/deleting/4916235-1.html
-/sdcard/android/layout_tests/editing/deleting/delete-ligature-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-ligature-003.html
-/sdcard/android/layout_tests/editing/deleting/skip-virama-001.html
-/sdcard/android/layout_tests/editing/deleting/smart-editing-disabled.html
-/sdcard/android/layout_tests/editing/deleting/delete-ligature-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-all-text-in-text-field-assertion.html
-/sdcard/android/layout_tests/editing/text-iterator/basic-iteration.html
-/sdcard/android/layout_tests/editing/text-iterator/thai-cursor-movement.html
-/sdcard/android/layout_tests/fast/replaced/table-percent-height-text-controls.html
-/sdcard/android/layout_tests/fast/replaced/image-map-2.html
-/sdcard/android/layout_tests/fast/replaced/image-map-bug16782.html
-/sdcard/android/layout_tests/fast/replaced/table-percent-height.html
-/sdcard/android/layout_tests/fast/replaced/image-map.html
-/sdcard/android/layout_tests/fast/dynamic/paused-event-dispatch.html
-/sdcard/android/layout_tests/fast/text/international/thai-offsetForPosition-inside-character.html
-/sdcard/android/layout_tests/fast/text/plain-text-line-breaks.html
-/sdcard/android/layout_tests/fast/text/offsetForPosition-cluster-at-zero.html
-/sdcard/android/layout_tests/fast/text/zero-width-characters.html
-/sdcard/android/layout_tests/fast/text/reset-drag-on-mouse-down.html
-/sdcard/android/layout_tests/fast/encoding/invalid-xml.html
-/sdcard/android/layout_tests/fast/encoding/char-decoding-mac.html
-/sdcard/android/layout_tests/fast/encoding/mailto-always-utf-8.html
-/sdcard/android/layout_tests/fast/encoding/percent-escaping.html
-/sdcard/android/layout_tests/fast/encoding/utf-32-big-endian-nobom.xml
-/sdcard/android/layout_tests/fast/encoding/hanarei-blog32-fc2-com.html
-/sdcard/android/layout_tests/fast/encoding/frame-default-enc.html
-/sdcard/android/layout_tests/fast/encoding/char-decoding.html
-/sdcard/android/layout_tests/fast/encoding/url-host-name-non-ascii.html
-/sdcard/android/layout_tests/fast/encoding/idn-security.html
-/sdcard/android/layout_tests/fast/encoding/utf-32-little-endian-nobom.xml
-/sdcard/android/layout_tests/fast/encoding/char-encoding-mac.html
-/sdcard/android/layout_tests/fast/encoding/charset-koi8-u.html
-/sdcard/android/layout_tests/fast/workers/worker-location.html
-/sdcard/android/layout_tests/fast/selectors/lang-inheritance.html
-/sdcard/android/layout_tests/fast/selectors/lang-vs-xml-lang.html
-/sdcard/android/layout_tests/fast/selectors/lang-inheritance2.html
-/sdcard/android/layout_tests/fast/overflow/scroll-vertical-not-horizontal.html
-/sdcard/android/layout_tests/fast/events/onunload.html
-/sdcard/android/layout_tests/fast/events/mouseup-outside-document.html
-/sdcard/android/layout_tests/fast/events/offsetX-offsetY.html
-/sdcard/android/layout_tests/fast/events/mouseover-mouseout.html
-/sdcard/android/layout_tests/fast/events/option-tab.html
-/sdcard/android/layout_tests/fast/events/popup-blocking-click-in-iframe.html
-/sdcard/android/layout_tests/fast/events/tabindex-focus-blur-all.html
-/sdcard/android/layout_tests/fast/events/onchange-passwordfield.html
-/sdcard/android/layout_tests/fast/events/drag-in-frames.html
-/sdcard/android/layout_tests/fast/events/frame-tab-focus.html
-/sdcard/android/layout_tests/fast/events/autoscroll-in-textfield.html
-/sdcard/android/layout_tests/fast/events/arrow-navigation.html
-/sdcard/android/layout_tests/fast/events/fire-scroll-event.html
-/sdcard/android/layout_tests/fast/events/attempt-scroll-with-no-scrollbars.html
-/sdcard/android/layout_tests/fast/events/mouseclick-target-and-positioning.html
-/sdcard/android/layout_tests/fast/events/anchor-empty-focus.html
-/sdcard/android/layout_tests/fast/events/input-image-scrolled-x-y.html
-/sdcard/android/layout_tests/fast/events/dblclick-addEventListener.html
-/sdcard/android/layout_tests/fast/events/frame-programmatic-focus.html
-/sdcard/android/layout_tests/fast/events/related-target.html
-/sdcard/android/layout_tests/fast/events/context-onmousedown-event.html
-/sdcard/android/layout_tests/fast/events/mouse-drag-from-frame-to-other-frame.html
-/sdcard/android/layout_tests/fast/events/prevent-drag-to-navigate.html
-/sdcard/android/layout_tests/fast/events/stop-load-in-unload-handler-using-window-stop.html
-/sdcard/android/layout_tests/fast/events/content-changed-during-drop.html
-/sdcard/android/layout_tests/fast/events/autoscroll-with-non-scrollable-parent.html
-/sdcard/android/layout_tests/fast/events/window-events-capture.html
-/sdcard/android/layout_tests/fast/events/onchange-click-hang.html
-/sdcard/android/layout_tests/fast/events/onload-webkit-before-webcore.html
-/sdcard/android/layout_tests/fast/events/window-events-bubble2.html
-/sdcard/android/layout_tests/fast/events/js-keyboard-event-creation.html
-/sdcard/android/layout_tests/fast/events/event-view-toString.html
-/sdcard/android/layout_tests/fast/events/onchange-select-popup.html
-/sdcard/android/layout_tests/fast/events/access-key-self-destruct.html
-/sdcard/android/layout_tests/fast/events/scrollbar-double-click.html
-/sdcard/android/layout_tests/fast/events/onunload-clears-onbeforeunload.html
-/sdcard/android/layout_tests/fast/events/stop-load-in-unload-handler-using-document-write.html
-/sdcard/android/layout_tests/fast/events/tabindex-focus-chain.html
-/sdcard/android/layout_tests/fast/events/capture-on-target.html
-/sdcard/android/layout_tests/fast/events/window-events-bubble.html
-/sdcard/android/layout_tests/fast/events/event-function-toString.html
-/sdcard/android/layout_tests/fast/events/right-click-focus.html
-/sdcard/android/layout_tests/fast/events/mouseup-from-button2.html
-/sdcard/android/layout_tests/fast/events/frame-click-focus.html
-/sdcard/android/layout_tests/fast/events/crash-on-mutate-during-drop.html
-/sdcard/android/layout_tests/fast/events/mouseout-on-window.html
-/sdcard/android/layout_tests/fast/events/keypress-insert-tab.html
-/sdcard/android/layout_tests/fast/events/mouseout-dead-subframe.html
-/sdcard/android/layout_tests/fast/events/onunload-not-on-body.html
-/sdcard/android/layout_tests/fast/events/mousemove-after-drag-over-scrollbar.html
-/sdcard/android/layout_tests/fast/events/contextmenu-scrolled-page-with-frame.html
-/sdcard/android/layout_tests/fast/events/drag-to-navigate.html
-/sdcard/android/layout_tests/fast/events/key-events-in-input-button.html
-/sdcard/android/layout_tests/fast/events/arrow-keys-on-body.html
-/sdcard/android/layout_tests/fast/events/ondragenter.html
-/sdcard/android/layout_tests/fast/events/pointer-events.html
-/sdcard/android/layout_tests/fast/events/scroll-to-anchor-in-overflow-hidden.html
-/sdcard/android/layout_tests/fast/events/autoscroll-nonscrollable-iframe-in-scrollable-div.html
-/sdcard/android/layout_tests/fast/events/keypress-focus-change.html
-/sdcard/android/layout_tests/fast/events/key-events-in-input-text.html
-/sdcard/android/layout_tests/fast/events/pointer-events-2.html
-/sdcard/android/layout_tests/fast/events/drag-outside-window.html
-/sdcard/android/layout_tests/fast/events/click-count.html
-/sdcard/android/layout_tests/fast/events/onchange-searchfield.html
-/sdcard/android/layout_tests/fast/events/special-key-events-in-input-text.html
-/sdcard/android/layout_tests/fast/events/mouse-drag-from-frame.html
-/sdcard/android/layout_tests/fast/events/keydown-keypress-preventDefault.html
-/sdcard/android/layout_tests/fast/events/onsearch-enter.html
-/sdcard/android/layout_tests/fast/events/mouse-click-events.html
-/sdcard/android/layout_tests/fast/events/mouseover-mouseout2.html
-/sdcard/android/layout_tests/fast/events/open-window-from-another-frame.html
-/sdcard/android/layout_tests/fast/events/resize-subframe.html
-/sdcard/android/layout_tests/fast/events/onchange-textfield.html
-/sdcard/android/layout_tests/fast/events/onclick-list-marker.html
-/sdcard/android/layout_tests/fast/events/anchor-image-scrolled-x-y.html
-/sdcard/android/layout_tests/fast/images/image-map-zoom.html
-/sdcard/android/layout_tests/fast/js/kde/Number.html
-/sdcard/android/layout_tests/fast/js/instanceof-operator.html
-/sdcard/android/layout_tests/fast/js/navigator-mimeTypes-length.html
-/sdcard/android/layout_tests/fast/js/global-constructors.html
-/sdcard/android/layout_tests/fast/js/convert-nan-to-bool.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/hasFocus.html
-/sdcard/android/layout_tests/fast/dom/Document/early-document-access.html
-/sdcard/android/layout_tests/fast/dom/DOMException/XPathException.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/nested-execution.html
-/sdcard/android/layout_tests/fast/dom/HTMLDataGridElement/DataGridColumns-dom.html
-/sdcard/android/layout_tests/fast/dom/HTMLDataGridElement/DataGridColumns-basic.html
-/sdcard/android/layout_tests/fast/dom/HTMLDataGridElement/DataGridColumns-dom-attributes.html
-/sdcard/android/layout_tests/fast/dom/HTMLDataGridElement/DataGridDataSource-basic.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/010.xml
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/011.xml
-/sdcard/android/layout_tests/fast/dom/Window/window-xy-properties.html
-/sdcard/android/layout_tests/fast/dom/Window/window-screen-properties.html
-/sdcard/android/layout_tests/fast/dom/Window/new-window-opener.html
-/sdcard/android/layout_tests/fast/dom/Window/dom-access-from-closure-window.html
-/sdcard/android/layout_tests/fast/dom/Window/window-resize.html
-/sdcard/android/layout_tests/fast/dom/Window/closure-access-after-navigation-window.html
-/sdcard/android/layout_tests/fast/dom/Window/Plug-ins.html
-/sdcard/android/layout_tests/fast/dom/Window/get-set-properties.html
-/sdcard/android/layout_tests/fast/dom/Window/window-scroll-arguments.html
-/sdcard/android/layout_tests/fast/dom/Window/window-lookup-precedence.html
-/sdcard/android/layout_tests/fast/dom/Window/window-resize-and-move-arguments.html
-/sdcard/android/layout_tests/fast/dom/Window/custom-constructors.html
-/sdcard/android/layout_tests/fast/dom/Window/webkitConvertPoint.html
-/sdcard/android/layout_tests/fast/dom/Window/window-properties.html
-/sdcard/android/layout_tests/fast/dom/Window/window-onFocus.html
-/sdcard/android/layout_tests/fast/dom/Window/dom-access-from-closure-iframe.html
-/sdcard/android/layout_tests/fast/dom/Window/window-early-properties.html
-/sdcard/android/layout_tests/fast/dom/StyleSheet/ownerNode-lifetime-2.html
-/sdcard/android/layout_tests/fast/dom/dom-constructors.html
-/sdcard/android/layout_tests/fast/dom/assign-to-window-status.html
-/sdcard/android/layout_tests/fast/dom/navigator-detached-no-crash.html
-/sdcard/android/layout_tests/fast/dom/object-embed-plugin-scripting.html
-/sdcard/android/layout_tests/fast/dom/node-filter-gc.html
-/sdcard/android/layout_tests/fast/dom/noscript-canvas-in-created-html-document.html
-/sdcard/android/layout_tests/fast/dom/getClientRects.html
-/sdcard/android/layout_tests/fast/dom/null-document-location-href-put-crash.html
-/sdcard/android/layout_tests/fast/dom/prototype-inheritance-2.html
-/sdcard/android/layout_tests/fast/dom/location-new-window-no-crash.html
-/sdcard/android/layout_tests/fast/dom/gc-9.html
-/sdcard/android/layout_tests/fast/dom/wrapper-classes.html
-/sdcard/android/layout_tests/fast/dom/document-width-height-force-layout.html
-/sdcard/android/layout_tests/fast/dom/client-width-height.html
-/sdcard/android/layout_tests/fast/dom/constructed-objects-prototypes.html
-/sdcard/android/layout_tests/fast/dom/global-constructors.html
-/sdcard/android/layout_tests/fast/dom/client-width-height-quirks.html
-/sdcard/android/layout_tests/fast/dom/javascript-url-crash-function.html
-/sdcard/android/layout_tests/fast/dom/getBoundingClientRect.html
-/sdcard/android/layout_tests/fast/dom/location-hash.html
-/sdcard/android/layout_tests/fast/dom/documenturi-can-hold-arbitrary-string.html
-/sdcard/android/layout_tests/fast/dom/documenturi-not-affected-by-base-tag.html
-/sdcard/android/layout_tests/fast/dom/open-and-close-by-DOM.html
-/sdcard/android/layout_tests/fast/dom/set-frame-src-while-running-script-in-frame.html
-/sdcard/android/layout_tests/fast/dom/prototype-inheritance.html
-/sdcard/android/layout_tests/fast/dom/getBoundingClientRect-getClientRects-relative-to-viewport.html
-/sdcard/android/layout_tests/fast/dom/frame-loading-via-document-write.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/paths.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/expressions.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/predicates.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/abbreviations.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/axes.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/functions.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/nodetests.html
-/sdcard/android/layout_tests/fast/xpath/py-dom-xpath/data.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/od_20000608.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/namespace-nodes.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/rs_20010831.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/sr_20021217.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/kd_20010423.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Borrowed/cz_20030217.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_boolean_expr.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_core_functions.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_location_path.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_node_test.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_literal_expr.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_predicate_list.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_parser.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_nodeset_expr.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_numeric_expr.html
-/sdcard/android/layout_tests/fast/xpath/4XPath/Core/test_step.html
-/sdcard/android/layout_tests/fast/xpath/detached-subtree-invalidate-iterator.html
-/sdcard/android/layout_tests/fast/xpath/ancestor-axis.html
-/sdcard/android/layout_tests/fast/xpath/string-value.html
-/sdcard/android/layout_tests/fast/xpath/id-simple.html
-/sdcard/android/layout_tests/fast/xpath/id-path.html
-/sdcard/android/layout_tests/fast/xpath/invalid-functions.html
-/sdcard/android/layout_tests/fast/xpath/xpath-namespaces.html
-/sdcard/android/layout_tests/fast/xpath/node-name-case-sensitivity.html
-/sdcard/android/layout_tests/fast/xpath/xpath-empty-string.html
-/sdcard/android/layout_tests/fast/xpath/attribute-node-predicate.html
-/sdcard/android/layout_tests/fast/xpath/nodeset-duplicates.html
-/sdcard/android/layout_tests/fast/xpath/name-null-namespace.html
-/sdcard/android/layout_tests/fast/xpath/implicit-node-args.html
-/sdcard/android/layout_tests/fast/xpath/text-nodes.html
-/sdcard/android/layout_tests/fast/xpath/complex-id.html
-/sdcard/android/layout_tests/fast/xpath/xpath-functional-test.html
-/sdcard/android/layout_tests/fast/xpath/attr-namespace.html
-/sdcard/android/layout_tests/fast/xpath/position.html
-/sdcard/android/layout_tests/fast/xpath/evaluate-twice.html
-/sdcard/android/layout_tests/fast/xpath/substring-after.html
-/sdcard/android/layout_tests/fast/xpath/empty-string-substring.html
-/sdcard/android/layout_tests/fast/xpath/document-order.html
-/sdcard/android/layout_tests/fast/xpath/reverse-axes.html
-/sdcard/android/layout_tests/fast/xpath/nan-to-boolean.html
-/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii-text-plain.html
-/sdcard/android/layout_tests/fast/forms/mailto/advanced-get.html
-/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii-text-plain-latin-1.html
-/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items-multipart-form-data.html
-/sdcard/android/layout_tests/fast/forms/mailto/get-multiple-items.html
-/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii-always-utf-8.html
-/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items.html
-/sdcard/android/layout_tests/fast/forms/mailto/post-append-query.html
-/sdcard/android/layout_tests/fast/forms/mailto/get-multiple-items-x-www-form-urlencoded.html
-/sdcard/android/layout_tests/fast/forms/mailto/get-overwrite-query.html
-/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items-x-www-form-urlencoded.html
-/sdcard/android/layout_tests/fast/forms/mailto/get-multiple-items-text-plain.html
-/sdcard/android/layout_tests/fast/forms/mailto/post-multiple-items-text-plain.html
-/sdcard/android/layout_tests/fast/forms/mailto/get-non-ascii.html
-/sdcard/android/layout_tests/fast/forms/mailto/post-text-plain-with-accept-charset.html
-/sdcard/android/layout_tests/fast/forms/mailto/post-text-plain.html
-/sdcard/android/layout_tests/fast/forms/mailto/advanced-put.html
-/sdcard/android/layout_tests/fast/forms/listbox-typeahead-scroll.html
-/sdcard/android/layout_tests/fast/forms/select-empty-list.html
-/sdcard/android/layout_tests/fast/forms/focus2.html
-/sdcard/android/layout_tests/fast/forms/legend-access-key.html
-/sdcard/android/layout_tests/fast/forms/focus-selection-textarea.html
-/sdcard/android/layout_tests/fast/forms/select-popup-pagekeys.html
-/sdcard/android/layout_tests/fast/forms/select-double-onchange.html
-/sdcard/android/layout_tests/fast/forms/button-enter-click.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-003.html
-/sdcard/android/layout_tests/fast/forms/search-click-in-placeholder.html
-/sdcard/android/layout_tests/fast/forms/onselect-textfield.html
-/sdcard/android/layout_tests/fast/forms/textfield-onchange-deletion.html
-/sdcard/android/layout_tests/fast/forms/listbox-onchange.html
-/sdcard/android/layout_tests/fast/forms/button-spacebar-click.html
-/sdcard/android/layout_tests/fast/forms/search-cancel-button-mouseup.html
-/sdcard/android/layout_tests/fast/forms/get-file-upload.html
-/sdcard/android/layout_tests/fast/forms/select-enter-key.html
-/sdcard/android/layout_tests/fast/forms/drag-out-of-textarea.html
-/sdcard/android/layout_tests/fast/forms/option-mouseevents.html
-/sdcard/android/layout_tests/fast/forms/input-radio-checked-tab.html
-/sdcard/android/layout_tests/fast/forms/plaintext-mode-1.html
-/sdcard/android/layout_tests/fast/forms/input-select-on-click.html
-/sdcard/android/layout_tests/fast/forms/textarea-scrolled-endline-caret.html
-/sdcard/android/layout_tests/fast/forms/textarea-scrollbar-height.html
-/sdcard/android/layout_tests/fast/forms/textarea-type-spaces.html
-/sdcard/android/layout_tests/fast/forms/slider-mouse-events.html
-/sdcard/android/layout_tests/fast/forms/slider-onchange-event.html
-/sdcard/android/layout_tests/fast/forms/textarea-input-event.html
-/sdcard/android/layout_tests/fast/forms/search-delete-while-cancel-button-clicked.html
-/sdcard/android/layout_tests/fast/forms/select-accesskey.html
-/sdcard/android/layout_tests/fast/forms/password-doubleclick-selection.html
-/sdcard/android/layout_tests/fast/forms/textfield-inside-anchor.html
-/sdcard/android/layout_tests/fast/forms/slider-delete-while-dragging-thumb.html
-/sdcard/android/layout_tests/fast/forms/textfield-to-password-on-focus.html
-/sdcard/android/layout_tests/fast/forms/textarea-arrow-navigation.html
-/sdcard/android/layout_tests/fast/forms/search-abs-pos-cancel-button.html
-/sdcard/android/layout_tests/fast/forms/enter-clicks-buttons.html
-/sdcard/android/layout_tests/fast/forms/radio_checked_name.html
-/sdcard/android/layout_tests/fast/forms/search-hidden-cancel-button.html
-/sdcard/android/layout_tests/fast/forms/select-script-onchange.html
-/sdcard/android/layout_tests/fast/forms/textarea-paste-newline.html
-/sdcard/android/layout_tests/fast/forms/drag-into-textarea.html
-/sdcard/android/layout_tests/fast/forms/form-and-frame-interaction-retains-values.html
-/sdcard/android/layout_tests/fast/forms/slider-transformed.html
-/sdcard/android/layout_tests/fast/forms/focus-control-to-page.html
-/sdcard/android/layout_tests/fast/forms/select-type-ahead-non-latin.html
-/sdcard/android/layout_tests/fast/forms/focus-selection-input.html
-/sdcard/android/layout_tests/fast/forms/slider-zoomed.html
-/sdcard/android/layout_tests/fast/forms/search-event-delay.html
-/sdcard/android/layout_tests/fast/forms/empty-textarea-toggle-disabled.html
-/sdcard/android/layout_tests/fast/forms/25153.html
-/sdcard/android/layout_tests/fast/forms/select-cache-desynchronization.html
-/sdcard/android/layout_tests/fast/forms/check-box-enter-key.html
-/sdcard/android/layout_tests/fast/forms/button-state-restore.html
-/sdcard/android/layout_tests/fast/forms/access-key.html
-/sdcard/android/layout_tests/fast/forms/textarea-selection-preservation.html
-/sdcard/android/layout_tests/fast/forms/textarea-metrics.html
-/sdcard/android/layout_tests/fast/forms/onchange-enter-submit.html
-/sdcard/android/layout_tests/fast/forms/onselect-textarea.html
-/sdcard/android/layout_tests/fast/forms/listbox-selection.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style-without-renderer.html
-/sdcard/android/layout_tests/fast/css/text-align.html
-/sdcard/android/layout_tests/fast/css/hover-affects-child.html
-/sdcard/android/layout_tests/fast/css/resize-single-axis.html
-/sdcard/android/layout_tests/fast/css/percent-character-as-value.html
-/sdcard/android/layout_tests/fast/css/uri-token-parsing.html
-/sdcard/android/layout_tests/fast/css/zoom-body-scroll.html
-/sdcard/android/layout_tests/fast/css/invalid-percentage-property.html
-/sdcard/android/layout_tests/fast/parser/external-entities-in-xslt.xml
-/sdcard/android/layout_tests/fast/parser/xml-declaration-missing-ending-mark.html
-/sdcard/android/layout_tests/fast/parser/tabindex-parsing.html
-/sdcard/android/layout_tests/fast/history/saves-state-after-fragment-nav.html
-/sdcard/android/layout_tests/fast/history/back-forward-is-asynchronous.html
-/sdcard/android/layout_tests/fast/history/window-open.html
-/sdcard/android/layout_tests/fast/history/history_reload.html
-/sdcard/android/layout_tests/fast/history/go-back-to-changed-name.html
-/sdcard/android/layout_tests/fast/loader/cancel-load-during-port-block-timer.html
-/sdcard/android/layout_tests/fast/loader/local-iFrame-source-from-local.html
-/sdcard/android/layout_tests/fast/loader/null-request-after-willSendRequest.html
-/sdcard/android/layout_tests/fast/loader/stop-provisional-loads.html
-/sdcard/android/layout_tests/fast/loader/location-port.html
-/sdcard/android/layout_tests/fast/loader/user-style-sheet-resource-load-callbacks.html
-/sdcard/android/layout_tests/fast/loader/policy-delegate-action-hit-test-zoomed.html
-/sdcard/android/layout_tests/fast/loader/subframe-navigate-during-main-frame-load.html
-/sdcard/android/layout_tests/fast/loader/onunload-form-submit-crash-2.html
-/sdcard/android/layout_tests/fast/loader/javascript-url-hierarchical-execution.html
-/sdcard/android/layout_tests/fast/loader/plain-text-document.html
-/sdcard/android/layout_tests/fast/loader/onunload-form-submit-crash.html
-/sdcard/android/layout_tests/fast/loader/subframe-self-close.html
-/sdcard/android/layout_tests/fast/loader/local-image-from-local.html
-/sdcard/android/layout_tests/fast/loader/local-CSS-from-local.html
-/sdcard/android/layout_tests/fast/loader/reload-policy-delegate.html
-/sdcard/android/layout_tests/fast/loader/local-JavaScript-from-local.html
-/sdcard/android/layout_tests/fast/loader/main-document-url-for-non-http-loads.html
-/sdcard/android/layout_tests/fast/loader/data-url-encoding-svg.html
-/sdcard/android/layout_tests/fast/loader/data-url-encoding-html.html
-/sdcard/android/layout_tests/fast/loader/opaque-base-url.html
-/sdcard/android/layout_tests/fast/xsl/sort-locale.xml
-/sdcard/android/layout_tests/fast/xsl/transformToFragment-XML-declaration.html
-/sdcard/android/layout_tests/fast/xsl/extra-lf-at-end.html
-/sdcard/android/layout_tests/fast/xsl/xslt-doc-noenc.xml
-/sdcard/android/layout_tests/fast/xsl/import-after-comment.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-processor.html
-/sdcard/android/layout_tests/fast/xsl/sort-unicode.xml
-/sdcard/android/layout_tests/fast/xsl/default-html.html
-/sdcard/android/layout_tests/fast/xsl/nbsp-in-stylesheet.html
-/sdcard/android/layout_tests/fast/xsl/xslt-string-parameters.html
-/sdcard/android/layout_tests/fast/xsl/xslt-entity-enc.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-text.html
-/sdcard/android/layout_tests/fast/xsl/xslt-nested-stylesheets.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-url.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-doc-enc.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-recursion.xml
-/sdcard/android/layout_tests/fast/xsl/exslt-node-set.xml
-/sdcard/android/layout_tests/fast/xsl/subframe-location.html
-/sdcard/android/layout_tests/fast/xsl/xslt-second-level-import.xml
-/sdcard/android/layout_tests/fast/xsl/dtd-in-source-document.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-fragment-in-empty-doc.html
-/sdcard/android/layout_tests/fast/xsl/mozilla-tests.xml
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-bad-mimetype.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-gc.html
-/sdcard/android/layout_tests/fast/canvas/canvas-alphaImageData-behavior.html
-/sdcard/android/layout_tests/fast/canvas/canvas-gradient-addStop-error.html
-/sdcard/android/layout_tests/fast/canvas/canvas-pattern-behaviour.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-non-invertible.html
-/sdcard/android/layout_tests/fast/canvas/pointInPath.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-infinity.html
-/sdcard/android/layout_tests/fast/canvas/translate-text.html
-/sdcard/android/layout_tests/fast/canvas/toDataURL-supportedTypes.html
-/sdcard/android/layout_tests/fast/canvas/canvas-getImageData.html
-/sdcard/android/layout_tests/fast/canvas/canvas-empty-image-pattern.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-skewed.html
-/sdcard/android/layout_tests/fast/canvas/canvas-ImageData-behaviour.html
-/sdcard/android/layout_tests/fast/canvas/canvas-putImageData.html
-/sdcard/android/layout_tests/fast/canvas/canvas-pattern-modify.html
-/sdcard/android/layout_tests/fast/canvas/canvas-longlived-context.html
-/sdcard/android/layout_tests/fast/canvas/canvas-save-restore-with-path.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-nan.html
-/sdcard/android/layout_tests/fast/canvas/canvas-pattern-transform.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-identity.html
-/sdcard/android/layout_tests/fast/canvas/set-colors.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transform-multiply.html
-/sdcard/android/layout_tests/fast/frames/viewsource-empty-attribute-value.html
-/sdcard/android/layout_tests/fast/frames/location-put-after-removal.html
-/sdcard/android/layout_tests/fast/frames/frame-deep-nested-resize.html
-/sdcard/android/layout_tests/fast/frames/iframe-window-focus.html
-/sdcard/android/layout_tests/fast/frames/frame-dead-region.html
-/sdcard/android/layout_tests/fast/frames/frameElement-widthheight.html
-/sdcard/android/layout_tests/fast/frames/removal-before-attach-crash.html
-/sdcard/android/layout_tests/fast/frames/frame-unload-crash.html
-/sdcard/android/layout_tests/fast/frames/frame-js-url-clientWidth.html
-/sdcard/android/layout_tests/fast/frames/iframe-js-url-clientWidth.html
-/sdcard/android/layout_tests/fast/frames/frame-length-fractional.html
-/sdcard/android/layout_tests/fast/frames/iframe-name-and-id.html
-/sdcard/android/layout_tests/fast/loading/subframe-removes-itself.html
-/sdcard/android/layout_tests/http/tests/media/video-seekable-stall.html
-/sdcard/android/layout_tests/http/tests/media/remove-while-loading.html
-/sdcard/android/layout_tests/http/tests/media/video-play-stall.html
-/sdcard/android/layout_tests/http/tests/media/video-play-stall-seek.html
-/sdcard/android/layout_tests/http/tests/plugins/npapi-response-headers.html
-/sdcard/android/layout_tests/http/tests/plugins/get-url.html
-/sdcard/android/layout_tests/http/tests/plugins/interrupted-get-url.html
-/sdcard/android/layout_tests/http/tests/plugins/post-url-file.html
-/sdcard/android/layout_tests/http/tests/plugins/cross-frame-object-access.html
-/sdcard/android/layout_tests/http/tests/plugins/local-geturl-from-remote.html
-/sdcard/android/layout_tests/http/tests/plugins/geturlnotify-from-npp-destroystream.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-does-not-load-stylesheet-with-text-plain-and-css-extension.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-does-not-load-stylesheet-with-text-plain.html
-/sdcard/android/layout_tests/http/tests/local/drag-over-remote-content.html
-/sdcard/android/layout_tests/http/tests/misc/image-blocked-src-change.html
-/sdcard/android/layout_tests/http/tests/misc/acid3.html
-/sdcard/android/layout_tests/http/tests/misc/dns-prefetch-control.html
-/sdcard/android/layout_tests/http/tests/misc/will-send-request-returns-null-on-redirect.html
-/sdcard/android/layout_tests/http/tests/misc/isindex-formdata.html
-/sdcard/android/layout_tests/http/tests/misc/image-blocked-src-no-change.html
-/sdcard/android/layout_tests/http/tests/misc/policy-delegate-called-twice.html
-/sdcard/android/layout_tests/http/tests/misc/window-dot-stop.html
-/sdcard/android/layout_tests/http/tests/misc/css-reject-any-type-in-strict-mode.html
-/sdcard/android/layout_tests/http/tests/misc/favicon-loads-with-images-disabled.html
-/sdcard/android/layout_tests/http/tests/misc/SVGFont-delayed-load.html
-/sdcard/android/layout_tests/http/tests/misc/location-test-xsl-style-sheet.xml
-/sdcard/android/layout_tests/http/tests/misc/redirect-to-external-url.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf7.html
-/sdcard/android/layout_tests/http/tests/cookies/simple-cookies-max-age.html
-/sdcard/android/layout_tests/http/tests/cookies/simple-cookies-expired.html
-/sdcard/android/layout_tests/http/tests/cookies/multiple-cookies.html
-/sdcard/android/layout_tests/http/tests/wml/access-target-path-deny.html
-/sdcard/android/layout_tests/http/tests/wml/post-data-to-server.html
-/sdcard/android/layout_tests/http/tests/wml/go-task-get-method-accept-charset.html
-/sdcard/android/layout_tests/http/tests/wml/access-target.html
-/sdcard/android/layout_tests/http/tests/wml/access-target-domain-deny.html
-/sdcard/android/layout_tests/http/tests/wml/go-task-post-method-accept-charset.html
-/sdcard/android/layout_tests/http/tests/wml/go-task-get-method.html
-/sdcard/android/layout_tests/http/tests/wml/go-task-post-method.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-reload.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect-cycle.html
-/sdcard/android/layout_tests/http/tests/navigation/reload-subframe-frame.html
-/sdcard/android/layout_tests/http/tests/navigation/window-open-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/timerredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/lockedhistory-iframe.html
-/sdcard/android/layout_tests/http/tests/navigation/document-location-click-timeout.html
-/sdcard/android/layout_tests/http/tests/navigation/post-goback2.html
-/sdcard/android/layout_tests/http/tests/navigation/onload-navigation-iframe-timeout.html
-/sdcard/android/layout_tests/http/tests/navigation/location-assign-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/anchor-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect-load-no-form-restoration.html
-/sdcard/android/layout_tests/http/tests/navigation/metaredirect-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/javascriptlink-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/metaredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/post-goback-same-url.html
-/sdcard/android/layout_tests/http/tests/navigation/restore-form-state-https.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect302-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/document-location-mouseover.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect302-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/anchor-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/target-frame-from-window.html
-/sdcard/android/layout_tests/http/tests/navigation/slowmetaredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/reload-subframe-iframe.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-loadsame.html
-/sdcard/android/layout_tests/http/tests/navigation/relativeanchor-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect302-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/relativeanchor-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/metaredirect-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/redirect302-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/multiple-back-forward-entries.html
-/sdcard/android/layout_tests/http/tests/navigation/javascriptlink-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/postredirect-goback2.html
-/sdcard/android/layout_tests/http/tests/navigation/timerredirect-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/location-href-set-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/anchor-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/document-location-click.html
-/sdcard/android/layout_tests/http/tests/navigation/onload-navigation-iframe.html
-/sdcard/android/layout_tests/http/tests/navigation/relativeanchor-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/metaredirect-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/location-replace-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/success200-frames-loadsame.html
-/sdcard/android/layout_tests/http/tests/navigation/back-to-slow-frame.html
-/sdcard/android/layout_tests/http/tests/navigation/new-window-redirect-history.html
-/sdcard/android/layout_tests/http/tests/navigation/javascriptlink-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/timerredirect-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/location-set-adds-history-item.html
-/sdcard/android/layout_tests/http/tests/navigation/onload-navigation-iframe-2.html
-/sdcard/android/layout_tests/http/tests/navigation/reload-subframe-object.html
-/sdcard/android/layout_tests/http/tests/navigation/timerredirect-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/slowtimerredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/window-open-adds-history-item2.html
-/sdcard/android/layout_tests/http/tests/navigation/document-location-onload.html
-/sdcard/android/layout_tests/http/tests/history/redirect-meta-refresh-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-assign-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-href-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-href-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-form-submit-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-form-submit-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-href-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-replace-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-replace-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-document-location-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-document-location-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-form-submit-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-assign-0-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-assign-2-seconds.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-location-replace-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-js-document-location-before-load.html
-/sdcard/android/layout_tests/http/tests/history/redirect-meta-refresh-0-seconds.html
-/sdcard/android/layout_tests/http/tests/cache/subresource-expiration.html
-/sdcard/android/layout_tests/http/tests/appcache/local-content.html
-/sdcard/android/layout_tests/http/tests/appcache/max-size.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/xss-DENIED-set-opener.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/xss-DENIED-navigate-opener-javascript-url.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/xss-DENIED-navigate-opener-document-write.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-javascript-url-window-open.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame-2-level.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-in-foreign-domain-subframe.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-in-foreign-domain-window-open.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-in-foreign-domain-subframe-location-change.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-in-foreign-domain-subframe.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-in-foreign-domain-window-open.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-sub-frame-2-level.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame-uppercase.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-window-open.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-sub-frame-to-data-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-from-data-url-to-data-url.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-from-data-url.html
-/sdcard/android/layout_tests/http/tests/security/dataURL/xss-DENIED-to-data-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/clipboard/clipboard-file-access.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/image-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/body-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/number-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/body-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/global-variables.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/location-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/image-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/document-open.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/document-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/window-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/location-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/all-window-prototypes.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/click-event.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/all-window-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/document-properties.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/string-prototype.html
-/sdcard/android/layout_tests/http/tests/security/isolatedWorld/object-prototype.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-window-onclick-addEventListener.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-window-onclick-shortcut.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-parent-same-origin-allow.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-parent-same-origin-deny.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-in-body.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-allow.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-deny.html
-/sdcard/android/layout_tests/http/tests/security/XFrameOptions/x-frame-options-deny.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/xss-ALLOWED-targeted-subframe-navigation-change.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/xss-DENIED-targeted-link-navigation.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/xss-DENIED-plugin-navigation.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-setAttributeNode.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-setAttributeNodeNS.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-setAttribute.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-setAttributeNS.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-setAttributeNode.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-setAttributeNodeNS.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-sub-frame-2-level.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-to-javscript-url.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-to-javascript-url-from-javscript-url.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-getAttribute-value.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-htmldom.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-to-javascript-url-sub-frame-2-level.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-window-open.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-DENIED-from-javascript-url-in-foreign-domain-window-open.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-location-htmldom.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-iframe-src-getAttribute-value.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-from-javascript-url-sub-frame-to-javascript-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-DENIED-to-javascript-url-in-foreign-domain-subframe.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-to-javascript-url-window-open.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-htmldom.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-DENIED-to-javascript-url-in-foreign-domain-window-open.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-ALLOWED-to-javascript-url-sub-frame.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-setAttribute.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/javascriptURL-execution-context-frame-src-setAttributeNS.html
-/sdcard/android/layout_tests/http/tests/security/javascriptURL/xss-DENIED-from-javascript-url-in-foreign-domain-subframe.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-empty.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/faux-script1.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-convoluted.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-location.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-HTML-entities-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/object-embed-tag-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/anchor-url-dom-write-location.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick-ampersand.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-double-quote.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-no-quote.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-safe3.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/http-equiv-utf-7-encoded.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-scheme-relative.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-open-redirect.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/object-embed-tag-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/faux-script3.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-post.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/embed-tag-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/property-escape.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-post-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-HTML-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-addslashes-single-quote.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-innerHTML.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-location-inline-event.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/malformed-HTML.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-ampersand.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/anchor-url-dom-write-location-inline-event.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-safe2.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/anchor-url-dom-write-location-inline-event-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-URL.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-redirect.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/object-tag.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-addslashes-backslash.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/dom-write-location-javascript-URL.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/embed-tag.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/faux-script2.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/anchor-url-dom-write-location-javascript-URL.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-relative-scheme.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/img-onerror-tricky.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-HTML-entities-named.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link-HTML-entities-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-addslashes-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-opens-new-window.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-utf-7-encoded.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-utf-7.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-addslashes-double-quote.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-safe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/link-onclick-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/javascript-link.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-null-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/iframe-javascript-url.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-src-redirect-safe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-with-source-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/get-from-iframe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/inline-event-HTML-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/post-from-iframe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-post-control-char.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/object-embed-tag.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/script-tag-entities.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/base-href-safe.html
-/sdcard/android/layout_tests/http/tests/security/xssAuditor/embed-tag-null-char.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-location-get-override.html
-/sdcard/android/layout_tests/http/tests/security/protocol-compare-case-insensitive.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-xsl-external-entity.xml
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-history-get-override.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-get-override.html
-/sdcard/android/layout_tests/http/tests/security/cross-origin-xsl-BLOCKED.html
-/sdcard/android/layout_tests/http/tests/security/local-iFrame-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/credentials-in-referer.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-xsl-external-entity-redirect.xml
-/sdcard/android/layout_tests/http/tests/security/local-video-poster-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/local-CSS-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/local-user-CSS-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-object-prototype.html
-/sdcard/android/layout_tests/http/tests/security/dataTransfer-set-data-file-url.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-enumeration.html
-/sdcard/android/layout_tests/http/tests/security/host-compare-case-insensitive.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-xsl-document.xml
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-protocol.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-private-browsing.html
-/sdcard/android/layout_tests/http/tests/security/feed-urls-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-put.html
-/sdcard/android/layout_tests/http/tests/security/canvas-remote-read-svg-image.html
-/sdcard/android/layout_tests/http/tests/security/window-properties-clear-domain.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-callback-explicit-domain-DENY.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-get.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-port.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-document-direct.html
-/sdcard/android/layout_tests/http/tests/security/window-properties-pass.html
-/sdcard/android/layout_tests/http/tests/security/local-video-src-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-history-put.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-child-explicit-domain.html
-/sdcard/android/layout_tests/http/tests/security/local-video-source-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/drag-over-remote-content-iframe.html
-/sdcard/android/layout_tests/http/tests/security/local-JavaScript-from-remote.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-parent-explicit-domain.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-location-put.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-history-get.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-get-custom-property-cached.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-location-get.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-delete.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-xsl-document-redirect.xml
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-protocol-explicit-domain.html
-/sdcard/android/layout_tests/http/tests/security/window-properties-clear-port.html
-/sdcard/android/layout_tests/http/tests/security/frame-loading-via-document-write.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-port-explicit-domain.html
-/sdcard/android/layout_tests/http/tests/security/local-image-from-remote.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/methods-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/methods.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/008.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/methods-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/methods.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-005.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/upload-onload-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/small-chunks-response-text.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-non-simple-allow-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-009.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/frame-unload-abort-crash.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-non-simple-deny-cached.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-unsafe-redirect.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-006.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/upload-onprogress-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cache-override.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xhr-onunload.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/methods-lower-case.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-007.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/svg-created-by-xhr-disallowed-in-dashboard.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-004.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-missing-file-exception.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cookies.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-010.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-tripmine.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-same-origin-get-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/response-encoding.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/frame-load-cancelled-abort.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/upload-progress-events.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xml-encoding.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/default-content-type-dashboard.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/abort-should-cancel-load.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-whitelist-request-headers.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/uri-resolution-opera-open-008.html
-/sdcard/android/layout_tests/http/tests/loading/preload-img-test.html
-/sdcard/android/layout_tests/http/tests/loading/gmail-assert-on-load.html
-/sdcard/android/layout_tests/http/tests/loading/text-content-type-with-binary-extension.html
-/sdcard/android/layout_tests/http/tests/loading/basic.html
-/sdcard/android/layout_tests/http/tests/loading/slow-parsing-subframe.html
-/sdcard/android/layout_tests/http/tests/loading/deleted-host-in-resource-load-delegate-callback.html
-/sdcard/android/layout_tests/http/tests/loading/bad-scheme-subframe.html
-/sdcard/android/layout_tests/http/tests/loading/location-hash-reload-cycle.html
-/sdcard/android/layout_tests/http/tests/loading/bad-server-subframe.html
-/sdcard/android/layout_tests/http/tests/loading/empty-subframe.html
-/sdcard/android/layout_tests/http/tests/loading/redirect-methods.html
-/sdcard/android/layout_tests/media/video-error-does-not-exist.html
-/sdcard/android/layout_tests/media/audio-constructor.html
-/sdcard/android/layout_tests/media/video-play-empty-events.html
-/sdcard/android/layout_tests/media/video-append-source.html
-/sdcard/android/layout_tests/media/media-load-event.html
-/sdcard/android/layout_tests/media/unsupported-rtsp.html
-/sdcard/android/layout_tests/media/video-dom-autoplay.html
-/sdcard/android/layout_tests/media/video-currentTime-set2.html
-/sdcard/android/layout_tests/media/video-muted.html
-/sdcard/android/layout_tests/media/progress-event.html
-/sdcard/android/layout_tests/media/video-source-type.html
-/sdcard/android/layout_tests/media/audio-delete-while-step-button-clicked.html
-/sdcard/android/layout_tests/media/video-played-reset.html
-/sdcard/android/layout_tests/media/video-seek-past-end-playing.html
-/sdcard/android/layout_tests/media/video-dom-src.html
-/sdcard/android/layout_tests/media/remove-from-document.html
-/sdcard/android/layout_tests/media/video-loop.html
-/sdcard/android/layout_tests/media/video-src-change.html
-/sdcard/android/layout_tests/media/video-seekable.html
-/sdcard/android/layout_tests/media/video-played.html
-/sdcard/android/layout_tests/media/video-played-collapse.html
-/sdcard/android/layout_tests/media/video-click-dblckick-standalone.html
-/sdcard/android/layout_tests/media/video-can-play-type.html
-/sdcard/android/layout_tests/media/video-seeking.html
-/sdcard/android/layout_tests/media/video-controls-transformed.html
-/sdcard/android/layout_tests/media/video-controls-zoomed.html
-/sdcard/android/layout_tests/media/video-src-invalid-remove.html
-/sdcard/android/layout_tests/media/video-volume.html
-/sdcard/android/layout_tests/media/video-size.html
-/sdcard/android/layout_tests/media/controls-right-click-on-timebar.html
-/sdcard/android/layout_tests/media/video-currentTime.html
-/sdcard/android/layout_tests/media/audio-constructor-autobuffer.html
-/sdcard/android/layout_tests/media/broken-video.html
-/sdcard/android/layout_tests/media/video-buffered.html
-/sdcard/android/layout_tests/media/video-load-readyState.html
-/sdcard/android/layout_tests/media/video-load-networkState.html
-/sdcard/android/layout_tests/media/unsupported-tracks.html
-/sdcard/android/layout_tests/media/video-source-add-src.html
-/sdcard/android/layout_tests/media/video-seek-past-end-paused.html
-/sdcard/android/layout_tests/media/media-startTime.html
-/sdcard/android/layout_tests/media/video-source-error.html
-/sdcard/android/layout_tests/media/video-autoplay.html
-/sdcard/android/layout_tests/media/video-controls.html
-/sdcard/android/layout_tests/media/video-canvas-source.html
-/sdcard/android/layout_tests/media/video-timeupdate-during-playback.html
-/sdcard/android/layout_tests/media/video-currentTime-set.html
-/sdcard/android/layout_tests/media/controls-css-overload.html
-/sdcard/android/layout_tests/media/video-source-type-params.html
-/sdcard/android/layout_tests/media/event-attributes.html
-/sdcard/android/layout_tests/media/audio-data-url.html
-/sdcard/android/layout_tests/media/video-src-plus-source.html
-/sdcard/android/layout_tests/media/video-no-autoplay.html
-/sdcard/android/layout_tests/media/video-pause-empty-events.html
-/sdcard/android/layout_tests/media/video-document-types.html
-/sdcard/android/layout_tests/media/video-src-remove.html
-/sdcard/android/layout_tests/media/audio-delete-while-slider-thumb-clicked.html
-/sdcard/android/layout_tests/media/video-error-abort.html
-/sdcard/android/layout_tests/media/video-size-intrinsic-scale.html
-/sdcard/android/layout_tests/media/progress-event-total.html
-/sdcard/android/layout_tests/media/audio-constructor-src.html
-/sdcard/android/layout_tests/media/audio-mpeg-supported.html
-/sdcard/android/layout_tests/plugins/throw-on-dealloc.html
-/sdcard/android/layout_tests/plugins/invoke.html
-/sdcard/android/layout_tests/plugins/plugin-remove-subframe.html
-/sdcard/android/layout_tests/plugins/netscape-identifier-conversion.html
-/sdcard/android/layout_tests/plugins/netscape-invoke-browserfuncs.html
-/sdcard/android/layout_tests/plugins/call-as-function-test.html
-/sdcard/android/layout_tests/plugins/npruntime.html
-/sdcard/android/layout_tests/plugins/netscape-construct.html
-/sdcard/android/layout_tests/plugins/root-object-premature-delete-crash.html
-/sdcard/android/layout_tests/plugins/netscape-get-property-return-value.html
-/sdcard/android/layout_tests/plugins/mouse-events.html
-/sdcard/android/layout_tests/plugins/return-error-from-new-stream-doesnt-invoke-destroy-stream.html
-/sdcard/android/layout_tests/plugins/destroy-stream-twice.html
-/sdcard/android/layout_tests/plugins/jsobjc-simple.html
-/sdcard/android/layout_tests/plugins/embed-attributes-setting.html
-/sdcard/android/layout_tests/plugins/inner-html-display-none.html
-/sdcard/android/layout_tests/plugins/netscape-invoke-default.html
-/sdcard/android/layout_tests/plugins/undefined-property-crash.html
-/sdcard/android/layout_tests/plugins/netscape-plugin-map-data-to-src.html
-/sdcard/android/layout_tests/plugins/netscape-plugin-setwindow-size-2.html
-/sdcard/android/layout_tests/plugins/jsobjc-dom-wrappers.html
-/sdcard/android/layout_tests/plugins/plugin-javascript-access.html
-/sdcard/android/layout_tests/plugins/getintidentifier-special-values.html
-/sdcard/android/layout_tests/plugins/get-empty-url.html
-/sdcard/android/layout_tests/plugins/geturl-replace-query.html
-/sdcard/android/layout_tests/plugins/netscape-destroy-plugin-script-objects.html
-/sdcard/android/layout_tests/plugins/open-and-close-window-with-plugin.html
-/sdcard/android/layout_tests/plugins/netscape-enumerate.html
-/sdcard/android/layout_tests/plugins/get-url-that-the-resource-load-delegate-will-disallow.html
-/sdcard/android/layout_tests/plugins/netscape-plugin-setwindow-size.html
-/sdcard/android/layout_tests/plugins/embed-inside-object.html
-/sdcard/android/layout_tests/plugins/netscape-throw-exception.html
-/sdcard/android/layout_tests/plugins/get-url-with-blank-target.html
-/sdcard/android/layout_tests/plugins/bindings-test.html
-/sdcard/android/layout_tests/scrollbars/scrollbar-miss-mousemove-disabled.html
-/sdcard/android/layout_tests/security/set-form-autocomplete-attribute.html
-/sdcard/android/layout_tests/storage/execute-sql-args.html
-/sdcard/android/layout_tests/transitions/transition-shorthand-delay.html
-/sdcard/android/layout_tests/transitions/transition-drt-api-delay.html
-/sdcard/android/layout_tests/transitions/transition-hit-test.html
-/sdcard/android/layout_tests/transitions/opacity-transition-zindex.html
-/sdcard/android/layout_tests/transitions/interrupted-all-transition.html
-/sdcard/android/layout_tests/transitions/hang-with-bad-transition-list.html
-/sdcard/android/layout_tests/transitions/zero-duration-with-non-zero-delay-end.html
-/sdcard/android/layout_tests/transitions/remove-transition-style.html
-/sdcard/android/layout_tests/transitions/transition-hit-test-transform.html
-/sdcard/android/layout_tests/transitions/repeated-firing-background-color.html
-/sdcard/android/layout_tests/webarchive/loading/test-loading-archive.html
-/sdcard/android/layout_tests/wml/onenterforward-event.html
-/sdcard/android/layout_tests/wml/go-task-get-method-external-deck-with-href.html
-/sdcard/android/layout_tests/wml/option-element-onpick.html
-/sdcard/android/layout_tests/wml/enter-first-card-with-events.html
-/sdcard/android/layout_tests/wml/go-task-get-method-external-deck.html
-/sdcard/android/layout_tests/wml/go-task-get-method-same-deck.html
-/sdcard/android/layout_tests/wml/onenterforward-inline-event.html
-/sdcard/android/layout_tests/wml/ontimer-event.html
-/sdcard/android/layout_tests/wml/variable-reference-invalid-character.html
-/sdcard/android/layout_tests/wml/enter-card-with-events.html
-/sdcard/android/layout_tests/wml/ontimer-inline-event.html
-/sdcard/android/layout_tests/wml/select-element-variables.html
-/sdcard/android/layout_tests/wml/variable-reference-valid.html
-/sdcard/android/layout_tests/wml/access-target-deny.html
-/sdcard/android/layout_tests/wml/input-format.html
-/sdcard/android/layout_tests/wml/access-target.html
-/sdcard/android/layout_tests/wml/newcontext-same-deck.html
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt b/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt
deleted file mode 100644
index 665ef07..0000000
--- a/tests/DumpRenderTree/assets/results/layout_tests_nontext.txt
+++ /dev/null
@@ -1,4280 +0,0 @@
-/sdcard/android/layout_tests/accessibility/image-map1.html
-/sdcard/android/layout_tests/accessibility/aria-labelledby-on-input.html
-/sdcard/android/layout_tests/accessibility/aria-labelledby-stay-within.html
-/sdcard/android/layout_tests/accessibility/table-with-rules.html
-/sdcard/android/layout_tests/accessibility/aria-describedby-on-input.html
-/sdcard/android/layout_tests/accessibility/table-detection.html
-/sdcard/android/layout_tests/accessibility/table-with-aria-role.html
-/sdcard/android/layout_tests/accessibility/image-map2.html
-/sdcard/android/layout_tests/accessibility/table-cell-spans.html
-/sdcard/android/layout_tests/accessibility/table-cells.html
-/sdcard/android/layout_tests/accessibility/lists.html
-/sdcard/android/layout_tests/accessibility/plugin.html
-/sdcard/android/layout_tests/accessibility/table-sections.html
-/sdcard/android/layout_tests/accessibility/table-one-cell.html
-/sdcard/android/layout_tests/accessibility/internal-link-anchors2.html
-/sdcard/android/layout_tests/accessibility/radio-button-group-members.html
-/sdcard/android/layout_tests/accessibility/table-attributes.html
-/sdcard/android/layout_tests/accessibility/input-slider.html
-/sdcard/android/layout_tests/accessibility/aria-tables.html
-/sdcard/android/layout_tests/accessibility/legend.html
-/sdcard/android/layout_tests/accessibility/aria-roles.html
-/sdcard/android/layout_tests/animations/animation-drt-api-multiple-keyframes.html
-/sdcard/android/layout_tests/animations/animation-drt-api.html
-/sdcard/android/layout_tests/compositing/repaint/content-into-overflow.html
-/sdcard/android/layout_tests/compositing/repaint/overflow-into-content.html
-/sdcard/android/layout_tests/compositing/repaint/become-overlay-composited-layer.html
-/sdcard/android/layout_tests/compositing/repaint/layer-repaint-rects.html
-/sdcard/android/layout_tests/compositing/overflow/ancestor-overflow.html
-/sdcard/android/layout_tests/compositing/overflow/overflow-scroll.html
-/sdcard/android/layout_tests/compositing/overflow/overflow-positioning.html
-/sdcard/android/layout_tests/compositing/overflow/parent-overflow.html
-/sdcard/android/layout_tests/compositing/color-matching/image-color-matching.html
-/sdcard/android/layout_tests/compositing/geometry/root-layer-update.html
-/sdcard/android/layout_tests/compositing/geometry/outline-change.html
-/sdcard/android/layout_tests/compositing/reflections/reflection-on-composited.html
-/sdcard/android/layout_tests/compositing/self-painting-layers.html
-/sdcard/android/layout_tests/compositing/direct-image-compositing.html
-/sdcard/android/layout_tests/compositing/layers-inside-overflow-scroll.html
-/sdcard/android/layout_tests/compositing/generated-content.html
-/sdcard/android/layout_tests/compositing/sibling-positioning.html
-/sdcard/android/layout_tests/css1/color_and_background/background_color.html
-/sdcard/android/layout_tests/css1/color_and_background/color.html
-/sdcard/android/layout_tests/css1/color_and_background/background.html
-/sdcard/android/layout_tests/css1/color_and_background/background_repeat.html
-/sdcard/android/layout_tests/css1/color_and_background/background_image.html
-/sdcard/android/layout_tests/css1/color_and_background/background_position.html
-/sdcard/android/layout_tests/css1/color_and_background/background_attachment.html
-/sdcard/android/layout_tests/css1/pseudo/firstline.html
-/sdcard/android/layout_tests/css1/pseudo/pseudo_elements_in_selectors.html
-/sdcard/android/layout_tests/css1/pseudo/multiple_pseudo_elements.html
-/sdcard/android/layout_tests/css1/pseudo/firstletter.html
-/sdcard/android/layout_tests/css1/pseudo/anchor.html
-/sdcard/android/layout_tests/css1/text_properties/text_align.html
-/sdcard/android/layout_tests/css1/text_properties/line_height.html
-/sdcard/android/layout_tests/css1/text_properties/text_transform.html
-/sdcard/android/layout_tests/css1/text_properties/word_spacing.html
-/sdcard/android/layout_tests/css1/text_properties/letter_spacing.html
-/sdcard/android/layout_tests/css1/text_properties/vertical_align.html
-/sdcard/android/layout_tests/css1/text_properties/text_indent.html
-/sdcard/android/layout_tests/css1/text_properties/text_decoration.html
-/sdcard/android/layout_tests/css1/basic/containment.html
-/sdcard/android/layout_tests/css1/basic/id_as_selector.html
-/sdcard/android/layout_tests/css1/basic/comments.html
-/sdcard/android/layout_tests/css1/basic/class_as_selector.html
-/sdcard/android/layout_tests/css1/basic/contextual_selectors.html
-/sdcard/android/layout_tests/css1/basic/inheritance.html
-/sdcard/android/layout_tests/css1/basic/grouping.html
-/sdcard/android/layout_tests/css1/font_properties/font_weight.html
-/sdcard/android/layout_tests/css1/font_properties/font_size.html
-/sdcard/android/layout_tests/css1/font_properties/font.html
-/sdcard/android/layout_tests/css1/font_properties/font_style.html
-/sdcard/android/layout_tests/css1/font_properties/font_family.html
-/sdcard/android/layout_tests/css1/font_properties/font_variant.html
-/sdcard/android/layout_tests/css1/units/percentage_units.html
-/sdcard/android/layout_tests/css1/units/color_units.html
-/sdcard/android/layout_tests/css1/units/length_units.html
-/sdcard/android/layout_tests/css1/units/urls.html
-/sdcard/android/layout_tests/css1/cascade/important.html
-/sdcard/android/layout_tests/css1/cascade/cascade_order.html
-/sdcard/android/layout_tests/css1/box_properties/border_width.html
-/sdcard/android/layout_tests/css1/box_properties/margin.html
-/sdcard/android/layout_tests/css1/box_properties/width.html
-/sdcard/android/layout_tests/css1/box_properties/padding_left.html
-/sdcard/android/layout_tests/css1/box_properties/margin_left_inline.html
-/sdcard/android/layout_tests/css1/box_properties/clear.html
-/sdcard/android/layout_tests/css1/box_properties/border_left_width.html
-/sdcard/android/layout_tests/css1/box_properties/margin_left.html
-/sdcard/android/layout_tests/css1/box_properties/padding_top.html
-/sdcard/android/layout_tests/css1/box_properties/padding_bottom.html
-/sdcard/android/layout_tests/css1/box_properties/border_style_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_top_width_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_top_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_style.html
-/sdcard/android/layout_tests/css1/box_properties/border_top.html
-/sdcard/android/layout_tests/css1/box_properties/margin_bottom_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_bottom_width.html
-/sdcard/android/layout_tests/css1/box_properties/margin_bottom.html
-/sdcard/android/layout_tests/css1/box_properties/float_elements_in_series.html
-/sdcard/android/layout_tests/css1/box_properties/float_on_text_elements.html
-/sdcard/android/layout_tests/css1/box_properties/padding.html
-/sdcard/android/layout_tests/css1/box_properties/border_right_width_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_right_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_right_width.html
-/sdcard/android/layout_tests/css1/box_properties/margin_right.html
-/sdcard/android/layout_tests/css1/box_properties/border_width_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_inline.html
-/sdcard/android/layout_tests/css1/box_properties/clear_float.html
-/sdcard/android/layout_tests/css1/box_properties/border.html
-/sdcard/android/layout_tests/css1/box_properties/padding_left_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_left_width_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_left_inline.html
-/sdcard/android/layout_tests/css1/box_properties/padding_top_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_left.html
-/sdcard/android/layout_tests/css1/box_properties/padding_bottom_inline.html
-/sdcard/android/layout_tests/css1/box_properties/margin_top_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_top_width.html
-/sdcard/android/layout_tests/css1/box_properties/border_bottom_width_inline.html
-/sdcard/android/layout_tests/css1/box_properties/acid_test.html
-/sdcard/android/layout_tests/css1/box_properties/border_bottom_inline.html
-/sdcard/android/layout_tests/css1/box_properties/margin_top.html
-/sdcard/android/layout_tests/css1/box_properties/border_bottom.html
-/sdcard/android/layout_tests/css1/box_properties/padding_right_inline.html
-/sdcard/android/layout_tests/css1/box_properties/float_margin.html
-/sdcard/android/layout_tests/css1/box_properties/padding_right.html
-/sdcard/android/layout_tests/css1/box_properties/padding_inline.html
-/sdcard/android/layout_tests/css1/box_properties/float.html
-/sdcard/android/layout_tests/css1/box_properties/height.html
-/sdcard/android/layout_tests/css1/box_properties/margin_right_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_color_inline.html
-/sdcard/android/layout_tests/css1/box_properties/border_right.html
-/sdcard/android/layout_tests/css1/box_properties/border_color.html
-/sdcard/android/layout_tests/css1/box_properties/margin_inline.html
-/sdcard/android/layout_tests/css1/conformance/forward_compatible_parsing.html
-/sdcard/android/layout_tests/css1/formatting_model/floating_elements.html
-/sdcard/android/layout_tests/css1/formatting_model/horizontal_formatting.html
-/sdcard/android/layout_tests/css1/formatting_model/vertical_formatting.html
-/sdcard/android/layout_tests/css1/formatting_model/height_of_lines.html
-/sdcard/android/layout_tests/css1/formatting_model/inline_elements.html
-/sdcard/android/layout_tests/css1/formatting_model/canvas.html
-/sdcard/android/layout_tests/css1/formatting_model/replaced_elements.html
-/sdcard/android/layout_tests/css1/classification/list_style_type.html
-/sdcard/android/layout_tests/css1/classification/list_style_image.html
-/sdcard/android/layout_tests/css1/classification/list_style_position.html
-/sdcard/android/layout_tests/css1/classification/display.html
-/sdcard/android/layout_tests/css1/classification/list_style.html
-/sdcard/android/layout_tests/css1/classification/white_space.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-03-c.html
-/sdcard/android/layout_tests/css2.1/t0804-c5509-padn-l-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t1205-c563-list-type-00-b.html
-/sdcard/android/layout_tests/css2.1/t090402-c42-ibx-pad-00-d-ag.html
-/sdcard/android/layout_tests/css2.1/t120401-scope-00-b.html
-/sdcard/android/layout_tests/css2.1/t010403-shand-border-00-c.html
-/sdcard/android/layout_tests/css2.1/t0805-c5518-ibrdr-t-00-a.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-03-b.html
-/sdcard/android/layout_tests/css2.1/t1008-c44-ln-box-00-d-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-14-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-34-d.html
-/sdcard/android/layout_tests/css2.1/t1204-implied-00-b.html
-/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-03-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-54-d.html
-/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-00-c-a.html
-/sdcard/android/layout_tests/css2.1/t0905-c5526-fltclr-00-c-ag.html
-/sdcard/android/layout_tests/css2.1/bogus-color-span.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-74-d.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-03-b-a.html
-/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-04-c-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-94-d.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-03-b-a.html
-/sdcard/android/layout_tests/css2.1/t040307-syntax-01-b.html
-/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-04-d-ag.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-06-b.html
-/sdcard/android/layout_tests/css2.1/t040306-c63-color-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-02-b.html
-/sdcard/android/layout_tests/css2.1/t080301-c411-vt-mrgn-00-b.html
-/sdcard/android/layout_tests/css2.1/t010403-shand-font-03-b.html
-/sdcard/android/layout_tests/css2.1/t051103-c21-focus-ln-00-e-i.html
-/sdcard/android/layout_tests/css2.1/t120403-display-none-00-c.html
-/sdcard/android/layout_tests/css2.1/t0805-c5512-brdr-rw-01-b-g.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-12-c.html
-/sdcard/android/layout_tests/css2.1/t0805-c5515-ibrdr-00-b.html
-/sdcard/android/layout_tests/css2.1/t0805-c5520-brdr-b-00-a.html
-/sdcard/android/layout_tests/css2.1/t1505-c524-font-var-00-b.html
-/sdcard/android/layout_tests/css2.1/t0509-c15-ids-00-a.html
-/sdcard/android/layout_tests/css2.1/t060403-c21-pseu-cls-00-e-i.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-03-d.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-12-b.html
-/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-04-f.html
-/sdcard/android/layout_tests/css2.1/t040303-c62-percent-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-23-d.html
-/sdcard/android/layout_tests/css2.1/t140201-c535-bg-fixd-00-b-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-43-d.html
-/sdcard/android/layout_tests/css2.1/t1204-increment-02-c-o.html
-/sdcard/android/layout_tests/css2.1/t0602-c13-inh-underlin-00-e.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-63-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-83-d.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-16-f.html
-/sdcard/android/layout_tests/css2.1/t040302-c61-phys-len-00-b.html
-/sdcard/android/layout_tests/css2.1/t0805-c5516-ibrdr-c-00-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5521-brdr-l-01-e.html
-/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-03-d-agi.html
-/sdcard/android/layout_tests/css2.1/t040103-escapes-06-b.html
-/sdcard/android/layout_tests/css2.1/t0402-syntax-03-f.html
-/sdcard/android/layout_tests/css2.1/t050803-c14-classes-00-e.html
-/sdcard/android/layout_tests/css2.1/t140201-c537-bgfxps-00-c-ag.html
-/sdcard/android/layout_tests/css2.1/t1002-c5523-width-02-b-g.html
-/sdcard/android/layout_tests/css2.1/t1004-c5524-width-00-b-g.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-11-b.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-06-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0805-c5522-brdr-02-e.html
-/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-anch-00-e-i.html
-/sdcard/android/layout_tests/css2.1/t0804-c5508-ipadn-b-01-f-a.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-04-b-ag.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-01-c.html
-/sdcard/android/layout_tests/css2.1/t040102-keywords-00-b.html
-/sdcard/android/layout_tests/css2.1/t0505-c16-descendant-02-e.html
-/sdcard/android/layout_tests/css2.1/t1507-c526-font-sz-03-f-a.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-09-b.html
-/sdcard/android/layout_tests/css2.1/t1204-root-e.html
-/sdcard/android/layout_tests/css2.1/t0905-c414-flt-fit-01-d-g.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-01-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-12-d.html
-/sdcard/android/layout_tests/css2.1/t090501-c5525-flt-r-00-b-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-32-d.html
-/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-01-b.html
-/sdcard/android/layout_tests/css2.1/t1004-c43-rpl-bbx-00-d-ag.html
-/sdcard/android/layout_tests/css2.1/t140201-c534-bgre-01-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-02-b-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-52-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5512-brdr-rw-02-b.html
-/sdcard/android/layout_tests/css2.1/t040109-c17-comments-00-b.html
-/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-72-d.html
-/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-01-c-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-92-d.html
-/sdcard/android/layout_tests/css2.1/t0905-c414-flt-01-d-g.html
-/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-01-b-ag.html
-/sdcard/android/layout_tests/css2.1/t090501-c414-flt-03-b-g.html
-/sdcard/android/layout_tests/css2.1/t1204-multiple-01-c.html
-/sdcard/android/layout_tests/css2.1/t0803-c5505-mrgn-03-c-ag.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-04-b.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-00-b.html
-/sdcard/android/layout_tests/css2.1/t1602-c43-center-00-d-ag.html
-/sdcard/android/layout_tests/css2.1/t140201-c532-bgcolor-00-a.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-mrgn-l-03-c.html
-/sdcard/android/layout_tests/css2.1/t010403-shand-font-01-b.html
-/sdcard/android/layout_tests/css2.1/t1005-c5524-width-01-b-g.html
-/sdcard/android/layout_tests/css2.1/t1601-c547-indent-01-d.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-10-c.html
-/sdcard/android/layout_tests/css2.1/t090501-c414-flt-01-b.html
-/sdcard/android/layout_tests/css2.1/t0803-c5505-mrgn-02-c.html
-/sdcard/android/layout_tests/css2.1/t0905-c414-flt-04-c.html
-/sdcard/android/layout_tests/css2.1/t051103-dom-hover-01-c-io.html
-/sdcard/android/layout_tests/css2.1/t1604-c542-letter-sp-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-08-c.html
-/sdcard/android/layout_tests/css2.1/t120401-scope-02-c.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-01-d.html
-/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-02-f.html
-/sdcard/android/layout_tests/css2.1/t1204-reset-00-c-o.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-21-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-41-d.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwidth-01-c-g.html
-/sdcard/android/layout_tests/css2.1/t1507-c526-font-sz-00-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-61-d.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-08-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-81-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-19-d.html
-/sdcard/android/layout_tests/css2.1/t040103-escapes-04-b.html
-/sdcard/android/layout_tests/css2.1/t1604-c541-word-sp-01-b-a.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-39-d.html
-/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-08-b.html
-/sdcard/android/layout_tests/css2.1/t0402-syntax-01-f.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-59-d.html
-/sdcard/android/layout_tests/css2.1/t1205-c565-list-pos-00-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-79-d.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-10-c.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-99-d.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-01-b-ag.html
-/sdcard/android/layout_tests/css2.1/t040306-syntax-01-f.html
-/sdcard/android/layout_tests/css2.1/t1507-c526-font-sz-01-b-a.html
-/sdcard/android/layout_tests/css2.1/t040105-atrule-04-b.html
-/sdcard/android/layout_tests/css2.1/t0505-c16-descendant-00-e.html
-/sdcard/android/layout_tests/css2.1/t0805-c5513-brdr-bw-02-b.html
-/sdcard/android/layout_tests/css2.1/t0805-c5519-brdr-r-01-e.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-07-b.html
-/sdcard/android/layout_tests/css2.1/t0804-c5510-padn-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0805-c5517-ibrdr-s-00-a.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-10-d.html
-/sdcard/android/layout_tests/css2.1/t040105-import-00-b.html
-/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-03-b-a.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-30-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5514-brdr-lw-02-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-50-d.html
-/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-03-b-a.html
-/sdcard/android/layout_tests/css2.1/t1008-c44-ln-box-02-d-ag.html
-/sdcard/android/layout_tests/css2.1/t0805-c5512-brdr-rw-00-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-70-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-08-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-90-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-28-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-48-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5513-brdr-bw-01-b-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-68-d.html
-/sdcard/android/layout_tests/css2.1/t1402-c45-bg-canvas-00-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-88-d.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-02-b.html
-/sdcard/android/layout_tests/css2.1/t0805-c5521-ibrdr-l-00-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5522-brdr-00-b.html
-/sdcard/android/layout_tests/css2.1/t1606-c562-white-sp-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0905-c414-flt-02-c.html
-/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-00-a-ag.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-06-c.html
-/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-00-f.html
-/sdcard/android/layout_tests/css2.1/t1204-reset-02-c-o.html
-/sdcard/android/layout_tests/css2.1/t0602-c13-inheritance-00-e.html
-/sdcard/android/layout_tests/css2.1/t090501-c414-flt-ln-02-d.html
-/sdcard/android/layout_tests/css2.1/t1205-c566-list-stl-01-c-g.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-06-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-17-d.html
-/sdcard/android/layout_tests/css2.1/t100304-c43-rpl-bbx-00-d-g.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-mrgn-l-00-c-ag.html
-/sdcard/android/layout_tests/css2.1/t1205-c566-list-stl-00-e-ag.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwidth-03-c-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-37-d.html
-/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-06-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-57-d.html
-/sdcard/android/layout_tests/css2.1/t0804-c5510-padn-02-f.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-77-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-97-d.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t090204-display-change-01-b-ao.html
-/sdcard/android/layout_tests/css2.1/t040302-c61-ex-len-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t040105-atrule-02-b.html
-/sdcard/android/layout_tests/css2.1/t0805-c5513-brdr-bw-00-b.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-09-b.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-05-b.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-mrgn-r-02-c.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-06-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0804-c5507-padn-r-01-c-a.html
-/sdcard/android/layout_tests/css2.1/t090501-c414-flt-00-d.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-17-d.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-mrgn-l-01-c-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5514-brdr-lw-00-b.html
-/sdcard/android/layout_tests/css2.1/t140201-c536-bgpos-01-b-ag.html
-/sdcard/android/layout_tests/css2.1/t100303-c412-blockw-00-d-ag.html
-/sdcard/android/layout_tests/css2.1/t120401-scope-04-d.html
-/sdcard/android/layout_tests/css2.1/t0804-c5506-ipadn-t-01-b-a.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-06-d.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-15-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-26-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5521-brdr-l-00-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5511-brdr-tw-02-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-46-d.html
-/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-02-b-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-66-d.html
-/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-03-c-ag.html
-/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-02-d-agi.html
-/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-04-f-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-86-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5512-ibrdr-rw-00-a.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-00-b.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltblck-01-d.html
-/sdcard/android/layout_tests/css2.1/t0402-syntax-06-f.html
-/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-03-d-ag.html
-/sdcard/android/layout_tests/css2.1/t0805-c5515-brdr-w-00-a.html
-/sdcard/android/layout_tests/css2.1/t051202-c24-first-lttr-00-b.html
-/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-link-02-e.html
-/sdcard/android/layout_tests/css2.1/t0804-c5510-padn-01-e-a.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltinln-00-c-ag.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-14-b.html
-/sdcard/android/layout_tests/css2.1/t0805-c5518-brdr-t-01-e.html
-/sdcard/android/layout_tests/css2.1/t040105-atkeyw-01-b.html
-/sdcard/android/layout_tests/css2.1/t0805-c5511-brdr-tw-01-b-g.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-04-c.html
-/sdcard/android/layout_tests/css2.1/t1205-c563-list-type-01-b.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-18-f.html
-/sdcard/android/layout_tests/css2.1/t0509-id-sel-syntax-01-f.html
-/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-01-d-ag.html
-/sdcard/android/layout_tests/css2.1/t090501-c414-flt-ln-00-d.html
-/sdcard/android/layout_tests/css2.1/t1601-c547-indent-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-04-b.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-flthw-00-c-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-15-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5522-brdr-01-b-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-35-d.html
-/sdcard/android/layout_tests/css2.1/t040103-escapes-00-b.html
-/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-04-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-55-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-75-d.html
-/sdcard/android/layout_tests/css2.1/t1205-c564-list-img-00-b-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-95-d.html
-/sdcard/android/layout_tests/css2.1/t120403-visibility-00-c.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-02-b-a.html
-/sdcard/android/layout_tests/css2.1/t051103-c21-activ-ln-00-e-i.html
-/sdcard/android/layout_tests/css2.1/t0801-c412-hz-box-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t090501-c414-flt-02-d-g.html
-/sdcard/android/layout_tests/css2.1/t1605-c545-txttrans-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t040105-atrule-00-b.html
-/sdcard/android/layout_tests/css2.1/t100801-c548-leadin-00-d-a.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-05-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0804-c5508-ipadn-b-03-b-a.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-07-b.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-03-b.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-13-c.html
-/sdcard/android/layout_tests/css2.1/t1204-order-01-d.html
-/sdcard/android/layout_tests/css2.1/t0804-c5510-ipadn-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-04-d.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-13-b.html
-/sdcard/android/layout_tests/css2.1/t140201-c534-bgre-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t1504-c523-font-style-00-b.html
-/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-01-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-mrgn-r-01-c-a.html
-/sdcard/android/layout_tests/css2.1/t1204-increment-01-c-o.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-24-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5511-brdr-tw-00-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-44-d.html
-/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-00-c-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-64-d.html
-/sdcard/android/layout_tests/css2.1/t1204-implied-02-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-84-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5521-brdr-l-02-e.html
-/sdcard/android/layout_tests/css2.1/t040103-escapes-07-b.html
-/sdcard/android/layout_tests/css2.1/t0804-c5507-padn-r-02-f.html
-/sdcard/android/layout_tests/css2.1/t0402-syntax-04-f.html
-/sdcard/android/layout_tests/css2.1/t1002-c5523-width-01-b-g.html
-/sdcard/android/layout_tests/css2.1/t0805-c5519-brdr-r-00-a.html
-/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-link-00-e.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-12-b.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-02-c.html
-/sdcard/android/layout_tests/css2.1/t040102-keywords-01-b.html
-/sdcard/android/layout_tests/css2.1/t0803-c5503-imrgn-b-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5513-ibrdr-bw-00-a.html
-/sdcard/android/layout_tests/css2.1/css1_forward_compatible_parsing.html
-/sdcard/android/layout_tests/css2.1/t0804-c5509-padn-l-03-f-g.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-02-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-13-d.html
-/sdcard/android/layout_tests/css2.1/t0905-c5526-flthw-00-c-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-33-d.html
-/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-02-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-53-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5512-brdr-rw-03-b.html
-/sdcard/android/layout_tests/css2.1/t040109-c17-comments-01-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-73-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-93-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5511-ibrdr-tw-00-a.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-02-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-05-b.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-01-b.html
-/sdcard/android/layout_tests/css2.1/t1005-c5524-width-00-b-g.html
-/sdcard/android/layout_tests/css2.1/t0905-c414-flt-wrap-01-d-g.html
-/sdcard/android/layout_tests/css2.1/t010403-shand-font-02-b.html
-/sdcard/android/layout_tests/css2.1/t0805-c5515-brdr-w-02-b.html
-/sdcard/android/layout_tests/css2.1/t060401-c32-cascading-00-b.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltcont-00-d-g.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-11-c.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-16-c.html
-/sdcard/android/layout_tests/css2.1/t0509-id-sel-syntax-02-b.html
-/sdcard/android/layout_tests/css2.1/t090501-c5525-flt-l-00-b-g.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-09-c.html
-/sdcard/android/layout_tests/css2.1/t050201-c12-grouping-00-b.html
-/sdcard/android/layout_tests/css2.1/t120401-scope-03-c.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-02-d.html
-/sdcard/android/layout_tests/css2.1/t0905-c414-flt-wrap-00-e.html
-/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-03-f.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-11-b.html
-/sdcard/android/layout_tests/css2.1/t1506-c525-font-wt-00-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-22-d.html
-/sdcard/android/layout_tests/css2.1/t1008-c44-ln-box-01-d-ag.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwidth-00-c-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-42-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-62-d.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltmult-00-d-g.html
-/sdcard/android/layout_tests/css2.1/t1401-c531-color-00-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5514-ibrdr-lw-00-a.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-09-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-82-d.html
-/sdcard/android/layout_tests/css2.1/t1604-c541-word-sp-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5515-brdr-w-01-b-g.html
-/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-04-b-ag.html
-/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-09-b.html
-/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-05-c-ag.html
-/sdcard/android/layout_tests/css2.1/t0402-syntax-02-f.html
-/sdcard/android/layout_tests/css2.1/t0803-c5503-mrgn-b-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5517-brdr-s-00-c.html
-/sdcard/android/layout_tests/css2.1/t0805-c5514-brdr-lw-01-b-g.html
-/sdcard/android/layout_tests/css2.1/t100801-c42-ibx-ht-00-d-a.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-00-c.html
-/sdcard/android/layout_tests/css2.1/t0805-c5513-brdr-bw-03-b.html
-/sdcard/android/layout_tests/css2.1/t0804-c5506-padn-t-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t0505-c16-descendant-01-e.html
-/sdcard/android/layout_tests/css2.1/t0805-c5519-brdr-r-02-e.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-08-b.html
-/sdcard/android/layout_tests/css2.1/t051103-c21-hover-ln-00-e-i.html
-/sdcard/android/layout_tests/css2.1/t120403-content-none-00-c.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-00-b.html
-/sdcard/android/layout_tests/css2.1/t040105-import-01-b.html
-/sdcard/android/layout_tests/css2.1/t040103-case-01-c.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-11-d.html
-/sdcard/android/layout_tests/css2.1/t09-c5526c-display-00-e.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltblck-00-d-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-31-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5514-brdr-lw-03-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-51-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-71-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-09-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-91-d.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwrap-00-b.html
-/sdcard/android/layout_tests/css2.1/t0905-c414-flt-fit-00-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-29-d.html
-/sdcard/android/layout_tests/css2.1/t0803-c5505-mrgn-01-e-a.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-mrgn-r-00-c-ag.html
-/sdcard/android/layout_tests/css2.1/t1004-c43-rpl-ibx-00-d-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-49-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-69-d.html
-/sdcard/android/layout_tests/css2.1/t1204-multiple-00-c.html
-/sdcard/android/layout_tests/css2.1/t140201-c533-bgimage-01-b-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-89-d.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-03-b.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-mrgn-l-02-c.html
-/sdcard/android/layout_tests/css2.1/t0805-c5518-brdr-t-00-a.html
-/sdcard/android/layout_tests/css2.1/t010403-shand-font-00-b.html
-/sdcard/android/layout_tests/css2.1/t0510-c25-pseudo-elmnt-00-c.html
-/sdcard/android/layout_tests/css2.1/t0803-c5505-imrgn-00-a-ag.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-imrgn-r-05-b-ag.html
-/sdcard/android/layout_tests/css2.1/t060402-c31-important-00-b.html
-/sdcard/android/layout_tests/css2.1/t0905-c414-flt-00-d.html
-/sdcard/android/layout_tests/css2.1/t0905-c414-flt-03-c.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-07-c.html
-/sdcard/android/layout_tests/css2.1/t1204-order-00-c.html
-/sdcard/android/layout_tests/css2.1/t120401-scope-01-c.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-00-d.html
-/sdcard/android/layout_tests/css2.1/t0402-c71-fwd-parsing-01-f.html
-/sdcard/android/layout_tests/css2.1/t1604-c542-letter-sp-01-b-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5520-brdr-b-01-e.html
-/sdcard/android/layout_tests/css2.1/t140201-c536-bgpos-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-20-d.html
-/sdcard/android/layout_tests/css2.1/t0509-c15-ids-01-e.html
-/sdcard/android/layout_tests/css2.1/t1204-reset-01-c-o.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-40-d.html
-/sdcard/android/layout_tests/css2.1/t090501-c414-flt-ln-03-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-60-d.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltwidth-02-c-g.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltclr-00-c-ag.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-07-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-80-d.html
-/sdcard/android/layout_tests/css2.1/t1204-implied-01-c.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-18-d.html
-/sdcard/android/layout_tests/css2.1/t0804-c5507-ipadn-r-01-b-ag.html
-/sdcard/android/layout_tests/css2.1/t040103-escapes-03-b.html
-/sdcard/android/layout_tests/css2.1/t140201-c534-bgreps-02-c-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-38-d.html
-/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-07-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-58-d.html
-/sdcard/android/layout_tests/css2.1/t0803-c5505-mrgn-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t100801-c544-valgn-04-d-agi.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-78-d.html
-/sdcard/android/layout_tests/css2.1/t100801-c548-ln-ht-02-b-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-98-d.html
-/sdcard/android/layout_tests/css2.1/t0804-c5508-ipadn-b-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t0804-c5509-padn-l-01-b-a.html
-/sdcard/android/layout_tests/css2.1/t040105-atrule-03-b.html
-/sdcard/android/layout_tests/css2.1/t1507-c526-font-sz-02-b-a.html
-/sdcard/android/layout_tests/css2.1/t0805-c5522-ibrdr-00-a.html
-/sdcard/android/layout_tests/css2.1/t0803-c5502-mrgn-r-03-c.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-06-b.html
-/sdcard/android/layout_tests/css2.1/t0905-c5525-fltmrgn-00-c-ag.html
-/sdcard/android/layout_tests/css2.1/t051103-dom-hover-02-c-io.html
-/sdcard/android/layout_tests/css2.1/t0804-c5506-ipadn-t-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t040304-c64-uri-00-a-g.html
-/sdcard/android/layout_tests/css2.1/t0803-c5501-mrgn-t-00-b-a.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-07-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-27-d.html
-/sdcard/android/layout_tests/css2.1/t0805-c5511-brdr-tw-03-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-47-d.html
-/sdcard/android/layout_tests/css2.1/t060403-c21-pseu-id-00-e-i.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-67-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-87-d.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-01-b.html
-/sdcard/android/layout_tests/css2.1/t0603-c11-import-00-b.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-04-b-ag.html
-/sdcard/android/layout_tests/css2.1/t1503-c522-font-family-00-b.html
-/sdcard/android/layout_tests/css2.1/t090501-c414-flt-ln-01-d-g.html
-/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-link-03-e.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-15-b.html
-/sdcard/android/layout_tests/css2.1/t040105-atkeyw-02-b.html
-/sdcard/android/layout_tests/css2.1/t0805-c5519-ibrdr-r-00-a.html
-/sdcard/android/layout_tests/css2.1/t040103-ident-05-c.html
-/sdcard/android/layout_tests/css2.1/t0602-inherit-bdr-pad-b-00.html
-/sdcard/android/layout_tests/css2.1/t040302-c61-rel-len-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0804-c5507-padn-r-00-c-ag.html
-/sdcard/android/layout_tests/css2.1/t0804-c5509-ipadn-l-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t0805-c5520-ibrdr-b-00-a.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-05-b.html
-/sdcard/android/layout_tests/css2.1/t1008-c44-ln-box-03-d-ag.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-16-d.html
-/sdcard/android/layout_tests/css2.1/t040103-escapes-01-b.html
-/sdcard/android/layout_tests/css2.1/t100304-c43-rpl-bbx-01-d-g.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-36-d.html
-/sdcard/android/layout_tests/css2.1/t1001-abs-pos-cb-05-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-56-d.html
-/sdcard/android/layout_tests/css2.1/t0804-c5509-padn-l-02-f.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-76-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-96-d.html
-/sdcard/android/layout_tests/css2.1/t051202-c26-psudo-nest-00-c.html
-/sdcard/android/layout_tests/css2.1/t040105-atrule-01-b.html
-/sdcard/android/layout_tests/css2.1/t0804-c5508-ipadn-b-02-b-a.html
-/sdcard/android/layout_tests/css2.1/t0803-c5501-imrgn-t-00-b-ag.html
-/sdcard/android/layout_tests/css2.1/t140201-c532-bgcolor-01-b.html
-/sdcard/android/layout_tests/css2.1/t1508-c527-font-08-b.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-04-b.html
-/sdcard/android/layout_tests/css2.1/t040103-case-00-b.html
-/sdcard/android/layout_tests/css2.1/t1504-c543-txt-decor-00-d-g.html
-/sdcard/android/layout_tests/css2.1/t0805-c5516-brdr-c-00-a.html
-/sdcard/android/layout_tests/css2.1/t0804-c5506-ipadn-t-02-b-a.html
-/sdcard/android/layout_tests/css2.1/t1204-increment-00-c-o.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-05-d.html
-/sdcard/android/layout_tests/css2.1/t1202-counter-14-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-25-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-45-d.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-65-d.html
-/sdcard/android/layout_tests/css2.1/t040103-escapes-02-d.html
-/sdcard/android/layout_tests/css2.1/t1602-c546-txt-align-00-b.html
-/sdcard/android/layout_tests/css2.1/t170602-bdr-conflct-w-85-d.html
-/sdcard/android/layout_tests/css2.1/t040103-escapes-05-c.html
-/sdcard/android/layout_tests/css2.1/t040103-escapes-08-b.html
-/sdcard/android/layout_tests/css2.1/t0803-c5504-imrgn-l-01-b-ag.html
-/sdcard/android/layout_tests/css2.1/t1002-c5523-width-00-b-g.html
-/sdcard/android/layout_tests/css2.1/t0804-c5507-padn-r-03-f.html
-/sdcard/android/layout_tests/css2.1/t0402-syntax-05-f.html
-/sdcard/android/layout_tests/css2.1/t1205-c561-list-displ-00-b.html
-/sdcard/android/layout_tests/css2.1/t0511-c21-pseud-link-01-e.html
-/sdcard/android/layout_tests/css2.1/t051201-c23-first-line-00-b.html
-/sdcard/android/layout_tests/css2.1/t1202-counters-13-b.html
-/sdcard/android/layout_tests/css2.1/t140201-c533-bgimage-00-a.html
-/sdcard/android/layout_tests/css2.1/t040105-atkeyw-00-b.html
-/sdcard/android/layout_tests/css3/css3-modsel-33.html
-/sdcard/android/layout_tests/css3/css3-modsel-35.html
-/sdcard/android/layout_tests/css3/css3-modsel-36.html
-/sdcard/android/layout_tests/css3/css3-modsel-37.html
-/sdcard/android/layout_tests/editing/input/emacs-ctrl-o.html
-/sdcard/android/layout_tests/editing/style/style-3681552-fix-001.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-013.html
-/sdcard/android/layout_tests/editing/style/style-3690704-fix.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-005.html
-/sdcard/android/layout_tests/editing/style/style-boundary-002.html
-/sdcard/android/layout_tests/editing/style/remove-underline-after-paragraph.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-009.html
-/sdcard/android/layout_tests/editing/style/5228141.html
-/sdcard/android/layout_tests/editing/style/block-style-004.html
-/sdcard/android/layout_tests/editing/style/apple-style-editable-mix.html
-/sdcard/android/layout_tests/editing/style/unbold-in-bold.html
-/sdcard/android/layout_tests/editing/style/typing-style-001.html
-/sdcard/android/layout_tests/editing/style/relative-font-size-change-004.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-010.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-002.html
-/sdcard/android/layout_tests/editing/style/style-3681552-fix-002.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-006.html
-/sdcard/android/layout_tests/editing/style/style-boundary-003.html
-/sdcard/android/layout_tests/editing/style/block-style-001.html
-/sdcard/android/layout_tests/editing/style/smoosh-styles-001.html
-/sdcard/android/layout_tests/editing/style/font-family-with-space.html
-/sdcard/android/layout_tests/editing/style/5084241.html
-/sdcard/android/layout_tests/editing/style/5065910.html
-/sdcard/android/layout_tests/editing/style/block-style-005.html
-/sdcard/android/layout_tests/editing/style/remove-underline-across-paragraph-in-bold.html
-/sdcard/android/layout_tests/editing/style/5279521.html
-/sdcard/android/layout_tests/editing/style/non-inheritable-styles.html
-/sdcard/android/layout_tests/editing/style/5046875-1.html
-/sdcard/android/layout_tests/editing/style/style-3998892-fix.html
-/sdcard/android/layout_tests/editing/style/typing-style-002.html
-/sdcard/android/layout_tests/editing/style/relative-font-size-change-001.html
-/sdcard/android/layout_tests/editing/style/4916887.html
-/sdcard/android/layout_tests/editing/style/remove-underline-across-paragraph.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-011.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-003.html
-/sdcard/android/layout_tests/editing/style/remove-underline.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-007.html
-/sdcard/android/layout_tests/editing/style/style-boundary-004.html
-/sdcard/android/layout_tests/editing/style/5017613-1.html
-/sdcard/android/layout_tests/editing/style/block-style-002.html
-/sdcard/android/layout_tests/editing/style/block-style-006.html
-/sdcard/android/layout_tests/editing/style/fontsize-1.html
-/sdcard/android/layout_tests/editing/style/5046875-2.html
-/sdcard/android/layout_tests/editing/style/typing-style-003.html
-/sdcard/android/layout_tests/editing/style/relative-font-size-change-002.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-012.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-004.html
-/sdcard/android/layout_tests/editing/style/designmode.html
-/sdcard/android/layout_tests/editing/style/block-styles-007.html
-/sdcard/android/layout_tests/editing/style/style-boundary-001.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-008.html
-/sdcard/android/layout_tests/editing/style/style-boundary-005.html
-/sdcard/android/layout_tests/editing/style/5017613-2.html
-/sdcard/android/layout_tests/editing/style/underline.html
-/sdcard/android/layout_tests/editing/style/block-style-003.html
-/sdcard/android/layout_tests/editing/style/smoosh-styles-003.html
-/sdcard/android/layout_tests/editing/style/remove-underline-after-paragraph-in-bold.html
-/sdcard/android/layout_tests/editing/style/highlight.html
-/sdcard/android/layout_tests/editing/style/relative-font-size-change-003.html
-/sdcard/android/layout_tests/editing/style/table-selection.html
-/sdcard/android/layout_tests/editing/style/create-block-for-style-001.html
-/sdcard/android/layout_tests/editing/unsupported-content/table-delete-001.html
-/sdcard/android/layout_tests/editing/unsupported-content/table-type-after.html
-/sdcard/android/layout_tests/editing/unsupported-content/table-delete-002.html
-/sdcard/android/layout_tests/editing/unsupported-content/table-type-before.html
-/sdcard/android/layout_tests/editing/unsupported-content/table-delete-003.html
-/sdcard/android/layout_tests/editing/unsupported-content/list-delete-001.html
-/sdcard/android/layout_tests/editing/unsupported-content/list-type-after.html
-/sdcard/android/layout_tests/editing/unsupported-content/list-type-before.html
-/sdcard/android/layout_tests/editing/unsupported-content/list-delete-003.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-011.html
-/sdcard/android/layout_tests/editing/inserting/4960120-1.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-023.html
-/sdcard/android/layout_tests/editing/inserting/insert-paragraph-04.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-007.html
-/sdcard/android/layout_tests/editing/inserting/5058163-2.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-019.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-at-tabspan-003.html
-/sdcard/android/layout_tests/editing/inserting/5607069-2.html
-/sdcard/android/layout_tests/editing/inserting/6633727.html
-/sdcard/android/layout_tests/editing/inserting/6703873.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-003.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-003.html
-/sdcard/android/layout_tests/editing/inserting/4875189-1.html
-/sdcard/android/layout_tests/editing/inserting/typing-003.html
-/sdcard/android/layout_tests/editing/inserting/insert-3907422-fix.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-020.html
-/sdcard/android/layout_tests/editing/inserting/before-after-input-element.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-004.html
-/sdcard/android/layout_tests/editing/inserting/insert-paragraph-01.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-016.html
-/sdcard/android/layout_tests/editing/inserting/5510537.html
-/sdcard/android/layout_tests/editing/inserting/4959067.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-008.html
-/sdcard/android/layout_tests/editing/inserting/insert-text-at-tabspan-001.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-001.html
-/sdcard/android/layout_tests/editing/inserting/paragraph-separator-02.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-013.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-025.html
-/sdcard/android/layout_tests/editing/inserting/insert-3654864-fix.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-009.html
-/sdcard/android/layout_tests/editing/inserting/return-key-with-selection-002.html
-/sdcard/android/layout_tests/editing/inserting/editable-html-element.html
-/sdcard/android/layout_tests/editing/inserting/5418891.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-005.html
-/sdcard/android/layout_tests/editing/inserting/insert-tab-002.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-005.html
-/sdcard/android/layout_tests/editing/inserting/line-break.html
-/sdcard/android/layout_tests/editing/inserting/5549929-3.html
-/sdcard/android/layout_tests/editing/inserting/typing-tab-designmode-forms.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-010.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-022.html
-/sdcard/android/layout_tests/editing/inserting/insert-paragraph-03.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-006.html
-/sdcard/android/layout_tests/editing/inserting/5058163-1.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-018.html
-/sdcard/android/layout_tests/editing/inserting/paragraph-separator-in-table-2.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-at-tabspan-002.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-002.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-002.html
-/sdcard/android/layout_tests/editing/inserting/typing-002.html
-/sdcard/android/layout_tests/editing/inserting/insert-3800346-fix.html
-/sdcard/android/layout_tests/editing/inserting/typing-around-image-001.html
-/sdcard/android/layout_tests/editing/inserting/insert-text-at-tabspan-003.html
-/sdcard/android/layout_tests/editing/inserting/insert-text-with-newlines.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-003.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-015.html
-/sdcard/android/layout_tests/editing/inserting/insert-at-end-02.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-027.html
-/sdcard/android/layout_tests/editing/inserting/insert-3659587-fix.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-007.html
-/sdcard/android/layout_tests/editing/inserting/insert-tab-004.html
-/sdcard/android/layout_tests/editing/inserting/editable-inline-element.html
-/sdcard/android/layout_tests/editing/inserting/paragraph-separator-01.html
-/sdcard/android/layout_tests/editing/inserting/insert-3851164-fix.html
-/sdcard/android/layout_tests/editing/inserting/5156401-2.html
-/sdcard/android/layout_tests/editing/inserting/4960120-2.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-012.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-024.html
-/sdcard/android/layout_tests/editing/inserting/multiple-lines-selected.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-008.html
-/sdcard/android/layout_tests/editing/inserting/insert-paragraph-05.html
-/sdcard/android/layout_tests/editing/inserting/insert-3778059-fix.html
-/sdcard/android/layout_tests/editing/inserting/return-key-with-selection-001.html
-/sdcard/android/layout_tests/editing/inserting/5607069-3.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-004.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-004.html
-/sdcard/android/layout_tests/editing/inserting/insert-tab-001.html
-/sdcard/android/layout_tests/editing/inserting/4875189-2.html
-/sdcard/android/layout_tests/editing/inserting/5549929-2.html
-/sdcard/android/layout_tests/editing/inserting/editing-empty-divs.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-021.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-005.html
-/sdcard/android/layout_tests/editing/inserting/insert-paragraph-02.html
-/sdcard/android/layout_tests/editing/inserting/insert-3786362-fix.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-017.html
-/sdcard/android/layout_tests/editing/inserting/paragraph-separator-in-table-1.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-at-tabspan-001.html
-/sdcard/android/layout_tests/editing/inserting/insert-space-in-empty-doc.html
-/sdcard/android/layout_tests/editing/inserting/insert-after-delete-001.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-001.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-001.html
-/sdcard/android/layout_tests/editing/inserting/typing-001.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-009.html
-/sdcard/android/layout_tests/editing/inserting/4278698.html
-/sdcard/android/layout_tests/editing/inserting/insert-text-at-tabspan-002.html
-/sdcard/android/layout_tests/editing/inserting/5002441.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-002.html
-/sdcard/android/layout_tests/editing/inserting/paragraph-separator-03.html
-/sdcard/android/layout_tests/editing/inserting/12882.html
-/sdcard/android/layout_tests/editing/inserting/insert-3775316-fix.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-014.html
-/sdcard/android/layout_tests/editing/inserting/edited-whitespace-1.html
-/sdcard/android/layout_tests/editing/inserting/insert-at-end-01.html
-/sdcard/android/layout_tests/editing/inserting/insert-div-026.html
-/sdcard/android/layout_tests/editing/inserting/break-blockquote-after-delete.html
-/sdcard/android/layout_tests/editing/inserting/redo.html
-/sdcard/android/layout_tests/editing/inserting/4840662.html
-/sdcard/android/layout_tests/editing/inserting/typing-around-br-001.html
-/sdcard/android/layout_tests/editing/inserting/return-key-with-selection-003.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-006.html
-/sdcard/android/layout_tests/editing/inserting/insert-tab-003.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-006.html
-/sdcard/android/layout_tests/editing/execCommand/5142012-1.html
-/sdcard/android/layout_tests/editing/execCommand/hilitecolor.html
-/sdcard/android/layout_tests/editing/execCommand/format-block-with-braces.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-blockquote-test3.html
-/sdcard/android/layout_tests/editing/execCommand/4920742-1.html
-/sdcard/android/layout_tests/editing/execCommand/4924441.html
-/sdcard/android/layout_tests/editing/execCommand/create-list-with-hr.html
-/sdcard/android/layout_tests/editing/execCommand/format-block-with-trailing-br.html
-/sdcard/android/layout_tests/editing/execCommand/remove-formatting-2.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-selection.html
-/sdcard/android/layout_tests/editing/execCommand/strikethroughSelection.html
-/sdcard/android/layout_tests/editing/execCommand/5482023.html
-/sdcard/android/layout_tests/editing/execCommand/4786404-1.html
-/sdcard/android/layout_tests/editing/execCommand/remove-formatting.html
-/sdcard/android/layout_tests/editing/execCommand/findString.html
-/sdcard/android/layout_tests/editing/execCommand/italicizeByCharacter.html
-/sdcard/android/layout_tests/editing/execCommand/create-list-from-range-selection.html
-/sdcard/android/layout_tests/editing/execCommand/5190926.html
-/sdcard/android/layout_tests/editing/execCommand/insertHorizontalRule.html
-/sdcard/android/layout_tests/editing/execCommand/paste-1.html
-/sdcard/android/layout_tests/editing/execCommand/nsresponder-outdent.html
-/sdcard/android/layout_tests/editing/execCommand/toggle-compound-styles.html
-/sdcard/android/layout_tests/editing/execCommand/5080333-2.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-blockquote-test2.html
-/sdcard/android/layout_tests/editing/execCommand/5049671.html
-/sdcard/android/layout_tests/editing/execCommand/4920488.html
-/sdcard/android/layout_tests/editing/execCommand/nsresponder-indent.html
-/sdcard/android/layout_tests/editing/execCommand/indent-list-item.html
-/sdcard/android/layout_tests/editing/execCommand/4916402.html
-/sdcard/android/layout_tests/editing/execCommand/5138441.html
-/sdcard/android/layout_tests/editing/execCommand/insert-list-empty-div.html
-/sdcard/android/layout_tests/editing/execCommand/5481523.html
-/sdcard/android/layout_tests/editing/execCommand/print.html
-/sdcard/android/layout_tests/editing/execCommand/4641880-2.html
-/sdcard/android/layout_tests/editing/execCommand/4580583-2.html
-/sdcard/android/layout_tests/editing/execCommand/remove-list-item-1.html
-/sdcard/android/layout_tests/editing/execCommand/5569741.html
-/sdcard/android/layout_tests/editing/execCommand/findString-2.html
-/sdcard/android/layout_tests/editing/execCommand/modifyForeColorByCharacter.html
-/sdcard/android/layout_tests/editing/execCommand/5142012-2.html
-/sdcard/android/layout_tests/editing/execCommand/find-after-replace.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-blockquote-test4.html
-/sdcard/android/layout_tests/editing/execCommand/format-block.html
-/sdcard/android/layout_tests/editing/execCommand/5080333-1.html
-/sdcard/android/layout_tests/editing/execCommand/remove-list-from-range-selection.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-blockquote-test1.html
-/sdcard/android/layout_tests/editing/execCommand/5136770.html
-/sdcard/android/layout_tests/editing/execCommand/4916541.html
-/sdcard/android/layout_tests/editing/execCommand/4786404-2.html
-/sdcard/android/layout_tests/editing/execCommand/insertImage.html
-/sdcard/android/layout_tests/editing/execCommand/insert-list-and-stitch.html
-/sdcard/android/layout_tests/editing/execCommand/5573879.html
-/sdcard/android/layout_tests/editing/execCommand/4641880-1.html
-/sdcard/android/layout_tests/editing/execCommand/4580583-1.html
-/sdcard/android/layout_tests/editing/execCommand/4747450.html
-/sdcard/android/layout_tests/editing/execCommand/format-block-from-range-selection.html
-/sdcard/android/layout_tests/editing/execCommand/indent-empty-root.html
-/sdcard/android/layout_tests/editing/execCommand/indent-selection.html
-/sdcard/android/layout_tests/editing/execCommand/selectAll.html
-/sdcard/android/layout_tests/editing/execCommand/paste-2.html
-/sdcard/android/layout_tests/editing/pasteboard/subframe-dragndrop-1.html
-/sdcard/android/layout_tests/editing/pasteboard/innerText-inline-table.html
-/sdcard/android/layout_tests/editing/pasteboard/5156401-1.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-list-001.html
-/sdcard/android/layout_tests/editing/pasteboard/4242293-1.html
-/sdcard/android/layout_tests/editing/pasteboard/5032095.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-004.html
-/sdcard/android/layout_tests/editing/pasteboard/5247341.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-4035648-fix.html
-/sdcard/android/layout_tests/editing/pasteboard/4700297.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-003.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-into-blockquote.html
-/sdcard/android/layout_tests/editing/pasteboard/drop-link.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-into-blockquote-3.html
-/sdcard/android/layout_tests/editing/pasteboard/4944770-1.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-015.html
-/sdcard/android/layout_tests/editing/pasteboard/5075944.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-match-style-001.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-4039777-fix.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-end-3.html
-/sdcard/android/layout_tests/editing/pasteboard/smart-paste-007.html
-/sdcard/android/layout_tests/editing/pasteboard/5483567.html
-/sdcard/android/layout_tests/editing/pasteboard/7955.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-end-blockquote.html
-/sdcard/android/layout_tests/editing/pasteboard/testcase-9507.html
-/sdcard/android/layout_tests/editing/pasteboard/input-field-1.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-001.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-at-tabspan-001.html
-/sdcard/android/layout_tests/editing/pasteboard/interchange-newline-2.html
-/sdcard/android/layout_tests/editing/pasteboard/block-wrappers-necessary.html
-/sdcard/android/layout_tests/editing/pasteboard/4861080.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-009.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-after-delete.html
-/sdcard/android/layout_tests/editing/pasteboard/5478250.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-012.html
-/sdcard/android/layout_tests/editing/pasteboard/prevent-block-nesting-01.html
-/sdcard/android/layout_tests/editing/pasteboard/8145-2.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-end-borders.html
-/sdcard/android/layout_tests/editing/pasteboard/5027857.html
-/sdcard/android/layout_tests/editing/pasteboard/smart-paste-004.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-start-list.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-008.html
-/sdcard/android/layout_tests/editing/pasteboard/4806874.html
-/sdcard/android/layout_tests/editing/pasteboard/emacs-ctrl-a-k-y.html
-/sdcard/android/layout_tests/editing/pasteboard/bad-placeholder.html
-/sdcard/android/layout_tests/editing/pasteboard/displaced-placeholder.html
-/sdcard/android/layout_tests/editing/pasteboard/5387578.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-1.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-010.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-006.html
-/sdcard/android/layout_tests/editing/pasteboard/5601583-1.html
-/sdcard/android/layout_tests/editing/pasteboard/4947130.html
-/sdcard/android/layout_tests/editing/pasteboard/pasting-tabs.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-after-delete-2.html
-/sdcard/android/layout_tests/editing/pasteboard/smart-paste-001.html
-/sdcard/android/layout_tests/editing/pasteboard/4076267-2.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-table-001.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-005.html
-/sdcard/android/layout_tests/editing/pasteboard/5089327.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-017.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-end-5.html
-/sdcard/android/layout_tests/editing/pasteboard/drop-text-without-selection.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-at-tabspan-003.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-003.html
-/sdcard/android/layout_tests/editing/pasteboard/drag-drop-modifies-page.html
-/sdcard/android/layout_tests/editing/pasteboard/emacs-ctrl-k-y-001.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-after-blockquote.html
-/sdcard/android/layout_tests/editing/pasteboard/5071074.html
-/sdcard/android/layout_tests/editing/pasteboard/interchange-newline-4.html
-/sdcard/android/layout_tests/editing/pasteboard/styled-element-markup.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-4038267-fix.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-002.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-into-blockquote-2.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-pre-002.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-014.html
-/sdcard/android/layout_tests/editing/pasteboard/drag-drop-dead-frame.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-end-2.html
-/sdcard/android/layout_tests/editing/pasteboard/smart-paste-006.html
-/sdcard/android/layout_tests/editing/pasteboard/5368833.html
-/sdcard/android/layout_tests/editing/pasteboard/select-element-1.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-3.html
-/sdcard/android/layout_tests/editing/pasteboard/4641033.html
-/sdcard/android/layout_tests/editing/pasteboard/drag-image-to-contenteditable-in-iframe.html
-/sdcard/android/layout_tests/editing/pasteboard/interchange-newline-1.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-paste-bidi.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-008.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-011.html
-/sdcard/android/layout_tests/editing/pasteboard/8145-1.html
-/sdcard/android/layout_tests/editing/pasteboard/smart-paste-003.html
-/sdcard/android/layout_tests/editing/pasteboard/5075944-3.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-table-003.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-TIFF.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-007.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-019.html
-/sdcard/android/layout_tests/editing/pasteboard/undoable-fragment-removes.html
-/sdcard/android/layout_tests/editing/pasteboard/nested-blocks-with-text-field.html
-/sdcard/android/layout_tests/editing/pasteboard/4989774.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-unrendered-select.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-005.html
-/sdcard/android/layout_tests/editing/pasteboard/emacs-cntl-y-001.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-after-delete-1.html
-/sdcard/android/layout_tests/editing/pasteboard/unrendered-br.html
-/sdcard/android/layout_tests/editing/pasteboard/4631972.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-004.html
-/sdcard/android/layout_tests/editing/pasteboard/quirks-mode-br-1.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-into-blockquote-4.html
-/sdcard/android/layout_tests/editing/pasteboard/4944770-2.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-table-cells.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-016.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-match-style-002.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-end-4.html
-/sdcard/android/layout_tests/editing/pasteboard/drag-selected-image-to-contenteditable.html
-/sdcard/android/layout_tests/editing/pasteboard/smart-paste-008.html
-/sdcard/android/layout_tests/editing/pasteboard/3976872.html
-/sdcard/android/layout_tests/editing/pasteboard/pasting-object.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-end-list.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-standalone-image.html
-/sdcard/android/layout_tests/editing/pasteboard/displaced-generic-placeholder.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-002.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-at-tabspan-002.html
-/sdcard/android/layout_tests/editing/pasteboard/interchange-newline-3.html
-/sdcard/android/layout_tests/editing/pasteboard/5071074-2.html
-/sdcard/android/layout_tests/editing/pasteboard/display-block-on-spans.html
-/sdcard/android/layout_tests/editing/pasteboard/4242293.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-001.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-pre-001.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-start-blockquote.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-end-1.html
-/sdcard/android/layout_tests/editing/pasteboard/8145-3.html
-/sdcard/android/layout_tests/editing/pasteboard/5006779.html
-/sdcard/android/layout_tests/editing/pasteboard/smart-paste-005.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-009.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-blockquote-2.html
-/sdcard/android/layout_tests/editing/pasteboard/merge-end-table.html
-/sdcard/android/layout_tests/editing/pasteboard/5065605.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-line-endings-007.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-010.html
-/sdcard/android/layout_tests/editing/pasteboard/5028447.html
-/sdcard/android/layout_tests/editing/pasteboard/nested-blocks-with-text-area.html
-/sdcard/android/layout_tests/editing/pasteboard/4076267-3.html
-/sdcard/android/layout_tests/editing/pasteboard/4076267.html
-/sdcard/android/layout_tests/editing/pasteboard/smart-paste-002.html
-/sdcard/android/layout_tests/editing/pasteboard/5075944-2.html
-/sdcard/android/layout_tests/editing/pasteboard/5134759.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-006.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-text-018.html
-/sdcard/android/layout_tests/editing/pasteboard/paste-RTFD.html
-/sdcard/android/layout_tests/editing/pasteboard/cut-text-001.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-9.html
-/sdcard/android/layout_tests/editing/selection/fake-drag.html
-/sdcard/android/layout_tests/editing/selection/wrapped-line-caret-2.html
-/sdcard/android/layout_tests/editing/selection/unrendered-002.html
-/sdcard/android/layout_tests/editing/selection/3690703-2.html
-/sdcard/android/layout_tests/editing/selection/extend-by-character-005.html
-/sdcard/android/layout_tests/editing/selection/caret-rtl-2.html
-/sdcard/android/layout_tests/editing/selection/paragraph-granularity.html
-/sdcard/android/layout_tests/editing/selection/clear-selection.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-6.html
-/sdcard/android/layout_tests/editing/selection/drag-in-iframe.html
-/sdcard/android/layout_tests/editing/selection/unrendered-space.html
-/sdcard/android/layout_tests/editing/selection/extend-by-character-002.html
-/sdcard/android/layout_tests/editing/selection/4932260-2.html
-/sdcard/android/layout_tests/editing/selection/select-element-paragraph-boundary.html
-/sdcard/android/layout_tests/editing/selection/extend-by-sentence-001.html
-/sdcard/android/layout_tests/editing/selection/3690719.html
-/sdcard/android/layout_tests/editing/selection/editable-non-editable-crash.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-3.html
-/sdcard/android/layout_tests/editing/selection/replaced-boundaries-3.html
-/sdcard/android/layout_tests/editing/selection/move-by-sentence-linebreak.html
-/sdcard/android/layout_tests/editing/selection/move-by-character-005.html
-/sdcard/android/layout_tests/editing/selection/end-of-document.html
-/sdcard/android/layout_tests/editing/selection/selectNode.html
-/sdcard/android/layout_tests/editing/selection/editable-links.html
-/sdcard/android/layout_tests/editing/selection/extend-by-word-002.html
-/sdcard/android/layout_tests/editing/selection/move-by-character-002.html
-/sdcard/android/layout_tests/editing/selection/14971.html
-/sdcard/android/layout_tests/editing/selection/5131716-2.html
-/sdcard/android/layout_tests/editing/selection/5081257-1.html
-/sdcard/android/layout_tests/editing/selection/move-3875641-fix.html
-/sdcard/android/layout_tests/editing/selection/5099303.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-002.html
-/sdcard/android/layout_tests/editing/selection/select-missing-image.html
-/sdcard/android/layout_tests/editing/selection/selection-3748164-fix.html
-/sdcard/android/layout_tests/editing/selection/4983858.html
-/sdcard/android/layout_tests/editing/selection/move-by-sentence-001.html
-/sdcard/android/layout_tests/editing/selection/table-caret-1.html
-/sdcard/android/layout_tests/editing/selection/move-by-word-001.html
-/sdcard/android/layout_tests/editing/selection/select-all-004.html
-/sdcard/android/layout_tests/editing/selection/5076323-2.html
-/sdcard/android/layout_tests/editing/selection/move-3875618-fix.html
-/sdcard/android/layout_tests/editing/selection/inline-table.html
-/sdcard/android/layout_tests/editing/selection/4895428-3.html
-/sdcard/android/layout_tests/editing/selection/caret-before-select.html
-/sdcard/android/layout_tests/editing/selection/select-all-001.html
-/sdcard/android/layout_tests/editing/selection/unrendered-003.html
-/sdcard/android/layout_tests/editing/selection/extend-by-character-006.html
-/sdcard/android/layout_tests/editing/selection/7152-1.html
-/sdcard/android/layout_tests/editing/selection/iframe.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-7.html
-/sdcard/android/layout_tests/editing/selection/select-all-iframe.html
-/sdcard/android/layout_tests/editing/selection/extend-by-character-003.html
-/sdcard/android/layout_tests/editing/selection/4932260-3.html
-/sdcard/android/layout_tests/editing/selection/4960116.html
-/sdcard/android/layout_tests/editing/selection/drag-to-contenteditable-iframe.html
-/sdcard/android/layout_tests/editing/selection/selectNodeContents.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-4.html
-/sdcard/android/layout_tests/editing/selection/focus-body.html
-/sdcard/android/layout_tests/editing/selection/designmode-no-caret.html
-/sdcard/android/layout_tests/editing/selection/5234383-1.html
-/sdcard/android/layout_tests/editing/selection/5232159.html
-/sdcard/android/layout_tests/editing/selection/4960137.html
-/sdcard/android/layout_tests/editing/selection/previous-line-position.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-1.html
-/sdcard/android/layout_tests/editing/selection/replaced-boundaries-1.html
-/sdcard/android/layout_tests/editing/selection/move-by-character-003.html
-/sdcard/android/layout_tests/editing/selection/4776665.html
-/sdcard/android/layout_tests/editing/selection/move-by-character-6.html
-/sdcard/android/layout_tests/editing/selection/image-before-linebreak.html
-/sdcard/android/layout_tests/editing/selection/move-between-blocks-no-001.html
-/sdcard/android/layout_tests/editing/selection/5131716-3.html
-/sdcard/android/layout_tests/editing/selection/5081257-2.html
-/sdcard/android/layout_tests/editing/selection/5354455-1.html
-/sdcard/android/layout_tests/editing/selection/expanding-selections2.html
-/sdcard/android/layout_tests/editing/selection/display-table-text.html
-/sdcard/android/layout_tests/editing/selection/13804.html
-/sdcard/android/layout_tests/editing/selection/table-caret-2.html
-/sdcard/android/layout_tests/editing/selection/expanding-selections.html
-/sdcard/android/layout_tests/editing/selection/node-removal-1.html
-/sdcard/android/layout_tests/editing/selection/5240265.html
-/sdcard/android/layout_tests/editing/selection/select-all-005.html
-/sdcard/android/layout_tests/editing/selection/5076323-3.html
-/sdcard/android/layout_tests/editing/selection/line-wrap-1.html
-/sdcard/android/layout_tests/editing/selection/replace-selection-1.html
-/sdcard/android/layout_tests/editing/selection/caret-rtl.html
-/sdcard/android/layout_tests/editing/selection/5109817.html
-/sdcard/android/layout_tests/editing/selection/5136696.html
-/sdcard/android/layout_tests/editing/selection/4397952.html
-/sdcard/android/layout_tests/editing/selection/caret-and-focus-ring.html
-/sdcard/android/layout_tests/editing/selection/4895428-4.html
-/sdcard/android/layout_tests/editing/selection/4947387.html
-/sdcard/android/layout_tests/editing/selection/select-from-textfield-outwards.html
-/sdcard/android/layout_tests/editing/selection/leave-requested-block.html
-/sdcard/android/layout_tests/editing/selection/select-all-002.html
-/sdcard/android/layout_tests/editing/selection/unrendered-004.html
-/sdcard/android/layout_tests/editing/selection/7152-2.html
-/sdcard/android/layout_tests/editing/selection/5195166-1.html
-/sdcard/android/layout_tests/editing/selection/editable-html-element.html
-/sdcard/android/layout_tests/editing/selection/4866671.html
-/sdcard/android/layout_tests/editing/selection/4895428-1.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-8.html
-/sdcard/android/layout_tests/editing/selection/wrapped-line-caret-1.html
-/sdcard/android/layout_tests/editing/selection/selection-actions.html
-/sdcard/android/layout_tests/editing/selection/4402375.html
-/sdcard/android/layout_tests/editing/selection/unrendered-001.html
-/sdcard/android/layout_tests/editing/selection/extend-by-character-004.html
-/sdcard/android/layout_tests/editing/selection/contenteditable-click-inside.html
-/sdcard/android/layout_tests/editing/selection/addRange.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-5.html
-/sdcard/android/layout_tests/editing/selection/5007143.html
-/sdcard/android/layout_tests/editing/selection/fake-doubleclick.html
-/sdcard/android/layout_tests/editing/selection/extend-by-character-001.html
-/sdcard/android/layout_tests/editing/selection/4932260-1.html
-/sdcard/android/layout_tests/editing/selection/5234383-2.html
-/sdcard/android/layout_tests/editing/selection/5057506.html
-/sdcard/android/layout_tests/editing/selection/focus_editable_html.html
-/sdcard/android/layout_tests/editing/selection/4818145.html
-/sdcard/android/layout_tests/editing/selection/move-backwords-by-word-001.html
-/sdcard/android/layout_tests/editing/selection/mixed-editability-2.html
-/sdcard/android/layout_tests/editing/selection/replaced-boundaries-2.html
-/sdcard/android/layout_tests/editing/selection/move-by-character-004.html
-/sdcard/android/layout_tests/editing/selection/4889598.html
-/sdcard/android/layout_tests/editing/selection/5131716-4.html
-/sdcard/android/layout_tests/editing/selection/3690703.html
-/sdcard/android/layout_tests/editing/selection/5333725.html
-/sdcard/android/layout_tests/editing/selection/5354455-2.html
-/sdcard/android/layout_tests/editing/selection/selection-background.html
-/sdcard/android/layout_tests/editing/selection/extend-by-word-001.html
-/sdcard/android/layout_tests/editing/selection/move-by-character-001.html
-/sdcard/android/layout_tests/editing/selection/doubleclick-crash.html
-/sdcard/android/layout_tests/editing/selection/table-caret-3.html
-/sdcard/android/layout_tests/editing/selection/5131716-1.html
-/sdcard/android/layout_tests/editing/selection/node-removal-2.html
-/sdcard/android/layout_tests/editing/selection/drag-select-1.html
-/sdcard/android/layout_tests/editing/selection/select-all-006.html
-/sdcard/android/layout_tests/editing/selection/after-line-wrap.html
-/sdcard/android/layout_tests/editing/selection/line-wrap-2.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-001.html
-/sdcard/android/layout_tests/editing/selection/move-between-blocks-yes-001.html
-/sdcard/android/layout_tests/editing/selection/6476.html
-/sdcard/android/layout_tests/editing/selection/contains-boundaries.html
-/sdcard/android/layout_tests/editing/selection/click-start-of-line.html
-/sdcard/android/layout_tests/editing/selection/triple-click-in-pre.html
-/sdcard/android/layout_tests/editing/selection/move-past-trailing-space.html
-/sdcard/android/layout_tests/editing/selection/inline-closest-leaf-child.html
-/sdcard/android/layout_tests/editing/selection/5007143-2.html
-/sdcard/android/layout_tests/editing/selection/select-all-003.html
-/sdcard/android/layout_tests/editing/selection/5076323-1.html
-/sdcard/android/layout_tests/editing/selection/5057506-2.html
-/sdcard/android/layout_tests/editing/selection/4975120.html
-/sdcard/android/layout_tests/editing/selection/unrendered-005.html
-/sdcard/android/layout_tests/editing/selection/5195166-2.html
-/sdcard/android/layout_tests/editing/selection/select-box.html
-/sdcard/android/layout_tests/editing/selection/4895428-2.html
-/sdcard/android/layout_tests/editing/selection/word-granularity.html
-/sdcard/android/layout_tests/editing/undo/undo-misspellings.html
-/sdcard/android/layout_tests/editing/undo/undo-combined-delete.html
-/sdcard/android/layout_tests/editing/undo/undo-delete-boundary.html
-/sdcard/android/layout_tests/editing/undo/undo-forward-delete-boundary.html
-/sdcard/android/layout_tests/editing/undo/4063751.html
-/sdcard/android/layout_tests/editing/undo/redo-typing-001.html
-/sdcard/android/layout_tests/editing/undo/5378473.html
-/sdcard/android/layout_tests/editing/undo/undo-combined-delete-boundary.html
-/sdcard/android/layout_tests/editing/undo/undo-delete.html
-/sdcard/android/layout_tests/editing/undo/undo-forward-delete.html
-/sdcard/android/layout_tests/editing/undo/undo-typing-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-3608462-fix.html
-/sdcard/android/layout_tests/editing/deleting/delete-image-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-3928305-fix.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-012.html
-/sdcard/android/layout_tests/editing/deleting/5115601.html
-/sdcard/android/layout_tests/editing/deleting/deletionUI-single-instance.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-contents-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-024.html
-/sdcard/android/layout_tests/editing/deleting/delete-after-span-ws-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-011.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-008.html
-/sdcard/android/layout_tests/editing/deleting/delete-listitem-001.html
-/sdcard/android/layout_tests/editing/deleting/5300379.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-007.html
-/sdcard/android/layout_tests/editing/deleting/5433862-2.html
-/sdcard/android/layout_tests/editing/deleting/5026848-1.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-003.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-012.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-008.html
-/sdcard/android/layout_tests/editing/deleting/5206311-2.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-start-or-end.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-021.html
-/sdcard/android/layout_tests/editing/deleting/delete-ws-fixup-004.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-005.html
-/sdcard/android/layout_tests/editing/deleting/delete-select-all-003.html
-/sdcard/android/layout_tests/editing/deleting/smart-delete-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-017.html
-/sdcard/android/layout_tests/editing/deleting/table-cells.html
-/sdcard/android/layout_tests/editing/deleting/5156801-2.html
-/sdcard/android/layout_tests/editing/deleting/delete-leading-ws-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-004.html
-/sdcard/android/layout_tests/editing/deleting/delete-3857753-fix.html
-/sdcard/android/layout_tests/editing/deleting/delete-3959464-fix.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-016.html
-/sdcard/android/layout_tests/editing/deleting/delete-trailing-ws-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-005.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-008.html
-/sdcard/android/layout_tests/editing/deleting/delete-tab-004.html
-/sdcard/android/layout_tests/editing/deleting/merge-whitespace-pre.html
-/sdcard/android/layout_tests/editing/deleting/delete-ws-fixup-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-end-ws-002.html
-/sdcard/android/layout_tests/editing/deleting/merge-unrendered-space.html
-/sdcard/android/layout_tests/editing/deleting/delete-by-word-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-image-003.html
-/sdcard/android/layout_tests/editing/deleting/delete-selection-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-014.html
-/sdcard/android/layout_tests/editing/deleting/merge-different-styles.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-contents-003.html
-/sdcard/android/layout_tests/editing/deleting/delete-after-span-ws-003.html
-/sdcard/android/layout_tests/editing/deleting/merge-into-empty-block-1.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-013.html
-/sdcard/android/layout_tests/editing/deleting/delete-3865854-fix.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-009.html
-/sdcard/android/layout_tests/editing/deleting/5026848-3.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-005.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-tab-001.html
-/sdcard/android/layout_tests/editing/deleting/whitespace-pre-1.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-table.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-011.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-023.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-010.html
-/sdcard/android/layout_tests/editing/deleting/5032066.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-007.html
-/sdcard/android/layout_tests/editing/deleting/smart-delete-004.html
-/sdcard/android/layout_tests/editing/deleting/5144139-2.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-019.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-006.html
-/sdcard/android/layout_tests/editing/deleting/5126166.html
-/sdcard/android/layout_tests/editing/deleting/delete-to-end-of-paragraph.html
-/sdcard/android/layout_tests/editing/deleting/5408255.html
-/sdcard/android/layout_tests/editing/deleting/5099303.html
-/sdcard/android/layout_tests/editing/deleting/4845371.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-002.html
-/sdcard/android/layout_tests/editing/deleting/4922367.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-011.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-007.html
-/sdcard/android/layout_tests/editing/deleting/move-nodes-001.html
-/sdcard/android/layout_tests/editing/deleting/merge-no-br.html
-/sdcard/android/layout_tests/editing/deleting/delete-3800834-fix.html
-/sdcard/android/layout_tests/editing/deleting/delete-4038408-fix.html
-/sdcard/android/layout_tests/editing/deleting/5206311-1.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-020.html
-/sdcard/android/layout_tests/editing/deleting/delete-ws-fixup-003.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-004.html
-/sdcard/android/layout_tests/editing/deleting/delete-select-all-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-contiguous-ws-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-to-select-table.html
-/sdcard/android/layout_tests/editing/deleting/smart-delete-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-016.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-003.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-015.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-011.html
-/sdcard/android/layout_tests/editing/deleting/5390681.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-004.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-007.html
-/sdcard/android/layout_tests/editing/deleting/forward-delete.html
-/sdcard/android/layout_tests/editing/deleting/delete-tab-003.html
-/sdcard/android/layout_tests/editing/deleting/collapse-whitespace-3587601-fix.html
-/sdcard/android/layout_tests/editing/deleting/pruning-after-merge-2.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-end-ws-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-by-word-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-image-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-013.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-contents-002.html
-/sdcard/android/layout_tests/editing/deleting/paragraph-in-preserveNewline.html
-/sdcard/android/layout_tests/editing/deleting/delete-after-span-ws-002.html
-/sdcard/android/layout_tests/editing/deleting/5272440.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-012.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-009.html
-/sdcard/android/layout_tests/editing/deleting/delete-listitem-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-character-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-008.html
-/sdcard/android/layout_tests/editing/deleting/5483370.html
-/sdcard/android/layout_tests/editing/deleting/5026848-2.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-004.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-013.html
-/sdcard/android/layout_tests/editing/deleting/5091898.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-009.html
-/sdcard/android/layout_tests/editing/deleting/transpose-empty.html
-/sdcard/android/layout_tests/editing/deleting/merge-endOfParagraph.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-010.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-022.html
-/sdcard/android/layout_tests/editing/deleting/delete-3775172-fix.html
-/sdcard/android/layout_tests/editing/deleting/delete-mixed-editable-content-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-006.html
-/sdcard/android/layout_tests/editing/deleting/smart-delete-003.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-018.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-005.html
-/sdcard/android/layout_tests/editing/deleting/delete-first-list-item.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-017.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-trailing-ws-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-010.html
-/sdcard/android/layout_tests/editing/deleting/delete-and-undo.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-006.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-009.html
-/sdcard/android/layout_tests/editing/deleting/delete-hr.html
-/sdcard/android/layout_tests/editing/deleting/delete-4083333-fix.html
-/sdcard/android/layout_tests/editing/deleting/delete-3608445-fix.html
-/sdcard/android/layout_tests/editing/deleting/delete-ws-fixup-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-003.html
-/sdcard/android/layout_tests/editing/deleting/delete-image-004.html
-/sdcard/android/layout_tests/editing/deleting/delete-select-all-001.html
-/sdcard/android/layout_tests/editing/deleting/delete-block-merge-contents-015.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-002.html
-/sdcard/android/layout_tests/editing/deleting/delete-line-014.html
-/sdcard/android/layout_tests/editing/deleting/merge-into-empty-block-2.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-010.html
-/sdcard/android/layout_tests/editing/deleting/5390681-2.html
-/sdcard/android/layout_tests/editing/deleting/5369009.html
-/sdcard/android/layout_tests/editing/deleting/delete-br-003.html
-/sdcard/android/layout_tests/editing/deleting/delete-at-paragraph-boundaries-006.html
-/sdcard/android/layout_tests/editing/deleting/delete-tab-002.html
-/sdcard/android/layout_tests/editing/deleting/list-item-1.html
-/sdcard/android/layout_tests/editing/deleting/5168598.html
-/sdcard/android/layout_tests/editing/deleting/delete-3608430-fix.html
-/sdcard/android/layout_tests/editing/deleting/type-delete-after-quote.html
-/sdcard/android/layout_tests/editing/spelling/spelling.html
-/sdcard/android/layout_tests/editing/spelling/spellcheck-attribute.html
-/sdcard/android/layout_tests/editing/spelling/inline_spelling_markers.html
-/sdcard/android/layout_tests/editing/spelling/spelling-linebreak.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-05.html
-/sdcard/android/layout_tests/fast/media/mq-grid-02.html
-/sdcard/android/layout_tests/fast/media/mq-compound-query-02.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-09.html
-/sdcard/android/layout_tests/fast/media/mq-width-absolute-03.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-media-feature-02.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-04.html
-/sdcard/android/layout_tests/fast/media/mq-min-pixel-ratio.html
-/sdcard/android/layout_tests/fast/media/implicit-media-all.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-01.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-03.html
-/sdcard/android/layout_tests/fast/media/viewport-media-query.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-05.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-01.html
-/sdcard/android/layout_tests/fast/media/mq-transition.html
-/sdcard/android/layout_tests/fast/media/mq-orientation.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-05.html
-/sdcard/android/layout_tests/fast/media/mq-transform-04.html
-/sdcard/android/layout_tests/fast/media/mq-js-media-except-02.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-02.html
-/sdcard/android/layout_tests/fast/media/mq-js-stylesheet-media-03.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-06.html
-/sdcard/android/layout_tests/fast/media/mq-valueless.html
-/sdcard/android/layout_tests/fast/media/mq-compound-query-03.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-01.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-media-feature-03.html
-/sdcard/android/layout_tests/fast/media/mq-width-absolute-04.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-05.html
-/sdcard/android/layout_tests/fast/media/mq-animation.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-02.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-04.html
-/sdcard/android/layout_tests/fast/media/media-type-syntax-01.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-06.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-02.html
-/sdcard/android/layout_tests/fast/media/mq-transform-01.html
-/sdcard/android/layout_tests/fast/media/monochrome.html
-/sdcard/android/layout_tests/fast/media/mq-pixel-ratio.html
-/sdcard/android/layout_tests/fast/media/mq-js-media-except-03.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-03.html
-/sdcard/android/layout_tests/fast/media/mq-js-stylesheet-media-04.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-07.html
-/sdcard/android/layout_tests/fast/media/mq-compound-query-04.html
-/sdcard/android/layout_tests/fast/media/mq-width-absolute-01.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-02.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-media-feature-04.html
-/sdcard/android/layout_tests/fast/media/mq-max-pixel-ratio.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-01.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-03.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-05.html
-/sdcard/android/layout_tests/fast/media/media-type-syntax-02.html
-/sdcard/android/layout_tests/fast/media/mq-transform-02.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-03.html
-/sdcard/android/layout_tests/fast/media/mq-js-stylesheet-media-01.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-04.html
-/sdcard/android/layout_tests/fast/media/mq-grid-01.html
-/sdcard/android/layout_tests/fast/media/mq-compound-query-01.html
-/sdcard/android/layout_tests/fast/media/mq-min-constraint.html
-/sdcard/android/layout_tests/fast/media/mq-relative-constraints-08.html
-/sdcard/android/layout_tests/fast/media/mq-compound-query-05.html
-/sdcard/android/layout_tests/fast/media/mq-width-absolute-02.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-media-feature-01.html
-/sdcard/android/layout_tests/fast/media/mq-simple-query-03.html
-/sdcard/android/layout_tests/fast/media/mq-js-media-forward-syntax.html
-/sdcard/android/layout_tests/fast/media/mq-simple-neg-query-02.html
-/sdcard/android/layout_tests/fast/media/media-descriptor-syntax-04.html
-/sdcard/android/layout_tests/fast/media/mq-aspect-ratio.html
-/sdcard/android/layout_tests/fast/media/mq-invalid-syntax-04.html
-/sdcard/android/layout_tests/fast/media/mq-transform-03.html
-/sdcard/android/layout_tests/fast/media/mq-js-media-except-01.html
-/sdcard/android/layout_tests/fast/media/mq-js-stylesheet-media-02.html
-/sdcard/android/layout_tests/fast/replaced/embed-display-none.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-radio.html
-/sdcard/android/layout_tests/fast/replaced/selection-rect.html
-/sdcard/android/layout_tests/fast/replaced/applet-display-none.html
-/sdcard/android/layout_tests/fast/replaced/inline-box-wrapper-handover.html
-/sdcard/android/layout_tests/fast/replaced/maxheight-pxs.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-searchfield.html
-/sdcard/android/layout_tests/fast/replaced/selection-rect-transform.html
-/sdcard/android/layout_tests/fast/replaced/minwidth-pxs.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-textarea.html
-/sdcard/android/layout_tests/fast/replaced/maxwidth-pxs.html
-/sdcard/android/layout_tests/fast/replaced/absolute-position-percentage-height.html
-/sdcard/android/layout_tests/fast/replaced/004.html
-/sdcard/android/layout_tests/fast/replaced/applet-disabled-positioned.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-checkbox.html
-/sdcard/android/layout_tests/fast/replaced/008.html
-/sdcard/android/layout_tests/fast/replaced/percent-height-in-anonymous-block-widget.html
-/sdcard/android/layout_tests/fast/replaced/maxheight-percent.html
-/sdcard/android/layout_tests/fast/replaced/minwidth-percent.html
-/sdcard/android/layout_tests/fast/replaced/maxwidth-percent.html
-/sdcard/android/layout_tests/fast/replaced/applet-rendering-java-disabled.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-button.html
-/sdcard/android/layout_tests/fast/replaced/image-resize-width.html
-/sdcard/android/layout_tests/fast/replaced/absolute-image-sizing.html
-/sdcard/android/layout_tests/fast/replaced/001.html
-/sdcard/android/layout_tests/fast/replaced/005.html
-/sdcard/android/layout_tests/fast/replaced/object-display-none.html
-/sdcard/android/layout_tests/fast/replaced/absolute-position-percentage-width.html
-/sdcard/android/layout_tests/fast/replaced/object-align-hspace-vspace.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-menulist.html
-/sdcard/android/layout_tests/fast/replaced/percent-height-in-anonymous-block-in-table.html
-/sdcard/android/layout_tests/fast/replaced/image-sizing.html
-/sdcard/android/layout_tests/fast/replaced/minheight-pxs.html
-/sdcard/android/layout_tests/fast/replaced/pdf-as-image.html
-/sdcard/android/layout_tests/fast/replaced/replaced-breaking-mixture.html
-/sdcard/android/layout_tests/fast/replaced/max-width-percent.html
-/sdcard/android/layout_tests/fast/replaced/002.html
-/sdcard/android/layout_tests/fast/replaced/006.html
-/sdcard/android/layout_tests/fast/replaced/minheight-percent.html
-/sdcard/android/layout_tests/fast/replaced/absolute-position-with-auto-width-and-left-and-right.html
-/sdcard/android/layout_tests/fast/replaced/selection-rect-in-table-cell.html
-/sdcard/android/layout_tests/fast/replaced/border-radius-clip.html
-/sdcard/android/layout_tests/fast/replaced/percent-height-in-anonymous-block.html
-/sdcard/android/layout_tests/fast/replaced/three-selects-break.html
-/sdcard/android/layout_tests/fast/replaced/image-tag.html
-/sdcard/android/layout_tests/fast/replaced/image-onload.html
-/sdcard/android/layout_tests/fast/replaced/replaced-breaking.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-image.html
-/sdcard/android/layout_tests/fast/replaced/image-solid-color-with-alpha.html
-/sdcard/android/layout_tests/fast/replaced/003.html
-/sdcard/android/layout_tests/fast/replaced/replaced-child-of-absolute-with-auto-height.html
-/sdcard/android/layout_tests/fast/replaced/007.html
-/sdcard/android/layout_tests/fast/replaced/absolute-position-with-auto-height-and-top-and-bottom.html
-/sdcard/android/layout_tests/fast/replaced/width100percent-textfield.html
-/sdcard/android/layout_tests/fast/dynamic/positioned-movement-with-positioned-children.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-table-cell-height.html
-/sdcard/android/layout_tests/fast/dynamic/move-node-with-selection.html
-/sdcard/android/layout_tests/fast/dynamic/create-renderer-for-whitespace-only-text.html
-/sdcard/android/layout_tests/fast/dynamic/outerHTML-doc.html
-/sdcard/android/layout_tests/fast/dynamic/window-scrollbars-test.html
-/sdcard/android/layout_tests/fast/dynamic/floating-to-positioned-2.html
-/sdcard/android/layout_tests/fast/dynamic/anchor-lock.html
-/sdcard/android/layout_tests/fast/dynamic/012.html
-/sdcard/android/layout_tests/fast/dynamic/004.html
-/sdcard/android/layout_tests/fast/dynamic/008.html
-/sdcard/android/layout_tests/fast/dynamic/float-no-longer-overhanging.html
-/sdcard/android/layout_tests/fast/dynamic/float-withdrawal-2.html
-/sdcard/android/layout_tests/fast/dynamic/float-in-trailing-whitespace-after-last-line-break.html
-/sdcard/android/layout_tests/fast/dynamic/selection-highlight-adjust.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-no-common-root-static-y.html
-/sdcard/android/layout_tests/fast/dynamic/genContentDestroyChildren.html
-/sdcard/android/layout_tests/fast/dynamic/001.html
-/sdcard/android/layout_tests/fast/dynamic/link-href-change.html
-/sdcard/android/layout_tests/fast/dynamic/013.html
-/sdcard/android/layout_tests/fast/dynamic/005.html
-/sdcard/android/layout_tests/fast/dynamic/009.html
-/sdcard/android/layout_tests/fast/dynamic/float-withdrawal.html
-/sdcard/android/layout_tests/fast/dynamic/anonymous-block-layer-lost.html
-/sdcard/android/layout_tests/fast/dynamic/layer-hit-test-crash.html
-/sdcard/android/layout_tests/fast/dynamic/view-overflow.html
-/sdcard/android/layout_tests/fast/dynamic/window-resize-scrollbars-test.html
-/sdcard/android/layout_tests/fast/dynamic/010.html
-/sdcard/android/layout_tests/fast/dynamic/002.html
-/sdcard/android/layout_tests/fast/dynamic/014.html
-/sdcard/android/layout_tests/fast/dynamic/006.html
-/sdcard/android/layout_tests/fast/dynamic/flash-replacement-test.html
-/sdcard/android/layout_tests/fast/dynamic/insertAdjacentElement.html
-/sdcard/android/layout_tests/fast/dynamic/insert-before-table-part-in-continuation.html
-/sdcard/android/layout_tests/fast/dynamic/staticY.html
-/sdcard/android/layout_tests/fast/dynamic/anonymous-block-orphaned-lines.html
-/sdcard/android/layout_tests/fast/dynamic/noninlinebadness.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-parent-static-y.html
-/sdcard/android/layout_tests/fast/dynamic/outerHTML-img.html
-/sdcard/android/layout_tests/fast/dynamic/staticY-marking-parents-regression.html
-/sdcard/android/layout_tests/fast/dynamic/floating-to-positioned.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-boundary-percent-height.html
-/sdcard/android/layout_tests/fast/dynamic/011.html
-/sdcard/android/layout_tests/fast/dynamic/containing-block-change.html
-/sdcard/android/layout_tests/fast/dynamic/015.html
-/sdcard/android/layout_tests/fast/dynamic/007.html
-/sdcard/android/layout_tests/fast/text/firstline/001.html
-/sdcard/android/layout_tests/fast/text/firstline/002.html
-/sdcard/android/layout_tests/fast/text/firstline/003.html
-/sdcard/android/layout_tests/fast/text/international/hindi-spacing.html
-/sdcard/android/layout_tests/fast/text/international/bidi-L2-run-reordering.html
-/sdcard/android/layout_tests/fast/text/international/bidi-override.html
-/sdcard/android/layout_tests/fast/text/international/hindi-whitespace.html
-/sdcard/android/layout_tests/fast/text/international/bidi-european-terminators.html
-/sdcard/android/layout_tests/fast/text/international/bidi-LDB-2-formatting-characters.html
-/sdcard/android/layout_tests/fast/text/international/bidi-AN-after-L.html
-/sdcard/android/layout_tests/fast/text/international/bidi-LDB-2-CSS.html
-/sdcard/android/layout_tests/fast/text/international/bidi-control-chars-treated-as-ZWS.html
-/sdcard/android/layout_tests/fast/text/international/bidi-neutral-directionality-paragraph-start.html
-/sdcard/android/layout_tests/fast/text/international/bidi-linebreak-001.html
-/sdcard/android/layout_tests/fast/text/international/bidi-linebreak-003.html
-/sdcard/android/layout_tests/fast/text/international/002.html
-/sdcard/android/layout_tests/fast/text/international/bidi-explicit-embedding.html
-/sdcard/android/layout_tests/fast/text/international/rtl-white-space-pre-wrap.html
-/sdcard/android/layout_tests/fast/text/international/bidi-CS-after-AN.html
-/sdcard/android/layout_tests/fast/text/international/complex-character-based-fallback.html
-/sdcard/android/layout_tests/fast/text/international/wrap-CJK-001.html
-/sdcard/android/layout_tests/fast/text/international/bidi-listbox-atsui.html
-/sdcard/android/layout_tests/fast/text/international/thai-line-breaks.html
-/sdcard/android/layout_tests/fast/text/international/bidi-neutral-run.html
-/sdcard/android/layout_tests/fast/text/international/bidi-innertext.html
-/sdcard/android/layout_tests/fast/text/international/bidi-listbox.html
-/sdcard/android/layout_tests/fast/text/international/khmer-selection.html
-/sdcard/android/layout_tests/fast/text/international/thai-baht-space.html
-/sdcard/android/layout_tests/fast/text/international/rtl-caret.html
-/sdcard/android/layout_tests/fast/text/international/bidi-AN-after-empty-run.html
-/sdcard/android/layout_tests/fast/text/international/001.html
-/sdcard/android/layout_tests/fast/text/international/bidi-linebreak-002.html
-/sdcard/android/layout_tests/fast/text/international/danda-space.html
-/sdcard/android/layout_tests/fast/text/international/003.html
-/sdcard/android/layout_tests/fast/text/international/bidi-ignored-for-first-child-inline.html
-/sdcard/android/layout_tests/fast/text/international/bidi-layout-across-linebreak.html
-/sdcard/android/layout_tests/fast/text/international/bidi-menulist.html
-/sdcard/android/layout_tests/fast/text/international/bidi-LDB-2-HTML.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-wrap-overflow-selection.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-newline-box-test.html
-/sdcard/android/layout_tests/fast/text/whitespace/span-in-word-space-causes-overflow.html
-/sdcard/android/layout_tests/fast/text/whitespace/nowrap-clear-float.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-wrap-line-test.html
-/sdcard/android/layout_tests/fast/text/whitespace/010.html
-/sdcard/android/layout_tests/fast/text/whitespace/020.html
-/sdcard/android/layout_tests/fast/text/whitespace/002.html
-/sdcard/android/layout_tests/fast/text/whitespace/030.html
-/sdcard/android/layout_tests/fast/text/whitespace/012.html
-/sdcard/android/layout_tests/fast/text/whitespace/022.html
-/sdcard/android/layout_tests/fast/text/whitespace/004.html
-/sdcard/android/layout_tests/fast/text/whitespace/014.html
-/sdcard/android/layout_tests/fast/text/whitespace/024.html
-/sdcard/android/layout_tests/fast/text/whitespace/006.html
-/sdcard/android/layout_tests/fast/text/whitespace/016.html
-/sdcard/android/layout_tests/fast/text/whitespace/008.html
-/sdcard/android/layout_tests/fast/text/whitespace/026.html
-/sdcard/android/layout_tests/fast/text/whitespace/018.html
-/sdcard/android/layout_tests/fast/text/whitespace/028.html
-/sdcard/android/layout_tests/fast/text/whitespace/normal-after-nowrap-breaking.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-break-word.html
-/sdcard/android/layout_tests/fast/text/whitespace/nbsp-mode-and-linewraps.html
-/sdcard/android/layout_tests/fast/text/whitespace/001.html
-/sdcard/android/layout_tests/fast/text/whitespace/011.html
-/sdcard/android/layout_tests/fast/text/whitespace/tab-character-basics.html
-/sdcard/android/layout_tests/fast/text/whitespace/003.html
-/sdcard/android/layout_tests/fast/text/whitespace/021.html
-/sdcard/android/layout_tests/fast/text/whitespace/013.html
-/sdcard/android/layout_tests/fast/text/whitespace/023.html
-/sdcard/android/layout_tests/fast/text/whitespace/005.html
-/sdcard/android/layout_tests/fast/text/whitespace/015.html
-/sdcard/android/layout_tests/fast/text/whitespace/025.html
-/sdcard/android/layout_tests/fast/text/whitespace/007.html
-/sdcard/android/layout_tests/fast/text/whitespace/017.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-wrap-spaces-after-newline.html
-/sdcard/android/layout_tests/fast/text/whitespace/027.html
-/sdcard/android/layout_tests/fast/text/whitespace/009.html
-/sdcard/android/layout_tests/fast/text/whitespace/019.html
-/sdcard/android/layout_tests/fast/text/whitespace/pre-wrap-last-char.html
-/sdcard/android/layout_tests/fast/text/whitespace/029.html
-/sdcard/android/layout_tests/fast/text/basic/001.html
-/sdcard/android/layout_tests/fast/text/basic/002.html
-/sdcard/android/layout_tests/fast/text/basic/011.html
-/sdcard/android/layout_tests/fast/text/basic/generic-family-changes.html
-/sdcard/android/layout_tests/fast/text/basic/003.html
-/sdcard/android/layout_tests/fast/text/basic/012.html
-/sdcard/android/layout_tests/fast/text/basic/004.html
-/sdcard/android/layout_tests/fast/text/basic/013.html
-/sdcard/android/layout_tests/fast/text/basic/005.html
-/sdcard/android/layout_tests/fast/text/basic/014.html
-/sdcard/android/layout_tests/fast/text/basic/006.html
-/sdcard/android/layout_tests/fast/text/basic/015.html
-/sdcard/android/layout_tests/fast/text/basic/007.html
-/sdcard/android/layout_tests/fast/text/basic/008.html
-/sdcard/android/layout_tests/fast/text/basic/009.html
-/sdcard/android/layout_tests/fast/text/basic/generic-family-reset.html
-/sdcard/android/layout_tests/fast/text/in-rendered-text-rtl.html
-/sdcard/android/layout_tests/fast/text/selection-painted-separately.html
-/sdcard/android/layout_tests/fast/text/bidi-embedding-pop-and-push-same.html
-/sdcard/android/layout_tests/fast/text/wbr-in-pre-crash.html
-/sdcard/android/layout_tests/fast/text/atsui-spacing-features.html
-/sdcard/android/layout_tests/fast/text/textIteratorNilRenderer.html
-/sdcard/android/layout_tests/fast/text/drawBidiText.html
-/sdcard/android/layout_tests/fast/text/selection-hard-linebreak.html
-/sdcard/android/layout_tests/fast/text/word-break.html
-/sdcard/android/layout_tests/fast/text/break-word.html
-/sdcard/android/layout_tests/fast/text/font-initial.html
-/sdcard/android/layout_tests/fast/text/complex-text-opacity.html
-/sdcard/android/layout_tests/fast/text/stroking.html
-/sdcard/android/layout_tests/fast/text/midword-break-hang.html
-/sdcard/android/layout_tests/fast/text/atsui-partial-selection.html
-/sdcard/android/layout_tests/fast/text/embed-at-end-of-pre-wrap-line.html
-/sdcard/android/layout_tests/fast/text/atsui-multiple-renderers.html
-/sdcard/android/layout_tests/fast/text/shadow-translucent-fill.html
-/sdcard/android/layout_tests/fast/text/apply-start-width-after-skipped-text.html
-/sdcard/android/layout_tests/fast/text/capitalize-preserve-nbsp.html
-/sdcard/android/layout_tests/fast/text/updateNewFont.html
-/sdcard/android/layout_tests/fast/text/atsui-rtl-override-selection.html
-/sdcard/android/layout_tests/fast/text/align-center-rtl-spill.html
-/sdcard/android/layout_tests/fast/text/wbr.html
-/sdcard/android/layout_tests/fast/text/cg-vs-atsui.html
-/sdcard/android/layout_tests/fast/text/monospace-width-cache.html
-/sdcard/android/layout_tests/fast/text/soft-hyphen-2.html
-/sdcard/android/layout_tests/fast/text/atsui-pointtooffset-calls-cg.html
-/sdcard/android/layout_tests/fast/text/justified-selection.html
-/sdcard/android/layout_tests/fast/text/atsui-kerning-and-ligatures.html
-/sdcard/android/layout_tests/fast/text/wbr-pre.html
-/sdcard/android/layout_tests/fast/text/capitalize-boundaries.html
-/sdcard/android/layout_tests/fast/text/trailing-white-space.html
-/sdcard/android/layout_tests/fast/text/capitalize-empty-generated-string.html
-/sdcard/android/layout_tests/fast/text/stripNullFromText.html
-/sdcard/android/layout_tests/fast/text/letter-spacing-negative-opacity.html
-/sdcard/android/layout_tests/fast/text/atsui-small-caps-punctuation-size.html
-/sdcard/android/layout_tests/fast/text/word-break-soft-hyphen.html
-/sdcard/android/layout_tests/fast/text/fixed-pitch-control-characters.html
-/sdcard/android/layout_tests/fast/text/cg-fallback-bolding.html
-/sdcard/android/layout_tests/fast/text/line-breaks-after-white-space.html
-/sdcard/android/layout_tests/fast/text/text-letter-spacing.html
-/sdcard/android/layout_tests/fast/text/soft-hyphen-3.html
-/sdcard/android/layout_tests/fast/text/should-use-atsui.html
-/sdcard/android/layout_tests/fast/text/wide-zero-width-space.html
-/sdcard/android/layout_tests/fast/text/justified-selection-at-edge.html
-/sdcard/android/layout_tests/fast/text/trailing-white-space-2.html
-/sdcard/android/layout_tests/fast/text/word-break-run-rounding.html
-/sdcard/android/layout_tests/fast/text/softHyphen.html
-/sdcard/android/layout_tests/fast/text/delete-hard-break-character.html
-/sdcard/android/layout_tests/fast/text/line-breaks.html
-/sdcard/android/layout_tests/fast/text/wbr-styled.html
-/sdcard/android/layout_tests/fast/text/large-text-composed-char.html
-/sdcard/android/layout_tests/fast/text/shadow-no-blur.html
-/sdcard/android/layout_tests/fast/text/reset-emptyRun.html
-/sdcard/android/layout_tests/fast/text/word-space.html
-/sdcard/android/layout_tests/fast/text/midword-break-after-breakable-char.html
-/sdcard/android/layout_tests/fast/text/stroking-decorations.html
-/sdcard/android/layout_tests/fast/encoding/utf-16-little-endian.html
-/sdcard/android/layout_tests/fast/encoding/denormalised-voiced-japanese-chars.html
-/sdcard/android/layout_tests/fast/encoding/utf-16-no-bom.xml
-/sdcard/android/layout_tests/fast/encoding/utf-16-big-endian.html
-/sdcard/android/layout_tests/fast/encoding/xmacroman-encoding-test.html
-/sdcard/android/layout_tests/fast/encoding/invalid-UTF-8.html
-/sdcard/android/layout_tests/fast/multicol/float-avoidance.html
-/sdcard/android/layout_tests/fast/multicol/negativeColumnWidth.html
-/sdcard/android/layout_tests/fast/multicol/column-rules.html
-/sdcard/android/layout_tests/fast/multicol/column-rules-stacking.html
-/sdcard/android/layout_tests/fast/multicol/zeroColumnCount.html
-/sdcard/android/layout_tests/fast/multicol/columns-shorthand-parsing.html
-/sdcard/android/layout_tests/fast/multicol/float-multicol.html
-/sdcard/android/layout_tests/fast/doctypes/001.html
-/sdcard/android/layout_tests/fast/doctypes/002.html
-/sdcard/android/layout_tests/fast/doctypes/003.html
-/sdcard/android/layout_tests/fast/doctypes/004.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-row-group-to-inline.html
-/sdcard/android/layout_tests/fast/css-generated-content/spellingToolTip-assert.html
-/sdcard/android/layout_tests/fast/css-generated-content/no-openclose-quote.html
-/sdcard/android/layout_tests/fast/css-generated-content/before-with-first-letter.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-row-group-with-before.html
-/sdcard/android/layout_tests/fast/css-generated-content/010.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-with-before.html
-/sdcard/android/layout_tests/fast/css-generated-content/002.html
-/sdcard/android/layout_tests/fast/css-generated-content/012.html
-/sdcard/android/layout_tests/fast/css-generated-content/004.html
-/sdcard/android/layout_tests/fast/css-generated-content/014.html
-/sdcard/android/layout_tests/fast/css-generated-content/016.html
-/sdcard/android/layout_tests/fast/css-generated-content/008.html
-/sdcard/android/layout_tests/fast/css-generated-content/after-order.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-cell-before-content.html
-/sdcard/android/layout_tests/fast/css-generated-content/visibleContentHiddenParent.html
-/sdcard/android/layout_tests/fast/css-generated-content/inline-display-types.html
-/sdcard/android/layout_tests/fast/css-generated-content/positioned-background-hit-test-crash.html
-/sdcard/android/layout_tests/fast/css-generated-content/001.html
-/sdcard/android/layout_tests/fast/css-generated-content/011.html
-/sdcard/android/layout_tests/fast/css-generated-content/003.html
-/sdcard/android/layout_tests/fast/css-generated-content/beforeAfter-interdocument.html
-/sdcard/android/layout_tests/fast/css-generated-content/013.html
-/sdcard/android/layout_tests/fast/css-generated-content/005.html
-/sdcard/android/layout_tests/fast/css-generated-content/hover-style-change.html
-/sdcard/android/layout_tests/fast/css-generated-content/table-row-with-before.html
-/sdcard/android/layout_tests/fast/css-generated-content/absolute-position-inside-inline.html
-/sdcard/android/layout_tests/fast/css-generated-content/015.html
-/sdcard/android/layout_tests/fast/css-generated-content/hit-test-generated-content.html
-/sdcard/android/layout_tests/fast/css-generated-content/007.html
-/sdcard/android/layout_tests/fast/css-generated-content/009.html
-/sdcard/android/layout_tests/fast/css-generated-content/wbr-with-before-content.html
-/sdcard/android/layout_tests/fast/lists/decimal-leading-zero.html
-/sdcard/android/layout_tests/fast/lists/ol-display-types.html
-/sdcard/android/layout_tests/fast/lists/li-style-alpha-huge-value-crash.html
-/sdcard/android/layout_tests/fast/lists/ol-start-dynamic.html
-/sdcard/android/layout_tests/fast/lists/numeric-markers-outside-list.html
-/sdcard/android/layout_tests/fast/lists/marker-image-error.html
-/sdcard/android/layout_tests/fast/lists/marker-before-empty-inline.html
-/sdcard/android/layout_tests/fast/lists/list-marker-with-line-height.html
-/sdcard/android/layout_tests/fast/lists/scrolled-marker-paint.html
-/sdcard/android/layout_tests/fast/lists/li-values.html
-/sdcard/android/layout_tests/fast/lists/002.html
-/sdcard/android/layout_tests/fast/lists/dynamic-marker-crash.html
-/sdcard/android/layout_tests/fast/lists/list-item-line-height.html
-/sdcard/android/layout_tests/fast/lists/004.html
-/sdcard/android/layout_tests/fast/lists/drag-into-marker.html
-/sdcard/android/layout_tests/fast/lists/list-style-none-crash.html
-/sdcard/android/layout_tests/fast/lists/alpha-list-wrap.html
-/sdcard/android/layout_tests/fast/lists/006.html
-/sdcard/android/layout_tests/fast/lists/ol-start-parsing.html
-/sdcard/android/layout_tests/fast/lists/008.html
-/sdcard/android/layout_tests/fast/lists/inlineBoxWrapperNullCheck.html
-/sdcard/android/layout_tests/fast/lists/w3-list-styles.html
-/sdcard/android/layout_tests/fast/lists/item-not-in-list-line-wrapping.html
-/sdcard/android/layout_tests/fast/lists/olstart.html
-/sdcard/android/layout_tests/fast/lists/big-list-marker.html
-/sdcard/android/layout_tests/fast/lists/markers-in-selection.html
-/sdcard/android/layout_tests/fast/lists/list-style-type-dynamic-change.html
-/sdcard/android/layout_tests/fast/lists/001.html
-/sdcard/android/layout_tests/fast/lists/ordered-list-with-no-ol-tag.html
-/sdcard/android/layout_tests/fast/lists/003.html
-/sdcard/android/layout_tests/fast/lists/005.html
-/sdcard/android/layout_tests/fast/lists/li-br.html
-/sdcard/android/layout_tests/fast/lists/007.html
-/sdcard/android/layout_tests/fast/lists/009.html
-/sdcard/android/layout_tests/fast/transforms/transform-overflow.html
-/sdcard/android/layout_tests/fast/transforms/transforms-with-opacity.html
-/sdcard/android/layout_tests/fast/transforms/transformed-caret.html
-/sdcard/android/layout_tests/fast/transforms/bounding-rect-zoom.html
-/sdcard/android/layout_tests/fast/transforms/matrix-01.html
-/sdcard/android/layout_tests/fast/transforms/matrix-02.html
-/sdcard/android/layout_tests/fast/transforms/overflow-with-transform.html
-/sdcard/android/layout_tests/fast/transforms/transformed-document-element.html
-/sdcard/android/layout_tests/fast/transforms/transforms-with-zoom.html
-/sdcard/android/layout_tests/fast/transforms/transformed-focused-text-input.html
-/sdcard/android/layout_tests/fast/transforms/identity-matrix.html
-/sdcard/android/layout_tests/fast/transforms/transform-on-inline.html
-/sdcard/android/layout_tests/fast/transforms/transform-positioned-ancestor.html
-/sdcard/android/layout_tests/fast/transforms/skew-with-unitless-zero.html
-/sdcard/android/layout_tests/fast/transforms/transform-table-row.html
-/sdcard/android/layout_tests/fast/transforms/shadows.html
-/sdcard/android/layout_tests/fast/transforms/diamond.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusSolid01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDouble01.html
-/sdcard/android/layout_tests/fast/borders/block-mask-overlay-image.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDouble03.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusSolid03.html
-/sdcard/android/layout_tests/fast/borders/border-color-inherit.html
-/sdcard/android/layout_tests/fast/borders/svg-as-border-image-2.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusInvalidColor.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDotted02.html
-/sdcard/android/layout_tests/fast/borders/border-image-scale-transform.html
-/sdcard/android/layout_tests/fast/borders/border-fit.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusArcs01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDashed01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDashed03.html
-/sdcard/android/layout_tests/fast/borders/fieldsetBorderRadius.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusAllStylesAllCorners.html
-/sdcard/android/layout_tests/fast/borders/border-radius-split-inline.html
-/sdcard/android/layout_tests/fast/borders/border-radius-constraints.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusGroove01.html
-/sdcard/android/layout_tests/fast/borders/border-image-omit-right-slice.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDouble02.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusSolid02.html
-/sdcard/android/layout_tests/fast/borders/outline-offset-min-assert.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusSolid04.html
-/sdcard/android/layout_tests/fast/borders/border-radius-huge-assert.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusInset01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDotted01.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusOutset01.html
-/sdcard/android/layout_tests/fast/borders/svg-as-border-image.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDotted03.html
-/sdcard/android/layout_tests/fast/borders/border-image-border-radius.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusDashed02.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusRidge01.html
-/sdcard/android/layout_tests/fast/borders/border-image-rotate-transform.html
-/sdcard/android/layout_tests/fast/borders/inline-mask-overlay-image.html
-/sdcard/android/layout_tests/fast/borders/borderRadiusGroove02.html
-/sdcard/android/layout_tests/fast/borders/border-image-01.html
-/sdcard/android/layout_tests/fast/innerHTML/001.html
-/sdcard/android/layout_tests/fast/innerHTML/002.html
-/sdcard/android/layout_tests/fast/innerHTML/003.html
-/sdcard/android/layout_tests/fast/innerHTML/006.html
-/sdcard/android/layout_tests/fast/selectors/175a.html
-/sdcard/android/layout_tests/fast/selectors/155c.html
-/sdcard/android/layout_tests/fast/selectors/059.html
-/sdcard/android/layout_tests/fast/selectors/066b.html
-/sdcard/android/layout_tests/fast/selectors/168.html
-/sdcard/android/layout_tests/fast/selectors/177a.html
-/sdcard/android/layout_tests/fast/selectors/087b.html
-/sdcard/android/layout_tests/fast/selectors/020.html
-/sdcard/android/layout_tests/fast/selectors/012.html
-/sdcard/android/layout_tests/fast/selectors/040.html
-/sdcard/android/layout_tests/fast/selectors/004.html
-/sdcard/android/layout_tests/fast/selectors/032.html
-/sdcard/android/layout_tests/fast/selectors/060.html
-/sdcard/android/layout_tests/fast/selectors/016.html
-/sdcard/android/layout_tests/fast/selectors/044.html
-/sdcard/android/layout_tests/fast/selectors/008.html
-/sdcard/android/layout_tests/fast/selectors/072.html
-/sdcard/android/layout_tests/fast/selectors/064.html
-/sdcard/android/layout_tests/fast/selectors/056.html
-/sdcard/android/layout_tests/fast/selectors/018b.html
-/sdcard/android/layout_tests/fast/selectors/090b.html
-/sdcard/android/layout_tests/fast/selectors/045c.html
-/sdcard/android/layout_tests/fast/selectors/170d.html
-/sdcard/android/layout_tests/fast/selectors/157.html
-/sdcard/android/layout_tests/fast/selectors/039b.html
-/sdcard/android/layout_tests/fast/selectors/156b.html
-/sdcard/android/layout_tests/fast/selectors/175b.html
-/sdcard/android/layout_tests/fast/selectors/155d.html
-/sdcard/android/layout_tests/fast/selectors/167a.html
-/sdcard/android/layout_tests/fast/selectors/169.html
-/sdcard/android/layout_tests/fast/selectors/077b.html
-/sdcard/android/layout_tests/fast/selectors/177b.html
-/sdcard/android/layout_tests/fast/selectors/169a.html
-/sdcard/android/layout_tests/fast/selectors/001.html
-/sdcard/android/layout_tests/fast/selectors/021.html
-/sdcard/android/layout_tests/fast/selectors/unqualified-hover-quirks.html
-/sdcard/android/layout_tests/fast/selectors/013.html
-/sdcard/android/layout_tests/fast/selectors/041.html
-/sdcard/android/layout_tests/fast/selectors/021b.html
-/sdcard/android/layout_tests/fast/selectors/005.html
-/sdcard/android/layout_tests/fast/selectors/061.html
-/sdcard/android/layout_tests/fast/selectors/170.html
-/sdcard/android/layout_tests/fast/selectors/017.html
-/sdcard/android/layout_tests/fast/selectors/170a.html
-/sdcard/android/layout_tests/fast/selectors/009.html
-/sdcard/android/layout_tests/fast/selectors/045.html
-/sdcard/android/layout_tests/fast/selectors/154.html
-/sdcard/android/layout_tests/fast/selectors/044b.html
-/sdcard/android/layout_tests/fast/selectors/065.html
-/sdcard/android/layout_tests/fast/selectors/155a.html
-/sdcard/android/layout_tests/fast/selectors/166.html
-/sdcard/android/layout_tests/fast/selectors/158.html
-/sdcard/android/layout_tests/fast/selectors/077.html
-/sdcard/android/layout_tests/fast/selectors/175c.html
-/sdcard/android/layout_tests/fast/selectors/089.html
-/sdcard/android/layout_tests/fast/selectors/088b.html
-/sdcard/android/layout_tests/fast/selectors/nondeterministic-combinators.html
-/sdcard/android/layout_tests/fast/selectors/unqualified-hover-strict.html
-/sdcard/android/layout_tests/fast/selectors/010.html
-/sdcard/android/layout_tests/fast/selectors/002.html
-/sdcard/android/layout_tests/fast/selectors/014.html
-/sdcard/android/layout_tests/fast/selectors/042.html
-/sdcard/android/layout_tests/fast/selectors/006.html
-/sdcard/android/layout_tests/fast/selectors/034.html
-/sdcard/android/layout_tests/fast/selectors/062.html
-/sdcard/android/layout_tests/fast/selectors/007a.html
-/sdcard/android/layout_tests/fast/selectors/054.html
-/sdcard/android/layout_tests/fast/selectors/018.html
-/sdcard/android/layout_tests/fast/selectors/046.html
-/sdcard/android/layout_tests/fast/selectors/170b.html
-/sdcard/android/layout_tests/fast/selectors/072b.html
-/sdcard/android/layout_tests/fast/selectors/044c.html
-/sdcard/android/layout_tests/fast/selectors/038.html
-/sdcard/android/layout_tests/fast/selectors/155.html
-/sdcard/android/layout_tests/fast/selectors/066.html
-/sdcard/android/layout_tests/fast/selectors/058.html
-/sdcard/android/layout_tests/fast/selectors/155b.html
-/sdcard/android/layout_tests/fast/selectors/166a.html
-/sdcard/android/layout_tests/fast/selectors/167.html
-/sdcard/android/layout_tests/fast/selectors/159.html
-/sdcard/android/layout_tests/fast/selectors/168a.html
-/sdcard/android/layout_tests/fast/selectors/078b.html
-/sdcard/android/layout_tests/fast/selectors/011.html
-/sdcard/android/layout_tests/fast/selectors/003.html
-/sdcard/android/layout_tests/fast/selectors/015.html
-/sdcard/android/layout_tests/fast/selectors/043.html
-/sdcard/android/layout_tests/fast/selectors/160.html
-/sdcard/android/layout_tests/fast/selectors/063.html
-/sdcard/android/layout_tests/fast/selectors/043b.html
-/sdcard/android/layout_tests/fast/selectors/007b.html
-/sdcard/android/layout_tests/fast/selectors/027.html
-/sdcard/android/layout_tests/fast/selectors/019.html
-/sdcard/android/layout_tests/fast/selectors/083.html
-/sdcard/android/layout_tests/fast/selectors/045b.html
-/sdcard/android/layout_tests/fast/selectors/170c.html
-/sdcard/android/layout_tests/fast/selectors/044d.html
-/sdcard/android/layout_tests/fast/selectors/039.html
-/sdcard/android/layout_tests/fast/overflow/overflow-focus-ring.html
-/sdcard/android/layout_tests/fast/overflow/overflow-x-y.html
-/sdcard/android/layout_tests/fast/overflow/overflow-text-hit-testing.html
-/sdcard/android/layout_tests/fast/overflow/unreachable-overflow-rtl-bug.html
-/sdcard/android/layout_tests/fast/overflow/overflow-auto-position-absolute.html
-/sdcard/android/layout_tests/fast/overflow/scrollRevealButton.html
-/sdcard/android/layout_tests/fast/overflow/overflow-rtl-inline-scrollbar.html
-/sdcard/android/layout_tests/fast/overflow/002.html
-/sdcard/android/layout_tests/fast/overflow/overflow-rtl.html
-/sdcard/android/layout_tests/fast/overflow/004.html
-/sdcard/android/layout_tests/fast/overflow/overflow-stacking.html
-/sdcard/android/layout_tests/fast/overflow/006.html
-/sdcard/android/layout_tests/fast/overflow/border-radius-clipping.html
-/sdcard/android/layout_tests/fast/overflow/scrollbar-position-update.html
-/sdcard/android/layout_tests/fast/overflow/008.html
-/sdcard/android/layout_tests/fast/overflow/overflow-float-stacking.html
-/sdcard/android/layout_tests/fast/overflow/scroll-nested-positioned-layer-in-overflow.html
-/sdcard/android/layout_tests/fast/overflow/image-selection-highlight.html
-/sdcard/android/layout_tests/fast/overflow/childFocusRingClip.html
-/sdcard/android/layout_tests/fast/overflow/position-relative.html
-/sdcard/android/layout_tests/fast/overflow/dynamic-hidden.html
-/sdcard/android/layout_tests/fast/overflow/overflow_hidden.html
-/sdcard/android/layout_tests/fast/overflow/clip-rects-fixed-ancestor.html
-/sdcard/android/layout_tests/fast/overflow/infiniteRecursionGuard.html
-/sdcard/android/layout_tests/fast/overflow/float-in-relpositioned.html
-/sdcard/android/layout_tests/fast/overflow/table-overflow-float.html
-/sdcard/android/layout_tests/fast/overflow/003.xml
-/sdcard/android/layout_tests/fast/overflow/overflow-auto-table.html
-/sdcard/android/layout_tests/fast/overflow/unreachable-content-test.html
-/sdcard/android/layout_tests/fast/overflow/infiniteRecursion.html
-/sdcard/android/layout_tests/fast/overflow/001.html
-/sdcard/android/layout_tests/fast/overflow/hit-test-overflow-controls.html
-/sdcard/android/layout_tests/fast/overflow/005.html
-/sdcard/android/layout_tests/fast/overflow/007.html
-/sdcard/android/layout_tests/fast/overflow/overflow-with-local-background-attachment.html
-/sdcard/android/layout_tests/fast/overflow/hidden-scrollbar-resize.html
-/sdcard/android/layout_tests/fast/events/context-no-deselect.html
-/sdcard/android/layout_tests/fast/events/autoscroll.html
-/sdcard/android/layout_tests/fast/events/5056619.html
-/sdcard/android/layout_tests/fast/events/updateLayoutForHitTest.html
-/sdcard/android/layout_tests/fast/events/label-focus.html
-/sdcard/android/layout_tests/fast/events/keydown-1.html
-/sdcard/android/layout_tests/fast/events/onloadFrameCrash.html
-/sdcard/android/layout_tests/fast/events/event-listener-on-link.html
-/sdcard/android/layout_tests/fast/events/onload-re-entry.html
-/sdcard/android/layout_tests/fast/events/standalone-image-drag-to-editable.html
-/sdcard/android/layout_tests/fast/events/focusingUnloadedFrame.html
-/sdcard/android/layout_tests/fast/events/event-sender-mouse-moved.html
-/sdcard/android/layout_tests/fast/events/reveal-link-when-focused.html
-/sdcard/android/layout_tests/fast/events/mouseout-dead-node.html
-/sdcard/android/layout_tests/fast/html/keygen.html
-/sdcard/android/layout_tests/fast/html/marquee-scroll.html
-/sdcard/android/layout_tests/fast/html/link-rel-stylesheet.html
-/sdcard/android/layout_tests/fast/html/listing.html
-/sdcard/android/layout_tests/fast/images/svg-as-background.html
-/sdcard/android/layout_tests/fast/images/pdf-as-image-landscape.html
-/sdcard/android/layout_tests/fast/images/pdf-as-tiled-background.html
-/sdcard/android/layout_tests/fast/images/pdf-as-image.html
-/sdcard/android/layout_tests/fast/images/image-map-anchor-children.html
-/sdcard/android/layout_tests/fast/images/animated-gif-with-offsets.html
-/sdcard/android/layout_tests/fast/images/favicon-as-image.html
-/sdcard/android/layout_tests/fast/images/svg-width-100p-as-background.html
-/sdcard/android/layout_tests/fast/images/svg-as-tiled-background.html
-/sdcard/android/layout_tests/fast/images/svg-as-image.html
-/sdcard/android/layout_tests/fast/images/object-image.html
-/sdcard/android/layout_tests/fast/images/pdf-as-background.html
-/sdcard/android/layout_tests/fast/images/imagemap-case.html
-/sdcard/android/layout_tests/fast/images/svg-as-relative-image.html
-/sdcard/android/layout_tests/fast/images/embed-image.html
-/sdcard/android/layout_tests/fast/images/animated-svg-as-image.html
-/sdcard/android/layout_tests/fast/images/image-in-map.html
-/sdcard/android/layout_tests/fast/images/icon-decoding.html
-/sdcard/android/layout_tests/fast/inline-block/14498-positionForCoordinates.html
-/sdcard/android/layout_tests/fast/inline-block/001.html
-/sdcard/android/layout_tests/fast/inline-block/002.html
-/sdcard/android/layout_tests/fast/inline-block/003.html
-/sdcard/android/layout_tests/fast/inline-block/004.html
-/sdcard/android/layout_tests/fast/inline-block/005.html
-/sdcard/android/layout_tests/fast/inline-block/contenteditable-baseline.html
-/sdcard/android/layout_tests/fast/inline-block/006.html
-/sdcard/android/layout_tests/fast/inline-block/inline-block-vertical-align.html
-/sdcard/android/layout_tests/fast/inline-block/tricky-baseline.html
-/sdcard/android/layout_tests/fast/inline-block/overflow-clip.html
-/sdcard/android/layout_tests/fast/inspector/matchedrules.html
-/sdcard/android/layout_tests/fast/inspector/style.html
-/sdcard/android/layout_tests/fast/flexbox/010.html
-/sdcard/android/layout_tests/fast/flexbox/020.html
-/sdcard/android/layout_tests/fast/flexbox/002.html
-/sdcard/android/layout_tests/fast/flexbox/012.html
-/sdcard/android/layout_tests/fast/flexbox/022.html
-/sdcard/android/layout_tests/fast/flexbox/004.html
-/sdcard/android/layout_tests/fast/flexbox/014.html
-/sdcard/android/layout_tests/fast/flexbox/024.html
-/sdcard/android/layout_tests/fast/flexbox/006.html
-/sdcard/android/layout_tests/fast/flexbox/016.html
-/sdcard/android/layout_tests/fast/flexbox/026.html
-/sdcard/android/layout_tests/fast/flexbox/008.html
-/sdcard/android/layout_tests/fast/flexbox/018.html
-/sdcard/android/layout_tests/fast/flexbox/001.html
-/sdcard/android/layout_tests/fast/flexbox/011.html
-/sdcard/android/layout_tests/fast/flexbox/003.html
-/sdcard/android/layout_tests/fast/flexbox/021.html
-/sdcard/android/layout_tests/fast/flexbox/013.html
-/sdcard/android/layout_tests/fast/flexbox/005.html
-/sdcard/android/layout_tests/fast/flexbox/023.html
-/sdcard/android/layout_tests/fast/flexbox/015.html
-/sdcard/android/layout_tests/fast/flexbox/007.html
-/sdcard/android/layout_tests/fast/flexbox/025.html
-/sdcard/android/layout_tests/fast/flexbox/017.html
-/sdcard/android/layout_tests/fast/flexbox/009.html
-/sdcard/android/layout_tests/fast/flexbox/019.html
-/sdcard/android/layout_tests/fast/flexbox/flex-hang.html
-/sdcard/android/layout_tests/fast/tokenizer/missing-style-end-tag-1.html
-/sdcard/android/layout_tests/fast/tokenizer/002.html
-/sdcard/android/layout_tests/fast/tokenizer/missing-title-end-tag-2.html
-/sdcard/android/layout_tests/fast/tokenizer/script-after-frameset.html
-/sdcard/android/layout_tests/fast/tokenizer/missing-style-end-tag-2.html
-/sdcard/android/layout_tests/fast/tokenizer/external-script-document-write.html
-/sdcard/android/layout_tests/fast/tokenizer/script_extra_close.html
-/sdcard/android/layout_tests/fast/tokenizer/001.html
-/sdcard/android/layout_tests/fast/tokenizer/003.html
-/sdcard/android/layout_tests/fast/tokenizer/missing-title-end-tag-1.html
-/sdcard/android/layout_tests/fast/tokenizer/external-script-document-write_2.html
-/sdcard/android/layout_tests/fast/box-shadow/transform-fringing.html
-/sdcard/android/layout_tests/fast/box-shadow/spread.html
-/sdcard/android/layout_tests/fast/box-shadow/border-radius-big.html
-/sdcard/android/layout_tests/fast/box-shadow/inset.html
-/sdcard/android/layout_tests/fast/box-shadow/basic-shadows.html
-/sdcard/android/layout_tests/fast/js/exception-linenums-in-html-3.html
-/sdcard/android/layout_tests/fast/js/missing-style-end-tag-js.html
-/sdcard/android/layout_tests/fast/inline/continuation-outlines-with-layers.html
-/sdcard/android/layout_tests/fast/inline/inline-padding-disables-text-quirk.html
-/sdcard/android/layout_tests/fast/inline/emptyInlinesWithinLists.html
-/sdcard/android/layout_tests/fast/inline/drawStyledEmptyInlines.html
-/sdcard/android/layout_tests/fast/inline/long-wrapped-line.html
-/sdcard/android/layout_tests/fast/inline/inline-continuation-borders.html
-/sdcard/android/layout_tests/fast/inline/vertical-align-text-bottom.html
-/sdcard/android/layout_tests/fast/inline/25277-2.html
-/sdcard/android/layout_tests/fast/inline/25277.html
-/sdcard/android/layout_tests/fast/inline/drawStyledEmptyInlinesWithWS.html
-/sdcard/android/layout_tests/fast/inline/positionedLifetime.html
-/sdcard/android/layout_tests/fast/inline/dirtyLinesForInline.html
-/sdcard/android/layout_tests/fast/inline/001.html
-/sdcard/android/layout_tests/fast/inline/002.html
-/sdcard/android/layout_tests/fast/inline/inline-text-quirk-bpm.html
-/sdcard/android/layout_tests/fast/inline/inline-borders-with-bidi-override.html
-/sdcard/android/layout_tests/fast/inline/styledEmptyInlinesWithBRs.html
-/sdcard/android/layout_tests/fast/inline/continuation-outlines.html
-/sdcard/android/layout_tests/fast/inline/br-text-decoration.html
-/sdcard/android/layout_tests/fast/inline/outline-continuations.html
-/sdcard/android/layout_tests/fast/inline/percentage-margins.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/010.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/001.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/002.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/003.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/004.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/005.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/006.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/007.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/008.html
-/sdcard/android/layout_tests/fast/body-propagation/background-image/009.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/001.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/002.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/003.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/004.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/005.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/006.html
-/sdcard/android/layout_tests/fast/body-propagation/overflow/007.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/001.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/002.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/003.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/004.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/005.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/006.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/007.html
-/sdcard/android/layout_tests/fast/body-propagation/background-color/008.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/colSpan.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/createCaption.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/frameless-location-bugzilla10837.html
-/sdcard/android/layout_tests/fast/dom/Element/null-offset-parent.html
-/sdcard/android/layout_tests/fast/dom/Element/class-attribute-whitespace.html
-/sdcard/android/layout_tests/fast/dom/HTMLLinkElement/pending-stylesheet-count.html
-/sdcard/android/layout_tests/fast/dom/HTMLStyleElement/insert-parser-generated.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableColElement/resize-table-using-col-width.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/input-image-alt-text.html
-/sdcard/android/layout_tests/fast/dom/Window/open-existing-pop-up-blocking.html
-/sdcard/android/layout_tests/fast/dom/Window/btoa-pnglet.html
-/sdcard/android/layout_tests/fast/dom/HTMLObjectElement/vspace-hspace-as-number.html
-/sdcard/android/layout_tests/fast/dom/HTMLElement/bdo.html
-/sdcard/android/layout_tests/fast/dom/Range/surroundContents-1.html
-/sdcard/android/layout_tests/fast/dom/Range/create-contextual-fragment.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead1.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead2.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead3.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead4.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/textInHead5.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/head-link-style-href-check.html
-/sdcard/android/layout_tests/fast/dom/HTMLTextAreaElement/reset-textarea.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-alt-text.html
-/sdcard/android/layout_tests/fast/dom/dom-parse-serialize.html
-/sdcard/android/layout_tests/fast/dom/focus-contenteditable.html
-/sdcard/android/layout_tests/fast/dom/jsDevicePixelRatio.html
-/sdcard/android/layout_tests/fast/dom/isindex-001.html
-/sdcard/android/layout_tests/fast/dom/css-cached-import-rule.html
-/sdcard/android/layout_tests/fast/dom/dom-parse-serialize-display.html
-/sdcard/android/layout_tests/fast/dom/css-rule-functions.html
-/sdcard/android/layout_tests/fast/dom/createDocumentType.html
-/sdcard/android/layout_tests/fast/dom/clientWidthAfterDocumentIsRemoved.html
-/sdcard/android/layout_tests/fast/dom/css-inline-style-important.html
-/sdcard/android/layout_tests/fast/dom/replaceChild.html
-/sdcard/android/layout_tests/fast/dom/anchor-text.html
-/sdcard/android/layout_tests/fast/dom/importNodeHTML.html
-/sdcard/android/layout_tests/fast/dom/gc-10.html
-/sdcard/android/layout_tests/fast/dom/inner-text.html
-/sdcard/android/layout_tests/fast/dom/isindex-002.html
-/sdcard/android/layout_tests/fast/dom/outerText.html
-/sdcard/android/layout_tests/fast/dom/row-inner-text.html
-/sdcard/android/layout_tests/fast/dom/blur-contenteditable.html
-/sdcard/android/layout_tests/fast/dom/setPrimitiveValue.html
-/sdcard/android/layout_tests/fast/dom/delete-contents.html
-/sdcard/android/layout_tests/fast/dom/children-nodes.html
-/sdcard/android/layout_tests/fast/dom/css-mediarule-deleteRule-update.html
-/sdcard/android/layout_tests/fast/dom/attr_dead_doc.html
-/sdcard/android/layout_tests/fast/dom/clone-contents-0-end-offset.html
-/sdcard/android/layout_tests/fast/dom/comment-not-documentElement.html
-/sdcard/android/layout_tests/fast/dom/clone-node-dynamic-style.html
-/sdcard/android/layout_tests/fast/dom/css-mediarule-insertRule-update.html
-/sdcard/android/layout_tests/fast/dom/css-insert-import-rule.html
-/sdcard/android/layout_tests/fast/dom/stripNullFromTextNodes.html
-/sdcard/android/layout_tests/fast/gradients/crash-on-zero-radius.html
-/sdcard/android/layout_tests/fast/gradients/generated-gradients.html
-/sdcard/android/layout_tests/fast/gradients/background-clipped.html
-/sdcard/android/layout_tests/fast/gradients/list-item-gradient.html
-/sdcard/android/layout_tests/fast/gradients/border-image-gradient-sides-and-corners.html
-/sdcard/android/layout_tests/fast/gradients/simple-gradients.html
-/sdcard/android/layout_tests/fast/gradients/border-image-gradient.html
-/sdcard/android/layout_tests/fast/invalid/table-inside-stray-table-content.html
-/sdcard/android/layout_tests/fast/invalid/010.html
-/sdcard/android/layout_tests/fast/invalid/002.html
-/sdcard/android/layout_tests/fast/invalid/012.html
-/sdcard/android/layout_tests/fast/invalid/004.html
-/sdcard/android/layout_tests/fast/invalid/014.html
-/sdcard/android/layout_tests/fast/invalid/006.html
-/sdcard/android/layout_tests/fast/invalid/016.html
-/sdcard/android/layout_tests/fast/invalid/008.html
-/sdcard/android/layout_tests/fast/invalid/018.html
-/sdcard/android/layout_tests/fast/invalid/junk-data.xml
-/sdcard/android/layout_tests/fast/invalid/missing-dl-end-tag.html
-/sdcard/android/layout_tests/fast/invalid/td-inside-object.html
-/sdcard/android/layout_tests/fast/invalid/table-residual-style-crash.html
-/sdcard/android/layout_tests/fast/invalid/missing-font-end-tag.html
-/sdcard/android/layout_tests/fast/invalid/missing-dt-end-tag.html
-/sdcard/android/layout_tests/fast/invalid/020.xml
-/sdcard/android/layout_tests/fast/invalid/001.html
-/sdcard/android/layout_tests/fast/invalid/nestedh3s.html
-/sdcard/android/layout_tests/fast/invalid/011.html
-/sdcard/android/layout_tests/fast/invalid/003.html
-/sdcard/android/layout_tests/fast/invalid/021.html
-/sdcard/android/layout_tests/fast/invalid/013.html
-/sdcard/android/layout_tests/fast/invalid/005.html
-/sdcard/android/layout_tests/fast/invalid/015.html
-/sdcard/android/layout_tests/fast/invalid/007.html
-/sdcard/android/layout_tests/fast/invalid/residual-style.html
-/sdcard/android/layout_tests/fast/invalid/017.html
-/sdcard/android/layout_tests/fast/invalid/009.html
-/sdcard/android/layout_tests/fast/invalid/missing-address-end-tag.html
-/sdcard/android/layout_tests/fast/invalid/019.html
-/sdcard/android/layout_tests/fast/forms/input-width.html
-/sdcard/android/layout_tests/fast/forms/select-item-background-clip.html
-/sdcard/android/layout_tests/fast/forms/radio-nested-labels.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-preventDefault.html
-/sdcard/android/layout_tests/fast/forms/input-double-click-selection-gap-bug.html
-/sdcard/android/layout_tests/fast/forms/preserveFormDuringResidualStyle.html
-/sdcard/android/layout_tests/fast/forms/input-text-option-delete.html
-/sdcard/android/layout_tests/fast/forms/textfield-overflow.html
-/sdcard/android/layout_tests/fast/forms/search-zoomed.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label02.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-visibility.html
-/sdcard/android/layout_tests/fast/forms/search-vertical-alignment.html
-/sdcard/android/layout_tests/fast/forms/file-input-direction.html
-/sdcard/android/layout_tests/fast/forms/select-change-listbox-size.html
-/sdcard/android/layout_tests/fast/forms/002.html
-/sdcard/android/layout_tests/fast/forms/textarea-align.html
-/sdcard/android/layout_tests/fast/forms/control-restrict-line-height.html
-/sdcard/android/layout_tests/fast/forms/basic-textareas.html
-/sdcard/android/layout_tests/fast/forms/button-generated-content.html
-/sdcard/android/layout_tests/fast/forms/input-text-paste-maxlength.html
-/sdcard/android/layout_tests/fast/forms/select-display-none-style-resolve.html
-/sdcard/android/layout_tests/fast/forms/input-readonly-autoscroll.html
-/sdcard/android/layout_tests/fast/forms/thumbslider-no-parent-slider.html
-/sdcard/android/layout_tests/fast/forms/listbox-clip.html
-/sdcard/android/layout_tests/fast/forms/textarea-setinnerhtml.html
-/sdcard/android/layout_tests/fast/forms/input-align.html
-/sdcard/android/layout_tests/fast/forms/button-cannot-be-nested.html
-/sdcard/android/layout_tests/fast/forms/input-type-change.html
-/sdcard/android/layout_tests/fast/forms/menulist-option-wrap.html
-/sdcard/android/layout_tests/fast/forms/select-empty-option-height.html
-/sdcard/android/layout_tests/fast/forms/float-before-fieldset.html
-/sdcard/android/layout_tests/fast/forms/radio_checked.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-focus.html
-/sdcard/android/layout_tests/fast/forms/input-value.html
-/sdcard/android/layout_tests/fast/forms/select-selected.html
-/sdcard/android/layout_tests/fast/forms/control-clip-overflow.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-default-bkcolor.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label03.html
-/sdcard/android/layout_tests/fast/forms/button-default-title.html
-/sdcard/android/layout_tests/fast/forms/hidden-listbox.html
-/sdcard/android/layout_tests/fast/forms/input-baseline.html
-/sdcard/android/layout_tests/fast/forms/targeted-frame-submission.html
-/sdcard/android/layout_tests/fast/forms/003.html
-/sdcard/android/layout_tests/fast/forms/text-control-intrinsic-widths.html
-/sdcard/android/layout_tests/fast/forms/select-change-listbox-to-popup.html
-/sdcard/android/layout_tests/fast/forms/radio_checked_dynamic.html
-/sdcard/android/layout_tests/fast/forms/text-style-color.html
-/sdcard/android/layout_tests/fast/forms/button-sizes.html
-/sdcard/android/layout_tests/fast/forms/listbox-scrollbar-incremental-load.html
-/sdcard/android/layout_tests/fast/forms/password-placeholder.html
-/sdcard/android/layout_tests/fast/forms/button-style-color.html
-/sdcard/android/layout_tests/fast/forms/caret-rtl.html
-/sdcard/android/layout_tests/fast/forms/listbox-deselect-scroll.html
-/sdcard/android/layout_tests/fast/forms/select-initial-position.html
-/sdcard/android/layout_tests/fast/forms/placeholder-set-attribute.html
-/sdcard/android/layout_tests/fast/forms/radio-attr-order.html
-/sdcard/android/layout_tests/fast/forms/input-disabled-color.html
-/sdcard/android/layout_tests/fast/forms/fieldset-align.html
-/sdcard/android/layout_tests/fast/forms/select-baseline.html
-/sdcard/android/layout_tests/fast/forms/stuff-on-my-optgroup.html
-/sdcard/android/layout_tests/fast/forms/input-align-image.html
-/sdcard/android/layout_tests/fast/forms/option-index.html
-/sdcard/android/layout_tests/fast/forms/menulist-clip.html
-/sdcard/android/layout_tests/fast/forms/search-display-none-cancel-button.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label04.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-disabled.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-height.html
-/sdcard/android/layout_tests/fast/forms/004.html
-/sdcard/android/layout_tests/fast/forms/search-placeholder-value-changed.html
-/sdcard/android/layout_tests/fast/forms/input-field-text-truncated.html
-/sdcard/android/layout_tests/fast/forms/input-type-text-min-width.html
-/sdcard/android/layout_tests/fast/forms/slider-thumb-shared-style.html
-/sdcard/android/layout_tests/fast/forms/option-script.html
-/sdcard/android/layout_tests/fast/forms/input-paste-undo.html
-/sdcard/android/layout_tests/fast/forms/button-white-space.html
-/sdcard/android/layout_tests/fast/forms/slider-padding.html
-/sdcard/android/layout_tests/fast/forms/button-submit.html
-/sdcard/android/layout_tests/fast/forms/input-text-double-click.html
-/sdcard/android/layout_tests/fast/forms/form-hides-table.html
-/sdcard/android/layout_tests/fast/forms/listbox-width-change.html
-/sdcard/android/layout_tests/fast/forms/button-positioned.html
-/sdcard/android/layout_tests/fast/forms/control-clip.html
-/sdcard/android/layout_tests/fast/forms/listbox-hit-test-zoomed.html
-/sdcard/android/layout_tests/fast/forms/thumbslider-crash.html
-/sdcard/android/layout_tests/fast/forms/input-first-letter.html
-/sdcard/android/layout_tests/fast/forms/search-rtl.html
-/sdcard/android/layout_tests/fast/forms/isindex-placeholder.html
-/sdcard/android/layout_tests/fast/forms/plaintext-mode-2.html
-/sdcard/android/layout_tests/fast/forms/select-change-popup-to-listbox.html
-/sdcard/android/layout_tests/fast/forms/blankbuttons.html
-/sdcard/android/layout_tests/fast/forms/input-text-maxlength.html
-/sdcard/android/layout_tests/fast/forms/password-placeholder-text-security.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label05.html
-/sdcard/android/layout_tests/fast/forms/visual-hebrew-text-field.html
-/sdcard/android/layout_tests/fast/forms/005.html
-/sdcard/android/layout_tests/fast/forms/search-styled.html
-/sdcard/android/layout_tests/fast/forms/file-input-disabled.html
-/sdcard/android/layout_tests/fast/forms/select-disabled-appearance.html
-/sdcard/android/layout_tests/fast/forms/input-type-change2.html
-/sdcard/android/layout_tests/fast/forms/select-block-background.html
-/sdcard/android/layout_tests/fast/forms/select-dirty-parent-pref-widths.html
-/sdcard/android/layout_tests/fast/forms/range-thumb-height-percentage.html
-/sdcard/android/layout_tests/fast/forms/select-visual-hebrew.html
-/sdcard/android/layout_tests/fast/forms/textAreaLineHeight.html
-/sdcard/android/layout_tests/fast/forms/option-text-clip.html
-/sdcard/android/layout_tests/fast/forms/formmove.html
-/sdcard/android/layout_tests/fast/forms/textfield-outline.html
-/sdcard/android/layout_tests/fast/forms/button-text-transform.html
-/sdcard/android/layout_tests/fast/forms/textarea-scroll-height.html
-/sdcard/android/layout_tests/fast/forms/button-table-styles.html
-/sdcard/android/layout_tests/fast/forms/box-shadow-override.html
-/sdcard/android/layout_tests/fast/forms/checkbox-radio-onchange.html
-/sdcard/android/layout_tests/fast/forms/searchfield-heights.html
-/sdcard/android/layout_tests/fast/forms/input-spaces.html
-/sdcard/android/layout_tests/fast/forms/textarea-scrollbar.html
-/sdcard/android/layout_tests/fast/forms/minWidthPercent.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label06.html
-/sdcard/android/layout_tests/fast/forms/placeholder-pseudo-style.html
-/sdcard/android/layout_tests/fast/forms/menulist-width-change.html
-/sdcard/android/layout_tests/fast/forms/input-text-drag-down.html
-/sdcard/android/layout_tests/fast/forms/option-strip-whitespace.html
-/sdcard/android/layout_tests/fast/forms/006.html
-/sdcard/android/layout_tests/fast/forms/input-no-renderer.html
-/sdcard/android/layout_tests/fast/forms/input-text-click-outside.html
-/sdcard/android/layout_tests/fast/forms/input-text-scroll-left-on-blur.html
-/sdcard/android/layout_tests/fast/forms/form-element-geometry.html
-/sdcard/android/layout_tests/fast/forms/input-table.html
-/sdcard/android/layout_tests/fast/forms/textarea-scrolled-type.html
-/sdcard/android/layout_tests/fast/forms/select-align.html
-/sdcard/android/layout_tests/fast/forms/select-writing-direction-natural.html
-/sdcard/android/layout_tests/fast/forms/search-cancel-button-style-sharing.html
-/sdcard/android/layout_tests/fast/forms/tabbing-input-iframe.html
-/sdcard/android/layout_tests/fast/forms/hidden-input-file.html
-/sdcard/android/layout_tests/fast/forms/menulist-deselect-update.html
-/sdcard/android/layout_tests/fast/forms/slider-thumb-stylability.html
-/sdcard/android/layout_tests/fast/forms/input-readonly-dimmed.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-width.html
-/sdcard/android/layout_tests/fast/forms/select-list-box-with-height.html
-/sdcard/android/layout_tests/fast/forms/textarea-rows-cols.html
-/sdcard/android/layout_tests/fast/forms/button-align.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-readonly.html
-/sdcard/android/layout_tests/fast/forms/form-added-to-table.html
-/sdcard/android/layout_tests/fast/forms/menulist-no-overflow.html
-/sdcard/android/layout_tests/fast/forms/formmove2.html
-/sdcard/android/layout_tests/fast/forms/input-text-word-wrap.html
-/sdcard/android/layout_tests/fast/forms/listbox-selection-2.html
-/sdcard/android/layout_tests/fast/forms/input-readonly-empty.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label07.html
-/sdcard/android/layout_tests/fast/forms/007.html
-/sdcard/android/layout_tests/fast/forms/indeterminate.html
-/sdcard/android/layout_tests/fast/forms/negativeLineHeight.html
-/sdcard/android/layout_tests/fast/forms/select-style.html
-/sdcard/android/layout_tests/fast/forms/select-size.html
-/sdcard/android/layout_tests/fast/forms/menulist-separator-painting.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_label01.html
-/sdcard/android/layout_tests/fast/forms/fieldset-with-float.html
-/sdcard/android/layout_tests/fast/forms/floating-textfield-relayout.html
-/sdcard/android/layout_tests/fast/forms/button-inner-block-reuse.html
-/sdcard/android/layout_tests/fast/forms/001.html
-/sdcard/android/layout_tests/fast/forms/input-text-click-inside.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-selection.html
-/sdcard/android/layout_tests/fast/forms/menulist-narrow-width.html
-/sdcard/android/layout_tests/fast/forms/linebox-overflow-in-textarea-padding.html
-/sdcard/android/layout_tests/fast/forms/menulist-restrict-line-height.html
-/sdcard/android/layout_tests/fast/forms/textarea-width.html
-/sdcard/android/layout_tests/fast/forms/disabled-select-change-index.html
-/sdcard/android/layout_tests/fast/forms/formmove3.html
-/sdcard/android/layout_tests/fast/forms/placeholder-set-value.html
-/sdcard/android/layout_tests/fast/forms/input-text-self-emptying-click.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-bkcolor.html
-/sdcard/android/layout_tests/fast/forms/search-transformed.html
-/sdcard/android/layout_tests/fast/forms/image-border.html
-/sdcard/android/layout_tests/fast/forms/encoding-test.html
-/sdcard/android/layout_tests/fast/forms/form-in-malformed-markup.html
-/sdcard/android/layout_tests/fast/forms/menulist-style-color.html
-/sdcard/android/layout_tests/fast/compact/001.html
-/sdcard/android/layout_tests/fast/compact/002.html
-/sdcard/android/layout_tests/fast/compact/003.html
-/sdcard/android/layout_tests/fast/clip/nestedTransparencyClip.html
-/sdcard/android/layout_tests/fast/clip/overflow-border-radius-clip.html
-/sdcard/android/layout_tests/fast/clip/outline-overflowClip.html
-/sdcard/android/layout_tests/fast/clip/001.html
-/sdcard/android/layout_tests/fast/clip/010.html
-/sdcard/android/layout_tests/fast/clip/002.html
-/sdcard/android/layout_tests/fast/clip/011.html
-/sdcard/android/layout_tests/fast/clip/003.html
-/sdcard/android/layout_tests/fast/clip/012.html
-/sdcard/android/layout_tests/fast/clip/004.html
-/sdcard/android/layout_tests/fast/clip/013.html
-/sdcard/android/layout_tests/fast/clip/005.html
-/sdcard/android/layout_tests/fast/clip/014.html
-/sdcard/android/layout_tests/fast/clip/006.html
-/sdcard/android/layout_tests/fast/clip/015.html
-/sdcard/android/layout_tests/fast/clip/016.html
-/sdcard/android/layout_tests/fast/clip/007.html
-/sdcard/android/layout_tests/fast/clip/008.html
-/sdcard/android/layout_tests/fast/clip/017.html
-/sdcard/android/layout_tests/fast/clip/009.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/001.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/002.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/003.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/004.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/equal-precedence-resolution.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/rtl-border-collapsing.html
-/sdcard/android/layout_tests/fast/table/border-collapsing/border-collapsing-head-foot.html
-/sdcard/android/layout_tests/fast/table/fixed-nested.html
-/sdcard/android/layout_tests/fast/table/frame-and-rules.html
-/sdcard/android/layout_tests/fast/table/empty-table-percent-height.html
-/sdcard/android/layout_tests/fast/table/100-percent-cell-width.html
-/sdcard/android/layout_tests/fast/table/stale-grid-crash.html
-/sdcard/android/layout_tests/fast/table/div-as-col-span.html
-/sdcard/android/layout_tests/fast/table/nobr.html
-/sdcard/android/layout_tests/fast/table/012.html
-/sdcard/android/layout_tests/fast/table/040.html
-/sdcard/android/layout_tests/fast/table/growCellForImageQuirk.html
-/sdcard/android/layout_tests/fast/table/024.html
-/sdcard/android/layout_tests/fast/table/cell-pref-width-invalidation.html
-/sdcard/android/layout_tests/fast/table/fixed-granular-cols.html
-/sdcard/android/layout_tests/fast/table/008.html
-/sdcard/android/layout_tests/fast/table/036.html
-/sdcard/android/layout_tests/fast/table/nested-percent-height-table.html
-/sdcard/android/layout_tests/fast/table/rules-attr-dynchange1.html
-/sdcard/android/layout_tests/fast/table/wide-column.html
-/sdcard/android/layout_tests/fast/table/fixed-with-auto-with-colspan.html
-/sdcard/android/layout_tests/fast/table/percent-heights.html
-/sdcard/android/layout_tests/fast/table/021.html
-/sdcard/android/layout_tests/fast/table/colspanMinWidth.html
-/sdcard/android/layout_tests/fast/table/005.html
-/sdcard/android/layout_tests/fast/table/033.html
-/sdcard/android/layout_tests/fast/table/floatingTablePaintBackground.html
-/sdcard/android/layout_tests/fast/table/017.html
-/sdcard/android/layout_tests/fast/table/029.html
-/sdcard/android/layout_tests/fast/table/cell-absolute-child.html
-/sdcard/android/layout_tests/fast/table/click-near-anonymous-table.html
-/sdcard/android/layout_tests/fast/table/auto-with-percent-height.html
-/sdcard/android/layout_tests/fast/table/insert-before-anonymous-ancestors.html
-/sdcard/android/layout_tests/fast/table/append-cells2.html
-/sdcard/android/layout_tests/fast/table/unused-percent-heights.html
-/sdcard/android/layout_tests/fast/table/max-width-integer-overflow.html
-/sdcard/android/layout_tests/fast/table/vertical-align-baseline-readjust.html
-/sdcard/android/layout_tests/fast/table/empty-row-crash.html
-/sdcard/android/layout_tests/fast/table/002.html
-/sdcard/android/layout_tests/fast/table/030.html
-/sdcard/android/layout_tests/fast/table/cell-width-auto.html
-/sdcard/android/layout_tests/fast/table/014.html
-/sdcard/android/layout_tests/fast/table/037.xml
-/sdcard/android/layout_tests/fast/table/large-width.html
-/sdcard/android/layout_tests/fast/table/026.html
-/sdcard/android/layout_tests/fast/table/unbreakable-images-quirk.html
-/sdcard/android/layout_tests/fast/table/038.html
-/sdcard/android/layout_tests/fast/table/dynamic-cellpadding.html
-/sdcard/android/layout_tests/fast/table/generated-caption.html
-/sdcard/android/layout_tests/fast/table/empty-cells.html
-/sdcard/android/layout_tests/fast/table/add-before-anonymous-child.html
-/sdcard/android/layout_tests/fast/table/011.html
-/sdcard/android/layout_tests/fast/table/table-display-types-strict.html
-/sdcard/android/layout_tests/fast/table/023.html
-/sdcard/android/layout_tests/fast/table/007.html
-/sdcard/android/layout_tests/fast/table/cellindex.html
-/sdcard/android/layout_tests/fast/table/035.html
-/sdcard/android/layout_tests/fast/table/colgroup-spanning-groups-rules.html
-/sdcard/android/layout_tests/fast/table/insert-row-before-form.html
-/sdcard/android/layout_tests/fast/table/rowspan-paint-order.html
-/sdcard/android/layout_tests/fast/table/rtl-cell-display-none-assert.html
-/sdcard/android/layout_tests/fast/table/insert-cell-before-form.html
-/sdcard/android/layout_tests/fast/table/replaced-percent-height.html
-/sdcard/android/layout_tests/fast/table/text-field-baseline.html
-/sdcard/android/layout_tests/fast/table/table-display-types.html
-/sdcard/android/layout_tests/fast/table/table-hspace-align-center.html
-/sdcard/android/layout_tests/fast/table/caption-relayout.html
-/sdcard/android/layout_tests/fast/table/020.html
-/sdcard/android/layout_tests/fast/table/fixed-table-non-cell-in-row.html
-/sdcard/android/layout_tests/fast/table/004.html
-/sdcard/android/layout_tests/fast/table/032.html
-/sdcard/android/layout_tests/fast/table/row-height-recalc.html
-/sdcard/android/layout_tests/fast/table/016.html
-/sdcard/android/layout_tests/fast/table/absolute-table-at-bottom.html
-/sdcard/android/layout_tests/fast/table/028.html
-/sdcard/android/layout_tests/fast/table/spanOverlapRepaint.html
-/sdcard/android/layout_tests/fast/table/invisible-cell-background.html
-/sdcard/android/layout_tests/fast/table/vertical-align-baseline.html
-/sdcard/android/layout_tests/fast/table/cell-coalescing.html
-/sdcard/android/layout_tests/fast/table/wide-colspan.html
-/sdcard/android/layout_tests/fast/table/rowindex.html
-/sdcard/android/layout_tests/fast/table/001.html
-/sdcard/android/layout_tests/fast/table/remove-td-display-none.html
-/sdcard/android/layout_tests/fast/table/013.html
-/sdcard/android/layout_tests/fast/table/041.html
-/sdcard/android/layout_tests/fast/table/colgroup-preceded-by-caption.html
-/sdcard/android/layout_tests/fast/table/025.html
-/sdcard/android/layout_tests/fast/table/giantCellspacing.html
-/sdcard/android/layout_tests/fast/table/009.html
-/sdcard/android/layout_tests/fast/table/edge-offsets.html
-/sdcard/android/layout_tests/fast/table/giantRowspan.html
-/sdcard/android/layout_tests/fast/table/inline-form-assert.html
-/sdcard/android/layout_tests/fast/table/overflowHidden.html
-/sdcard/android/layout_tests/fast/table/rules-attr-dynchange2.html
-/sdcard/android/layout_tests/fast/table/height-percent-test.html
-/sdcard/android/layout_tests/fast/table/multiple-percent-height-rows.html
-/sdcard/android/layout_tests/fast/table/giantRowspan2.html
-/sdcard/android/layout_tests/fast/table/010.html
-/sdcard/android/layout_tests/fast/table/tableInsideCaption.html
-/sdcard/android/layout_tests/fast/table/022.html
-/sdcard/android/layout_tests/fast/table/006.html
-/sdcard/android/layout_tests/fast/table/034.html
-/sdcard/android/layout_tests/fast/table/append-cells.html
-/sdcard/android/layout_tests/fast/table/018.html
-/sdcard/android/layout_tests/fast/table/percent-widths-stretch.html
-/sdcard/android/layout_tests/fast/table/prepend-in-anonymous-table.html
-/sdcard/android/layout_tests/fast/table/floating-th.html
-/sdcard/android/layout_tests/fast/table/empty-section-crash.html
-/sdcard/android/layout_tests/fast/table/form-with-table-style.html
-/sdcard/android/layout_tests/fast/table/003.html
-/sdcard/android/layout_tests/fast/table/031.html
-/sdcard/android/layout_tests/fast/table/015.html
-/sdcard/android/layout_tests/fast/table/027.html
-/sdcard/android/layout_tests/fast/table/039.html
-/sdcard/android/layout_tests/fast/css/counters/invalidate-cached-counter-node.html
-/sdcard/android/layout_tests/fast/css/counters/counter-text-security.html
-/sdcard/android/layout_tests/fast/css/counters/counter-text-transform.html
-/sdcard/android/layout_tests/fast/css/variables/multiple-term-test.html
-/sdcard/android/layout_tests/fast/css/variables/colors-test.html
-/sdcard/android/layout_tests/fast/css/variables/font-test.html
-/sdcard/android/layout_tests/fast/css/variables/multiple-blocks-test.html
-/sdcard/android/layout_tests/fast/css/variables/misplaced-variables-test.html
-/sdcard/android/layout_tests/fast/css/variables/invalid-variable-test.html
-/sdcard/android/layout_tests/fast/css/variables/misplaced-import-test.html
-/sdcard/android/layout_tests/fast/css/variables/import-test.html
-/sdcard/android/layout_tests/fast/css/variables/inline-style-test.html
-/sdcard/android/layout_tests/fast/css/variables/declaration-block-test.html
-/sdcard/android/layout_tests/fast/css/variables/margin-test.html
-/sdcard/android/layout_tests/fast/css/variables/set-variable-test.html
-/sdcard/android/layout_tests/fast/css/variables/override-test.html
-/sdcard/android/layout_tests/fast/css/variables/remove-variable-test.html
-/sdcard/android/layout_tests/fast/css/variables/variable-iteration-test.html
-/sdcard/android/layout_tests/fast/css/variables/image-test.html
-/sdcard/android/layout_tests/fast/css/variables/block-cycle-test.html
-/sdcard/android/layout_tests/fast/css/variables/shorthand-test.html
-/sdcard/android/layout_tests/fast/css/variables/print-test.html
-/sdcard/android/layout_tests/fast/css/namespaces/001.xml
-/sdcard/android/layout_tests/fast/css/namespaces/002.xml
-/sdcard/android/layout_tests/fast/css/namespaces/003.xml
-/sdcard/android/layout_tests/fast/css/namespaces/004.xml
-/sdcard/android/layout_tests/fast/css/namespaces/005.xml
-/sdcard/android/layout_tests/fast/css/namespaces/006.xml
-/sdcard/android/layout_tests/fast/css/namespaces/007.xml
-/sdcard/android/layout_tests/fast/css/font-face-in-media-rule.html
-/sdcard/android/layout_tests/fast/css/font-face-default-font.html
-/sdcard/android/layout_tests/fast/css/first-letter-float-after-float.html
-/sdcard/android/layout_tests/fast/css/invalidation-errors-2.html
-/sdcard/android/layout_tests/fast/css/line-height-negative.html
-/sdcard/android/layout_tests/fast/css/only-child-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/008.html
-/sdcard/android/layout_tests/fast/css/first-of-type-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/ZeroOpacityLayers2.html
-/sdcard/android/layout_tests/fast/css/target-fragment-match.html
-/sdcard/android/layout_tests/fast/css/attribute-selector-dynamic.xml
-/sdcard/android/layout_tests/fast/css/zoom-font-size.html
-/sdcard/android/layout_tests/fast/css/live-cssrules.html
-/sdcard/android/layout_tests/fast/css/005.html
-/sdcard/android/layout_tests/fast/css/first-letter-hover.html
-/sdcard/android/layout_tests/fast/css/clip-zooming.html
-/sdcard/android/layout_tests/fast/css/color-quirk.html
-/sdcard/android/layout_tests/fast/css/resize-corner-tracking-transformed.html
-/sdcard/android/layout_tests/fast/css/selector-set-attribute.html
-/sdcard/android/layout_tests/fast/css/attribute-selector-empty-value.html
-/sdcard/android/layout_tests/fast/css/line-height-overflow.html
-/sdcard/android/layout_tests/fast/css/002.html
-/sdcard/android/layout_tests/fast/css/empty-generated-content.html
-/sdcard/android/layout_tests/fast/css/border-radius-outline-offset.html
-/sdcard/android/layout_tests/fast/css/background-image-with-baseurl.html
-/sdcard/android/layout_tests/fast/css/hsla-color.html
-/sdcard/android/layout_tests/fast/css/first-letter-skip-out-of-flow.html
-/sdcard/android/layout_tests/fast/css/font-face-multiple-remote-sources.html
-/sdcard/android/layout_tests/fast/css/pseudo-cache-stale.html
-/sdcard/android/layout_tests/fast/css/hover-subselector.html
-/sdcard/android/layout_tests/fast/css/margin-bottom-form-element-strict.html
-/sdcard/android/layout_tests/fast/css/shadow-multiple.html
-/sdcard/android/layout_tests/fast/css/import_with_baseurl.html
-/sdcard/android/layout_tests/fast/css/list-outline.html
-/sdcard/android/layout_tests/fast/css/apple-prefix.html
-/sdcard/android/layout_tests/fast/css/line-height.html
-/sdcard/android/layout_tests/fast/css/first-letter-visibility.html
-/sdcard/android/layout_tests/fast/css/acid2.html
-/sdcard/android/layout_tests/fast/css/font_property_normal.html
-/sdcard/android/layout_tests/fast/css/css-imports.html
-/sdcard/android/layout_tests/fast/css/last-of-type-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/last-child-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/visibility-hit-test.html
-/sdcard/android/layout_tests/fast/css/absolute-poition-in-rtl-parent.html
-/sdcard/android/layout_tests/fast/css/content-dynamic.html
-/sdcard/android/layout_tests/fast/css/acid2-pixel.html
-/sdcard/android/layout_tests/fast/css/transition-color-unspecified.html
-/sdcard/android/layout_tests/fast/css/table-text-align-strict.html
-/sdcard/android/layout_tests/fast/css/transform-default-parameter.html
-/sdcard/android/layout_tests/fast/css/text-overflow-ellipsis-bidi.html
-/sdcard/android/layout_tests/fast/css/contentImage.html
-/sdcard/android/layout_tests/fast/css/value-list-out-of-bounds-crash.html
-/sdcard/android/layout_tests/fast/css/color-strict.html
-/sdcard/android/layout_tests/fast/css/ignore-text-zoom.html
-/sdcard/android/layout_tests/fast/css/max-height-none.html
-/sdcard/android/layout_tests/fast/css/invalidation-errors-3.html
-/sdcard/android/layout_tests/fast/css/empty-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/begin-end-contain-selector-empty-value.html
-/sdcard/android/layout_tests/fast/css/find-next-layer.html
-/sdcard/android/layout_tests/fast/css/text-overflow-ellipsis.html
-/sdcard/android/layout_tests/fast/css/contentDiv.html
-/sdcard/android/layout_tests/fast/css/invalid-pseudo-classes.html
-/sdcard/android/layout_tests/fast/css/disabled-author-styles.html
-/sdcard/android/layout_tests/fast/css/text-security.html
-/sdcard/android/layout_tests/fast/css/font-weight-1.html
-/sdcard/android/layout_tests/fast/css/nested-floating-relative-position-percentages.html
-/sdcard/android/layout_tests/fast/css/margin-bottom-form-element-quirk.html
-/sdcard/android/layout_tests/fast/css/font-shorthand-weight-only.html
-/sdcard/android/layout_tests/fast/css/006.html
-/sdcard/android/layout_tests/fast/css/fieldset-display-row.html
-/sdcard/android/layout_tests/fast/css/border-height.html
-/sdcard/android/layout_tests/fast/css/css2-system-fonts.html
-/sdcard/android/layout_tests/fast/css/imageTileOpacity.html
-/sdcard/android/layout_tests/fast/css/font-face-remote.html
-/sdcard/android/layout_tests/fast/css/003.html
-/sdcard/android/layout_tests/fast/css/error-in-last-decl.html
-/sdcard/android/layout_tests/fast/css/zoom-property-parsing.html
-/sdcard/android/layout_tests/fast/css/style-outside-head.html
-/sdcard/android/layout_tests/fast/css/positioned-overflow-scroll.html
-/sdcard/android/layout_tests/fast/css/first-letter-capitalized.html
-/sdcard/android/layout_tests/fast/css/font-face-locally-installed.html
-/sdcard/android/layout_tests/fast/css/word-space-extra.html
-/sdcard/android/layout_tests/fast/css/first-letter-float.html
-/sdcard/android/layout_tests/fast/css/simple-selector-chain-parsing.html
-/sdcard/android/layout_tests/fast/css/xml-stylesheet-pi-not-in-prolog.xml
-/sdcard/android/layout_tests/fast/css/continuationCrash.html
-/sdcard/android/layout_tests/fast/css/vertical-align-lengths.html
-/sdcard/android/layout_tests/fast/css/first-child-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/percent-top-value-with-relative-position.html
-/sdcard/android/layout_tests/fast/css/beforeSelectorOnCodeElement.html
-/sdcard/android/layout_tests/fast/css/getFloatValueForUnit.html
-/sdcard/android/layout_tests/fast/css/first-letter-detach.html
-/sdcard/android/layout_tests/fast/css/line-height-font-order.html
-/sdcard/android/layout_tests/fast/css/text-overflow-ellipsis-strict.html
-/sdcard/android/layout_tests/fast/css/font-face-unicode-range.html
-/sdcard/android/layout_tests/fast/css/layerZOrderCrash.html
-/sdcard/android/layout_tests/fast/css/compare-content-style.html
-/sdcard/android/layout_tests/fast/css/import-rule-regression-11590.html
-/sdcard/android/layout_tests/fast/css/last-child-style-sharing.html
-/sdcard/android/layout_tests/fast/css/css3-modsel-22.html
-/sdcard/android/layout_tests/fast/css/ex-after-font-variant.html
-/sdcard/android/layout_tests/fast/css/quirk-orphaned-units.html
-/sdcard/android/layout_tests/fast/css/outline-auto-location.html
-/sdcard/android/layout_tests/fast/css/margin-top-bottom-dynamic.html
-/sdcard/android/layout_tests/fast/css/font-face-descriptor-multiple-values.html
-/sdcard/android/layout_tests/fast/css/empty-body-test.html
-/sdcard/android/layout_tests/fast/css/007.html
-/sdcard/android/layout_tests/fast/css/link-outside-head.html
-/sdcard/android/layout_tests/fast/css/font-size-negative.html
-/sdcard/android/layout_tests/fast/css/rem-units-on-root.html
-/sdcard/android/layout_tests/fast/css/position-negative-top-margin.html
-/sdcard/android/layout_tests/fast/css/ZeroOpacityLayers.html
-/sdcard/android/layout_tests/fast/css/only-of-type-pseudo-class.html
-/sdcard/android/layout_tests/fast/css/004.html
-/sdcard/android/layout_tests/fast/css/rtl-ordering.html
-/sdcard/android/layout_tests/fast/css/affected-by-hover-after-style-change.html
-/sdcard/android/layout_tests/fast/css/resize-corner-tracking.html
-/sdcard/android/layout_tests/fast/css/invalidation-errors.html
-/sdcard/android/layout_tests/fast/css/background-shorthand-invalid-url.html
-/sdcard/android/layout_tests/fast/css/MarqueeLayoutTest.html
-/sdcard/android/layout_tests/fast/css/textCapitalizeEdgeCases.html
-/sdcard/android/layout_tests/fast/css/001.html
-/sdcard/android/layout_tests/fast/css/hsl-color.html
-/sdcard/android/layout_tests/fast/css/font-face-implicit-local-font.html
-/sdcard/android/layout_tests/fast/css/first-letter-recalculation.html
-/sdcard/android/layout_tests/fast/css/rem-dynamic-scaling.html
-/sdcard/android/layout_tests/fast/css/inline-properties-important.html
-/sdcard/android/layout_tests/fast/css/dynamic-sibling-selector.html
-/sdcard/android/layout_tests/fast/css/table-text-align-quirk.html
-/sdcard/android/layout_tests/fast/css/nth-child-dynamic.html
-/sdcard/android/layout_tests/fast/css/outline-auto-empty-rects.html
-/sdcard/android/layout_tests/fast/css/font-face-multiple-faces.html
-/sdcard/android/layout_tests/fast/css/rgb-float.html
-/sdcard/android/layout_tests/fast/css/pendingStylesheetFontSize.html
-/sdcard/android/layout_tests/fast/css/contentDivWithChildren.html
-/sdcard/android/layout_tests/fast/css/universal-hover-quirk.html
-/sdcard/android/layout_tests/fast/css/css3-nth-child.html
-/sdcard/android/layout_tests/fast/css/style-parsed-outside-head.html
-/sdcard/android/layout_tests/fast/css/percentage-non-integer.html
-/sdcard/android/layout_tests/fast/css/nested-layers-with-hover.html
-/sdcard/android/layout_tests/fast/css/negative-nth-child.html
-/sdcard/android/layout_tests/fast/box-sizing/panels-one.html
-/sdcard/android/layout_tests/fast/box-sizing/percentage-height.html
-/sdcard/android/layout_tests/fast/box-sizing/box-sizing.html
-/sdcard/android/layout_tests/fast/box-sizing/panels-two.html
-/sdcard/android/layout_tests/fast/block/basic/minheight.html
-/sdcard/android/layout_tests/fast/block/basic/min-pref-width-nowrap-floats.html
-/sdcard/android/layout_tests/fast/block/basic/fieldset-stretch-to-legend.html
-/sdcard/android/layout_tests/fast/block/basic/white-space-pre-wraps.html
-/sdcard/android/layout_tests/fast/block/basic/adding-near-anonymous-block.html
-/sdcard/android/layout_tests/fast/block/basic/quirk-percent-height-grandchild.html
-/sdcard/android/layout_tests/fast/block/basic/001.html
-/sdcard/android/layout_tests/fast/block/basic/010.html
-/sdcard/android/layout_tests/fast/block/basic/quirk-height.html
-/sdcard/android/layout_tests/fast/block/basic/020.html
-/sdcard/android/layout_tests/fast/block/basic/002.html
-/sdcard/android/layout_tests/fast/block/basic/011.html
-/sdcard/android/layout_tests/fast/block/basic/text-indent-rtl.html
-/sdcard/android/layout_tests/fast/block/basic/021.html
-/sdcard/android/layout_tests/fast/block/basic/003.html
-/sdcard/android/layout_tests/fast/block/basic/012.html
-/sdcard/android/layout_tests/fast/block/basic/013.html
-/sdcard/android/layout_tests/fast/block/basic/004.html
-/sdcard/android/layout_tests/fast/block/basic/014.html
-/sdcard/android/layout_tests/fast/block/basic/005.html
-/sdcard/android/layout_tests/fast/block/basic/015.html
-/sdcard/android/layout_tests/fast/block/basic/006.html
-/sdcard/android/layout_tests/fast/block/basic/016.html
-/sdcard/android/layout_tests/fast/block/basic/007.html
-/sdcard/android/layout_tests/fast/block/basic/008.html
-/sdcard/android/layout_tests/fast/block/basic/009.html
-/sdcard/android/layout_tests/fast/block/basic/018.html
-/sdcard/android/layout_tests/fast/block/basic/019.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/001.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/002.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/003.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/004.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/005.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/006.html
-/sdcard/android/layout_tests/fast/block/positioning/auto/007.html
-/sdcard/android/layout_tests/fast/block/positioning/059.html
-/sdcard/android/layout_tests/fast/block/positioning/negative-rel-position.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-short-rtl.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-short-ltr.html
-/sdcard/android/layout_tests/fast/block/positioning/fixed-positioning-scrollbar-bug.html
-/sdcard/android/layout_tests/fast/block/positioning/relative-overflow-replaced-float.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-positioned-overconstrained.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-rtl-2.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-ltr-2.html
-/sdcard/android/layout_tests/fast/block/positioning/020.html
-/sdcard/android/layout_tests/fast/block/positioning/012.html
-/sdcard/android/layout_tests/fast/block/positioning/004.html
-/sdcard/android/layout_tests/fast/block/positioning/040.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-position-direction-strict.html
-/sdcard/android/layout_tests/fast/block/positioning/032.html
-/sdcard/android/layout_tests/fast/block/positioning/060.html
-/sdcard/android/layout_tests/fast/block/positioning/024.html
-/sdcard/android/layout_tests/fast/block/positioning/052.html
-/sdcard/android/layout_tests/fast/block/positioning/016.html
-/sdcard/android/layout_tests/fast/block/positioning/044.html
-/sdcard/android/layout_tests/fast/block/positioning/008.html
-/sdcard/android/layout_tests/fast/block/positioning/036.html
-/sdcard/android/layout_tests/fast/block/positioning/028.html
-/sdcard/android/layout_tests/fast/block/positioning/056.html
-/sdcard/android/layout_tests/fast/block/positioning/048.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-position-direction-quirk.html
-/sdcard/android/layout_tests/fast/block/positioning/replaced-inside-fixed-top-bottom.html
-/sdcard/android/layout_tests/fast/block/positioning/pref-width-change.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-ltr-3.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-ltr.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-rtl-3.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-rtl.html
-/sdcard/android/layout_tests/fast/block/positioning/001.html
-/sdcard/android/layout_tests/fast/block/positioning/021.html
-/sdcard/android/layout_tests/fast/block/positioning/013.html
-/sdcard/android/layout_tests/fast/block/positioning/relative-overflow-block.html
-/sdcard/android/layout_tests/fast/block/positioning/005.html
-/sdcard/android/layout_tests/fast/block/positioning/041.html
-/sdcard/android/layout_tests/fast/block/positioning/033.html
-/sdcard/android/layout_tests/fast/block/positioning/025.html
-/sdcard/android/layout_tests/fast/block/positioning/061.html
-/sdcard/android/layout_tests/fast/block/positioning/017.html
-/sdcard/android/layout_tests/fast/block/positioning/053.html
-/sdcard/android/layout_tests/fast/block/positioning/009.html
-/sdcard/android/layout_tests/fast/block/positioning/045.html
-/sdcard/android/layout_tests/fast/block/positioning/037.html
-/sdcard/android/layout_tests/fast/block/positioning/029.html
-/sdcard/android/layout_tests/fast/block/positioning/057.html
-/sdcard/android/layout_tests/fast/block/positioning/049.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-with-html-border-quirks.html
-/sdcard/android/layout_tests/fast/block/positioning/leftmargin-topmargin.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-length-of-neg-666666.html
-/sdcard/android/layout_tests/fast/block/positioning/complex-percentage-height.html
-/sdcard/android/layout_tests/fast/block/positioning/auto-height-with-top-and-bottom.html
-/sdcard/android/layout_tests/fast/block/positioning/010.html
-/sdcard/android/layout_tests/fast/block/positioning/002.html
-/sdcard/android/layout_tests/fast/block/positioning/030.html
-/sdcard/android/layout_tests/fast/block/positioning/relayout-on-position-change.html
-/sdcard/android/layout_tests/fast/block/positioning/022.html
-/sdcard/android/layout_tests/fast/block/positioning/padding-percent.html
-/sdcard/android/layout_tests/fast/block/positioning/014.html
-/sdcard/android/layout_tests/fast/block/positioning/050.html
-/sdcard/android/layout_tests/fast/block/positioning/042.html
-/sdcard/android/layout_tests/fast/block/positioning/006.html
-/sdcard/android/layout_tests/fast/block/positioning/034.html
-/sdcard/android/layout_tests/fast/block/positioning/offsetLeft-offsetTop-borders.html
-/sdcard/android/layout_tests/fast/block/positioning/062.html
-/sdcard/android/layout_tests/fast/block/positioning/026.html
-/sdcard/android/layout_tests/fast/block/positioning/054.html
-/sdcard/android/layout_tests/fast/block/positioning/018.html
-/sdcard/android/layout_tests/fast/block/positioning/046.html
-/sdcard/android/layout_tests/fast/block/positioning/abs-inside-inline-rel.html
-/sdcard/android/layout_tests/fast/block/positioning/038.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-with-html-border-strict.html
-/sdcard/android/layout_tests/fast/block/positioning/058.html
-/sdcard/android/layout_tests/fast/block/positioning/negative-right-pos.html
-/sdcard/android/layout_tests/fast/block/positioning/relative-overconstrained.html
-/sdcard/android/layout_tests/fast/block/positioning/child-of-absolute-with-auto-height.html
-/sdcard/android/layout_tests/fast/block/positioning/relative-overflow-replaced.html
-/sdcard/android/layout_tests/fast/block/positioning/height-change.html
-/sdcard/android/layout_tests/fast/block/positioning/window-height-change.html
-/sdcard/android/layout_tests/fast/block/positioning/011.html
-/sdcard/android/layout_tests/fast/block/positioning/003.html
-/sdcard/android/layout_tests/fast/block/positioning/move-with-auto-width.html
-/sdcard/android/layout_tests/fast/block/positioning/031.html
-/sdcard/android/layout_tests/fast/block/positioning/023.html
-/sdcard/android/layout_tests/fast/block/positioning/051.html
-/sdcard/android/layout_tests/fast/block/positioning/015.html
-/sdcard/android/layout_tests/fast/block/positioning/043.html
-/sdcard/android/layout_tests/fast/block/positioning/007.html
-/sdcard/android/layout_tests/fast/block/positioning/035.html
-/sdcard/android/layout_tests/fast/block/positioning/027.html
-/sdcard/android/layout_tests/fast/block/positioning/055.html
-/sdcard/android/layout_tests/fast/block/positioning/019.html
-/sdcard/android/layout_tests/fast/block/positioning/047.html
-/sdcard/android/layout_tests/fast/block/positioning/039.html
-/sdcard/android/layout_tests/fast/block/positioning/inline-block-relposition.html
-/sdcard/android/layout_tests/fast/block/float/vertical-move-relayout.html
-/sdcard/android/layout_tests/fast/block/float/overlapping-floats-with-overflow-hidden.html
-/sdcard/android/layout_tests/fast/block/float/tableshifting.html
-/sdcard/android/layout_tests/fast/block/float/table-relayout.html
-/sdcard/android/layout_tests/fast/block/float/nested-clearance.html
-/sdcard/android/layout_tests/fast/block/float/br-with-clear-2.html
-/sdcard/android/layout_tests/fast/block/float/020.html
-/sdcard/android/layout_tests/fast/block/float/012.html
-/sdcard/android/layout_tests/fast/block/float/004.html
-/sdcard/android/layout_tests/fast/block/float/032.html
-/sdcard/android/layout_tests/fast/block/float/024.html
-/sdcard/android/layout_tests/fast/block/float/016.html
-/sdcard/android/layout_tests/fast/block/float/008.html
-/sdcard/android/layout_tests/fast/block/float/028.html
-/sdcard/android/layout_tests/fast/block/float/shrink-to-fit-width.html
-/sdcard/android/layout_tests/fast/block/float/clamped-right-float.html
-/sdcard/android/layout_tests/fast/block/float/independent-align-positioning.html
-/sdcard/android/layout_tests/fast/block/float/float-on-zero-height-line.html
-/sdcard/android/layout_tests/fast/block/float/nowrap-clear-min-width.html
-/sdcard/android/layout_tests/fast/block/float/overhanging-after-height-decrease-offsets.html
-/sdcard/android/layout_tests/fast/block/float/001.html
-/sdcard/android/layout_tests/fast/block/float/021.html
-/sdcard/android/layout_tests/fast/block/float/013.html
-/sdcard/android/layout_tests/fast/block/float/nopaint-after-layer-destruction2.html
-/sdcard/android/layout_tests/fast/block/float/005.html
-/sdcard/android/layout_tests/fast/block/float/033.html
-/sdcard/android/layout_tests/fast/block/float/025.html
-/sdcard/android/layout_tests/fast/block/float/017.html
-/sdcard/android/layout_tests/fast/block/float/009.html
-/sdcard/android/layout_tests/fast/block/float/float-in-float-hit-testing.html
-/sdcard/android/layout_tests/fast/block/float/029.html
-/sdcard/android/layout_tests/fast/block/float/4145535Crash.html
-/sdcard/android/layout_tests/fast/block/float/editable-text-overlapping-float.html
-/sdcard/android/layout_tests/fast/block/float/nestedAnonymousBlocks.html
-/sdcard/android/layout_tests/fast/block/float/intruding-painted-twice.html
-/sdcard/android/layout_tests/fast/block/float/010.html
-/sdcard/android/layout_tests/fast/block/float/002.html
-/sdcard/android/layout_tests/fast/block/float/dynamic-unfloat-pref-width.html
-/sdcard/android/layout_tests/fast/block/float/marquee-shrink-to-avoid-floats.html
-/sdcard/android/layout_tests/fast/block/float/030.html
-/sdcard/android/layout_tests/fast/block/float/022.html
-/sdcard/android/layout_tests/fast/block/float/014.html
-/sdcard/android/layout_tests/fast/block/float/006.html
-/sdcard/android/layout_tests/fast/block/float/relative-painted-twice.html
-/sdcard/android/layout_tests/fast/block/float/034.html
-/sdcard/android/layout_tests/fast/block/float/026.html
-/sdcard/android/layout_tests/fast/block/float/018.html
-/sdcard/android/layout_tests/fast/block/float/width-update-after-clear.html
-/sdcard/android/layout_tests/fast/block/float/nopaint-after-layer-destruction.html
-/sdcard/android/layout_tests/fast/block/float/float-in-float-painting.html
-/sdcard/android/layout_tests/fast/block/float/overhanging-after-height-decrease.html
-/sdcard/android/layout_tests/fast/block/float/float-avoidance.html
-/sdcard/android/layout_tests/fast/block/float/narrow-after-wide.html
-/sdcard/android/layout_tests/fast/block/float/multiple-float-positioning.html
-/sdcard/android/layout_tests/fast/block/float/br-with-clear.html
-/sdcard/android/layout_tests/fast/block/float/011.html
-/sdcard/android/layout_tests/fast/block/float/negative-margin-clear.html
-/sdcard/android/layout_tests/fast/block/float/003.html
-/sdcard/android/layout_tests/fast/block/float/031.html
-/sdcard/android/layout_tests/fast/block/float/023.html
-/sdcard/android/layout_tests/fast/block/float/015.html
-/sdcard/android/layout_tests/fast/block/float/007.html
-/sdcard/android/layout_tests/fast/block/float/035.html
-/sdcard/android/layout_tests/fast/block/float/027.html
-/sdcard/android/layout_tests/fast/block/float/019.html
-/sdcard/android/layout_tests/fast/block/float/nestedAnonymousBlocks2.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/059.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/empty-clear-blocks.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/010.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/negative-margins.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/002.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/020.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/101.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/030.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/012.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/040.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/022.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/004.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/103.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/032.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/006.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/042.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/016.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/034.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/062.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/044.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/026.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/018.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/028.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/056.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/038.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/058.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/100.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/001.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/011.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/102.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/021.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/003.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/031.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/005.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/041.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/104.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/033.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/015.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/025.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/043.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/035.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/017.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/027.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/045.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/063.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/037.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/019.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/055.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/029.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/039.html
-/sdcard/android/layout_tests/fast/block/margin-collapse/057.html
-/sdcard/android/layout_tests/fast/runin/generated.html
-/sdcard/android/layout_tests/fast/runin/001.html
-/sdcard/android/layout_tests/fast/runin/002.html
-/sdcard/android/layout_tests/fast/parser/comments.html
-/sdcard/android/layout_tests/fast/parser/title-error-test.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-textarea.html
-/sdcard/android/layout_tests/fast/parser/parseCommentsInTitles.html
-/sdcard/android/layout_tests/fast/parser/open-comment-in-style.html
-/sdcard/android/layout_tests/fast/parser/document-write-option.html
-/sdcard/android/layout_tests/fast/parser/comment-in-textarea.html
-/sdcard/android/layout_tests/fast/parser/fonts.html
-/sdcard/android/layout_tests/fast/parser/comment-in-style.html
-/sdcard/android/layout_tests/fast/parser/comment-in-script.html
-/sdcard/android/layout_tests/fast/parser/broken-comments-vs-parsing-mode.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-style.html
-/sdcard/android/layout_tests/fast/parser/xhtml-alternate-entities.xml
-/sdcard/android/layout_tests/fast/parser/nofoo-tags-inside-paragraph.html
-/sdcard/android/layout_tests/fast/parser/bad-xml-slash.html
-/sdcard/android/layout_tests/fast/parser/001.html
-/sdcard/android/layout_tests/fast/parser/open-comment-in-textarea.html
-/sdcard/android/layout_tests/fast/parser/tabs-in-scripts.html
-/sdcard/android/layout_tests/fast/parser/remove-block-in-residual-style.html
-/sdcard/android/layout_tests/fast/parser/style-script-head-test.html
-/sdcard/android/layout_tests/fast/layers/zindex-ridonkulous.html
-/sdcard/android/layout_tests/fast/layers/self-painting-outline.html
-/sdcard/android/layout_tests/fast/layers/positioned-inside-root-with-margins.html
-/sdcard/android/layout_tests/fast/layers/video-layer.html
-/sdcard/android/layout_tests/fast/layers/inline-dirty-z-order-lists.html
-/sdcard/android/layout_tests/fast/layers/layer-visibility-sublayer.html
-/sdcard/android/layout_tests/fast/layers/opacity-outline.html
-/sdcard/android/layout_tests/fast/layers/add-layer-with-nested-stacking.html
-/sdcard/android/layout_tests/fast/layers/layer-content-visibility-change.html
-/sdcard/android/layout_tests/fast/layers/normal-flow-hit-test.html
-/sdcard/android/layout_tests/fast/layers/remove-layer-with-nested-stacking.html
-/sdcard/android/layout_tests/fast/layers/layer-visibility.html
-/sdcard/android/layout_tests/fast/layers/zindex-inherit.html
-/sdcard/android/layout_tests/fast/layers/overflow-scroll-auto-switch.html
-/sdcard/android/layout_tests/fast/layers/opacity-transforms.html
-/sdcard/android/layout_tests/fast/layers/scroll-rect-to-visible.html
-/sdcard/android/layout_tests/fast/layers/opacity-stacking.html
-/sdcard/android/layout_tests/fast/layers/remove-only-this-layer-update.html
-/sdcard/android/layout_tests/fast/history/clicked-link-is-visited.html
-/sdcard/android/layout_tests/fast/backgrounds/repeat/mask-negative-offset-repeat.html
-/sdcard/android/layout_tests/fast/backgrounds/repeat/negative-offset-repeat.html
-/sdcard/android/layout_tests/fast/backgrounds/repeat/negative-offset-repeat-transformed.html
-/sdcard/android/layout_tests/fast/backgrounds/repeat/noRepeatCorrectClip.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize20.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize02.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize11.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize21.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize03.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize12.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize22.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize04.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize13.html
-/sdcard/android/layout_tests/fast/backgrounds/size/zero.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize05.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize14.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize06.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize15.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize07.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize16.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize08.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize17.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize09.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize18.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize19.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize10.html
-/sdcard/android/layout_tests/fast/backgrounds/size/backgroundSize01.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-2.html
-/sdcard/android/layout_tests/fast/backgrounds/background-origin-root-element.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-3.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-4.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-5.html
-/sdcard/android/layout_tests/fast/backgrounds/background-position-1.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-6.html
-/sdcard/android/layout_tests/fast/backgrounds/opacity-on-document-element.html
-/sdcard/android/layout_tests/fast/backgrounds/background-clip-text.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-mask.html
-/sdcard/android/layout_tests/fast/backgrounds/solid-color-context-restore.html
-/sdcard/android/layout_tests/fast/backgrounds/mask-composite.html
-/sdcard/android/layout_tests/fast/backgrounds/animated-svg-as-background.html
-/sdcard/android/layout_tests/fast/backgrounds/body-generated-image-propagated-to-root.html
-/sdcard/android/layout_tests/fast/backgrounds/001.html
-/sdcard/android/layout_tests/fast/backgrounds/animated-gif-as-background.html
-/sdcard/android/layout_tests/fast/backgrounds/background-position-rounding.html
-/sdcard/android/layout_tests/fast/backgrounds/bgCompositeCopy.html
-/sdcard/android/layout_tests/fast/backgrounds/background-inherit-color-bug.html
-/sdcard/android/layout_tests/fast/backgrounds/animated-svg-as-mask.html
-/sdcard/android/layout_tests/fast/backgrounds/svg-as-background-1.html
-/sdcard/android/layout_tests/fast/repaint/reflection-redraw.html
-/sdcard/android/layout_tests/fast/repaint/layer-full-repaint.html
-/sdcard/android/layout_tests/fast/repaint/subtree-root-clip.html
-/sdcard/android/layout_tests/fast/repaint/subtree-root-clip-3.html
-/sdcard/android/layout_tests/fast/repaint/layer-outline-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/transform-layout-repaint.html
-/sdcard/android/layout_tests/fast/repaint/float-new-in-block.html
-/sdcard/android/layout_tests/fast/repaint/list-marker-2.html
-/sdcard/android/layout_tests/fast/repaint/layer-hide-when-needs-layout.html
-/sdcard/android/layout_tests/fast/repaint/layer-outline.html
-/sdcard/android/layout_tests/fast/repaint/table-section-overflow.html
-/sdcard/android/layout_tests/fast/repaint/body-background-image.html
-/sdcard/android/layout_tests/fast/repaint/shadow-multiple-strict-vertical.html
-/sdcard/android/layout_tests/fast/repaint/inline-outline-repaint.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-4.html
-/sdcard/android/layout_tests/fast/repaint/change-transform.html
-/sdcard/android/layout_tests/fast/repaint/fixed.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-8.html
-/sdcard/android/layout_tests/fast/repaint/erase-overflow.html
-/sdcard/android/layout_tests/fast/repaint/outline-child-repaint.html
-/sdcard/android/layout_tests/fast/repaint/float-overflow.html
-/sdcard/android/layout_tests/fast/repaint/containing-block-position-change.html
-/sdcard/android/layout_tests/fast/repaint/text-selection-rect-in-overflow.html
-/sdcard/android/layout_tests/fast/repaint/flexible-box-overflow-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/table-cell-move.html
-/sdcard/android/layout_tests/fast/repaint/transform-absolute-child.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-10.html
-/sdcard/android/layout_tests/fast/repaint/opacity-change-on-overflow-float.html
-/sdcard/android/layout_tests/fast/repaint/float-move-during-layout.html
-/sdcard/android/layout_tests/fast/repaint/overflow-clip-subtree-layout.html
-/sdcard/android/layout_tests/fast/repaint/invisible-objects.html
-/sdcard/android/layout_tests/fast/repaint/shadow-multiple-strict-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/focus-layers.html
-/sdcard/android/layout_tests/fast/repaint/inline-color-change.html
-/sdcard/android/layout_tests/fast/repaint/table-col-background.html
-/sdcard/android/layout_tests/fast/repaint/selection-after-remove.html
-/sdcard/android/layout_tests/fast/repaint/dynamic-table-vertical-alignment-change.html
-/sdcard/android/layout_tests/fast/repaint/flexible-box-overflow.html
-/sdcard/android/layout_tests/fast/repaint/table-two-pass-layout-overpaint.html
-/sdcard/android/layout_tests/fast/repaint/overflow-into-content.html
-/sdcard/android/layout_tests/fast/repaint/shadow-multiple-vertical.html
-/sdcard/android/layout_tests/fast/repaint/border-repaint-glitch.html
-/sdcard/android/layout_tests/fast/repaint/continuation-after-outline.html
-/sdcard/android/layout_tests/fast/repaint/intermediate-layout-position.html
-/sdcard/android/layout_tests/fast/repaint/table-section-repaint.html
-/sdcard/android/layout_tests/fast/repaint/clipped-relative.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-1.html
-/sdcard/android/layout_tests/fast/repaint/backgroundSizeRepaint.html
-/sdcard/android/layout_tests/fast/repaint/box-shadow-dynamic.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-5.html
-/sdcard/android/layout_tests/fast/repaint/text-shadow-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/caret-outside-block.html
-/sdcard/android/layout_tests/fast/repaint/renderer-destruction-by-invalidateSelection-crash.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-9.html
-/sdcard/android/layout_tests/fast/repaint/float-in-new-block-with-layout-delta.html
-/sdcard/android/layout_tests/fast/repaint/transform-repaint-descendants.html
-/sdcard/android/layout_tests/fast/repaint/layout-state-relative.html
-/sdcard/android/layout_tests/fast/repaint/shadow-multiple-horizontal.html
-/sdcard/android/layout_tests/fast/repaint/border-fit-lines.html
-/sdcard/android/layout_tests/fast/repaint/repaint-resized-overflow.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-3509.html
-/sdcard/android/layout_tests/fast/repaint/inline-block-overflow.html
-/sdcard/android/layout_tests/fast/repaint/search-field-cancel.html
-/sdcard/android/layout_tests/fast/repaint/background-generated.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-6278.html
-/sdcard/android/layout_tests/fast/repaint/button-spurious-layout-hint.html
-/sdcard/android/layout_tests/fast/repaint/box-shadow-v.html
-/sdcard/android/layout_tests/fast/repaint/float-overflow-right.html
-/sdcard/android/layout_tests/fast/repaint/delete-into-nested-block.html
-/sdcard/android/layout_tests/fast/repaint/table-cell-collapsed-border.html
-/sdcard/android/layout_tests/fast/repaint/selection-after-delete.html
-/sdcard/android/layout_tests/fast/repaint/layout-state-only-positioned.html
-/sdcard/android/layout_tests/fast/repaint/lines-with-layout-delta.html
-/sdcard/android/layout_tests/fast/repaint/table-extra-bottom-grow.html
-/sdcard/android/layout_tests/fast/repaint/transform-relative-position.html
-/sdcard/android/layout_tests/fast/repaint/selection-gap-overflow-scroll.html
-/sdcard/android/layout_tests/fast/repaint/subtree-root-skipped.html
-/sdcard/android/layout_tests/fast/repaint/line-overflow.html
-/sdcard/android/layout_tests/fast/repaint/background-misaligned.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-2.html
-/sdcard/android/layout_tests/fast/repaint/text-append-dirty-lines.html
-/sdcard/android/layout_tests/fast/repaint/table-row.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-6.html
-/sdcard/android/layout_tests/fast/repaint/table-outer-border.html
-/sdcard/android/layout_tests/fast/repaint/transform-replaced-shadows.html
-/sdcard/android/layout_tests/fast/repaint/overflow-scroll-delete.html
-/sdcard/android/layout_tests/fast/repaint/layer-visibility.html
-/sdcard/android/layout_tests/fast/repaint/border-radius-repaint.html
-/sdcard/android/layout_tests/fast/repaint/table-collapsed-border.html
-/sdcard/android/layout_tests/fast/repaint/transform-translate.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-7235.html
-/sdcard/android/layout_tests/fast/repaint/reflection-repaint-test.html
-/sdcard/android/layout_tests/fast/repaint/4776765.html
-/sdcard/android/layout_tests/fast/repaint/selection-clear.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-6473.html
-/sdcard/android/layout_tests/fast/repaint/intermediate-layout-position-clip.html
-/sdcard/android/layout_tests/fast/repaint/focus-ring.html
-/sdcard/android/layout_tests/fast/repaint/table-cell-vertical-overflow.html
-/sdcard/android/layout_tests/fast/repaint/create-layer-repaint.html
-/sdcard/android/layout_tests/fast/repaint/subtree-root-clip-2.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-6388.html
-/sdcard/android/layout_tests/fast/repaint/overflow-outline-repaint.html
-/sdcard/android/layout_tests/fast/repaint/content-into-overflow.html
-/sdcard/android/layout_tests/fast/repaint/static-to-positioned.html
-/sdcard/android/layout_tests/fast/repaint/bugzilla-5699.html
-/sdcard/android/layout_tests/fast/repaint/transform-absolute-in-positioned-container.html
-/sdcard/android/layout_tests/fast/repaint/outline-repaint-glitch.html
-/sdcard/android/layout_tests/fast/repaint/overflow-delete-line.html
-/sdcard/android/layout_tests/fast/repaint/transform-disable-layoutstate.html
-/sdcard/android/layout_tests/fast/repaint/list-marker.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-3.html
-/sdcard/android/layout_tests/fast/repaint/line-flow-with-floats-7.html
-/sdcard/android/layout_tests/fast/repaint/outline-inset.html
-/sdcard/android/layout_tests/fast/repaint/box-shadow-h.html
-/sdcard/android/layout_tests/fast/repaint/4774354.html
-/sdcard/android/layout_tests/fast/repaint/clip-with-layout-delta.html
-/sdcard/android/layout_tests/fast/repaint/control-clip.html
-/sdcard/android/layout_tests/fast/repaint/selected-replaced.html
-/sdcard/android/layout_tests/fast/repaint/text-selection-rect-in-overflow-2.html
-/sdcard/android/layout_tests/fast/repaint/make-children-non-inline.html
-/sdcard/android/layout_tests/fast/repaint/text-shadow.html
-/sdcard/android/layout_tests/fast/repaint/outline-shrinking.html
-/sdcard/android/layout_tests/fast/repaint/layer-child-outline.html
-/sdcard/android/layout_tests/fast/loader/start-load-in-unload.html
-/sdcard/android/layout_tests/fast/loader/text-document-wrapping.html
-/sdcard/android/layout_tests/fast/xsl/document-function.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-extra-content-at-end.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-enc.xml
-/sdcard/android/layout_tests/fast/xsl/xslt_unicode.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-import-depth.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-enc16.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-enc16to16.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-missing-namespace-in-xslt.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-enc-cyr.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-relative-path.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-mismatched-tags-in-xslt.xml
-/sdcard/android/layout_tests/fast/xsl/xslt-entity.xml
-/sdcard/android/layout_tests/fast/canvas/fillrect-gradient-zero-stops.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transforms-during-path.html
-/sdcard/android/layout_tests/fast/canvas/drawImage.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-7.html
-/sdcard/android/layout_tests/fast/canvas/image-pattern-rotate.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-4.html
-/sdcard/android/layout_tests/fast/canvas/drawImage-with-globalAlpha.html
-/sdcard/android/layout_tests/fast/canvas/canvas-text-baseline.html
-/sdcard/android/layout_tests/fast/canvas/canvas-as-image-incremental-repaint.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-1.html
-/sdcard/android/layout_tests/fast/canvas/canvas-size-change-after-layout.html
-/sdcard/android/layout_tests/fast/canvas/canvas-resize-reset.html
-/sdcard/android/layout_tests/fast/canvas/canvas-bg.html
-/sdcard/android/layout_tests/fast/canvas/zero-size-fill-rect.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-6.html
-/sdcard/android/layout_tests/fast/canvas/patternfill-repeat.html
-/sdcard/android/layout_tests/fast/canvas/image-object-in-canvas.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-3.html
-/sdcard/android/layout_tests/fast/canvas/canvas-composite.html
-/sdcard/android/layout_tests/fast/canvas/quadraticCurveTo.xml
-/sdcard/android/layout_tests/fast/canvas/gradient-add-second-start-end-stop.html
-/sdcard/android/layout_tests/fast/canvas/fill-stroke-clip-reset-path.html
-/sdcard/android/layout_tests/fast/canvas/canvas-text-alignment.html
-/sdcard/android/layout_tests/fast/canvas/canvas-incremental-repaint.html
-/sdcard/android/layout_tests/fast/canvas/canvas-bg-zoom.html
-/sdcard/android/layout_tests/fast/canvas/canvasDrawingIntoSelf.html
-/sdcard/android/layout_tests/fast/canvas/canvas-as-image.html
-/sdcard/android/layout_tests/fast/canvas/canvas-before-css.html
-/sdcard/android/layout_tests/fast/canvas/canvas-incremental-repaint-2.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-5.html
-/sdcard/android/layout_tests/fast/canvas/fillrect_gradient.html
-/sdcard/android/layout_tests/fast/canvas/shadow-offset-2.html
-/sdcard/android/layout_tests/fast/frames/contentWindow_Frame.html
-/sdcard/android/layout_tests/fast/frames/onlyCommentInIFrame.html
-/sdcard/android/layout_tests/fast/frames/content-opacity-2.html
-/sdcard/android/layout_tests/fast/frames/frame-src-attribute.html
-/sdcard/android/layout_tests/fast/frames/frameElement-frame.html
-/sdcard/android/layout_tests/fast/frames/empty-cols-attribute.html
-/sdcard/android/layout_tests/fast/frames/iframe-scrolling-attribute.html
-/sdcard/android/layout_tests/fast/frames/inline-object-inside-frameset.html
-/sdcard/android/layout_tests/fast/frames/valid.html
-/sdcard/android/layout_tests/fast/frames/no-frame-borders.html
-/sdcard/android/layout_tests/fast/frames/empty-frame-src.html
-/sdcard/android/layout_tests/fast/frames/calculate-round.html
-/sdcard/android/layout_tests/fast/frames/frame-navigation.html
-/sdcard/android/layout_tests/fast/frames/001.html
-/sdcard/android/layout_tests/fast/frames/viewsource-on-image-file.html
-/sdcard/android/layout_tests/fast/frames/invalid.html
-/sdcard/android/layout_tests/fast/frames/frameset-style-recalc.html
-/sdcard/android/layout_tests/fast/frames/viewsource-attribute.html
-/sdcard/android/layout_tests/fast/frames/002.html
-/sdcard/android/layout_tests/fast/frames/calculate-relative.html
-/sdcard/android/layout_tests/fast/frames/calculate-order.html
-/sdcard/android/layout_tests/fast/frames/calculate-percentage.html
-/sdcard/android/layout_tests/fast/frames/content-opacity-1.html
-/sdcard/android/layout_tests/fast/frames/iframe-text-contents.html
-/sdcard/android/layout_tests/fast/frames/frame-scrolling-attribute.html
-/sdcard/android/layout_tests/fast/frames/contentWindow_iFrame.html
-/sdcard/android/layout_tests/fast/frames/calculate-fixed.html
-/sdcard/android/layout_tests/fast/frames/frame-element-name.html
-/sdcard/android/layout_tests/fast/frames/frame-set-whitespace-attributes.html
-/sdcard/android/layout_tests/fast/frames/iframe-with-frameborder.html
-/sdcard/android/layout_tests/fast/frames/frameElement-iframe.html
-/sdcard/android/layout_tests/fast/reflections/inline-crash.html
-/sdcard/android/layout_tests/fast/reflections/reflection-masks-opacity.html
-/sdcard/android/layout_tests/fast/reflections/reflection-nesting.html
-/sdcard/android/layout_tests/fast/reflections/reflection-overflow-hidden.html
-/sdcard/android/layout_tests/fast/reflections/table-cell.html
-/sdcard/android/layout_tests/fast/reflections/reflection-masks.html
-/sdcard/android/layout_tests/fast/reflections/reflection-direction.html
-/sdcard/android/layout_tests/fonts/cursive.html
-/sdcard/android/layout_tests/fonts/default.html
-/sdcard/android/layout_tests/fonts/monospace.html
-/sdcard/android/layout_tests/fonts/fantasy.html
-/sdcard/android/layout_tests/fonts/serif.html
-/sdcard/android/layout_tests/fonts/sans-serif.html
-/sdcard/android/layout_tests/http/tests/webarchive/test-css-url-encoding-shift-jis.html
-/sdcard/android/layout_tests/http/tests/webarchive/test-css-url-encoding.html
-/sdcard/android/layout_tests/http/tests/webarchive/test-css-url-encoding-utf-8.html
-/sdcard/android/layout_tests/http/tests/webarchive/test-preload-resources.html
-/sdcard/android/layout_tests/http/tests/multipart/invalid-image-data.html
-/sdcard/android/layout_tests/http/tests/multipart/invalid-image-data-standalone.html
-/sdcard/android/layout_tests/http/tests/local/file-url-sent-as-referer.html
-/sdcard/android/layout_tests/http/tests/misc/location-replace-crossdomain.html
-/sdcard/android/layout_tests/http/tests/misc/acid2.html
-/sdcard/android/layout_tests/http/tests/misc/acid2-pixel.html
-/sdcard/android/layout_tests/http/tests/misc/favicon-as-image.html
-/sdcard/android/layout_tests/http/tests/misc/generated-content-inside-table.html
-/sdcard/android/layout_tests/http/tests/misc/willCacheResponse-delegate-callback.html
-/sdcard/android/layout_tests/http/tests/misc/iframe404.html
-/sdcard/android/layout_tests/http/tests/misc/frame-access-during-load.html
-/sdcard/android/layout_tests/http/tests/navigation/postredirect-goback1.html
-/sdcard/android/layout_tests/http/tests/navigation/error404-subframeload.html
-/sdcard/android/layout_tests/http/tests/navigation/error404-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/anchor-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/postredirect-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/post-goback1.html
-/sdcard/android/layout_tests/http/tests/navigation/post-basic.html
-/sdcard/android/layout_tests/http/tests/navigation/post-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/error404-goback.html
-/sdcard/android/layout_tests/http/tests/navigation/javascriptlink-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/postredirect-frames.html
-/sdcard/android/layout_tests/http/tests/navigation/error404-frames.html
-/sdcard/android/layout_tests/http/tests/loading/simple-subframe.html
-/sdcard/android/layout_tests/media/video-display-toggle.html
-/sdcard/android/layout_tests/media/video-transformed.html
-/sdcard/android/layout_tests/media/video-empty-source.html
-/sdcard/android/layout_tests/media/controls-strict.html
-/sdcard/android/layout_tests/media/audio-controls-rendering.html
-/sdcard/android/layout_tests/media/video-controls-visible-audio-only.html
-/sdcard/android/layout_tests/media/audio-no-installed-engines.html
-/sdcard/android/layout_tests/media/video-zoom.html
-/sdcard/android/layout_tests/media/video-zoom-controls.html
-/sdcard/android/layout_tests/media/video-controls-rendering.html
-/sdcard/android/layout_tests/media/controls-styling.html
-/sdcard/android/layout_tests/media/video-aspect-ratio.html
-/sdcard/android/layout_tests/media/controls-after-reload.html
-/sdcard/android/layout_tests/media/video-layer-crash.html
-/sdcard/android/layout_tests/plugins/netscape-dom-access.html
-/sdcard/android/layout_tests/plugins/embed-attributes-style.html
-/sdcard/android/layout_tests/printing/media-queries-print.html
-/sdcard/android/layout_tests/scrollbars/scrollbar-orientation.html
-/sdcard/android/layout_tests/scrollbars/scrollbar-buttons.html
-/sdcard/android/layout_tests/scrollbars/basic-scrollbar.html
-/sdcard/android/layout_tests/scrollbars/overflow-scrollbar-combinations.html
-/sdcard/android/layout_tests/scrollbars/disabled-scrollbar.html
-/sdcard/android/layout_tests/scrollbars/listbox-scrollbar-combinations.html
-/sdcard/android/layout_tests/security/block-test-no-port.html
-/sdcard/android/layout_tests/security/block-test.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/insertTbodyRebuild1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/appendCellsRebuild1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/appendColGroup1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/appendCol1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/insertTbodyExpand1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/dom/appendCells1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug56024.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-14.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug11945.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-18.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug72393.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug23847.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug7121-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug27993-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug7243.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-3.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1647.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-7.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug101759.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug2479-5.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug14007-1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-11.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1010.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-15.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug14159-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug25707.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug47163.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug91057.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug131020-3.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug19526.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug14489.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug73629.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1725.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-4.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug106336.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-8.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug22122.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug10216.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug14007-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug106966.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug32205-4.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug42043.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug178855.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-12.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug92868_1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug21518.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug45621.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-16.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug65372.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug59252.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug29058-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug17826.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug67915-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug46268-4.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1128.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1164.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/97619.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-5.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug10140.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-9.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug32205-1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug61042-1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug104898.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug8499.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug9879-1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug128876.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-13.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug58402-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug24880-1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug85016.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-17.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug80762-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug18770.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug33784.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3105.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1055-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug89315.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug92647-1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug1262.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug7113.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3517.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug220653.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug4294.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-6.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug6933.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug51000.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug11331.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug61042-2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/bugs/bug3166-10.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/other/empty_cells.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/other/test4.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/col_span2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/columns.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/captions1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/cols1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/backgrounds.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/captions2.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/captions3.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/conflicts.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/core/standards1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/collapsing_borders/bug41262-5.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/collapsing_borders/bug41262-6.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/collapsing_borders/bug41262-1.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_below.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-cell.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_row.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_hidden_tr.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-column.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/tables_caption_align_right.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-column-group.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-row-group.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_hidden.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row_sibling.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_lhs.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_rules_rows.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_rules_all.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_above.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_void.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_hsides.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_valign_top.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_right.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_hidden_tbody.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_layers-show.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_caption_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-cell.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_below.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table_caption.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_hidden_table.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_rules_cols.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-row.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_align_right.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-row.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody_sibling.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_rules_cols.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_border.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_colgroup_width_px.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_valign_bottom.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-quirks.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_box.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_rules_rows.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_hsides.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_left.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_caption_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_hidden_table.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-row-group.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_bottom.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_rhs.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_frame_vsides.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell_sibling.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_layers-hide.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_valign_middle.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/tables_cellspacing_pct.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_position-table-column-group.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_lhs.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_fixed-bg.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_td_dynamic_deactivate.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_rhs.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_above.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/x_table_frame_vsides.xml
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_tbody.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/backgr_border-table-column.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_caption_top.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_table.html
-/sdcard/android/layout_tests/tables/mozilla_expected_failures/marvin/tables_caption_align_left.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteCellsRebuild1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteRowsShrink1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertCellsRebuild1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertCellsRebuild2.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteCol1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteCol2.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertColGroups1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteCol3.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertColGroups2.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteCellsShrink1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteTbodyExpand1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteCellsShrink2.html
-/sdcard/android/layout_tests/tables/mozilla/dom/tableDom.html
-/sdcard/android/layout_tests/tables/mozilla/dom/appendCol2.html
-/sdcard/android/layout_tests/tables/mozilla/dom/appendTbodyExpand1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteTbodyRebuild1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteColGroup1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteColGroup2.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertRowsExpand1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/appendRowsExpand1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/deleteRowsRebuild1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertCols1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertCols2.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertRowsRebuild1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertCellsExpand1.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertCols3.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertCellsExpand2.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertCols4.html
-/sdcard/android/layout_tests/tables/mozilla/dom/insertCols5.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug30418.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug14159-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46623-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug24661.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug30692.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug53690-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug88035-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug51727.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug81934.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug68912.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug60992.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug92647-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug120107.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1271.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug28928.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug103533.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4093.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2267.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug92868.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4429.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug5538.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug106816.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug10009.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug149275-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug32205-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug13118.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1802s.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug10296-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug647.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug48028-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug72359.xml
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug25367.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1430.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1224.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug67915-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug45486.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug113424.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug108340.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3454.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2479-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug139524-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4849-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug11321.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2886.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug219693-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug42443.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug54450.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug269566.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug12709.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug80762-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug21918.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1302.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug25663.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug55527.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug7112-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1055-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug69382-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug17587.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug102145-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2516.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4803.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug19599.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1188.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3718.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug110566.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug106158-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug5188.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug215629.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug154780.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug137388-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug10039.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug5798.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug22246-3a.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug25074.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug27038-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/45621.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug25086.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug43854-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug34538.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug131020.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug7121-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4501.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug53891.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug8032-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268-5.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug63785.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug113235-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug69187.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug9024.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug120364.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug109043.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug220536.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-5.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2973.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug222467.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug6674.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug99948.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug277062.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug127267.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug30332-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug10036.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug16012.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2997.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug17130-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug650.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug14323.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug10565.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug52505.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug29314.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug13169.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug30559.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug29326.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug55545.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug18359.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3037-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug82946-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug55694.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug6304.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3263.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug101674.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug123862.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug221784-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug275625.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug106795.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug22513.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug57300.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug51037.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug119786.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug12908-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug15247.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46623-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug34176.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug53690-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug24880.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug41890.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug88035-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug50695-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1163-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug8411.xml
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1802.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3260.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug97138.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug9123-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3309-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3191.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1296.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug222336.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2773.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug8381.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug194024.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2947.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug5838.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug60013.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug138725.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug11026.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug175455-4.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug58402-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug43039.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug48028-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug24627.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug35662.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug21299.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug26178.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug18664.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug23299.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug88524.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug48827.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1318.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4427.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug6184.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug11384s.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug5835.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4576.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2479-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug139524-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug133948.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug9879-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug11944.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug13196.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug20579.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug29058-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug96334.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug7112-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug60749.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug59354.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug69382-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug27993-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug57378.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug102145-4.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug98196.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug9072.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2585.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug145572.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug137388-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug5799.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug157890.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug196870.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug22246-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug73321.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug18440.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug965.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug131020-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug43854-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug96343.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46368-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug102145-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug8032-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1067-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2065.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug97383.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug113235-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3681-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug9271-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1809.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2962.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-6.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2469.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug8950.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug133756-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2886-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug159108.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4849.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug25004.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug12910.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug43204.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug20804.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug23072.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug19061-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug10269-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug13526.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug52506.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug27038-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46480-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug42187.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2050.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3103.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug39209.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug38916.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug82946-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3037-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4523.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug67864.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug8361.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2981-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2684.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4385.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug126742.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug12910-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug8858.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug709.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug16252.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug33137.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug45350.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug12908-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug92143.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug14159-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug50695-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug29429.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1261.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4520.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46944.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/adforce_imgis_com.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug18955.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug227123.xml
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3309-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug9123-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug7342.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug83786.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4382.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug24200.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug641-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug625.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug32205-5.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug56201.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug32841.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug44505.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug45055-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug15544.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug40828.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1800.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug6404.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2509.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2479-4.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4739.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug139524-4.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug13105.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug149275-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug32205-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug12008.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug10296-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug727.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug278385.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug13484.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug15933.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug60807.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug93363.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug14929.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug86708.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug57828.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug11384q.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2954.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2479-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug139524-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug219693-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug137388-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug30273.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug22246-3.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug22246-2a.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug12384.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug44523.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug60804.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug86220.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug32447.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug17138.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug56405.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug26553.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1220.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug29058-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug33855.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug29157.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2123.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug19356.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug28933.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46368-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug18558.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug102145-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1067-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1474.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3681-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4284.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug4527.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug9271-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2296.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug106158-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2757.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug128229.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug133756-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug5797.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug278266.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug23235.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug19061-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug10269-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug963.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug27038-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug12268.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug45055.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug7471.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug75250.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46480-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug30985.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46924.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug56563.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug23994.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug113235-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug99923.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug55789.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2981-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-4.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug7714.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug222846.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug68998.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug30332-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug17130-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug51140.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug23151.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug10633.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug24503.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug28341.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug47432.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug101201.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug17168.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug46268-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug78162.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug17548.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug100334.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug57828-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1818-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug2763.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug1828.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug221784-1.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug3977.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug131020_iframe.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug641-2.html
-/sdcard/android/layout_tests/tables/mozilla/bugs/bug22019.html
-/sdcard/android/layout_tests/tables/mozilla/other/move_row.html
-/sdcard/android/layout_tests/tables/mozilla/other/nestedTables.html
-/sdcard/android/layout_tests/tables/mozilla/other/wa_table_tr_align.html
-/sdcard/android/layout_tests/tables/mozilla/other/ms.html
-/sdcard/android/layout_tests/tables/mozilla/other/cell_widths.html
-/sdcard/android/layout_tests/tables/mozilla/other/test3.html
-/sdcard/android/layout_tests/tables/mozilla/other/cellspacing.html
-/sdcard/android/layout_tests/tables/mozilla/other/nested2.html
-/sdcard/android/layout_tests/tables/mozilla/other/test6.html
-/sdcard/android/layout_tests/tables/mozilla/other/padding.html
-/sdcard/android/layout_tests/tables/mozilla/other/body_col.html
-/sdcard/android/layout_tests/tables/mozilla/other/wa_table_thtd_rowspan.html
-/sdcard/android/layout_tests/tables/mozilla/other/slashlogo.html
-/sdcard/android/layout_tests/tables/mozilla/images/adforce_imgis_com.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_auto.html
-/sdcard/android/layout_tests/tables/mozilla/core/captions.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_fixPer.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_autoFix.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_autoPer.html
-/sdcard/android/layout_tests/tables/mozilla/core/row_span.html
-/sdcard/android/layout_tests/tables/mozilla/core/cell_heights.html
-/sdcard/android/layout_tests/tables/mozilla/core/misc.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_autoFixPer.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_fix.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_per.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_auto.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_span.html
-/sdcard/android/layout_tests/tables/mozilla/core/margins.html
-/sdcard/android/layout_tests/tables/mozilla/core/borders.html
-/sdcard/android/layout_tests/tables/mozilla/core/table_frame.html
-/sdcard/android/layout_tests/tables/mozilla/core/table_rules.html
-/sdcard/android/layout_tests/tables/mozilla/core/table_heights.html
-/sdcard/android/layout_tests/tables/mozilla/core/nested1.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_autoFix.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_auto_fixPer.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_autoPer.html
-/sdcard/android/layout_tests/tables/mozilla/core/bloomberg.html
-/sdcard/android/layout_tests/tables/mozilla/core/one_row.html
-/sdcard/android/layout_tests/tables/mozilla/core/table_widths.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_autoFixPer.html
-/sdcard/android/layout_tests/tables/mozilla/core/box_sizing.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_fix.html
-/sdcard/android/layout_tests/tables/mozilla/core/col_widths_fix_per.html
-/sdcard/android/layout_tests/tables/mozilla/collapsing_borders/bug41262-3.html
-/sdcard/android/layout_tests/tables/mozilla/collapsing_borders/bug41262-4.html
-/sdcard/android/layout_tests/tables/mozilla/collapsing_borders/bug127040.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_green.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_valign_top.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_olive.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_teal_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_center.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_width_pct.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_class.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_olive_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_border_0.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-row-group.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_maroon_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_center.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_valign_baseline.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_align_right.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_width_rel.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_lime.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/td_valign_baseline.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_navy.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_char.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_valign_top.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-column.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_valign_baseline.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_nowrap.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_id.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_style.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_bgcolor_rgb.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_green_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_id.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_char.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_class.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_span.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_bgcolor_rgb.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/th_valign_bottom.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_silver_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_rules_groups.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_valign_baseline.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_gray.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_center.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_valign_bottom.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_bgcolor_rgb.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_cellspacing.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_width_px.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_navy_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/td_valign_middle.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_valign_middle.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_yellow.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_style.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_width.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_green.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-cell.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_left.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_silver.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_valign_top.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_center.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_border_px.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_valign_bottom.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_id.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_colspan.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_cellspacing_pct.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_nowrap.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_char.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_blue.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_navy.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_style.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_center.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_lime_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_right.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_aqua_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_valign_bottom.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_rowspan.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_bgcolor_name.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_id.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_char.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_rowspan.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_navy_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_valign_middle.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_valign_baseline.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_red.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_gray.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_align_right.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_justify.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_fuchsia.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_white_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_justify.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_valign_top.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_justify.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_class.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_maroon_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_rules_none.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_valign_middle.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_caption_align_bot.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_cellpadding_pct.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_yellow_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_colspan.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_valign_top.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_justify.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/th_valign_baseline.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_colspan.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_align_left.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_valign_baseline.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_nowrap.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_lime_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_aqua_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_align_left.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_char.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_justify.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_border_none.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_border_1.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_row_align_center.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_right.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_align_left.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/td_valign_bottom.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_maroon.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_frame_border.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_class.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_center.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_style.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_valign_bottom.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_blue.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_width_px.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_center.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_valign_middle.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_silver_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_style.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_align_center.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_width_rel.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_index.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_row_th_nowrap.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_black_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_id.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_char.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_valign_middle.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_width.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_justify.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_right.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_cellpadding_pct.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_gray_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_olive_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_valign_baseline.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_valign_bottom.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_id.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_valign_baseline.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_char.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_valign_top.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/body_col.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-row.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_fuchsia.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_cellpadding.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_align_center.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_class.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_frame_void.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_align_right.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_valign_bottom.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_rowspan.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_char.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_char.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_class.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_purple.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_rules_groups.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_valign_middle.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_gray_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_style.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_align_left.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_class.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_width_pct.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_valign_top.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/body_tfoot.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_span.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_width_pct.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_valign_baseline.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_yellow_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_height.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_white.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_justify.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_valign_baseline.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_frame_box.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_yellow.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_left.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_width_px.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_char.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_valign_top.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_valign_bottom.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_row_align_right.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_border_2.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_aqua.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_fuchsia_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_valign_bottom.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/td_valign_top.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_id.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_valign_baseline.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/th_valign_top.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/col_span.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_row_align_left.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_purple_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_class.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_align_char.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_red_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_width_pct.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_green_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_valign_top.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_border.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_white_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_valign_top.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_fuchsia_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_default.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_align_bottom.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_silver.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_valign_bottom.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_align_center.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_red.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_black.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_overflow_td_dynamic_deactivate.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_valign_top.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_cellpadding.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_valign_middle.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_align_right.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_rowspan.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_cellspacing.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_rules_none.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_white.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_align_justify.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_rules_all.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_valign_bottom.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_blue_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_valign_top.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_valign_middle.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_black_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_align_left.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_right.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_caption_align_top.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_valign_middle.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_id.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_col_span.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_bgcolor_name.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_justify.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_valign_middle.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_height.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_center.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_style.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_teal.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_height.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_olive.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_height.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/body_thead.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_justify.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_maroon.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_simple-table-column-group.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/table_overflow_hidden_td.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_valign_middle.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_black.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_layers-opacity.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_style.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_align_center.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_align_char.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_bgcolor_name.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_red_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_blue_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_valign_top.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_lime.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/th_valign_middle.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_width_percent.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_width.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_teal_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_valign_baseline.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_valign_middle.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_width_px.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_valign_baseline.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_align_char.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/backgr_position-table.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_char.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_th_width.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tfoot_align_center.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tbody_align_justify.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_bgcolor_rgb.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_purple_rgb.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_align_center.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/colgroup_valign_bottom.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_td_colspan.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_caption_align_top.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_table_align_center.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_valign_middle.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_colgroup_align_center.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/thead_valign_baseline.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_thead_style.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tbody_class.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_border_3.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_align_left.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tr_valign_bottom.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/body_tbody.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_td_bgcolor_name.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_bgcolor_teal.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_tfoot_align_justify.xml
-/sdcard/android/layout_tests/tables/mozilla/marvin/tables_bgcolor_purple.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/tr_valign_bottom.html
-/sdcard/android/layout_tests/tables/mozilla/marvin/x_th_id.xml
-/sdcard/android/layout_tests/transforms/2d/transform-borderbox.html
-/sdcard/android/layout_tests/transforms/2d/zoom-menulist.html
-/sdcard/android/layout_tests/transforms/2d/transform-origin-borderbox.html
-/sdcard/android/layout_tests/transforms/2d/compound-transforms-vs-containers.html
-/sdcard/android/layout_tests/transforms/3d/hit-testing/backface-hit-test.html
-/sdcard/android/layout_tests/transforms/3d/hit-testing/backface-no-transform-hit-test.html
-/sdcard/android/layout_tests/transforms/3d/hit-testing/rotated-hit-test.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-origins.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-deep.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-coplanar.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-preserve-3d.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-2.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-3.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping.html
-/sdcard/android/layout_tests/transforms/3d/point-mapping/3d-point-mapping-overlapping.html
-/sdcard/android/layout_tests/transforms/3d/general/perspective-units.html
-/sdcard/android/layout_tests/transforms/3d/general/perspective-non-layer.html
-/sdcard/android/layout_tests/transforms/no_transform_hit_testing.html
-/sdcard/android/layout_tests/transitions/transition-drt-api.html
-/sdcard/android/layout_tests/webarchive/loading/cache-expired-subresource.html
-/sdcard/android/layout_tests/webarchive/test-css-import.html
-/sdcard/android/layout_tests/webarchive/test-img-src.html
-/sdcard/android/layout_tests/webarchive/test-link-rel-icon.html
-/sdcard/android/layout_tests/webarchive/adopt-attribute-styled-body-webarchive.html
-/sdcard/android/layout_tests/webarchive/archive-empty-frame-dom.html
-/sdcard/android/layout_tests/webarchive/test-frameset.html
-/sdcard/android/layout_tests/webarchive/test-body-background.html
-/sdcard/android/layout_tests/webarchive/test-input-src.html
-/sdcard/android/layout_tests/webarchive/archive-empty-frame-source.html
-/sdcard/android/layout_tests/webarchive/doctype.html
-/sdcard/android/layout_tests/webarchive/test-css-url-resources-inline-styles.html
-/sdcard/android/layout_tests/webarchive/test-table-background.html
-/sdcard/android/layout_tests/webarchive/adopt-inline-styled-node-webarchive.html
-/sdcard/android/layout_tests/webarchive/test-object-data.html
-/sdcard/android/layout_tests/webarchive/test-css-url-resources-in-stylesheets.html
-/sdcard/android/layout_tests/webarchive/archive-with-unencoded-url.html
-/sdcard/android/layout_tests/webarchive/test-link-href.html
-/sdcard/android/layout_tests/webarchive/test-duplicate-resources.html
-/sdcard/android/layout_tests/webarchive/test-xml-stylesheet.xml
-/sdcard/android/layout_tests/webarchive/test-td-background.html
-/sdcard/android/layout_tests/webarchive/test-script-src.html
-/sdcard/android/layout_tests/webarchive/adopt-attribute-styled-node-webarchive.html
diff --git a/tests/DumpRenderTree/assets/results/layout_tests_passed.txt b/tests/DumpRenderTree/assets/results/layout_tests_passed.txt
deleted file mode 100644
index 942b647..0000000
--- a/tests/DumpRenderTree/assets/results/layout_tests_passed.txt
+++ /dev/null
@@ -1,2960 +0,0 @@
-/sdcard/android/layout_tests/accessibility/non-native-image-crash.html
-/sdcard/android/layout_tests/animations/animation-css-rule-types.html
-/sdcard/android/layout_tests/animations/animation-events-create.html
-/sdcard/android/layout_tests/animations/play-state.html
-/sdcard/android/layout_tests/animations/animation-start-event-destroy-renderer.html
-/sdcard/android/layout_tests/animations/combo-transform-translate+scale.html
-/sdcard/android/layout_tests/animations/transform-origin-vs-functions.html
-/sdcard/android/layout_tests/animations/simultaneous-start-transform.html
-/sdcard/android/layout_tests/animations/lineheight-animation.html
-/sdcard/android/layout_tests/animations/import.html
-/sdcard/android/layout_tests/animations/simultaneous-start-left.html
-/sdcard/android/layout_tests/animations/fill-unset-properties.html
-/sdcard/android/layout_tests/animations/multiple-keyframes.html
-/sdcard/android/layout_tests/animations/change-one-anim.html
-/sdcard/android/layout_tests/animations/keyframes-comma-separated.html
-/sdcard/android/layout_tests/animations/matrix-anim.html
-/sdcard/android/layout_tests/animations/keyframes-rule.html
-/sdcard/android/layout_tests/animations/generic-from-to.html
-/sdcard/android/layout_tests/animations/big-rotation.html
-/sdcard/android/layout_tests/animations/keyframe-timing-functions.html
-/sdcard/android/layout_tests/animations/transition-and-animation-1.html
-/sdcard/android/layout_tests/animations/computed-style.html
-/sdcard/android/layout_tests/animations/animation-iteration-event-destroy-renderer.html
-/sdcard/android/layout_tests/animations/keyframes.html
-/sdcard/android/layout_tests/animations/multiple-animations.html
-/sdcard/android/layout_tests/animations/animation-end-event-destroy-renderer.html
-/sdcard/android/layout_tests/animations/transition-and-animation-2.html
-/sdcard/android/layout_tests/animations/import-crash.html
-/sdcard/android/layout_tests/animations/empty-keyframes.html
-/sdcard/android/layout_tests/animations/width-using-ems.html
-/sdcard/android/layout_tests/animations/combo-transform-rotate+scale.html
-/sdcard/android/layout_tests/animations/keyframes-out-of-order.html
-/sdcard/android/layout_tests/css1/units/zero-duration-without-units.html
-/sdcard/android/layout_tests/css2.1/atrule_longest_match.html
-/sdcard/android/layout_tests/css3/khtml-background-size-0x0-bmp.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrlastchild.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementnormalize.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_noderemovechildnode.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetattributenodenull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapreturnfirstitem.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrparentnodenull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapreturnattrnode.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementsetattributenodenull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementnormalize2.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_noderemovechild.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforeinvalidnodetype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodechildnodesappendchild.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrfirstchild.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue05.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatagetlength.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentnodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrinsertdataoffsetnegative.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementinvalidcharacterexception.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_textsplittexttwo.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrsetvalue1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonegetparentnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreatetextnode.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentinvalidcharacterexceptioncreateelement.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistreturnlastitem.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrchildnodes1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrdeletedataoffsetnegative.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodetextnodevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementretrieveallattributes.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentinvalidcharacterexceptioncreateelement1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_domimplementationfeaturenoversion.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrprevioussiblingnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementsbytagnamespecialvalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildnodeancestor.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementsbytagnamenomatch.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildgetnodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedataend.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedataexceedslengthofarg.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_notationssetnameditem1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildinvalidnodetype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforenodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore7.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechild.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetprevioussiblingnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodehaschildnodesfalse.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapreturnlastitem.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetfirstchildnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_notationsremovenameditem1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforedocfragment.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataappenddata.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeattributenodevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrspecifiedvalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrgetvalue1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildnewchilddiffdocument.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_domimplementationfeaturenull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrreplacedataoffsetnegative.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforenewchildexists.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue06.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistindexnotzero.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_textwithnomarkup.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_entitiessetnameditem1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrsetvalue2.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetelementsbytagnametotallength.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentinvalidcharacterexceptioncreateattribute1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistindexgetlengthofemptylist.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementchangeattributevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeattributenodetype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetnextsiblingnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapinuseattributeerr.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrchildnodes2.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrcreatetextnode2.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodechildnodesempty.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataappenddatagetdata.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedataend.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetlastchildnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrcreatetextnode.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonefalsenocopytext.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchild.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild2.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrreplacedataoffsetgreater.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodetextnodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeparentnode.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapnotfounderr.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementretrieveattrvalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildoldchildnonexistent.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbefore.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodehaschildnodes.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecommentnodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/documentinvalidcharacterexceptioncreateentref1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrgetvalue2.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementretrievetagname.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrspecifiedvaluechanged.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforenewchilddiffdocument.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore2.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrreplacedatacountnegative.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedatabegining.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreateelement.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrinsertdataoffsetgreater.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_textparseintolistofelements.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue07.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetownerdocumentnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedatamiddle.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildinvalidnodetype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementremoveattributenode.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrsubstringoffsetgreater.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedatamiddle.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatasubstringexceedsvalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetrootnode.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatainsertdataend.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentnodetype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonenodetrue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapchildnoderange.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapnumberofnodes.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue01.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetimplementation.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildchildexists.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild3.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetelementsbytagnamelength.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeelementnodeattributes.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrsubstringnegativeoffset.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_noderemovechildgetnodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrsubstringcountnegative.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementnotfounderr.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentfragmentnodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrdeletedataoffsetgreater.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatasubstringvalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetownerdocument.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementassociatedattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementinvalidcharacterexception1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_textindexsizeerroffsetoutofbounds.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedatagetlengthanddata.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildnodeancestor.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue08.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_textsplittextthree.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreateelementcasesensitive.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore3.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentnodeattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdataindexsizeerrdeletedatacountnegative.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeelementnodevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildnewchildexists.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_domimplementationfeaturexml.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementreplaceexistingattributegevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeelementnodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementcreatenewattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecommentnodevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrnextsiblingnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrremovechild1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapwrongdocumenterr.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapreturnnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue02.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild4.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementinuseattributeerr.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetlastchild.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetattributenode.html
-/sdcard/android/layout_tests/dom/html/level1/core/documentgetdoctypenodtd.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapsetnameditemreturnvalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedataexceedslengthofdata.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodetextnodetype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeattributenodeattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetdoctype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapsetnameditemthatexists.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreatedocumentfragment.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_commentgetcomment.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attreffectivevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_textsplittextfour.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforenodeancestor.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore4.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_textindexsizeerrnegativeoffset.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecommentnodetype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodetextnodeattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentnodevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatadeletedataexceedslength.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_textsplittextone.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentfragmentnodevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatagetdata.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatainsertdatabeginning.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetnextsibling.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistreturnfirstitem.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrremovechild2.html
-/sdcard/android/layout_tests/dom/html/level1/core/documentinvalidcharacterexceptioncreatepi.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue03.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild5.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrhaschildnodes.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrreplacechild1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrnormalize.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodedocumentfragmentnodetype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementreplaceexistingattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchildnewchilddiffdocument.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelisttraverselist.html
-/sdcard/android/layout_tests/dom/html/level1/core/documentinvalidcharacterexceptioncreateentref.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatasetnodevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_entitiesremovenameditem1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore5.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementsbytagname.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrcreatedocumentfragment.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrclonenode1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapremovenameditem.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementaddnewattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistindexequalzero.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodechildnodes.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementempty.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatainsertdatamiddle.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreatecomment.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetprevioussibling.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforerefchildnonexistent.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementremoveattributeaftercreate.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_noderemovechildoldchildnonexistent.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementwrongdocumenterr.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_characterdatareplacedatabegining.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeattributenodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecommentnodeattributes.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodevalue04.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentinvalidcharacterexceptioncreateattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementremoveattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrappendchild6.html
-/sdcard/android/layout_tests/dom/html/level1/core/documentinvalidcharacterexceptioncreatepi1.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeelementnodetype.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrname.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapgetnameditem.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgettagname.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapsetnameditem.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeinsertbeforerefchildnull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrreplacechild2.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeparentnodenull.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodecloneattributescopied.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonenodefalse.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodereplacechildnodename.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementgetelementsbytagnameaccessnodelist.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeclonetruecopytext.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_attrinsertbefore6.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodelistindexgetlength.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_elementreplaceattributewithself.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentcreateattribute.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodeappendchilddocfragment.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_namednodemapsetnameditemwithnewvalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_documentgetelementsbytagnamevalue.html
-/sdcard/android/layout_tests/dom/html/level1/core/hc_nodegetfirstchild.html
-/sdcard/android/layout_tests/dom/html/level2/events/EventTargetCast01.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent12.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent04.html
-/sdcard/android/layout_tests/dom/html/level2/events/createEvent02.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent08.html
-/sdcard/android/layout_tests/dom/html/level2/events/initEvent04.html
-/sdcard/android/layout_tests/dom/html/level2/events/DocumentEventCast01.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent01.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent13.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent05.html
-/sdcard/android/layout_tests/dom/html/level2/events/initEvent01.html
-/sdcard/android/layout_tests/dom/html/level2/events/createEvent03.html
-/sdcard/android/layout_tests/dom/html/level2/events/initEvent05.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent09.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent10.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent02.html
-/sdcard/android/layout_tests/dom/html/level2/events/initEvent02.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent06.html
-/sdcard/android/layout_tests/dom/html/level2/events/createEvent04.html
-/sdcard/android/layout_tests/dom/html/level2/events/initEvent06.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent11.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent03.html
-/sdcard/android/layout_tests/dom/html/level2/events/createEvent01.html
-/sdcard/android/layout_tests/dom/html/level2/events/dispatchEvent07.html
-/sdcard/android/layout_tests/dom/html/level2/events/initEvent03.html
-/sdcard/android/layout_tests/dom/html/level2/events/createEvent05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement87.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/hasFeature04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement26.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement141.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement37.html
-/sdcard/android/layout_tests/dom/html/level2/html/table12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIsIndexElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameSetElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLModElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement27.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement90.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/table45.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement124.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement40.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLParamElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement30.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptGroupElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement73.html
-/sdcard/android/layout_tests/dom/html/level2/html/table28.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/anchor02.html
-/sdcard/android/layout_tests/dom/html/level2/html/object09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement27.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement107.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement23.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLMetaElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument25.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement56.html
-/sdcard/android/layout_tests/dom/html/level2/html/table31.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/object12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement30.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement89.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement110.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLabelElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/hasFeature06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement28.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement143.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement39.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIsIndexElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLModElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement29.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement92.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/table47.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement16.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement126.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement42.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLParamElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement75.html
-/sdcard/android/layout_tests/dom/html/level2/html/table50.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/anchor04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement29.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement109.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement25.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument27.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement58.html
-/sdcard/android/layout_tests/dom/html/level2/html/table33.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/area01.html
-/sdcard/android/layout_tests/dom/html/level2/html/object14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement32.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement112.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLabelElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDivElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLUListElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement145.html
-/sdcard/android/layout_tests/dom/html/level2/html/button01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement61.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLegendElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCaptionElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement94.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFieldSetElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/table49.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLIElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement128.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLMapElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement44.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement77.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/table52.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement21.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/anchor06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement16.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement131.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLParagraphElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement27.html
-/sdcard/android/layout_tests/dom/html/level2/html/table02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement80.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/table35.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/area03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement34.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement114.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement30.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLStyleElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement20.html
-/sdcard/android/layout_tests/dom/html/level2/html/button03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement63.html
-/sdcard/android/layout_tests/dom/html/level2/html/table18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLegendElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement96.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement46.html
-/sdcard/android/layout_tests/dom/html/level2/html/table21.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/object02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement20.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLQuoteElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement79.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement100.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement133.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement29.html
-/sdcard/android/layout_tests/dom/html/level2/html/table04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement82.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/table37.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement20.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement21.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement36.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement116.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement32.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/basefont01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLStyleElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement20.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement22.html
-/sdcard/android/layout_tests/dom/html/level2/html/button05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement65.html
-/sdcard/android/layout_tests/dom/html/level2/html/table40.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement98.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement48.html
-/sdcard/android/layout_tests/dom/html/level2/html/table23.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/object04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement20.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLPreElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement22.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOListElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement102.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument20.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement135.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement51.html
-/sdcard/android/layout_tests/dom/html/level2/html/table06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement84.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/table39.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/hasFeature01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement23.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement38.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement118.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement34.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseFontElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement24.html
-/sdcard/android/layout_tests/dom/html/level2/html/button07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement67.html
-/sdcard/android/layout_tests/dom/html/level2/html/table42.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement121.html
-/sdcard/android/layout_tests/dom/html/level2/html/dlist01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement70.html
-/sdcard/android/layout_tests/dom/html/level2/html/table25.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLMenuElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFontElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement24.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement104.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement20.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLMetaElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument22.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement137.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHRElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement53.html
-/sdcard/android/layout_tests/dom/html/level2/html/table08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement86.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/hasFeature03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement25.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement140.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement36.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseFontElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameSetElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement26.html
-/sdcard/android/layout_tests/dom/html/level2/html/button09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement69.html
-/sdcard/android/layout_tests/dom/html/level2/html/table44.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement123.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLParamElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement72.html
-/sdcard/android/layout_tests/dom/html/level2/html/table27.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/anchor01.html
-/sdcard/android/layout_tests/dom/html/level2/html/object08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement26.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement106.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement22.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLMetaElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/body01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument24.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement139.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHRElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement55.html
-/sdcard/android/layout_tests/dom/html/level2/html/table30.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/object11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement88.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHtmlElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLabelElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTitleElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/hasFeature05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement27.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement142.html
-/sdcard/android/layout_tests/dom/html/level2/html/doc01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/AppletsCollection.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement38.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIsIndexElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLModElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement28.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement91.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/table46.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement30.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement125.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement41.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLParamElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement31.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptGroupElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement74.html
-/sdcard/android/layout_tests/dom/html/level2/html/table29.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/anchor03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement28.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement108.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement24.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument26.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement57.html
-/sdcard/android/layout_tests/dom/html/level2/html/table32.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/object13.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement31.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement111.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLabelElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement29.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement144.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement60.html
-/sdcard/android/layout_tests/dom/html/level2/html/table15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLegendElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLModElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement93.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFieldSetElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/table48.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLIElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement127.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement43.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement76.html
-/sdcard/android/layout_tests/dom/html/level2/html/table51.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement20.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/anchor05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement130.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement26.html
-/sdcard/android/layout_tests/dom/html/level2/html/table01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement16.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement59.html
-/sdcard/android/layout_tests/dom/html/level2/html/table34.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/area02.html
-/sdcard/android/layout_tests/dom/html/level2/html/object15.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement33.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement113.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLUListElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBRElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/button02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLButtonElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement62.html
-/sdcard/android/layout_tests/dom/html/level2/html/table17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLegendElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement95.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement16.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionsCollection06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement129.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLMapElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement45.html
-/sdcard/android/layout_tests/dom/html/level2/html/table20.html
-/sdcard/android/layout_tests/dom/html/level2/html/object01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement78.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/table53.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement22.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement16.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement17.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement132.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement28.html
-/sdcard/android/layout_tests/dom/html/level2/html/table03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement16.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement81.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/table36.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/area04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement20.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement35.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement115.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDlistElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement31.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLStyleElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement21.html
-/sdcard/android/layout_tests/dom/html/level2/html/button04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement64.html
-/sdcard/android/layout_tests/dom/html/level2/html/table19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement16.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement97.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument16.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement47.html
-/sdcard/android/layout_tests/dom/html/level2/html/table22.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/object03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement21.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOListElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLQuoteElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement101.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement19.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement134.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLScriptElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement50.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement83.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/table38.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHeadingElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement21.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement22.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement37.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement117.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement33.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDirectoryElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement23.html
-/sdcard/android/layout_tests/dom/html/level2/html/button06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement66.html
-/sdcard/android/layout_tests/dom/html/level2/html/table41.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement40.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement99.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement120.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement16.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAppletElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement49.html
-/sdcard/android/layout_tests/dom/html/level2/html/table24.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFontElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/object05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLCollection11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLImageElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement23.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOListElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement103.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument21.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement136.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHRElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement52.html
-/sdcard/android/layout_tests/dom/html/level2/html/table07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLSelectElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableColElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement85.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement09.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAnchorElement14.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/hasFeature02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement24.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement39.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement119.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement35.html
-/sdcard/android/layout_tests/dom/html/level2/html/table10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBaseFontElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement25.html
-/sdcard/android/layout_tests/dom/html/level2/html/button08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement68.html
-/sdcard/android/layout_tests/dom/html/level2/html/table43.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLInputElement12.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTextAreaElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableRowElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFrameElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement122.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement18.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFormElement04.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLAreaElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLObjectElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement71.html
-/sdcard/android/layout_tests/dom/html/level2/html/table26.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLIFrameElement06.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLFontElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/object07.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableCellElement10.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableElement25.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement105.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLLinkElement08.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLOptionElement05.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement21.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLMetaElement02.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLBodyElement01.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLDocument23.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement138.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLHRElement03.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLTableSectionElement11.html
-/sdcard/android/layout_tests/dom/html/level2/html/HTMLElement54.html
-/sdcard/android/layout_tests/dom/html/level2/html/table09.html
-/sdcard/android/layout_tests/dom/html/level2/html/object10.html
-/sdcard/android/layout_tests/dom/html/level2/core/hc_notationsremovenameditemns1.html
-/sdcard/android/layout_tests/dom/html/level2/core/hc_entitiessetnameditemns1.html
-/sdcard/android/layout_tests/dom/html/level2/core/setAttributeNS10.html
-/sdcard/android/layout_tests/dom/html/level2/core/hc_nodedocumentfragmentnormalize2.html
-/sdcard/android/layout_tests/dom/html/level2/core/hc_namednodemapinvalidtype1.html
-/sdcard/android/layout_tests/dom/html/level2/core/createAttributeNS06.html
-/sdcard/android/layout_tests/dom/html/level2/core/createDocumentType04.html
-/sdcard/android/layout_tests/dom/html/level2/core/hc_notationssetnameditemns1.html
-/sdcard/android/layout_tests/dom/html/level2/core/hc_entitiesremovenameditemns1.html
-/sdcard/android/layout_tests/dom/html/level2/core/hc_nodedocumentfragmentnormalize1.html
-/sdcard/android/layout_tests/dom/html/level2/core/createDocument08.html
-/sdcard/android/layout_tests/editing/style/temporary-span-crash.html
-/sdcard/android/layout_tests/editing/style/4230923.html
-/sdcard/android/layout_tests/editing/style/textdecoration-outside-of-unsplittable-element.html
-/sdcard/android/layout_tests/editing/style/textdecoration-outside-of-rooteditable.html
-/sdcard/android/layout_tests/editing/style/highlight-insert-paragraph.html
-/sdcard/android/layout_tests/editing/inserting/6609479-1.html
-/sdcard/android/layout_tests/editing/inserting/6609479.html
-/sdcard/android/layout_tests/editing/inserting/5549929-1.html
-/sdcard/android/layout_tests/editing/inserting/font-size-clears-from-typing-style.html
-/sdcard/android/layout_tests/editing/inserting/6104369.html
-/sdcard/android/layout_tests/editing/inserting/return-with-object-element.html
-/sdcard/android/layout_tests/editing/inserting/5803706-2.html
-/sdcard/android/layout_tests/editing/inserting/5685601-2.html
-/sdcard/android/layout_tests/editing/inserting/5607069-1.html
-/sdcard/android/layout_tests/editing/inserting/insert-br-quoted-007.html
-/sdcard/android/layout_tests/editing/inserting/5803706-1.html
-/sdcard/android/layout_tests/editing/inserting/5685601-1.html
-/sdcard/android/layout_tests/editing/inserting/5994480.html
-/sdcard/android/layout_tests/editing/inserting/6104369-2.html
-/sdcard/android/layout_tests/editing/inserting/insert-before-link-1.html
-/sdcard/android/layout_tests/editing/inserting/5378847.html
-/sdcard/android/layout_tests/editing/inserting/5685601-3.html
-/sdcard/android/layout_tests/editing/inserting/6703873-2.html
-/sdcard/android/layout_tests/editing/execCommand/toggle-style-2.html
-/sdcard/android/layout_tests/editing/execCommand/19403.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-div.html
-/sdcard/android/layout_tests/editing/execCommand/25256.html
-/sdcard/android/layout_tests/editing/execCommand/default-parameters.html
-/sdcard/android/layout_tests/editing/execCommand/5120591.html
-/sdcard/android/layout_tests/editing/execCommand/19455.html
-/sdcard/android/layout_tests/editing/execCommand/19087.html
-/sdcard/android/layout_tests/editing/execCommand/5543472-3.html
-/sdcard/android/layout_tests/editing/execCommand/5207369.html
-/sdcard/android/layout_tests/editing/execCommand/empty-span-removal.html
-/sdcard/android/layout_tests/editing/execCommand/4916583.html
-/sdcard/android/layout_tests/editing/execCommand/5658933-2.html
-/sdcard/android/layout_tests/editing/execCommand/5469868.html
-/sdcard/android/layout_tests/editing/execCommand/insert-list-with-id.html
-/sdcard/android/layout_tests/editing/execCommand/indent-div-inside-list.html
-/sdcard/android/layout_tests/editing/execCommand/5575101-1.html
-/sdcard/android/layout_tests/editing/execCommand/5432254-1.html
-/sdcard/android/layout_tests/editing/execCommand/indent-nested-blockquotes.html
-/sdcard/android/layout_tests/editing/execCommand/5062376.html
-/sdcard/android/layout_tests/editing/execCommand/indent-second-paragraph-in-blockquote.html
-/sdcard/android/layout_tests/editing/execCommand/findString-3.html
-/sdcard/android/layout_tests/editing/execCommand/toggle-text-decorations.html
-/sdcard/android/layout_tests/editing/execCommand/5142012-3.html
-/sdcard/android/layout_tests/editing/execCommand/indent-empty-table-cell.html
-/sdcard/android/layout_tests/editing/execCommand/5700414-1.html
-/sdcard/android/layout_tests/editing/execCommand/16049.html
-/sdcard/android/layout_tests/editing/execCommand/19653-1.html
-/sdcard/android/layout_tests/editing/execCommand/arguments-combinations.html
-/sdcard/android/layout_tests/editing/execCommand/5685604-1.html
-/sdcard/android/layout_tests/editing/execCommand/4128080-1.html
-/sdcard/android/layout_tests/editing/execCommand/5575101-3.html
-/sdcard/android/layout_tests/editing/execCommand/5119244.html
-/sdcard/android/layout_tests/editing/execCommand/5543472-2.html
-/sdcard/android/layout_tests/editing/execCommand/inline-style-after-indentoutdent.html
-/sdcard/android/layout_tests/editing/execCommand/5770834-1.html
-/sdcard/android/layout_tests/editing/execCommand/5483526.html
-/sdcard/android/layout_tests/editing/execCommand/5658933-1.html
-/sdcard/android/layout_tests/editing/execCommand/5164796.html
-/sdcard/android/layout_tests/editing/execCommand/6355786.html
-/sdcard/android/layout_tests/editing/execCommand/5604313.html
-/sdcard/android/layout_tests/editing/execCommand/19653-3.html
-/sdcard/android/layout_tests/editing/execCommand/outdent-regular-blockquote.html
-/sdcard/android/layout_tests/editing/execCommand/6444148.html
-/sdcard/android/layout_tests/editing/execCommand/5763082.html
-/sdcard/android/layout_tests/editing/execCommand/4976800.html
-/sdcard/android/layout_tests/editing/execCommand/4928635.html
-/sdcard/android/layout_tests/editing/execCommand/list-wrapping-image-crash.html
-/sdcard/android/layout_tests/editing/execCommand/4920742-2.html
-/sdcard/android/layout_tests/editing/execCommand/4917055.html
-/sdcard/android/layout_tests/editing/execCommand/5658933-3.html
-/sdcard/android/layout_tests/editing/execCommand/5575101-2.html
-/sdcard/android/layout_tests/editing/execCommand/5432254-2.html
-/sdcard/android/layout_tests/editing/execCommand/5144139-1.html
-/sdcard/android/layout_tests/editing/execCommand/5543472-1.html
-/sdcard/android/layout_tests/editing/execCommand/25320.html
-/sdcard/android/layout_tests/editing/execCommand/5210032.html
-/sdcard/android/layout_tests/editing/execCommand/12244.html
-/sdcard/android/layout_tests/editing/execCommand/15381.html
-/sdcard/android/layout_tests/editing/execCommand/5700414-2.html
-/sdcard/android/layout_tests/editing/execCommand/19653-2.html
-/sdcard/android/layout_tests/editing/execCommand/boldSelection.html
-/sdcard/android/layout_tests/editing/execCommand/4916235.html
-/sdcard/android/layout_tests/editing/execCommand/5458246.html
-/sdcard/android/layout_tests/editing/execCommand/toggle-styles.html
-/sdcard/android/layout_tests/editing/pasteboard/5761530-2.html
-/sdcard/android/layout_tests/editing/pasteboard/6018653.html
-/sdcard/android/layout_tests/editing/pasteboard/4930986-1.html
-/sdcard/android/layout_tests/editing/pasteboard/5780697-1.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-crash-with-extraneous-attribute.html
-/sdcard/android/layout_tests/editing/pasteboard/4930986-3.html
-/sdcard/android/layout_tests/editing/pasteboard/5245519.html
-/sdcard/android/layout_tests/editing/pasteboard/copy-display-none.html
-/sdcard/android/layout_tests/editing/pasteboard/5521237.html
-/sdcard/android/layout_tests/editing/pasteboard/newlines-around-floating-or-positioned.html
-/sdcard/android/layout_tests/editing/pasteboard/5078739.html
-/sdcard/android/layout_tests/editing/pasteboard/createMarkup-assert.xml
-/sdcard/android/layout_tests/editing/pasteboard/4930986-2.html
-/sdcard/android/layout_tests/editing/pasteboard/4840662.html
-/sdcard/android/layout_tests/editing/pasteboard/5480736.html
-/sdcard/android/layout_tests/editing/selection/5825350-1.html
-/sdcard/android/layout_tests/editing/selection/selection-invalid-offset.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-005.html
-/sdcard/android/layout_tests/editing/selection/rangeCount.html
-/sdcard/android/layout_tests/editing/selection/containsNode.html
-/sdcard/android/layout_tests/editing/selection/selectAllChildren.html
-/sdcard/android/layout_tests/editing/selection/cleared-by-relayout.html
-/sdcard/android/layout_tests/editing/selection/extend-selection.html
-/sdcard/android/layout_tests/editing/selection/5825350-2.html
-/sdcard/android/layout_tests/editing/selection/5794920-1.html
-/sdcard/android/layout_tests/editing/selection/deleteFromDocument.html
-/sdcard/android/layout_tests/editing/selection/5497643.html
-/sdcard/android/layout_tests/editing/selection/setBaseAndExtent-revert-selection.html
-/sdcard/android/layout_tests/editing/selection/crash-on-drag-with-mutation-events.html
-/sdcard/android/layout_tests/editing/selection/5714333.html
-/sdcard/android/layout_tests/editing/selection/select-all-user-select-none.html
-/sdcard/android/layout_tests/editing/selection/thai-word-at-document-end.html
-/sdcard/android/layout_tests/editing/selection/extend.html
-/sdcard/android/layout_tests/editing/selection/5241148.html
-/sdcard/android/layout_tests/editing/selection/5213963.html
-/sdcard/android/layout_tests/editing/selection/move-by-line-004.html
-/sdcard/android/layout_tests/editing/selection/extend-by-line-anonymous-content-crash.html
-/sdcard/android/layout_tests/editing/selection/5779984-1.html
-/sdcard/android/layout_tests/editing/undo/4059423-1.html
-/sdcard/android/layout_tests/editing/undo/4059423-2.html
-/sdcard/android/layout_tests/editing/undo/5658727.html
-/sdcard/android/layout_tests/editing/undo/5738768.html
-/sdcard/android/layout_tests/editing/deleting/25322-2.html
-/sdcard/android/layout_tests/editing/deleting/2610675-2.html
-/sdcard/android/layout_tests/editing/deleting/5847330-2.html
-/sdcard/android/layout_tests/editing/deleting/5156801.html
-/sdcard/android/layout_tests/editing/deleting/4866671.html
-/sdcard/android/layout_tests/editing/deleting/type-delete-after-quote-2.html
-/sdcard/android/layout_tests/editing/deleting/25322-1.html
-/sdcard/android/layout_tests/editing/deleting/merge-at-end-of-document.html
-/sdcard/android/layout_tests/editing/deleting/6026335.html
-/sdcard/android/layout_tests/editing/deleting/2610675-1.html
-/sdcard/android/layout_tests/editing/deleting/5847330-1.html
-/sdcard/android/layout_tests/editing/deleting/5433862-1.html
-/sdcard/android/layout_tests/editing/deleting/5495723.html
-/sdcard/android/layout_tests/editing/deleting/5290534.html
-/sdcard/android/layout_tests/editing/deleting/removeNodeCommand-assert.html
-/sdcard/android/layout_tests/editing/deleting/25322-3.html
-/sdcard/android/layout_tests/editing/deleting/2610675-3.html
-/sdcard/android/layout_tests/editing/deleting/5890684.html
-/sdcard/android/layout_tests/editing/deleting/in-visibly-empty-root.html
-/sdcard/android/layout_tests/editing/deleting/4875189.html
-/sdcard/android/layout_tests/fast/media/matchmedium-query-api.html
-/sdcard/android/layout_tests/fast/replaced/object-param-no-name.html
-/sdcard/android/layout_tests/fast/ruby/parse-rp.html
-/sdcard/android/layout_tests/fast/dynamic/subtree-common-root.html
-/sdcard/android/layout_tests/fast/dynamic/hovered-detach.html
-/sdcard/android/layout_tests/fast/dynamic/insertAdjacentHTML.html
-/sdcard/android/layout_tests/fast/dynamic/style-access-late-stylesheet-load.html
-/sdcard/android/layout_tests/fast/dynamic/insertAdjacentText.html
-/sdcard/android/layout_tests/fast/dynamic/insertAdjacentHTML-allowed-parents.html
-/sdcard/android/layout_tests/fast/dynamic/checkbox-selection-crash.html
-/sdcard/android/layout_tests/fast/dynamic/outerHTML-no-element.html
-/sdcard/android/layout_tests/fast/dynamic/5872671.html
-/sdcard/android/layout_tests/fast/dynamic/ancestor-to-absolute.html
-/sdcard/android/layout_tests/fast/dynamic/float-remove-above-line.html
-/sdcard/android/layout_tests/fast/dynamic/recursive-layout.html
-/sdcard/android/layout_tests/fast/dynamic/inline-to-block-crash.html
-/sdcard/android/layout_tests/fast/text/whitespace/nowrap-line-break-after-white-space.html
-/sdcard/android/layout_tests/fast/text/find-backwards.html
-/sdcard/android/layout_tests/fast/text/large-text-composed-char-dos.html
-/sdcard/android/layout_tests/fast/text/find-quotes.html
-/sdcard/android/layout_tests/fast/text/find-case-folding.html
-/sdcard/android/layout_tests/fast/text/text-shadow-extreme-value.html
-/sdcard/android/layout_tests/fast/text/find-hidden-text.html
-/sdcard/android/layout_tests/fast/text/line-breaks-after-ideographic-comma-or-full-stop.html
-/sdcard/android/layout_tests/fast/text/find-spaces.html
-/sdcard/android/layout_tests/fast/text/text-large-negative-letter-spacing-with-opacity.html
-/sdcard/android/layout_tests/fast/encoding/gbk/chinese.html
-/sdcard/android/layout_tests/fast/encoding/gbk/x-euc-cn.html
-/sdcard/android/layout_tests/fast/encoding/gbk/gb_2312-80.html
-/sdcard/android/layout_tests/fast/encoding/gbk/cn-gb.html
-/sdcard/android/layout_tests/fast/encoding/gbk/csgb2312.html
-/sdcard/android/layout_tests/fast/encoding/gbk/iso-ir-58.html
-/sdcard/android/layout_tests/fast/encoding/gbk/csgb231280.html
-/sdcard/android/layout_tests/fast/encoding/gbk/gb2312.html
-/sdcard/android/layout_tests/fast/encoding/gbk/gbk.html
-/sdcard/android/layout_tests/fast/encoding/gbk/x-gbk.html
-/sdcard/android/layout_tests/fast/encoding/gbk/EUC-CN.html
-/sdcard/android/layout_tests/fast/encoding/gbk/close-gbk-converter.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/hebrew.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/csISO88598I.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/8859-8.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/8859-8-e.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/8859-8-i.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/logical.html
-/sdcard/android/layout_tests/fast/encoding/hebrew/iso-ir-138.html
-/sdcard/android/layout_tests/fast/encoding/pseudo-xml-4.html
-/sdcard/android/layout_tests/fast/encoding/no-charset-on-dynamic-script-load.html
-/sdcard/android/layout_tests/fast/encoding/utf-32-little-endian-bom.html
-/sdcard/android/layout_tests/fast/encoding/bandai-co-jp-releases.html
-/sdcard/android/layout_tests/fast/encoding/utf-32-big-endian-bom.html
-/sdcard/android/layout_tests/fast/encoding/css-charset-evil.html
-/sdcard/android/layout_tests/fast/encoding/css-charset.html
-/sdcard/android/layout_tests/fast/encoding/xml-charset-utf16.html
-/sdcard/android/layout_tests/fast/encoding/pseudo-xml-3.html
-/sdcard/android/layout_tests/fast/encoding/tag-in-title.html
-/sdcard/android/layout_tests/fast/encoding/noscript-in-head.html
-/sdcard/android/layout_tests/fast/encoding/css-cached-bom.html
-/sdcard/android/layout_tests/fast/encoding/preload-encoding.html
-/sdcard/android/layout_tests/fast/encoding/charset-invalid.html
-/sdcard/android/layout_tests/fast/encoding/pseudo-tags-in-attributes.html
-/sdcard/android/layout_tests/fast/encoding/decoder-allow-null-chars.html
-/sdcard/android/layout_tests/fast/encoding/css-charset-dom.html
-/sdcard/android/layout_tests/fast/encoding/charset-utf16.html
-/sdcard/android/layout_tests/fast/encoding/char-encoding.html
-/sdcard/android/layout_tests/fast/encoding/css-link-charset.html
-/sdcard/android/layout_tests/fast/encoding/latin1-winlatin.html
-/sdcard/android/layout_tests/fast/encoding/high-bit-latin1.html
-/sdcard/android/layout_tests/fast/encoding/bom-in-content.html
-/sdcard/android/layout_tests/fast/encoding/bom-in-content-utf16.html
-/sdcard/android/layout_tests/fast/encoding/namespace-tolerance.html
-/sdcard/android/layout_tests/fast/encoding/misplaced-xml-declaration.html
-/sdcard/android/layout_tests/fast/encoding/euckr-name.html
-/sdcard/android/layout_tests/fast/encoding/charset-xuser-defined.html
-/sdcard/android/layout_tests/fast/encoding/pseudo-xml-2.html
-/sdcard/android/layout_tests/fast/encoding/floraexpress-ru.html
-/sdcard/android/layout_tests/fast/encoding/charset-cp1251.html
-/sdcard/android/layout_tests/fast/encoding/charset-unicode.html
-/sdcard/android/layout_tests/fast/encoding/meta-charset.html
-/sdcard/android/layout_tests/fast/encoding/xml-utf-8-default.xml
-/sdcard/android/layout_tests/fast/encoding/pseudo-xml.html
-/sdcard/android/layout_tests/fast/encoding/yahoo-mail.html
-/sdcard/android/layout_tests/fast/encoding/ahram-org-eg.html
-/sdcard/android/layout_tests/fast/encoding/script-in-head.html
-/sdcard/android/layout_tests/fast/encoding/mispositioned-meta.html
-/sdcard/android/layout_tests/fast/multicol/gap-non-negative.html
-/sdcard/android/layout_tests/fast/multicol/content-height-zero-crash.html
-/sdcard/android/layout_tests/fast/doctypes/doctype-at-end.html
-/sdcard/android/layout_tests/fast/doctypes/005-case-preserving.html
-/sdcard/android/layout_tests/fast/doctypes/doctype-in-element.html
-/sdcard/android/layout_tests/fast/doctypes/doctype-after-comment.html
-/sdcard/android/layout_tests/fast/doctypes/doctype-parsing.html
-/sdcard/android/layout_tests/fast/doctypes/html-doctype.html
-/sdcard/android/layout_tests/fast/cookies/local-file-can-set-cookies.html
-/sdcard/android/layout_tests/fast/css-generated-content/empty-content-with-float-crash.html
-/sdcard/android/layout_tests/fast/css-generated-content/reset-content-to-initial.html
-/sdcard/android/layout_tests/fast/workers/worker-close.html
-/sdcard/android/layout_tests/fast/workers/worker-context-gc.html
-/sdcard/android/layout_tests/fast/workers/worker-constructor.html
-/sdcard/android/layout_tests/fast/workers/worker-timeout.html
-/sdcard/android/layout_tests/fast/workers/worker-messageport.html
-/sdcard/android/layout_tests/fast/workers/worker-gc.html
-/sdcard/android/layout_tests/fast/workers/worker-replace-self.html
-/sdcard/android/layout_tests/fast/workers/worker-event-listener.html
-/sdcard/android/layout_tests/fast/workers/worker-cloneport.html
-/sdcard/android/layout_tests/fast/workers/worker-call.html
-/sdcard/android/layout_tests/fast/workers/worker-messageport-gc.html
-/sdcard/android/layout_tests/fast/workers/stress-js-execution.html
-/sdcard/android/layout_tests/fast/workers/worker-terminate.html
-/sdcard/android/layout_tests/fast/workers/use-machine-stack.html
-/sdcard/android/layout_tests/fast/workers/worker-navigator.html
-/sdcard/android/layout_tests/fast/workers/worker-script-error.html
-/sdcard/android/layout_tests/fast/workers/worker-replace-global-constructor.html
-/sdcard/android/layout_tests/fast/transforms/container-transform-crash.html
-/sdcard/android/layout_tests/fast/leaks/001.html
-/sdcard/android/layout_tests/fast/leaks/002.html
-/sdcard/android/layout_tests/fast/borders/border-radius-parsing.html
-/sdcard/android/layout_tests/fast/innerHTML/innerHTML-custom-tag.html
-/sdcard/android/layout_tests/fast/innerHTML/additional-inline-style.html
-/sdcard/android/layout_tests/fast/innerHTML/005.html
-/sdcard/android/layout_tests/fast/innerHTML/javascript-url.html
-/sdcard/android/layout_tests/fast/innerHTML/innerHTML-case.html
-/sdcard/android/layout_tests/fast/overflow/onscroll-layer-self-destruct.html
-/sdcard/android/layout_tests/fast/overflow/generated-content-crash.html
-/sdcard/android/layout_tests/fast/overflow/overflow-y-scroll.html
-/sdcard/android/layout_tests/fast/events/dispatch-to-handle-event.html
-/sdcard/android/layout_tests/fast/events/scroll-during-zoom-change.html
-/sdcard/android/layout_tests/fast/events/scroll-event-does-not-bubble.html
-/sdcard/android/layout_tests/fast/events/onload-after-document-close-with-subresource.html
-/sdcard/android/layout_tests/fast/events/message-channel-gc-4.html
-/sdcard/android/layout_tests/fast/events/message-channel-listener-circular-ownership.html
-/sdcard/android/layout_tests/fast/events/message-port-constructor-for-deleted-document.html
-/sdcard/android/layout_tests/fast/events/dispatchEvent-crash.html
-/sdcard/android/layout_tests/fast/events/programmatic-check-no-change-event.html
-/sdcard/android/layout_tests/fast/events/message-port-inactive-document.html
-/sdcard/android/layout_tests/fast/events/onunload-body-property.html
-/sdcard/android/layout_tests/fast/events/event-trace.html
-/sdcard/android/layout_tests/fast/events/init-event-after-dispatch.html
-/sdcard/android/layout_tests/fast/events/delayed-style-mutation-event-crash.html
-/sdcard/android/layout_tests/fast/events/keydown-keypress-focus-change.html
-/sdcard/android/layout_tests/fast/events/no-blur-on-page-leave.html
-/sdcard/android/layout_tests/fast/events/onload-name-collision.html
-/sdcard/android/layout_tests/fast/events/div-focus.html
-/sdcard/android/layout_tests/fast/events/overflow-events.html
-/sdcard/android/layout_tests/fast/events/create-document-crash-on-attach-event.html
-/sdcard/android/layout_tests/fast/events/no-blur-on-enter-button.html
-/sdcard/android/layout_tests/fast/events/keypress-removed-node.html
-/sdcard/android/layout_tests/fast/events/shadow-boundary-crossing.html
-/sdcard/android/layout_tests/fast/events/submit-reset-nested-bubble.html
-/sdcard/android/layout_tests/fast/events/message-port-deleted-frame.html
-/sdcard/android/layout_tests/fast/events/nested-event-remove-node-crash.html
-/sdcard/android/layout_tests/fast/events/onsubmit-bubbling.html
-/sdcard/android/layout_tests/fast/events/onload-fires-twice.html
-/sdcard/android/layout_tests/fast/events/message-port-no-wrapper.html
-/sdcard/android/layout_tests/fast/events/mousedown_in_scrollbar.html
-/sdcard/android/layout_tests/fast/events/onload-single-line-comment.html
-/sdcard/android/layout_tests/fast/events/message-channel-gc-2.html
-/sdcard/android/layout_tests/fast/events/window-load-capture.html
-/sdcard/android/layout_tests/fast/events/message-port-deleted-document.html
-/sdcard/android/layout_tests/fast/events/event-instanceof.html
-/sdcard/android/layout_tests/fast/events/message-channel-gc.html
-/sdcard/android/layout_tests/fast/events/event-creation.html
-/sdcard/android/layout_tests/fast/events/event-listener-sharing.html
-/sdcard/android/layout_tests/fast/events/caller-access-from-event-listener.html
-/sdcard/android/layout_tests/fast/events/stopPropagation-submit.html
-/sdcard/android/layout_tests/fast/events/remove-event-listener.html
-/sdcard/android/layout_tests/fast/events/mouseup-outside-button.html
-/sdcard/android/layout_tests/fast/events/iframe-object-onload.html
-/sdcard/android/layout_tests/fast/events/no-window-load.html
-/sdcard/android/layout_tests/fast/events/event-listener-html-non-html-confusion.html
-/sdcard/android/layout_tests/fast/events/onerror-bubbling.html
-/sdcard/android/layout_tests/fast/events/keydown-remove-frame.html
-/sdcard/android/layout_tests/fast/events/message-channel-gc-3.html
-/sdcard/android/layout_tests/fast/events/event-targets.html
-/sdcard/android/layout_tests/fast/events/space-scroll-event.html
-/sdcard/android/layout_tests/fast/events/onload-after-document-close-no-subresource.html
-/sdcard/android/layout_tests/fast/events/nested-window-event.html
-/sdcard/android/layout_tests/fast/events/selectstart-during-autoscroll.html
-/sdcard/android/layout_tests/fast/events/stopPropagation-checkbox.html
-/sdcard/android/layout_tests/fast/events/message-port-clone.html
-/sdcard/android/layout_tests/fast/events/tab-crash-with-image-map.html
-/sdcard/android/layout_tests/fast/events/simulated-key-state.html
-/sdcard/android/layout_tests/fast/events/init-event-null-view.html
-/sdcard/android/layout_tests/fast/events/init-events.html
-/sdcard/android/layout_tests/fast/events/onunload-window-property.html
-/sdcard/android/layout_tests/fast/events/message-port.html
-/sdcard/android/layout_tests/fast/html/tab-order.html
-/sdcard/android/layout_tests/fast/html/xhtml-serialize.html
-/sdcard/android/layout_tests/fast/html/empty-fragment-id-goto-top.html
-/sdcard/android/layout_tests/fast/html/script-allowed-types-languages.html
-/sdcard/android/layout_tests/fast/html/text-field-input-types.html
-/sdcard/android/layout_tests/fast/html/draggable.html
-/sdcard/android/layout_tests/fast/html/body-offset-properties.html
-/sdcard/android/layout_tests/fast/images/image-empty-data.html
-/sdcard/android/layout_tests/fast/images/text-content-crash.html
-/sdcard/android/layout_tests/fast/images/border.html
-/sdcard/android/layout_tests/fast/images/animated-background-image-crash.html
-/sdcard/android/layout_tests/fast/images/load-img-with-empty-src.html
-/sdcard/android/layout_tests/fast/images/text-content-crash-2.html
-/sdcard/android/layout_tests/fast/inspector/cssURLQuotes.html
-/sdcard/android/layout_tests/fast/flexbox/repaint-scrollbar.html
-/sdcard/android/layout_tests/fast/flexbox/inline-children-crash.html
-/sdcard/android/layout_tests/fast/tokenizer/nested-cached-scripts.html
-/sdcard/android/layout_tests/fast/tokenizer/image-empty-crash.html
-/sdcard/android/layout_tests/fast/tokenizer/lessthan-terminates-tags-and-attrs.html
-/sdcard/android/layout_tests/fast/tokenizer/ignore-tags-in-iframe.html
-/sdcard/android/layout_tests/fast/tokenizer/write-partial-entity.html
-/sdcard/android/layout_tests/fast/tokenizer/external-script-document-open.html
-/sdcard/android/layout_tests/fast/tokenizer/004.html
-/sdcard/android/layout_tests/fast/tokenizer/write-inline-script-open.html
-/sdcard/android/layout_tests/fast/tokenizer/write-external-script-open.html
-/sdcard/android/layout_tests/fast/tokenizer/doctype-search-reset.html
-/sdcard/android/layout_tests/fast/tokenizer/nested-multiple-scripts.html
-/sdcard/android/layout_tests/fast/tokenizer/nested-cached-scripts-and-stylesheet.html
-/sdcard/android/layout_tests/fast/tokenizer/ampersand-in-special-tag.html
-/sdcard/android/layout_tests/fast/tokenizer/write-unclosed-script.html
-/sdcard/android/layout_tests/fast/tokenizer/badscript.html
-/sdcard/android/layout_tests/fast/regex/quantified-assertions.html
-/sdcard/android/layout_tests/fast/regex/non-pattern-characters.html
-/sdcard/android/layout_tests/fast/regex/malformed-escapes.html
-/sdcard/android/layout_tests/fast/regex/early-acid3-86.html
-/sdcard/android/layout_tests/fast/regex/alternative-length-miscalculation.html
-/sdcard/android/layout_tests/fast/regex/test4.html
-/sdcard/android/layout_tests/fast/regex/non-capturing-backtracking.html
-/sdcard/android/layout_tests/fast/box-shadow/box-shadow-overflow-scroll.html
-/sdcard/android/layout_tests/fast/js/kde/Boolean.html
-/sdcard/android/layout_tests/fast/js/kde/garbage-n.html
-/sdcard/android/layout_tests/fast/js/kde/function.html
-/sdcard/android/layout_tests/fast/js/kde/function_length.html
-/sdcard/android/layout_tests/fast/js/kde/const.html
-/sdcard/android/layout_tests/fast/js/kde/constructor_length.html
-/sdcard/android/layout_tests/fast/js/kde/statements.html
-/sdcard/android/layout_tests/fast/js/kde/math.html
-/sdcard/android/layout_tests/fast/js/kde/assignments.html
-/sdcard/android/layout_tests/fast/js/kde/crash-1.html
-/sdcard/android/layout_tests/fast/js/kde/delete.html
-/sdcard/android/layout_tests/fast/js/kde/var_decl_init.html
-/sdcard/android/layout_tests/fast/js/kde/literals.html
-/sdcard/android/layout_tests/fast/js/kde/eval.html
-/sdcard/android/layout_tests/fast/js/kde/j-comment-3.html
-/sdcard/android/layout_tests/fast/js/kde/StringObject.html
-/sdcard/android/layout_tests/fast/js/kde/crash-2.html
-/sdcard/android/layout_tests/fast/js/kde/exception_propagation.html
-/sdcard/android/layout_tests/fast/js/kde/conditional.html
-/sdcard/android/layout_tests/fast/js/kde/scope.html
-/sdcard/android/layout_tests/fast/js/kde/parse.html
-/sdcard/android/layout_tests/fast/js/kde/function_arguments.html
-/sdcard/android/layout_tests/fast/js/kde/arguments-scope.html
-/sdcard/android/layout_tests/fast/js/kde/lval-exceptions.html
-/sdcard/android/layout_tests/fast/js/kde/operators.html
-/sdcard/android/layout_tests/fast/js/kde/Array.html
-/sdcard/android/layout_tests/fast/js/kde/md5-1.html
-/sdcard/android/layout_tests/fast/js/kde/object_prototype_tostring.html
-/sdcard/android/layout_tests/fast/js/kde/Date-setYear.html
-/sdcard/android/layout_tests/fast/js/kde/GlobalObject.html
-/sdcard/android/layout_tests/fast/js/kde/prototype_proto.html
-/sdcard/android/layout_tests/fast/js/kde/evil-n.html
-/sdcard/android/layout_tests/fast/js/kde/RegExp.html
-/sdcard/android/layout_tests/fast/js/kde/cast.html
-/sdcard/android/layout_tests/fast/js/kde/j-comment-4.html
-/sdcard/android/layout_tests/fast/js/kde/iteration.html
-/sdcard/android/layout_tests/fast/js/kde/comment-1.html
-/sdcard/android/layout_tests/fast/js/kde/string-2-n.html
-/sdcard/android/layout_tests/fast/js/kde/Prototype.html
-/sdcard/android/layout_tests/fast/js/kde/completion.html
-/sdcard/android/layout_tests/fast/js/kde/encode_decode_uri.html
-/sdcard/android/layout_tests/fast/js/kde/exceptions.html
-/sdcard/android/layout_tests/fast/js/kde/md5-2.html
-/sdcard/android/layout_tests/fast/js/kde/Error.html
-/sdcard/android/layout_tests/fast/js/kde/function_constructor.html
-/sdcard/android/layout_tests/fast/js/kde/object_prototype.html
-/sdcard/android/layout_tests/fast/js/kde/empty.html
-/sdcard/android/layout_tests/fast/js/kde/inbuilt_function_proto.html
-/sdcard/android/layout_tests/fast/js/kde/string-1-n.html
-/sdcard/android/layout_tests/fast/js/kde/func-decl.html
-/sdcard/android/layout_tests/fast/js/kde/comment-2.html
-/sdcard/android/layout_tests/fast/js/kde/inbuilt_function_tostring.html
-/sdcard/android/layout_tests/fast/js/kde/Object.html
-/sdcard/android/layout_tests/fast/js/kde/prototype_length.html
-/sdcard/android/layout_tests/fast/js/pic/cached-single-entry-transition.html
-/sdcard/android/layout_tests/fast/js/pic/cached-prototype-setter.html
-/sdcard/android/layout_tests/fast/js/pic/get-empty-string.html
-/sdcard/android/layout_tests/fast/js/pic/get-set-proxy-object.html
-/sdcard/android/layout_tests/fast/js/pic/rehash-poisons-structure.html
-/sdcard/android/layout_tests/fast/js/pic/cached-array-length-access.html
-/sdcard/android/layout_tests/fast/js/pic/cached-prototype-then-immediate.html
-/sdcard/android/layout_tests/fast/js/pic/cached-getter-setter.html
-/sdcard/android/layout_tests/fast/js/pic/cached-getter-dictionary-and-proto.html
-/sdcard/android/layout_tests/fast/js/pic/delete-global-object.html
-/sdcard/android/layout_tests/fast/js/pic/cached-deleted-properties.html
-/sdcard/android/layout_tests/fast/js/pic/dictionary-prototype.html
-/sdcard/android/layout_tests/fast/js/bitwise-and-on-undefined.html
-/sdcard/android/layout_tests/fast/js/exception-sequencing-binops.html
-/sdcard/android/layout_tests/fast/js/exception-thrown-from-eval-inside-closure.html
-/sdcard/android/layout_tests/fast/js/recursion-limit-equal.html
-/sdcard/android/layout_tests/fast/js/string_replace.html
-/sdcard/android/layout_tests/fast/js/ignored-result-ref-crash.html
-/sdcard/android/layout_tests/fast/js/function-toString-object-literals.html
-/sdcard/android/layout_tests/fast/js/numeric-conversion.html
-/sdcard/android/layout_tests/fast/js/select-options-remove.html
-/sdcard/android/layout_tests/fast/js/array-tostring-ignore-separator.html
-/sdcard/android/layout_tests/fast/js/exception-sequencing-binops2.html
-/sdcard/android/layout_tests/fast/js/function-declaration.html
-/sdcard/android/layout_tests/fast/js/number-toExponential.html
-/sdcard/android/layout_tests/fast/js/direct-entry-to-function-code.html
-/sdcard/android/layout_tests/fast/js/number-parsing-crash.html
-/sdcard/android/layout_tests/fast/js/vardecl-preserve-vardecl.html
-/sdcard/android/layout_tests/fast/js/unexpected-constant-crash.html
-/sdcard/android/layout_tests/fast/js/var-shadows-arg-gc-crash.html
-/sdcard/android/layout_tests/fast/js/arguments-bad-index.html
-/sdcard/android/layout_tests/fast/js/resize-array-assign.html
-/sdcard/android/layout_tests/fast/js/number-toString.html
-/sdcard/android/layout_tests/fast/js/this-non-object-proto.html
-/sdcard/android/layout_tests/fast/js/exception-thrown-from-new.html
-/sdcard/android/layout_tests/fast/js/cyclic-proto.html
-/sdcard/android/layout_tests/fast/js/vardecl-preserve-arguments.html
-/sdcard/android/layout_tests/fast/js/regexp-compile-crash.html
-/sdcard/android/layout_tests/fast/js/var-declarations-shadowing.html
-/sdcard/android/layout_tests/fast/js/ignored-result-null-comparison-crash.html
-/sdcard/android/layout_tests/fast/js/array-sort-reentrance.html
-/sdcard/android/layout_tests/fast/js/toString-for-var-decl.html
-/sdcard/android/layout_tests/fast/js/string-slice-abnormal-values.html
-/sdcard/android/layout_tests/fast/js/exception-linenums-in-html-1.html
-/sdcard/android/layout_tests/fast/js/do-while-without-semicolon.html
-/sdcard/android/layout_tests/fast/js/object-prototype-toLocaleString.html
-/sdcard/android/layout_tests/fast/js/function-redefinition.html
-/sdcard/android/layout_tests/fast/js/function-name.html
-/sdcard/android/layout_tests/fast/js/logical-or-jless.html
-/sdcard/android/layout_tests/fast/js/regexp-non-character.html
-/sdcard/android/layout_tests/fast/js/JSON-parse.html
-/sdcard/android/layout_tests/fast/js/assign.html
-/sdcard/android/layout_tests/fast/js/for-in-avoid-duplicates.html
-/sdcard/android/layout_tests/fast/js/math-transforms.html
-/sdcard/android/layout_tests/fast/js/sort-stability.html
-/sdcard/android/layout_tests/fast/js/try-catch-crash.html
-/sdcard/android/layout_tests/fast/js/duplicate-param-gc-crash.html
-/sdcard/android/layout_tests/fast/js/regexp-stack-overflow.html
-/sdcard/android/layout_tests/fast/js/function-argument-evaluation-before-exception.html
-/sdcard/android/layout_tests/fast/js/number-toprecision.html
-/sdcard/android/layout_tests/fast/js/string-property-iteration.html
-/sdcard/android/layout_tests/fast/js/do-while-semicolon.html
-/sdcard/android/layout_tests/fast/js/regexp-divequal.html
-/sdcard/android/layout_tests/fast/js/named-function-expression.html
-/sdcard/android/layout_tests/fast/js/array-iterate-backwards.html
-/sdcard/android/layout_tests/fast/js/constructor-attributes.html
-/sdcard/android/layout_tests/fast/js/array-some.html
-/sdcard/android/layout_tests/fast/js/missing-title-end-tag-js.html
-/sdcard/android/layout_tests/fast/js/object-extra-comma.html
-/sdcard/android/layout_tests/fast/js/number-tofixed.html
-/sdcard/android/layout_tests/fast/js/function-declarations-in-switch-statement.html
-/sdcard/android/layout_tests/fast/js/regexp-extended-characters-crash.html
-/sdcard/android/layout_tests/fast/js/typeof-codegen-crash.html
-/sdcard/android/layout_tests/fast/js/array-indexof.html
-/sdcard/android/layout_tests/fast/js/mod-crash.html
-/sdcard/android/layout_tests/fast/js/eval-keyword-vs-function.html
-/sdcard/android/layout_tests/fast/js/debugger.html
-/sdcard/android/layout_tests/fast/js/rehash-assign.html
-/sdcard/android/layout_tests/fast/js/object-prototype-constructor.html
-/sdcard/android/layout_tests/fast/js/function-call-aliased.html
-/sdcard/android/layout_tests/fast/js/string-replace-exception-crash.html
-/sdcard/android/layout_tests/fast/js/date-big-setmonth.html
-/sdcard/android/layout_tests/fast/js/array-enumerators-functions.html
-/sdcard/android/layout_tests/fast/js/exception-linenums-in-html-2.html
-/sdcard/android/layout_tests/fast/js/select-options-add.html
-/sdcard/android/layout_tests/fast/js/toString-dontEnum.html
-/sdcard/android/layout_tests/fast/js/toString-elision-trailing-comma.html
-/sdcard/android/layout_tests/fast/js/regexp-negative-special-characters.html
-/sdcard/android/layout_tests/fast/js/getter-setter-gc.html
-/sdcard/android/layout_tests/fast/js/string-substr.html
-/sdcard/android/layout_tests/fast/js/for-in-var-scope.html
-/sdcard/android/layout_tests/fast/js/exec-state-marking.html
-/sdcard/android/layout_tests/fast/js/primitive-method-this.html
-/sdcard/android/layout_tests/fast/js/string-sort.html
-/sdcard/android/layout_tests/fast/js/for-in-cached.html
-/sdcard/android/layout_tests/fast/js/delete-getters-setters.html
-/sdcard/android/layout_tests/fast/js/const-without-initializer.html
-/sdcard/android/layout_tests/fast/js/function-apply-aliased.html
-/sdcard/android/layout_tests/fast/js/sparse-array.html
-/sdcard/android/layout_tests/fast/js/same-origin-subframe-about-blank.html
-/sdcard/android/layout_tests/fast/js/nested-function-scope.html
-/sdcard/android/layout_tests/fast/js/function-constructor-single-line-comment.html
-/sdcard/android/layout_tests/fast/js/JSON-stringify.html
-/sdcard/android/layout_tests/fast/js/uncaught-exception-line-number.html
-/sdcard/android/layout_tests/fast/js/const.html
-/sdcard/android/layout_tests/fast/js/reparsing-semicolon-insertion.html
-/sdcard/android/layout_tests/fast/js/regexp-non-capturing-groups.html
-/sdcard/android/layout_tests/fast/js/has-own-property.html
-/sdcard/android/layout_tests/fast/js/window-location-href-file-urls.html
-/sdcard/android/layout_tests/fast/js/regexp-extended-characters-more.html
-/sdcard/android/layout_tests/fast/js/prefix-syntax.html
-/sdcard/android/layout_tests/fast/js/exceptions-thrown-in-callbacks.html
-/sdcard/android/layout_tests/fast/js/exception-with-handler-inside-eval-with-dynamic-scope.html
-/sdcard/android/layout_tests/fast/js/for-in-exeception.html
-/sdcard/android/layout_tests/fast/js/array-lastIndexOf.html
-/sdcard/android/layout_tests/fast/js/modify-non-references.html
-/sdcard/android/layout_tests/fast/js/exception-for-nonobject.html
-/sdcard/android/layout_tests/fast/js/regexp-find-first-asserted.html
-/sdcard/android/layout_tests/fast/js/sort-randomly.html
-/sdcard/android/layout_tests/fast/js/array-indexing.html
-/sdcard/android/layout_tests/fast/js/registerCachingAcrossBranchTargets.html
-/sdcard/android/layout_tests/fast/js/regexp-caching.html
-/sdcard/android/layout_tests/fast/js/typeof-syntax.html
-/sdcard/android/layout_tests/fast/js/regexp-character-match-out-of-order.html
-/sdcard/android/layout_tests/fast/js/date-toisostring.html
-/sdcard/android/layout_tests/fast/js/function-call-register-allocation.html
-/sdcard/android/layout_tests/fast/js/arguments.html
-/sdcard/android/layout_tests/fast/js/constant-folding.html
-/sdcard/android/layout_tests/fast/js/activation-object-function-lifetime.html
-/sdcard/android/layout_tests/fast/js/array-filter.html
-/sdcard/android/layout_tests/fast/js/implicit-global-to-global-reentry.html
-/sdcard/android/layout_tests/fast/js/array-reduceRight.html
-/sdcard/android/layout_tests/fast/js/array-foreach.html
-/sdcard/android/layout_tests/fast/js/regexp-many-brackets.html
-/sdcard/android/layout_tests/fast/js/activation-proto.html
-/sdcard/android/layout_tests/fast/js/toString-overrides.html
-/sdcard/android/layout_tests/fast/js/regexp-unicode-overflow.html
-/sdcard/android/layout_tests/fast/js/postfix-syntax.html
-/sdcard/android/layout_tests/fast/js/global-recursion-on-full-stack.html
-/sdcard/android/layout_tests/fast/js/closure-inside-extra-arg-call.html
-/sdcard/android/layout_tests/fast/js/number-cell-reuse.html
-/sdcard/android/layout_tests/fast/js/removing-Cf-characters.html
-/sdcard/android/layout_tests/fast/js/pretty-print.html
-/sdcard/android/layout_tests/fast/js/isPrototypeOf.html
-/sdcard/android/layout_tests/fast/js/prototypes.html
-/sdcard/android/layout_tests/fast/js/math.html
-/sdcard/android/layout_tests/fast/js/string-from-char-code.html
-/sdcard/android/layout_tests/fast/js/sort-no-jit-code-crash.html
-/sdcard/android/layout_tests/fast/js/eval-overriding.html
-/sdcard/android/layout_tests/fast/js/regexp-char-insensitive.html
-/sdcard/android/layout_tests/fast/js/array-float-delete.html
-/sdcard/android/layout_tests/fast/js/array-index-immediate-types.html
-/sdcard/android/layout_tests/fast/js/integer-extremes.html
-/sdcard/android/layout_tests/fast/js/console-non-string-values.html
-/sdcard/android/layout_tests/fast/js/regexp-non-bmp.html
-/sdcard/android/layout_tests/fast/js/regexp-range-bound-ffff.html
-/sdcard/android/layout_tests/fast/js/delete-then-put.html
-/sdcard/android/layout_tests/fast/js/nested-object-gc.html
-/sdcard/android/layout_tests/fast/js/string-replace-2.html
-/sdcard/android/layout_tests/fast/js/cached-eval-gc.html
-/sdcard/android/layout_tests/fast/js/property-getters-and-setters.html
-/sdcard/android/layout_tests/fast/js/array-reset-large-index.html
-/sdcard/android/layout_tests/fast/js/date-proto-generic-invocation.html
-/sdcard/android/layout_tests/fast/js/lastModified.html
-/sdcard/android/layout_tests/fast/js/encode-URI-test.html
-/sdcard/android/layout_tests/fast/js/codegen-loops-logical-nodes.html
-/sdcard/android/layout_tests/fast/js/string-capitalization.html
-/sdcard/android/layout_tests/fast/js/caller-property.html
-/sdcard/android/layout_tests/fast/js/regexp-overflow-too-big.html
-/sdcard/android/layout_tests/fast/js/repeat-cached-vm-reentry.html
-/sdcard/android/layout_tests/fast/js/date-DST-time-cusps.html
-/sdcard/android/layout_tests/fast/js/regexp-unicode-handling.html
-/sdcard/android/layout_tests/fast/js/unmatching-argument-count.html
-/sdcard/android/layout_tests/fast/js/text-field-resize.html
-/sdcard/android/layout_tests/fast/js/delete-multiple-global-blocks.html
-/sdcard/android/layout_tests/fast/js/eval-throw-return.html
-/sdcard/android/layout_tests/fast/js/duplicate-param-crash.html
-/sdcard/android/layout_tests/fast/js/switch-behaviour.html
-/sdcard/android/layout_tests/fast/js/delete-syntax.html
-/sdcard/android/layout_tests/fast/js/date-DST-pre-1970.html
-/sdcard/android/layout_tests/fast/js/array-splice.html
-/sdcard/android/layout_tests/fast/js/statement-list-register-crash.html
-/sdcard/android/layout_tests/fast/js/date-set-to-nan.html
-/sdcard/android/layout_tests/fast/js/code-serialize-paren.html
-/sdcard/android/layout_tests/fast/js/parse-backslash-before-newline.html
-/sdcard/android/layout_tests/fast/js/delete-function-parameter.html
-/sdcard/android/layout_tests/fast/js/exception-expression-offset.html
-/sdcard/android/layout_tests/fast/js/JSON-stringify-replacer.html
-/sdcard/android/layout_tests/fast/js/invalid-syntax-for-function.html
-/sdcard/android/layout_tests/fast/js/toString-and-valueOf-override.html
-/sdcard/android/layout_tests/fast/js/cyclic-prototypes.html
-/sdcard/android/layout_tests/fast/js/equality.html
-/sdcard/android/layout_tests/fast/js/order-of-operations.html
-/sdcard/android/layout_tests/fast/js/regexp-no-extensions.html
-/sdcard/android/layout_tests/fast/js/stack-unwinding.html
-/sdcard/android/layout_tests/fast/js/toString-try-else.html
-/sdcard/android/layout_tests/fast/js/reserved-words.html
-/sdcard/android/layout_tests/fast/js/function-dot-arguments-and-caller.html
-/sdcard/android/layout_tests/fast/js/do-while-expression-value.html
-/sdcard/android/layout_tests/fast/js/bom-in-file-retains-correct-offset.html
-/sdcard/android/layout_tests/fast/js/string-split-ignore-case.html
-/sdcard/android/layout_tests/fast/js/date-constructor.html
-/sdcard/android/layout_tests/fast/js/global-function-resolve.html
-/sdcard/android/layout_tests/fast/js/date-big-setdate.html
-/sdcard/android/layout_tests/fast/js/array-every.html
-/sdcard/android/layout_tests/fast/js/array-functions-non-arrays.html
-/sdcard/android/layout_tests/fast/js/function-toString-parentheses.html
-/sdcard/android/layout_tests/fast/js/while-expression-value.html
-/sdcard/android/layout_tests/fast/js/string-replace-3.html
-/sdcard/android/layout_tests/fast/js/avl-crash.html
-/sdcard/android/layout_tests/fast/js/vardecl-blocks-init.html
-/sdcard/android/layout_tests/fast/js/null-char-in-string.html
-/sdcard/android/layout_tests/fast/js/codegen-temporaries-multiple-global-blocks.html
-/sdcard/android/layout_tests/fast/js/char-at.html
-/sdcard/android/layout_tests/fast/js/function-constructor-newline-after-brace.html
-/sdcard/android/layout_tests/fast/js/propertyIsEnumerable.html
-/sdcard/android/layout_tests/fast/js/exception-thrown-from-equal.html
-/sdcard/android/layout_tests/fast/js/constructor.html
-/sdcard/android/layout_tests/fast/js/regexp-backreferences.html
-/sdcard/android/layout_tests/fast/js/regexp-overflow.html
-/sdcard/android/layout_tests/fast/js/var-declarations.html
-/sdcard/android/layout_tests/fast/js/continue-break-multiple-labels.html
-/sdcard/android/layout_tests/fast/js/toString-exception.html
-/sdcard/android/layout_tests/fast/js/regexp-test-null-string.html
-/sdcard/android/layout_tests/fast/js/date-parse-comments-test.html
-/sdcard/android/layout_tests/fast/js/select-options-remove-gc.html
-/sdcard/android/layout_tests/fast/js/implicit-call-with-global-reentry.html
-/sdcard/android/layout_tests/fast/js/array-tostring-and-join.html
-/sdcard/android/layout_tests/fast/js/function-names.html
-/sdcard/android/layout_tests/fast/js/primitive-property-access-edge-cases.html
-/sdcard/android/layout_tests/fast/js/date-preserve-milliseconds.html
-/sdcard/android/layout_tests/fast/js/sort-large-array.html
-/sdcard/android/layout_tests/fast/js/for-in-to-text.html
-/sdcard/android/layout_tests/fast/js/global-var-limit.html
-/sdcard/android/layout_tests/fast/js/static-scope-object.html
-/sdcard/android/layout_tests/fast/js/var-shadows-arg-crash.html
-/sdcard/android/layout_tests/fast/js/function-apply.html
-/sdcard/android/layout_tests/fast/js/array-reduce.html
-/sdcard/android/layout_tests/fast/js/function-prototype.html
-/sdcard/android/layout_tests/fast/js/tostring-exception-in-property-access.html
-/sdcard/android/layout_tests/fast/js/function-declaration-statement.html
-/sdcard/android/layout_tests/fast/js/large-expressions.html
-/sdcard/android/layout_tests/fast/js/date-negative-setmonth.html
-/sdcard/android/layout_tests/fast/js/reentrant-call-unwind.html
-/sdcard/android/layout_tests/fast/js/dictionary-no-cache.html
-/sdcard/android/layout_tests/fast/js/regexp-lastindex.html
-/sdcard/android/layout_tests/fast/js/finally-codegen-failure.html
-/sdcard/android/layout_tests/fast/js/instance-of-immediates.html
-/sdcard/android/layout_tests/fast/js/read-modify-eval.html
-/sdcard/android/layout_tests/fast/js/exception-thrown-from-function-with-lazy-activation.html
-/sdcard/android/layout_tests/fast/js/cyclic-ref-toString.html
-/sdcard/android/layout_tests/fast/js/function-toString-semicolon-insertion.html
-/sdcard/android/layout_tests/fast/js/exception-sequencing.html
-/sdcard/android/layout_tests/fast/js/date-big-constructor.html
-/sdcard/android/layout_tests/fast/js/gmail-re-re.html
-/sdcard/android/layout_tests/fast/js/deep-recursion-test.html
-/sdcard/android/layout_tests/fast/js/lexical-lookup-in-function-constructor.html
-/sdcard/android/layout_tests/fast/js/regexp-range-out-of-order.html
-/sdcard/android/layout_tests/fast/js/throw-from-array-sort.html
-/sdcard/android/layout_tests/fast/js/slash-lineterminator-parse.html
-/sdcard/android/layout_tests/fast/js/dot-node-base-exception.html
-/sdcard/android/layout_tests/fast/js/toString-stack-overflow.html
-/sdcard/android/layout_tests/fast/js/codegen-peephole-locals.html
-/sdcard/android/layout_tests/fast/js/constant-count.html
-/sdcard/android/layout_tests/fast/js/regexp-compile.html
-/sdcard/android/layout_tests/fast/js/declaration-in-block.html
-/sdcard/android/layout_tests/fast/js/eval-var-decl.html
-/sdcard/android/layout_tests/fast/js/eval-cross-window.html
-/sdcard/android/layout_tests/fast/js/function-decompilation-operators.html
-/sdcard/android/layout_tests/fast/js/sort-non-numbers.html
-/sdcard/android/layout_tests/fast/js/excessive-comma-usage.html
-/sdcard/android/layout_tests/fast/js/method-check.html
-/sdcard/android/layout_tests/fast/js/function-declarations.html
-/sdcard/android/layout_tests/fast/js/regexp-extended-characters-match.html
-/sdcard/android/layout_tests/fast/js/non-object-proto.html
-/sdcard/android/layout_tests/fast/js/toString-number-dot-expr.html
-/sdcard/android/layout_tests/fast/js/date-parse-test.html
-/sdcard/android/layout_tests/fast/js/exception-try-finally-scope-error.html
-/sdcard/android/layout_tests/fast/js/function-dot-arguments.html
-/sdcard/android/layout_tests/fast/js/toString-prefix-postfix-preserve-parens.html
-/sdcard/android/layout_tests/fast/js/regexp-ranges-and-escaped-hyphens.html
-/sdcard/android/layout_tests/fast/js/construct-global-object.html
-/sdcard/android/layout_tests/fast/js/array-holes.html
-/sdcard/android/layout_tests/fast/js/exception-linenums.html
-/sdcard/android/layout_tests/fast/js/codegen-temporaries.html
-/sdcard/android/layout_tests/fast/js/array-join-bug-11524.html
-/sdcard/android/layout_tests/fast/js/with-scope-gc.html
-/sdcard/android/layout_tests/fast/js/string-index-overflow.html
-/sdcard/android/layout_tests/fast/js/eval-cache-crash.html
-/sdcard/android/layout_tests/fast/js/array-map.html
-/sdcard/android/layout_tests/fast/js/exception-codegen-crash.html
-/sdcard/android/layout_tests/fast/js/comparefn-sort-stability.html
-/sdcard/android/layout_tests/fast/js/typeof-constant-string.html
-/sdcard/android/layout_tests/fast/js/navigator-plugins-crash.html
-/sdcard/android/layout_tests/fast/js/vardecl-preserve-parameters.html
-/sdcard/android/layout_tests/fast/inline/clean-after-removing-temp-boxes.html
-/sdcard/android/layout_tests/fast/inline/continuation-positioned-reparenting.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/early-acid3-65-excerpt.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/early-acid3-66-excerpt.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/cellpadding-attribute.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/insert-row.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/tBodies.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableElement/rows.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/activeElement.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/hasFocus-frameless-crash.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/writeln-call.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/document-plugins.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/title-get.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/object-by-name-unknown-child-element.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/object-by-name-or-id.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/title-set.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/write-multiple-calls.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/document-special-properties.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/url-getset.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/write-call.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/document-open-return-value.html
-/sdcard/android/layout_tests/fast/dom/HTMLDocument/writeln-multiple-calls.html
-/sdcard/android/layout_tests/fast/dom/HTMLLabelElement/form/test1.html
-/sdcard/android/layout_tests/fast/dom/Document/replace-child.html
-/sdcard/android/layout_tests/fast/dom/Document/title-property-creates-title-element.html
-/sdcard/android/layout_tests/fast/dom/Document/createElementNS-namespace-err.html
-/sdcard/android/layout_tests/fast/dom/Document/title-property-set-multiple-times.html
-/sdcard/android/layout_tests/fast/dom/Document/document-reopen.html
-/sdcard/android/layout_tests/fast/dom/Document/document-charset.html
-/sdcard/android/layout_tests/fast/dom/Document/replaceChild-null-oldChild.html
-/sdcard/android/layout_tests/fast/dom/Document/createAttributeNS-namespace-err.html
-/sdcard/android/layout_tests/fast/dom/Document/open-with-pending-load.html
-/sdcard/android/layout_tests/fast/dom/Document/document-write-doctype.html
-/sdcard/android/layout_tests/fast/dom/Document/doc-open-while-parsing.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/named-options.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/length-not-overridden.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/options-collection-set-string-length.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/listbox-select-reset.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/options-collection-detached.html
-/sdcard/android/layout_tests/fast/dom/HTMLSelectElement/remove-element-from-within-focus-handler-crash.html
-/sdcard/android/layout_tests/fast/dom/Selection/getRangeAt.html
-/sdcard/android/layout_tests/fast/dom/HTMLMetaElement/meta-attributes.html
-/sdcard/android/layout_tests/fast/dom/Element/fixed-position-offset-parent.html
-/sdcard/android/layout_tests/fast/dom/Element/getAttribute-check-case-sensitivity.html
-/sdcard/android/layout_tests/fast/dom/Element/attr-param-typechecking.html
-/sdcard/android/layout_tests/fast/dom/Element/attribute-uppercase.html
-/sdcard/android/layout_tests/fast/dom/Element/element-traversal.html
-/sdcard/android/layout_tests/fast/dom/Element/onclick-case.html
-/sdcard/android/layout_tests/fast/dom/Element/offsetLeft-offsetTop-body-quirk.html
-/sdcard/android/layout_tests/fast/dom/Element/contains-method.html
-/sdcard/android/layout_tests/fast/dom/Element/scrollWidth.html
-/sdcard/android/layout_tests/fast/dom/Element/setAttribute-with-colon.html
-/sdcard/android/layout_tests/fast/dom/Element/setAttribute-case-insensitivity.html
-/sdcard/android/layout_tests/fast/dom/Element/dimension-properties-unrendered.html
-/sdcard/android/layout_tests/fast/dom/Element/offsetLeft-offsetTop-html.html
-/sdcard/android/layout_tests/fast/dom/Element/offsetTop-table-cell.html
-/sdcard/android/layout_tests/fast/dom/DOMException/EventException.html
-/sdcard/android/layout_tests/fast/dom/DOMException/prototype-object.html
-/sdcard/android/layout_tests/fast/dom/DOMException/RangeException.html
-/sdcard/android/layout_tests/fast/dom/HTMLButtonElement/value/getset.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-reexecution.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-set-src.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-load-events.html
-/sdcard/android/layout_tests/fast/dom/HTMLScriptElement/script-decoding-error-after-setting-src.html
-/sdcard/android/layout_tests/fast/dom/HTMLOptionElement/collection-setter-getter.html
-/sdcard/android/layout_tests/fast/dom/HTMLOptionElement/set-option-index-text.html
-/sdcard/android/layout_tests/fast/dom/HTMLOptionElement/option-text.html
-/sdcard/android/layout_tests/fast/dom/HTMLOptionElement/option-prototype.html
-/sdcard/android/layout_tests/fast/dom/NodeList/5725058-crash-scenario-1.html
-/sdcard/android/layout_tests/fast/dom/NodeList/5725058-crash-scenario-2.html
-/sdcard/android/layout_tests/fast/dom/NodeList/childNodes-reset-cache.html
-/sdcard/android/layout_tests/fast/dom/NodeList/5725058-crash-scenario-3.html
-/sdcard/android/layout_tests/fast/dom/NodeList/invalidate-node-lists-when-parsing.html
-/sdcard/android/layout_tests/fast/dom/NodeList/item-by-id-with-no-document.html
-/sdcard/android/layout_tests/fast/dom/NodeList/nodelist-item-with-name.html
-/sdcard/android/layout_tests/fast/dom/DOMImplementation/createDocument-namespace-err.html
-/sdcard/android/layout_tests/fast/dom/DOMImplementation/createDocumentType-err.html
-/sdcard/android/layout_tests/fast/dom/CSSStyleDeclaration/transition-property-names.html
-/sdcard/android/layout_tests/fast/dom/CSSStyleDeclaration/css-properties-case-sensitive.html
-/sdcard/android/layout_tests/fast/dom/CSSStyleDeclaration/empty-string-property.html
-/sdcard/android/layout_tests/fast/dom/Node/normalize.html
-/sdcard/android/layout_tests/fast/dom/Node/initial-values.html
-/sdcard/android/layout_tests/fast/dom/Node/DOMNodeRemovedEvent.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/viewless-document.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/caseID-almost-strict.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/elementRoot.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/caseID-strict.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/not-supported-namespace-in-selector.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/id-fastpath.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/dumpNodeList.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/caseTag.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/undefined-null-stringify.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/detached-element.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/caseID.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/bug-17313.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/id-fastpath-almost-strict.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/id-fastpath-strict.html
-/sdcard/android/layout_tests/fast/dom/SelectorAPI/dumpNodeList-almost-strict.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableSectionElement/rows.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/checked-pseudo-selector.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/input-text-reset.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/size-as-number.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/duplicate-element-names.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/input-hidden-value.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/input-checked-reset.html
-/sdcard/android/layout_tests/fast/dom/HTMLInputElement/size-attribute.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/array/001.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/array/002.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/array/003.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/array/004.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/002.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/012.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/004.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/014.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/006.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/008.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/dumpNodeList.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/001.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/003.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/013.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/005.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/015.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/007.html
-/sdcard/android/layout_tests/fast/dom/getElementsByClassName/009.html
-/sdcard/android/layout_tests/fast/dom/TreeWalker/TreeWalker-currentNode.html
-/sdcard/android/layout_tests/fast/dom/HTMLDivElement/align/getset.html
-/sdcard/android/layout_tests/fast/dom/Text/replaceWholeText.html
-/sdcard/android/layout_tests/fast/dom/HTMLFormElement/adopt-assertion.html
-/sdcard/android/layout_tests/fast/dom/HTMLFormElement/document-deactivation-callback-crash.html
-/sdcard/android/layout_tests/fast/dom/HTMLFormElement/htmlformelement-indexed-getter.html
-/sdcard/android/layout_tests/fast/dom/HTMLFormElement/elements-not-in-document.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-override-window-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-override-location-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-using-with.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-on-proto-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-shadow-location-using-string.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-on-proto-using-with.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-on-proto.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-shadow-window-using-js-object-with-location-field.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/window-shadow-location-using-js-object-with-toString.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-using-with.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-on-proto-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-on-proto-using-with.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-toString-on-proto.html
-/sdcard/android/layout_tests/fast/dom/Window/Location/location-override-valueOf-using-defineGetter.html
-/sdcard/android/layout_tests/fast/dom/Window/window-closed-crash.html
-/sdcard/android/layout_tests/fast/dom/Window/window-function-name-getter-precedence.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-self.html
-/sdcard/android/layout_tests/fast/dom/Window/console-functions.html
-/sdcard/android/layout_tests/fast/dom/Window/window-postmessage-args.html
-/sdcard/android/layout_tests/fast/dom/Window/attr-constructor.html
-/sdcard/android/layout_tests/fast/dom/Window/window-remove-event-listener.html
-/sdcard/android/layout_tests/fast/dom/Window/window-frames-self-referential.html
-/sdcard/android/layout_tests/fast/dom/Window/redirect-with-timer.html
-/sdcard/android/layout_tests/fast/dom/Window/setting-properties-on-closed-window.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-parent.html
-/sdcard/android/layout_tests/fast/dom/Window/window-access-after-navigation.html
-/sdcard/android/layout_tests/fast/dom/Window/window-appendages-cleared.html
-/sdcard/android/layout_tests/fast/dom/Window/window-special-properties.html
-/sdcard/android/layout_tests/fast/dom/Window/window-custom-prototype.html
-/sdcard/android/layout_tests/fast/dom/Window/window-collection-length-no-crash.html
-/sdcard/android/layout_tests/fast/dom/Window/setTimeout-no-arguments.html
-/sdcard/android/layout_tests/fast/dom/Window/getMatchedCSSRules-null-crash.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-self-from-other-frame.html
-/sdcard/android/layout_tests/fast/dom/Window/window-custom-prototype-crash.html
-/sdcard/android/layout_tests/fast/dom/Window/setTimeout-string-argument.html
-/sdcard/android/layout_tests/fast/dom/Window/window-object-cross-frame-calls.html
-/sdcard/android/layout_tests/fast/dom/Window/window-location-replace-functions.html
-/sdcard/android/layout_tests/fast/dom/Window/dispatchEvent.html
-/sdcard/android/layout_tests/fast/dom/Window/window-function-frame-getter-precedence.html
-/sdcard/android/layout_tests/fast/dom/Window/atob-btoa.html
-/sdcard/android/layout_tests/fast/dom/Window/clear-timeout.html
-/sdcard/android/layout_tests/fast/dom/Window/window-early-properties-xhr.html
-/sdcard/android/layout_tests/fast/dom/Window/window-property-clearing.html
-/sdcard/android/layout_tests/fast/dom/Window/element-constructors-on-window.html
-/sdcard/android/layout_tests/fast/dom/Window/orphaned-frame-access.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-pending-url.html
-/sdcard/android/layout_tests/fast/dom/Window/window-resize-and-move-sub-frame.html
-/sdcard/android/layout_tests/fast/dom/Window/console-trace.html
-/sdcard/android/layout_tests/fast/dom/Window/alert-undefined.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-top.html
-/sdcard/android/layout_tests/fast/dom/Window/global-opener-function.html
-/sdcard/android/layout_tests/fast/dom/Window/window-property-shadowing.html
-/sdcard/android/layout_tests/fast/dom/Window/remove-timeout-crash.html
-/sdcard/android/layout_tests/fast/dom/Window/customized-property-survives-gc.html
-/sdcard/android/layout_tests/fast/dom/Window/timeout-callback-scope.html
-/sdcard/android/layout_tests/fast/dom/Window/window-property-shadowing-name.html
-/sdcard/android/layout_tests/fast/dom/Window/window-open-parent-no-parent.html
-/sdcard/android/layout_tests/fast/dom/Window/closure-access-after-navigation-iframe.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableRowElement/cells.html
-/sdcard/android/layout_tests/fast/dom/HTMLTableRowElement/insertCell.html
-/sdcard/android/layout_tests/fast/dom/HTMLFontElement/size-attribute.html
-/sdcard/android/layout_tests/fast/dom/HTMLObjectElement/form/test1.html
-/sdcard/android/layout_tests/fast/dom/HTMLObjectElement/object-as-frame.html
-/sdcard/android/layout_tests/fast/dom/HTMLElement/innerHTML-selection-crash.html
-/sdcard/android/layout_tests/fast/dom/HTMLElement/set-inner-outer-optimization.html
-/sdcard/android/layout_tests/fast/dom/Range/compareBoundaryPoints-1.html
-/sdcard/android/layout_tests/fast/dom/Range/range-compareNode.html
-/sdcard/android/layout_tests/fast/dom/Range/range-comparePoint.html
-/sdcard/android/layout_tests/fast/dom/Range/acid3-surround-contents.html
-/sdcard/android/layout_tests/fast/dom/Range/mutation.html
-/sdcard/android/layout_tests/fast/dom/Range/deleted-range-endpoints.html
-/sdcard/android/layout_tests/fast/dom/Range/13000.html
-/sdcard/android/layout_tests/fast/dom/Range/range-processing-instructions.html
-/sdcard/android/layout_tests/fast/dom/Range/range-insertNode-separate-endContainer.html
-/sdcard/android/layout_tests/fast/dom/Range/range-intersectsNode.html
-/sdcard/android/layout_tests/fast/dom/Range/range-isPointInRange.html
-/sdcard/android/layout_tests/fast/dom/Range/compareBoundaryPoints-2.html
-/sdcard/android/layout_tests/fast/dom/Range/range-clone-empty.html
-/sdcard/android/layout_tests/fast/dom/Range/range-modifycontents.html
-/sdcard/android/layout_tests/fast/dom/Range/bug-19527.html
-/sdcard/android/layout_tests/fast/dom/Range/range-insertNode-splittext.html
-/sdcard/android/layout_tests/fast/dom/Range/surroundContents-check-boundary-points.html
-/sdcard/android/layout_tests/fast/dom/Range/range-exceptions.html
-/sdcard/android/layout_tests/fast/dom/HTMLHeadElement/head-check.html
-/sdcard/android/layout_tests/fast/dom/HTMLHtmlElement/set-version.html
-/sdcard/android/layout_tests/fast/dom/HTMLHtmlElement/duplicate-html-element-crash.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-lowsrc-getset.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-src-absolute-url.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-loading-gc.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-longdesc-absolute-url.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/constructor-mutation-event-dispatch.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-load-cross-document.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-without-renderer-width.html
-/sdcard/android/layout_tests/fast/dom/HTMLImageElement/image-natural-width-height.html
-/sdcard/android/layout_tests/fast/dom/StyleSheet/ownerNode-lifetime.html
-/sdcard/android/layout_tests/fast/dom/EntityReference/readonly-exceptions.html
-/sdcard/android/layout_tests/fast/dom/script-element-remove-self.html
-/sdcard/android/layout_tests/fast/dom/remove-named-attribute-crash.html
-/sdcard/android/layout_tests/fast/dom/style-sheet-candidate-remove-unrendered-document.html
-/sdcard/android/layout_tests/fast/dom/node-item.html
-/sdcard/android/layout_tests/fast/dom/clone-node-style.html
-/sdcard/android/layout_tests/fast/dom/script-element-without-frame-crash.html
-/sdcard/android/layout_tests/fast/dom/script-element-gc.html
-/sdcard/android/layout_tests/fast/dom/empty-hash-and-search.html
-/sdcard/android/layout_tests/fast/dom/duplicate-ids.html
-/sdcard/android/layout_tests/fast/dom/prototypes.html
-/sdcard/android/layout_tests/fast/dom/clone-node-form-elements.html
-/sdcard/android/layout_tests/fast/dom/import-attribute-node.html
-/sdcard/android/layout_tests/fast/dom/getter-on-window-object2.html
-/sdcard/android/layout_tests/fast/dom/objc-big-method-name.html
-/sdcard/android/layout_tests/fast/dom/importNode-prefix.html
-/sdcard/android/layout_tests/fast/dom/css-dom-read.html
-/sdcard/android/layout_tests/fast/dom/image-object.html
-/sdcard/android/layout_tests/fast/dom/gc-5.html
-/sdcard/android/layout_tests/fast/dom/cssTarget-crash.html
-/sdcard/android/layout_tests/fast/dom/DOMParser-assign-variable.html
-/sdcard/android/layout_tests/fast/dom/offset-parent-positioned-and-inline.html
-/sdcard/android/layout_tests/fast/dom/timer-clear-interval-in-handler.html
-/sdcard/android/layout_tests/fast/dom/implementation-createHTMLDocument.html
-/sdcard/android/layout_tests/fast/dom/iframe-document.html
-/sdcard/android/layout_tests/fast/dom/document-all-input.html
-/sdcard/android/layout_tests/fast/dom/getelementsbytagnamens-mixed-namespaces.html
-/sdcard/android/layout_tests/fast/dom/object-plugin-hides-properties.html
-/sdcard/android/layout_tests/fast/dom/gc-2.html
-/sdcard/android/layout_tests/fast/dom/computed-style-set-property.html
-/sdcard/android/layout_tests/fast/dom/inner-text-001.html
-/sdcard/android/layout_tests/fast/dom/css-selectorText.html
-/sdcard/android/layout_tests/fast/dom/replace-first-child.html
-/sdcard/android/layout_tests/fast/dom/select-selectedIndex-multiple.html
-/sdcard/android/layout_tests/fast/dom/importNode-null.html
-/sdcard/android/layout_tests/fast/dom/space-to-text.html
-/sdcard/android/layout_tests/fast/dom/css-set-property-exception.html
-/sdcard/android/layout_tests/fast/dom/java-applet-calls.html
-/sdcard/android/layout_tests/fast/dom/plugin-attributes-enumeration.html
-/sdcard/android/layout_tests/fast/dom/html-attribute-types.html
-/sdcard/android/layout_tests/fast/dom/resource-locations-in-created-html-document.html
-/sdcard/android/layout_tests/fast/dom/comment-document-fragment.html
-/sdcard/android/layout_tests/fast/dom/createAttribute-exception.html
-/sdcard/android/layout_tests/fast/dom/noscript-style.html
-/sdcard/android/layout_tests/fast/dom/serialize-cdata.html
-/sdcard/android/layout_tests/fast/dom/createDocument.html
-/sdcard/android/layout_tests/fast/dom/getelementbyname-invalidation.html
-/sdcard/android/layout_tests/fast/dom/setAttributeNS-empty-namespace.html
-/sdcard/android/layout_tests/fast/dom/capturing-event-listeners.html
-/sdcard/android/layout_tests/fast/dom/title-text-property.html
-/sdcard/android/layout_tests/fast/dom/null-page-show-modal-dialog-crash.html
-/sdcard/android/layout_tests/fast/dom/incompatible-operations.html
-/sdcard/android/layout_tests/fast/dom/inner-text-rtl.html
-/sdcard/android/layout_tests/fast/dom/createDocument-empty.html
-/sdcard/android/layout_tests/fast/dom/documenturi-assigned-junk-implies-baseuri-null.html
-/sdcard/android/layout_tests/fast/dom/option-properties.html
-/sdcard/android/layout_tests/fast/dom/background-shorthand-csstext.html
-/sdcard/android/layout_tests/fast/dom/Range-insertNode-crash.html
-/sdcard/android/layout_tests/fast/dom/NamedNodeMap-setNamedItem-crash.html
-/sdcard/android/layout_tests/fast/dom/early-frame-url.html
-/sdcard/android/layout_tests/fast/dom/everything-to-string.html
-/sdcard/android/layout_tests/fast/dom/attribute-empty-value-no-children.html
-/sdcard/android/layout_tests/fast/dom/length-attribute-mapping.html
-/sdcard/android/layout_tests/fast/dom/documenturi-loses-to-base-tag.html
-/sdcard/android/layout_tests/fast/dom/createDocumentType2.html
-/sdcard/android/layout_tests/fast/dom/gc-6.html
-/sdcard/android/layout_tests/fast/dom/attribute-case-sensitivity.html
-/sdcard/android/layout_tests/fast/dom/compatMode-Compat.html
-/sdcard/android/layout_tests/fast/dom/namespaces-1.html
-/sdcard/android/layout_tests/fast/dom/getter-on-window-object.html
-/sdcard/android/layout_tests/fast/dom/constructors-overriding.html
-/sdcard/android/layout_tests/fast/dom/defaultView.html
-/sdcard/android/layout_tests/fast/dom/collection-null-like-arguments.html
-/sdcard/android/layout_tests/fast/dom/gc-3.html
-/sdcard/android/layout_tests/fast/dom/event-attribute-availability.html
-/sdcard/android/layout_tests/fast/dom/select-selectedIndex.html
-/sdcard/android/layout_tests/fast/dom/compatMode-Strict.html
-/sdcard/android/layout_tests/fast/dom/attribute-downcast-right.html
-/sdcard/android/layout_tests/fast/dom/document-all-select.html
-/sdcard/android/layout_tests/fast/dom/wrapper-context.html
-/sdcard/android/layout_tests/fast/dom/anchor-backslash.html
-/sdcard/android/layout_tests/fast/dom/css-mediarule-functions.html
-/sdcard/android/layout_tests/fast/dom/gc-acid3.html
-/sdcard/android/layout_tests/fast/dom/duplicate-ids-document-order.html
-/sdcard/android/layout_tests/fast/dom/exception-no-frame-inline-script-crash.html
-/sdcard/android/layout_tests/fast/dom/XMLSerializer-doctype2.html
-/sdcard/android/layout_tests/fast/dom/dir-no-body.html
-/sdcard/android/layout_tests/fast/dom/null-document-window-open-crash.html
-/sdcard/android/layout_tests/fast/dom/css-RGBValue.html
-/sdcard/android/layout_tests/fast/dom/documentElement-null.html
-/sdcard/android/layout_tests/fast/dom/innerHTML-nbsp.html
-/sdcard/android/layout_tests/fast/dom/createElementNS-empty-namespace.html
-/sdcard/android/layout_tests/fast/dom/class-all-whitespace.html
-/sdcard/android/layout_tests/fast/dom/wrapper-identity.html
-/sdcard/android/layout_tests/fast/dom/null-document-location-assign-crash.html
-/sdcard/android/layout_tests/fast/dom/createElement.html
-/sdcard/android/layout_tests/fast/dom/createElement-with-column.xml
-/sdcard/android/layout_tests/fast/dom/simultaneouslyRegsiteredTimerFireOrder.html
-/sdcard/android/layout_tests/fast/dom/clone-node-form-elements-with-attr.html
-/sdcard/android/layout_tests/fast/dom/setAttributeNS.html
-/sdcard/android/layout_tests/fast/dom/anchor-toString.html
-/sdcard/android/layout_tests/fast/dom/dom-add-optionelement.html
-/sdcard/android/layout_tests/fast/dom/location-assign.html
-/sdcard/android/layout_tests/fast/dom/documenturi-affects-relative-paths.html
-/sdcard/android/layout_tests/fast/dom/javascript-backslash.html
-/sdcard/android/layout_tests/fast/dom/setAttribute-using-initial-input-value.html
-/sdcard/android/layout_tests/fast/dom/css-shortHands.html
-/sdcard/android/layout_tests/fast/dom/generic-form-element-assert.html
-/sdcard/android/layout_tests/fast/dom/dom-instanceof.html
-/sdcard/android/layout_tests/fast/dom/array-special-accessors-should-ignore-items.html
-/sdcard/android/layout_tests/fast/dom/element-attribute-js-null.html
-/sdcard/android/layout_tests/fast/dom/css-dom-read-2.html
-/sdcard/android/layout_tests/fast/dom/navigator-cookieEnabled-no-crash.html
-/sdcard/android/layout_tests/fast/dom/import-document-fragment.html
-/sdcard/android/layout_tests/fast/dom/setter-type-enforcement.html
-/sdcard/android/layout_tests/fast/dom/XMLSerializer.html
-/sdcard/android/layout_tests/fast/dom/navigator-vendorSub.html
-/sdcard/android/layout_tests/fast/dom/outerText-no-element.html
-/sdcard/android/layout_tests/fast/dom/replace-child-siblings.html
-/sdcard/android/layout_tests/fast/dom/xmlhttprequest-constructor-in-detached-document.html
-/sdcard/android/layout_tests/fast/dom/constants.html
-/sdcard/android/layout_tests/fast/dom/inner-text-with-no-renderer.html
-/sdcard/android/layout_tests/fast/dom/gc-7.html
-/sdcard/android/layout_tests/fast/dom/onerror-img.html
-/sdcard/android/layout_tests/fast/dom/document-attribute-js-null.html
-/sdcard/android/layout_tests/fast/dom/css-element-attribute-js-null.html
-/sdcard/android/layout_tests/fast/dom/gc-11.html
-/sdcard/android/layout_tests/fast/dom/mutation-event-remove-inserted-node.html
-/sdcard/android/layout_tests/fast/dom/constructors-cached.html
-/sdcard/android/layout_tests/fast/dom/null-chardata-crash.html
-/sdcard/android/layout_tests/fast/dom/compatMode-AlmostStrict.html
-/sdcard/android/layout_tests/fast/dom/createElement-with-column.html
-/sdcard/android/layout_tests/fast/dom/exception-no-frame-timeout-crash.html
-/sdcard/android/layout_tests/fast/dom/title-text-property-2.html
-/sdcard/android/layout_tests/fast/dom/no-elements.html
-/sdcard/android/layout_tests/fast/dom/non-numeric-values-numeric-parameters.html
-/sdcard/android/layout_tests/fast/dom/gc-4.html
-/sdcard/android/layout_tests/fast/dom/inner-width-height.html
-/sdcard/android/layout_tests/fast/dom/XMLSerializer-doctype.html
-/sdcard/android/layout_tests/fast/dom/createElementNS.html
-/sdcard/android/layout_tests/fast/dom/undetectable-document-all.html
-/sdcard/android/layout_tests/fast/dom/prototype-chain.html
-/sdcard/android/layout_tests/fast/dom/gc-1.html
-/sdcard/android/layout_tests/fast/dom/script-add.html
-/sdcard/android/layout_tests/fast/dom/select-selectedIndex-bug-12942.html
-/sdcard/android/layout_tests/fast/dom/text-control-crash-on-select.html
-/sdcard/android/layout_tests/fast/dom/frame-contentWindow-crash.html
-/sdcard/android/layout_tests/fast/dom/document_write_params.html
-/sdcard/android/layout_tests/fast/dom/namednodemap-namelookup.html
-/sdcard/android/layout_tests/fast/dom/null-document-location-replace-crash.html
-/sdcard/android/layout_tests/fast/dom/htmlcollection-detectability.html
-/sdcard/android/layout_tests/fast/dom/documenturi-assigned-junk-implies-relative-urls-do-not-resolve.html
-/sdcard/android/layout_tests/fast/dom/collection-namedItem-via-item.html
-/sdcard/android/layout_tests/fast/dom/set-inner-text-newlines.html
-/sdcard/android/layout_tests/fast/dom/document-dir-property.html
-/sdcard/android/layout_tests/fast/dom/undetectable-style-filter.html
-/sdcard/android/layout_tests/fast/dom/domListEnumeration.html
-/sdcard/android/layout_tests/fast/dom/destroy-selected-radio-button-crash.html
-/sdcard/android/layout_tests/fast/dom/tabindex-clamp.html
-/sdcard/android/layout_tests/fast/dom/iframe-contentWindow-crash.html
-/sdcard/android/layout_tests/fast/dom/comment-dom-node.html
-/sdcard/android/layout_tests/fast/dom/constructors-cached-navigate.html
-/sdcard/android/layout_tests/fast/dom/features.html
-/sdcard/android/layout_tests/fast/dom/canvasContext2d-element-attribute-js-null.html
-/sdcard/android/layout_tests/fast/dom/remove-style-element.html
-/sdcard/android/layout_tests/fast/dom/attribute-namespaces-get-set.html
-/sdcard/android/layout_tests/fast/dom/innerHTML-escaping-attribute.html
-/sdcard/android/layout_tests/fast/dom/null-document-location-put-crash.html
-/sdcard/android/layout_tests/fast/dom/ImageDocument-image-deletion.html
-/sdcard/android/layout_tests/fast/dom/document-scripts.html
-/sdcard/android/layout_tests/fast/dom/cloneNode.html
-/sdcard/android/layout_tests/fast/dom/onload-open.html
-/sdcard/android/layout_tests/fast/gradients/crash-on-remove.html
-/sdcard/android/layout_tests/fast/invalid/test-case-tr-th-td-should-not-close-dl-list.html
-/sdcard/android/layout_tests/fast/invalid/nestedh3s-rapidweaver.html
-/sdcard/android/layout_tests/fast/forms/HTMLOptionElement_selected.html
-/sdcard/android/layout_tests/fast/forms/option-value-and-label.html
-/sdcard/android/layout_tests/fast/forms/menulist-selection-reset.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-customError-001.html
-/sdcard/android/layout_tests/fast/forms/textfield-focus-out.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-000.html
-/sdcard/android/layout_tests/fast/forms/form-data-encoding-normalization-overrun.html
-/sdcard/android/layout_tests/fast/forms/textarea-trailing-newline.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-002.html
-/sdcard/android/layout_tests/fast/forms/selection-functions.html
-/sdcard/android/layout_tests/fast/forms/select-no-name.html
-/sdcard/android/layout_tests/fast/forms/multiple-selected-options-innerHTML.html
-/sdcard/android/layout_tests/fast/forms/input-named-action-overrides-action-attribute.html
-/sdcard/android/layout_tests/fast/forms/empty-get.html
-/sdcard/android/layout_tests/fast/forms/display-none-in-onchange-keyboard.html
-/sdcard/android/layout_tests/fast/forms/4628409.html
-/sdcard/android/layout_tests/fast/forms/numeric-input-name.html
-/sdcard/android/layout_tests/fast/forms/activate-and-disabled-elements.html
-/sdcard/android/layout_tests/fast/forms/tabs-with-modifiers.html
-/sdcard/android/layout_tests/fast/forms/form-get-multipart2.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-002.html
-/sdcard/android/layout_tests/fast/forms/menulist-no-renderer-onmousedown.html
-/sdcard/android/layout_tests/fast/forms/select-replace-option.html
-/sdcard/android/layout_tests/fast/forms/textarea-setvalue-submit.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-007.html
-/sdcard/android/layout_tests/fast/forms/double-focus.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-004.html
-/sdcard/android/layout_tests/fast/forms/form-data-encoding-2.html
-/sdcard/android/layout_tests/fast/forms/inline-ignored-on-legend.html
-/sdcard/android/layout_tests/fast/forms/focus.html
-/sdcard/android/layout_tests/fast/forms/input-text-enter.html
-/sdcard/android/layout_tests/fast/forms/input-implicit-length-limit.html
-/sdcard/android/layout_tests/fast/forms/element-order.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-customError-002.html
-/sdcard/android/layout_tests/fast/forms/form-post-urlencoded.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-001.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-003.html
-/sdcard/android/layout_tests/fast/forms/8250.html
-/sdcard/android/layout_tests/fast/forms/var-name-conflict-in-form-event-handler.html
-/sdcard/android/layout_tests/fast/forms/listbox-select-all.html
-/sdcard/android/layout_tests/fast/forms/range-reset.html
-/sdcard/android/layout_tests/fast/forms/select-remove-option.html
-/sdcard/android/layout_tests/fast/forms/onselect-selectall.html
-/sdcard/android/layout_tests/fast/forms/input-select-webkit-user-select-none.html
-/sdcard/android/layout_tests/fast/forms/paste-multiline-text-input.html
-/sdcard/android/layout_tests/fast/forms/textarea-no-scroll-on-blur.html
-/sdcard/android/layout_tests/fast/forms/select-reset-multiple-selections-4-single-selection.html
-/sdcard/android/layout_tests/fast/forms/tab-in-input.html
-/sdcard/android/layout_tests/fast/forms/button-click-DOM.html
-/sdcard/android/layout_tests/fast/forms/submit-nil-value-field-assert.html
-/sdcard/android/layout_tests/fast/forms/domstring-replace-crash.html
-/sdcard/android/layout_tests/fast/forms/select-max-length.html
-/sdcard/android/layout_tests/fast/forms/form-get-multipart3.html
-/sdcard/android/layout_tests/fast/forms/select-out-of-bounds-index.html
-/sdcard/android/layout_tests/fast/forms/selected-index-assert.html
-/sdcard/android/layout_tests/fast/forms/legend-display-none.html
-/sdcard/android/layout_tests/fast/forms/form-collection-lookup.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-004.html
-/sdcard/android/layout_tests/fast/forms/select-list-box-mouse-focus.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-008.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-005.html
-/sdcard/android/layout_tests/fast/forms/required-attribute-001.html
-/sdcard/android/layout_tests/fast/forms/select-index-setter.html
-/sdcard/android/layout_tests/fast/forms/option-change-single-selected.html
-/sdcard/android/layout_tests/fast/forms/listbox-scroll-after-options-removed.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-customError-003.html
-/sdcard/android/layout_tests/fast/forms/input-selection-hidden.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-002.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-004.html
-/sdcard/android/layout_tests/fast/forms/select-set-inner.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-elementFromPoint.html
-/sdcard/android/layout_tests/fast/forms/missing-action.html
-/sdcard/android/layout_tests/fast/forms/listbox-typeahead-empty.html
-/sdcard/android/layout_tests/fast/forms/submit-to-url-fragment.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-005.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-009.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-006.html
-/sdcard/android/layout_tests/fast/forms/old-names.html
-/sdcard/android/layout_tests/fast/forms/required-attribute-002.html
-/sdcard/android/layout_tests/fast/forms/add-and-remove-option.html
-/sdcard/android/layout_tests/fast/forms/focus-style-pending.html
-/sdcard/android/layout_tests/fast/forms/textarea-initial-caret-position.html
-/sdcard/android/layout_tests/fast/forms/input-type-change-in-onfocus-mouse.html
-/sdcard/android/layout_tests/fast/forms/mutation-event-recalc.html
-/sdcard/android/layout_tests/fast/forms/slow-click.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-customError-004.html
-/sdcard/android/layout_tests/fast/forms/autofocus-attribute.html
-/sdcard/android/layout_tests/fast/forms/element-by-name.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-003.html
-/sdcard/android/layout_tests/fast/forms/radio-button-no-change-event.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-005.html
-/sdcard/android/layout_tests/fast/forms/input-maxlength.html
-/sdcard/android/layout_tests/fast/forms/select-reset.html
-/sdcard/android/layout_tests/fast/forms/input-hit-test-border.html
-/sdcard/android/layout_tests/fast/forms/pattern-attribute-001.html
-/sdcard/android/layout_tests/fast/forms/range-default-value.html
-/sdcard/android/layout_tests/fast/forms/shadow-tree-exposure.html
-/sdcard/android/layout_tests/fast/forms/paste-into-textarea.html
-/sdcard/android/layout_tests/fast/forms/radio-no-theme-padding.html
-/sdcard/android/layout_tests/fast/forms/textfield-drag-into-disabled.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-006.html
-/sdcard/android/layout_tests/fast/forms/saved-state-adoptNode-crash.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-007.html
-/sdcard/android/layout_tests/fast/forms/radio-check-click-and-drag.html
-/sdcard/android/layout_tests/fast/forms/11423.html
-/sdcard/android/layout_tests/fast/forms/cursor-position.html
-/sdcard/android/layout_tests/fast/forms/input-changing-value.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-004.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-001.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-006.html
-/sdcard/android/layout_tests/fast/forms/button-in-forms-collection.html
-/sdcard/android/layout_tests/fast/forms/input-delete.html
-/sdcard/android/layout_tests/fast/forms/placeholder-non-textfield.html
-/sdcard/android/layout_tests/fast/forms/option-constructor-selected.html
-/sdcard/android/layout_tests/fast/forms/input-multiple.html
-/sdcard/android/layout_tests/fast/forms/input-zero-height-focus.html
-/sdcard/android/layout_tests/fast/forms/pattern-attribute-002.html
-/sdcard/android/layout_tests/fast/forms/textarea-linewrap-dynamic.html
-/sdcard/android/layout_tests/fast/forms/placeholder-dom-property.html
-/sdcard/android/layout_tests/fast/forms/select-width-font-change.html
-/sdcard/android/layout_tests/fast/forms/text-field-setvalue-crash.html
-/sdcard/android/layout_tests/fast/forms/form-get-multipart.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-007.html
-/sdcard/android/layout_tests/fast/forms/select-type-ahead-list-box-no-selection.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-008.html
-/sdcard/android/layout_tests/fast/forms/textarea-crlf.html
-/sdcard/android/layout_tests/fast/forms/remove-radio-button-assert.html
-/sdcard/android/layout_tests/fast/forms/text-set-value-crash.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-001.html
-/sdcard/android/layout_tests/fast/forms/select-namedItem.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-005.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-002.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-007.html
-/sdcard/android/layout_tests/fast/forms/add-remove-option-modification-event.html
-/sdcard/android/layout_tests/fast/forms/input-type-change-in-onfocus-keyboard.html
-/sdcard/android/layout_tests/fast/forms/option-in-optgroup-removal.html
-/sdcard/android/layout_tests/fast/forms/form-data-encoding.html
-/sdcard/android/layout_tests/fast/forms/pattern-attribute-003.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-patternMismatch-001.html
-/sdcard/android/layout_tests/fast/forms/textarea-default-value-leading-newline.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-008.html
-/sdcard/android/layout_tests/fast/forms/add-remove-form-elements-stress-test.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-009.html
-/sdcard/android/layout_tests/fast/forms/textarea-setvalue-without-renderer.html
-/sdcard/android/layout_tests/fast/forms/hidden-input-not-enabled.html
-/sdcard/android/layout_tests/fast/forms/input-appearance-maxlength.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-001.html
-/sdcard/android/layout_tests/fast/forms/submit-with-base.html
-/sdcard/android/layout_tests/fast/forms/input-setvalue-selection.html
-/sdcard/android/layout_tests/fast/forms/autofocus-opera-002.html
-/sdcard/android/layout_tests/fast/forms/textarea-appearance-wrap.html
-/sdcard/android/layout_tests/fast/forms/add-selected-option.html
-/sdcard/android/layout_tests/fast/forms/willvalidate-006.html
-/sdcard/android/layout_tests/fast/forms/ValidityState-valueMissing-003.html
-/sdcard/android/layout_tests/fast/forms/textarea-hard-linewrap-empty.html
-/sdcard/android/layout_tests/fast/forms/document-write.html
-/sdcard/android/layout_tests/fast/table/incomplete-table-in-fragment-hang.html
-/sdcard/android/layout_tests/fast/table/section-in-table-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/large-rowspan-crash.html
-/sdcard/android/layout_tests/fast/table/colgroup-relative.html
-/sdcard/android/layout_tests/fast/table/border-changes.html
-/sdcard/android/layout_tests/fast/table/table-row-compositing-repaint-crash.html
-/sdcard/android/layout_tests/fast/table/cell-in-row-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/incomplete-table-in-fragment-2.html
-/sdcard/android/layout_tests/fast/table/rowindex-comment-nodes.html
-/sdcard/android/layout_tests/fast/table/td-display-nowrap.html
-/sdcard/android/layout_tests/fast/table/row-in-tbody-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/empty-auto-column-zero-divide.html
-/sdcard/android/layout_tests/fast/table/form-in-tbody-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/form-in-table-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/table/destroy-cell-with-selection-crash.html
-/sdcard/android/layout_tests/fast/table/form-in-row-before-misnested-text-crash-css.html
-/sdcard/android/layout_tests/fast/css/counters/counter-function-input-2.html
-/sdcard/android/layout_tests/fast/css/counters/counter-function-input.html
-/sdcard/android/layout_tests/fast/css/counters/counter-number-input.html
-/sdcard/android/layout_tests/fast/css/variables/color-hex-test.html
-/sdcard/android/layout_tests/fast/css/variables/invalid-identifier.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style-negative-top.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-borderRadius.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-background-size.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-border-image.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-border-spacing.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style-font-family.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-zIndex-auto.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-transform.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/computed-style-display-none.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-background-position.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-text-overflow.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-border-box.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-relayout.html
-/sdcard/android/layout_tests/fast/css/getComputedStyle/getComputedStyle-text-decoration.html
-/sdcard/android/layout_tests/fast/css/media-rule-dyn.html
-/sdcard/android/layout_tests/fast/css/transform-function-lowercase-assert.html
-/sdcard/android/layout_tests/fast/css/word-break-user-modify-allowed-values.html
-/sdcard/android/layout_tests/fast/css/import-style-update.html
-/sdcard/android/layout_tests/fast/css/outline-invert-assertion.html
-/sdcard/android/layout_tests/fast/css/insertRule-font-face.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-004.html
-/sdcard/android/layout_tests/fast/css/zoom-in-length-round-trip.html
-/sdcard/android/layout_tests/fast/css/transform-inline-style-remove.html
-/sdcard/android/layout_tests/fast/css/padding-no-renderer.html
-/sdcard/android/layout_tests/fast/css/transition_shorthand_parsing.html
-/sdcard/android/layout_tests/fast/css/css-selector-text.html
-/sdcard/android/layout_tests/fast/css/dashboard-regions-attr-crash.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-001.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-006.html
-/sdcard/android/layout_tests/fast/css/font-property-priority.html
-/sdcard/android/layout_tests/fast/css/number-parsing-crash.html
-/sdcard/android/layout_tests/fast/css/device-aspect-ratio.html
-/sdcard/android/layout_tests/fast/css/pseudostyle-anonymous-text.html
-/sdcard/android/layout_tests/fast/css/css-properties-case-insensitive.html
-/sdcard/android/layout_tests/fast/css/sheet-collection-link.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-003.html
-/sdcard/android/layout_tests/fast/css/resize-value-compared.html
-/sdcard/android/layout_tests/fast/css/font-face-descriptor-multiple-values-parsing.html
-/sdcard/android/layout_tests/fast/css/hexColor-isDigit-assert.html
-/sdcard/android/layout_tests/fast/css/transform-inline-style.html
-/sdcard/android/layout_tests/fast/css/child-selector-implicit-tbody.html
-/sdcard/android/layout_tests/fast/css/outline-hidden-illegal-value.html
-/sdcard/android/layout_tests/fast/css/emptyStyleTag.html
-/sdcard/android/layout_tests/fast/css/stale-style-selector-crash-1.html
-/sdcard/android/layout_tests/fast/css/display-none-inline-style-change-crash.html
-/sdcard/android/layout_tests/fast/css/getPropertyValue-clip.html
-/sdcard/android/layout_tests/fast/css/border-image-crash.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-005.html
-/sdcard/android/layout_tests/fast/css/insertRule-media.html
-/sdcard/android/layout_tests/fast/css/html-attr-case-sensitivity.html
-/sdcard/android/layout_tests/fast/css/font-face-multiple-families.html
-/sdcard/android/layout_tests/fast/css/getPropertyValue-border.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-002.html
-/sdcard/android/layout_tests/fast/css/invalid-rule-value.html
-/sdcard/android/layout_tests/fast/css/max-device-aspect-ratio.html
-/sdcard/android/layout_tests/fast/css/background-currentcolor.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-004.html
-/sdcard/android/layout_tests/fast/css/orphaned_units_crash.html
-/sdcard/android/layout_tests/fast/css/invalid-cursor-property-crash.html
-/sdcard/android/layout_tests/fast/css/sheet-title.html
-/sdcard/android/layout_tests/fast/css/large-list-of-rules-crash.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-001.html
-/sdcard/android/layout_tests/fast/css/background-position-serialize.html
-/sdcard/android/layout_tests/fast/css/stale-style-selector-crash-2.html
-/sdcard/android/layout_tests/fast/css/webkit-marquee-speed-unit-in-quirksmode.html
-/sdcard/android/layout_tests/fast/css/CSSPrimitiveValue-exceptions.html
-/sdcard/android/layout_tests/fast/css/empty-script.html
-/sdcard/android/layout_tests/fast/css/mask-missing-image-crash.html
-/sdcard/android/layout_tests/fast/css/parse-timing-function-crash.html
-/sdcard/android/layout_tests/fast/css/background-position-inherit.html
-/sdcard/android/layout_tests/fast/css/readonly-pseudoclass-opera-003.html
-/sdcard/android/layout_tests/fast/css/font-family-builtins.html
-/sdcard/android/layout_tests/fast/css/remove-shorthand.html
-/sdcard/android/layout_tests/fast/css/overflow-property.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-005.html
-/sdcard/android/layout_tests/fast/css/min-device-aspect-ratio.html
-/sdcard/android/layout_tests/fast/css/nested-rule-parent-sheet.html
-/sdcard/android/layout_tests/fast/css/case-transform.html
-/sdcard/android/layout_tests/fast/css/number-parsing-crash-2.html
-/sdcard/android/layout_tests/fast/css/matrix-as-function-crash.html
-/sdcard/android/layout_tests/fast/css/pseudo-required-optional-002.html
-/sdcard/android/layout_tests/fast/css/attr-parsing.html
-/sdcard/android/layout_tests/fast/css/font-family-initial.html
-/sdcard/android/layout_tests/fast/css/small-caps-crash.html
-/sdcard/android/layout_tests/fast/css/max-height-and-max-width.html
-/sdcard/android/layout_tests/fast/css/legacy-opacity-styles.html
-/sdcard/android/layout_tests/fast/css/transition-timing-function.html
-/sdcard/android/layout_tests/fast/block/positioning/absolute-in-inline-rtl-4.html
-/sdcard/android/layout_tests/fast/block/float/selection-gap-clip-out-tiger-crash.html
-/sdcard/android/layout_tests/fast/block/float/crash-on-absolute-positioning.html
-/sdcard/android/layout_tests/fast/block/float/crash-replaced-display-block.html
-/sdcard/android/layout_tests/fast/parser/implicit-head-in-fragment-crash.html
-/sdcard/android/layout_tests/fast/parser/smart-quotes-in-tag.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-iframe.html
-/sdcard/android/layout_tests/fast/parser/remove-node-stack.html
-/sdcard/android/layout_tests/fast/parser/remove-current-node-parent.html
-/sdcard/android/layout_tests/fast/parser/entity-end-iframe-tag.html
-/sdcard/android/layout_tests/fast/parser/nsup-entity.html
-/sdcard/android/layout_tests/fast/parser/block-nesting-cap.html
-/sdcard/android/layout_tests/fast/parser/residual-style-close-across-n-blocks.html
-/sdcard/android/layout_tests/fast/parser/tag-with-exclamation-point.html
-/sdcard/android/layout_tests/fast/parser/p-in-scope-strict.html
-/sdcard/android/layout_tests/fast/parser/entity-end-style-tag.html
-/sdcard/android/layout_tests/fast/parser/entity-end-xmp-tag.html
-/sdcard/android/layout_tests/fast/parser/external-entities.xml
-/sdcard/android/layout_tests/fast/parser/head-comment.html
-/sdcard/android/layout_tests/fast/parser/test-unicode-characters-in-attribute-name.html
-/sdcard/android/layout_tests/fast/parser/entity-end-textarea-tag.html
-/sdcard/android/layout_tests/fast/parser/script-tag-with-trailing-slash.html
-/sdcard/android/layout_tests/fast/parser/empty-text-resource.html
-/sdcard/android/layout_tests/fast/parser/comment-in-title.html
-/sdcard/android/layout_tests/fast/parser/residual-style-close-across-removed-block.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-title.html
-/sdcard/android/layout_tests/fast/parser/entity-end-title-tag.html
-/sdcard/android/layout_tests/fast/parser/head-content-after-head-removal.html
-/sdcard/android/layout_tests/fast/parser/pre-first-line-break.html
-/sdcard/android/layout_tests/fast/parser/number-sign-in-map-name.html
-/sdcard/android/layout_tests/fast/parser/input-textarea-inside-select-element.html
-/sdcard/android/layout_tests/fast/parser/entity-end-script-tag.html
-/sdcard/android/layout_tests/fast/parser/area-in-div.html
-/sdcard/android/layout_tests/fast/parser/entity-surrogate-pairs.html
-/sdcard/android/layout_tests/fast/parser/eightdigithexentity.html
-/sdcard/android/layout_tests/fast/parser/parse-wbr.html
-/sdcard/android/layout_tests/fast/parser/open-comment-in-script-tricky.html
-/sdcard/android/layout_tests/fast/parser/head-element-for-yahoo-player.html
-/sdcard/android/layout_tests/fast/parser/hex-entities-length.html
-/sdcard/android/layout_tests/fast/parser/html-whitespace.html
-/sdcard/android/layout_tests/fast/parser/script-after-frameset-assert.html
-/sdcard/android/layout_tests/fast/parser/comment-in-iframe.html
-/sdcard/android/layout_tests/fast/parser/duplicate-html-body-element-IDs.html
-/sdcard/android/layout_tests/fast/parser/assertion-empty-attribute.html
-/sdcard/android/layout_tests/fast/parser/comment-in-script-tricky.html
-/sdcard/android/layout_tests/fast/parser/rewrite-form.html
-/sdcard/android/layout_tests/fast/parser/entity-comment-in-script-tricky.html
-/sdcard/android/layout_tests/fast/parser/head-parsing-19517.html
-/sdcard/android/layout_tests/fast/parser/entities-in-html.html
-/sdcard/android/layout_tests/fast/parser/remove-parser-current-node.html
-/sdcard/android/layout_tests/fast/parser/rewrite-map.html
-/sdcard/android/layout_tests/fast/parser/strict-img-in-map.html
-/sdcard/android/layout_tests/fast/parser/p-in-scope.html
-/sdcard/android/layout_tests/fast/layers/removed-by-scroll-handler.html
-/sdcard/android/layout_tests/fast/layers/generated-layer-scrollbar-crash.html
-/sdcard/android/layout_tests/fast/layers/zindex-hit-test.html
-/sdcard/android/layout_tests/fast/layers/resize-layer-deletion-crash.html
-/sdcard/android/layout_tests/fast/history/subframe-is-visited.html
-/sdcard/android/layout_tests/fast/loader/early-load-cancel.html
-/sdcard/android/layout_tests/fast/loader/iframe-recursive-synchronous-load.html
-/sdcard/android/layout_tests/fast/loader/local-css-allowed-in-strict-mode.html
-/sdcard/android/layout_tests/fast/loader/url-strip-cr-lf-tab.html
-/sdcard/android/layout_tests/fast/loader/hashchange-event.html
-/sdcard/android/layout_tests/fast/loader/unloadable-script.html
-/sdcard/android/layout_tests/fast/loader/url-parse-1.html
-/sdcard/android/layout_tests/fast/loader/redirect-with-open-subframe-2.html
-/sdcard/android/layout_tests/fast/loader/simultaneous-reloads-assert.html
-/sdcard/android/layout_tests/fast/loader/invalid-charset-on-script-crashes-loader.html
-/sdcard/android/layout_tests/fast/loader/javascript-url-encoding.html
-/sdcard/android/layout_tests/fast/loader/empty-embed-src-attribute.html
-/sdcard/android/layout_tests/fast/loader/charset-parse.html
-/sdcard/android/layout_tests/fast/loader/meta-refresh-vs-open.html
-/sdcard/android/layout_tests/fast/loader/submit-form-while-parsing-2.html
-/sdcard/android/layout_tests/fast/loader/url-data-replace-backslash.html
-/sdcard/android/layout_tests/fast/loader/redirect-with-open-subframe.html
-/sdcard/android/layout_tests/fast/loader/empty-ref-versus-no-ref.html
-/sdcard/android/layout_tests/fast/loader/javascript-url-encoding-2.html
-/sdcard/android/layout_tests/fast/loader/window-clearing.html
-/sdcard/android/layout_tests/fast/loader/frame-creation-removal.html
-/sdcard/android/layout_tests/fast/loader/external-script-URL-location.html
-/sdcard/android/layout_tests/fast/loader/link-no-URL.html
-/sdcard/android/layout_tests/fast/loader/loadInProgress.html
-/sdcard/android/layout_tests/fast/loader/inherit-charset-to-empty-frame.html
-/sdcard/android/layout_tests/fast/loader/font-face-empty.html
-/sdcard/android/layout_tests/fast/loader/goto-anchor-infinite-layout.html
-/sdcard/android/layout_tests/fast/loader/file-URL-with-port-number.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-default-attributes.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-missing-file-exception.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-invalid-values.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-html-response-encoding.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/null-document-xmlhttprequest-open.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-nonexistent-file.html
-/sdcard/android/layout_tests/fast/xmlhttprequest/xmlhttprequest-open-after-iframe-onload-remove-self.html
-/sdcard/android/layout_tests/fast/canvas/pattern-with-transform.html
-/sdcard/android/layout_tests/fast/canvas/gradient-addColorStop-with-invalid-color.html
-/sdcard/android/layout_tests/fast/canvas/canvas-gradient-without-path.html
-/sdcard/android/layout_tests/fast/canvas/radialGradient-infinite-values.html
-/sdcard/android/layout_tests/fast/canvas/drawImage-with-negative-source-destination.html
-/sdcard/android/layout_tests/fast/canvas/drawImage-with-invalid-args.html
-/sdcard/android/layout_tests/fast/canvas/canvas-stroke-empty-fill.html
-/sdcard/android/layout_tests/fast/canvas/canvas-lineWidth.html
-/sdcard/android/layout_tests/fast/canvas/access-zero-sized-canvas.html
-/sdcard/android/layout_tests/fast/canvas/script-inside-canvas-fallback.html
-/sdcard/android/layout_tests/fast/canvas/unclosed-canvas-2.html
-/sdcard/android/layout_tests/fast/canvas/create-pattern-does-not-crash.html
-/sdcard/android/layout_tests/fast/canvas/gradient-with-clip.html
-/sdcard/android/layout_tests/fast/canvas/canvas-hides-fallback.html
-/sdcard/android/layout_tests/fast/canvas/arc-crash.html
-/sdcard/android/layout_tests/fast/canvas/canvas-modify-emptyPath.html
-/sdcard/android/layout_tests/fast/canvas/unclosed-canvas-4.html
-/sdcard/android/layout_tests/fast/canvas/canvas-invalid-fillstyle.html
-/sdcard/android/layout_tests/fast/canvas/unclosed-canvas-1.html
-/sdcard/android/layout_tests/fast/canvas/toDataURL-noData.html
-/sdcard/android/layout_tests/fast/canvas/canvas-with-incorrect-args.html
-/sdcard/android/layout_tests/fast/canvas/canvas-path-with-inf-nan-dimensions.html
-/sdcard/android/layout_tests/fast/canvas/canvas-radial-gradient-spreadMethod.html
-/sdcard/android/layout_tests/fast/canvas/canvas-set-properties-with-non-invertible-ctm.html
-/sdcard/android/layout_tests/fast/canvas/canvas-invalid-strokestyle.html
-/sdcard/android/layout_tests/fast/canvas/canvas-strokeRect.html
-/sdcard/android/layout_tests/fast/canvas/canvas-composite-alpha.html
-/sdcard/android/layout_tests/fast/canvas/canvas-transparency-and-composite.html
-/sdcard/android/layout_tests/fast/canvas/unclosed-canvas-3.html
-/sdcard/android/layout_tests/fast/canvas/linearGradient-infinite-values.html
-/sdcard/android/layout_tests/fast/canvas/canvas-setTransform.html
-/sdcard/android/layout_tests/fast/frames/frame-set-same-location.html
-/sdcard/android/layout_tests/fast/frames/viewsource-unfinished-tags.html
-/sdcard/android/layout_tests/fast/frames/set-unloaded-frame-location.html
-/sdcard/android/layout_tests/fast/frames/negative-remaining-length-crash.html
-/sdcard/android/layout_tests/fast/frames/frame-name-reset.html
-/sdcard/android/layout_tests/fast/frames/frame-set-same-src.html
-/sdcard/android/layout_tests/fast/frames/crash-removed-iframe.html
-/sdcard/android/layout_tests/fast/frames/empty-frame-document.html
-/sdcard/android/layout_tests/fast/frames/viewsource-plain-text-tags.html
-/sdcard/android/layout_tests/fast/frames/repaint-display-none-crash.html
-/sdcard/android/layout_tests/fast/frames/remove-frame-with-scrollbars-crash.html
-/sdcard/android/layout_tests/fast/frames/cross-site-this.html
-/sdcard/android/layout_tests/fast/frames/onload-remove-iframe-crash.html
-/sdcard/android/layout_tests/fast/frames/iframe-set-inner-html.html
-/sdcard/android/layout_tests/fast/frames/iframe-remove-after-id-change.html
-/sdcard/android/layout_tests/fast/frames/iframe-target.html
-/sdcard/android/layout_tests/fast/frames/viewsource-link-on-href-value.html
-/sdcard/android/layout_tests/fast/frames/hover-timer-crash.html
-/sdcard/android/layout_tests/fast/frames/iframe-no-src-set-location.html
-/sdcard/android/layout_tests/fast/frames/iframe-set-same-src.html
-/sdcard/android/layout_tests/fast/frames/iframe-double-attach.html
-/sdcard/android/layout_tests/fast/frames/iframe-set-same-location.html
-/sdcard/android/layout_tests/fast/frames/location-change.html
-/sdcard/android/layout_tests/fast/frames/frame-base-url.html
-/sdcard/android/layout_tests/fast/frames/iframe-display-none.html
-/sdcard/android/layout_tests/fast/frames/javascript-url-as-framesrc-crash.html
-/sdcard/android/layout_tests/fast/frames/frame-limit.html
-/sdcard/android/layout_tests/fast/frames/frame-display-none-focus.html
-/sdcard/android/layout_tests/fast/reflections/teardown-crash.html
-/sdcard/android/layout_tests/fast/reflections/reflection-computed-style.html
-/sdcard/android/layout_tests/fast/reflections/reflection-overflow-scroll.html
-/sdcard/android/layout_tests/http/tests/multipart/win-boundary-crash.html
-/sdcard/android/layout_tests/http/tests/multipart/stop-crash.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-loads-stylesheet-with-text-css-and-invalid-type.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-loads-stylesheet-with-empty-content-type.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-loads-stylesheet-with-charset-and-css-extension.html
-/sdcard/android/layout_tests/http/tests/mime/standard-mode-loads-stylesheet-with-charset.html
-/sdcard/android/layout_tests/http/tests/local/style-access-before-stylesheet-loaded.html
-/sdcard/android/layout_tests/http/tests/local/stylesheet-and-script-load-order-http.html
-/sdcard/android/layout_tests/http/tests/local/link-stylesheet-preferred.html
-/sdcard/android/layout_tests/http/tests/local/stylesheet-and-script-load-order.html
-/sdcard/android/layout_tests/http/tests/misc/uncacheable-script-repeated.html
-/sdcard/android/layout_tests/http/tests/misc/embedCrasher.html
-/sdcard/android/layout_tests/http/tests/misc/multiple-submit.html
-/sdcard/android/layout_tests/http/tests/misc/empty-file-formdata.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf7.html
-/sdcard/android/layout_tests/http/tests/misc/text-refresh.html
-/sdcard/android/layout_tests/http/tests/misc/window-open-then-write.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf16be.html
-/sdcard/android/layout_tests/http/tests/misc/frame-default-enc-same-domain.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf32le.html
-/sdcard/android/layout_tests/http/tests/misc/iframe-domain-test.html
-/sdcard/android/layout_tests/http/tests/misc/frame-default-enc-different-domain.html
-/sdcard/android/layout_tests/http/tests/misc/css-accept-any-type.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf7.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf32be.html
-/sdcard/android/layout_tests/http/tests/misc/meta-refresh-stray-single-quote.html
-/sdcard/android/layout_tests/http/tests/misc/canvas-pattern-from-incremental-image.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf16le.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf32be.html
-/sdcard/android/layout_tests/http/tests/misc/timer-vs-loading.html
-/sdcard/android/layout_tests/http/tests/misc/font-face-in-multiple-segmented-faces.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf16le.html
-/sdcard/android/layout_tests/http/tests/misc/refresh-meta-with-newline.html
-/sdcard/android/layout_tests/http/tests/misc/post-submit-button.html
-/sdcard/android/layout_tests/http/tests/misc/redirect-to-about-blank.html
-/sdcard/android/layout_tests/http/tests/misc/javascript-url-stop-loaders.html
-/sdcard/android/layout_tests/http/tests/misc/iframe-invalid-source-crash.html
-/sdcard/android/layout_tests/http/tests/misc/slow-preload-cancel.html
-/sdcard/android/layout_tests/http/tests/misc/object-image-error-with-onload.html
-/sdcard/android/layout_tests/http/tests/misc/image-error.html
-/sdcard/android/layout_tests/http/tests/misc/referrer.html
-/sdcard/android/layout_tests/http/tests/misc/cached-scripts.html
-/sdcard/android/layout_tests/http/tests/misc/empty-cookie.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf32be.html
-/sdcard/android/layout_tests/http/tests/misc/missing-style-sheet.html
-/sdcard/android/layout_tests/http/tests/misc/submit-post-in-utf16le.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf16be.html
-/sdcard/android/layout_tests/http/tests/misc/DOMContentLoaded-event.html
-/sdcard/android/layout_tests/http/tests/misc/onload-remove-iframe-crash-2.html
-/sdcard/android/layout_tests/http/tests/misc/submit-get-in-utf32le.html
-/sdcard/android/layout_tests/http/tests/misc/object-image-error.html
-/sdcard/android/layout_tests/http/tests/misc/createElementNamespace3.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf16be.html
-/sdcard/android/layout_tests/http/tests/misc/url-in-utf32le.html
-/sdcard/android/layout_tests/http/tests/misc/crash-multiple-family-fontface.html
-/sdcard/android/layout_tests/http/tests/misc/BOM-override-script.html
-/sdcard/android/layout_tests/http/tests/misc/createElementNamespace1.xml
-/sdcard/android/layout_tests/http/tests/workers/text-encoding.html
-/sdcard/android/layout_tests/http/tests/workers/worker-redirect.html
-/sdcard/android/layout_tests/http/tests/workers/worker-importScripts.html
-/sdcard/android/layout_tests/http/tests/cookies/double-quoted-value-with-semi-colon.html
-/sdcard/android/layout_tests/http/tests/uri/resolve-encoding-relative.html
-/sdcard/android/layout_tests/http/tests/uri/escaped-entity.html
-/sdcard/android/layout_tests/http/tests/uri/utf8-path.html
-/sdcard/android/layout_tests/http/tests/navigation/changing-frame-hierarchy-in-onload.html
-/sdcard/android/layout_tests/http/tests/navigation/fallback-anchor-reload.html
-/sdcard/android/layout_tests/http/tests/navigation/back-send-referrer.html
-/sdcard/android/layout_tests/http/tests/incremental/slow-utf8-css.html
-/sdcard/android/layout_tests/http/tests/incremental/frame-focus-before-load.html
-/sdcard/android/layout_tests/http/tests/appcache/crash-when-navigating-away-then-back.html
-/sdcard/android/layout_tests/http/tests/appcache/offline-access.html
-/sdcard/android/layout_tests/http/tests/appcache/update-cache.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-with-empty-file.html
-/sdcard/android/layout_tests/http/tests/appcache/simple.html
-/sdcard/android/layout_tests/http/tests/appcache/wrong-signature-2.html
-/sdcard/android/layout_tests/http/tests/appcache/top-frame-3.html
-/sdcard/android/layout_tests/http/tests/appcache/online-whitelist.html
-/sdcard/android/layout_tests/http/tests/appcache/fallback.html
-/sdcard/android/layout_tests/http/tests/appcache/different-origin-manifest.html
-/sdcard/android/layout_tests/http/tests/appcache/empty-manifest.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-redirect.html
-/sdcard/android/layout_tests/http/tests/appcache/navigating-away-while-cache-attempt-in-progress.html
-/sdcard/android/layout_tests/http/tests/appcache/top-frame-4.html
-/sdcard/android/layout_tests/http/tests/appcache/wrong-signature.html
-/sdcard/android/layout_tests/http/tests/appcache/fail-on-update.html
-/sdcard/android/layout_tests/http/tests/appcache/foreign-iframe-main.html
-/sdcard/android/layout_tests/http/tests/appcache/xhr-foreign-resource.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-containing-itself.html
-/sdcard/android/layout_tests/http/tests/appcache/resource-redirect.html
-/sdcard/android/layout_tests/http/tests/appcache/idempotent-update.html
-/sdcard/android/layout_tests/http/tests/appcache/top-frame-1.html
-/sdcard/android/layout_tests/http/tests/appcache/main-resource-hash.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-parsing.html
-/sdcard/android/layout_tests/http/tests/appcache/404-manifest.html
-/sdcard/android/layout_tests/http/tests/appcache/wrong-content-type.html
-/sdcard/android/layout_tests/http/tests/appcache/resource-redirect-2.html
-/sdcard/android/layout_tests/http/tests/appcache/top-frame-2.html
-/sdcard/android/layout_tests/http/tests/appcache/404-resource.html
-/sdcard/android/layout_tests/http/tests/appcache/remove-cache.html
-/sdcard/android/layout_tests/http/tests/appcache/manifest-redirect-2.html
-/sdcard/android/layout_tests/http/tests/appcache/reload.html
-/sdcard/android/layout_tests/http/tests/appcache/cyrillic-uri.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-alias.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-write.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren-alias.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-with-base-tag.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/window-open-self-about-blank.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren-writeln-lexical.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-window-open.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren-write-lexical.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-grandchildren-lexical.html
-/sdcard/android/layout_tests/http/tests/security/aboutBlank/security-context-writeln.html
-/sdcard/android/layout_tests/http/tests/security/cookies/document-open.html
-/sdcard/android/layout_tests/http/tests/security/cookies/create-document.html
-/sdcard/android/layout_tests/http/tests/security/cookies/assign-document-url.html
-/sdcard/android/layout_tests/http/tests/security/cookies/basic.html
-/sdcard/android/layout_tests/http/tests/security/cookies/base-tag.html
-/sdcard/android/layout_tests/http/tests/security/cookies/base-about-blank.html
-/sdcard/android/layout_tests/http/tests/security/cookies/xmlhttprequest.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-JSTargetNode-onclick-shortcut.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-XMLHttpRequest-shortcut.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-JSTargetNode-onclick-addEventListener.html
-/sdcard/android/layout_tests/http/tests/security/listener/xss-XMLHttpRequest-addEventListener.html
-/sdcard/android/layout_tests/http/tests/security/MessagePort/event-listener-context.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/delivery-order.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/data-url-sends-null-origin.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/origin-unaffected-by-base-tag.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/origin-unaffected-by-document-domain.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/javascript-page-still-sends-origin.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/invalid-origin-throws-exception.html
-/sdcard/android/layout_tests/http/tests/security/postMessage/target-origin.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/context-for-window-open.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/context-for-location.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/not-opener.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/opener.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/context-for-location-assign.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/context-for-location-href.html
-/sdcard/android/layout_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-get.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-https.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-post.html
-/sdcard/android/layout_tests/http/tests/security/originHeader/origin-header-for-data.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-hash.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-history-prototype.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-synchronous-form.html
-/sdcard/android/layout_tests/http/tests/security/canvas-remote-read-redirect-to-remote-image.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-nonstandardProperty.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-pathname.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-frames.html
-/sdcard/android/layout_tests/http/tests/security/object-literals.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-location-prototype.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-search.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-selection.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-name-getter.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-call.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-reload.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-invalid-domain-change.html
-/sdcard/android/layout_tests/http/tests/security/canvas-remote-read-remote-image.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-protocol.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-first-time.html
-/sdcard/android/layout_tests/http/tests/security/xss-eval.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-DOMImplementation.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-hostname.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-custom.html
-/sdcard/android/layout_tests/http/tests/security/xss-DENIED-assign-location-host.html
-/sdcard/android/layout_tests/http/tests/security/cross-frame-access-callback-explicit-domain-ALLOW.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/xmlhttprequest-file-not-found.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/abort-exception-assert.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/workers/close.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/010.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/002.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/012.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/004.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/014.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/018.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/002-simple.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/001.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/011.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/003.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/013.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/005.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/015.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/web-apps/007.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-site-denied-response.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/encode-request-url.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-non-simple-allow.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-preflight-cache.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/inject-header.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-LSProgressEvent-ProgressEvent-should-match.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-same-origin-post-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-denied.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-cross-origin-post-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-InvalidStateException-getAllRequestHeaders.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-denied-events-post-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/binary-x-user-defined.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/onloadstart-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-no-content-length-onProgress.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/readystatechange.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-contenttype-empty.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-post-fail-non-simple-content-type.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-forbidden-methods-exception.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-preflight-cache-invalidation-by-method.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/serialize-document.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/onerror-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/close-window.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-post-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/detaching-frame-2.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/encode-request-url-2.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/set-dangerous-headers.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/event-target.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-addEventListener-onProgress.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/send-on-abort.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/document-domain-set.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-preflight-cache-timeout.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-responseXML-exception.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-site-denied-response-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/upload-onloadstart-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/supported-xml-content-types.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-denied-events.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/request-encoding.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/zero-length-response.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/connection-error-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-access-control-origin-header-data-url.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-preflight-cache-invalidation-by-header.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-star.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-crlf-getAllResponseHeader.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/event-listener-gc.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/interactive-state.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/state-after-network-error.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/abort-crash.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/get-dangerous-headers.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-image-not-loaded.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/exceptions.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-test-send-flag.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-cross-origin-post-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/referer.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-invalidHeader-getRequestHeader.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/infoOnProgressEvent.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-allow-access-control-origin-header.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/docLoaderFrame.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-denied-events-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/post-content-type.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-whitelist-response-headers.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/onabort-event.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-same-origin-get-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/detaching-frame.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-get-fail-non-simple.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/zero-length-response-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/access-control-basic-denied-preflight-cache.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/authorization-header.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-post-crash.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-cross-origin-get-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-cross-origin-get-async.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-sync-double.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-abort-readyState-shouldDispatchEvent.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-responseText-exception.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-2.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-abort-readyState-shouldNotDispatchEvent.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/status-after-abort.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/XMLHttpRequestException.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-onProgress-open-should-zero-length.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/broken-xml-encoding.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-denied-events-post.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/extra-parameters.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-multiple-open.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/xmlhttprequest-InvalidStateException-getRequestHeader.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/origin-header-same-origin-post-sync.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/cross-site-denied-response-sync-2.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/request-from-popup.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/redirect-cross-origin-post.html
-/sdcard/android/layout_tests/http/tests/xmlhttprequest/simple-cross-origin-progress-events.html
-/sdcard/android/layout_tests/http/tests/messaging/cross-domain-message-event-dispatch.html
-/sdcard/android/layout_tests/http/tests/messaging/cross-domain-message-send.html
-/sdcard/android/layout_tests/media/constructors.html
-/sdcard/android/layout_tests/media/video-poster.html
-/sdcard/android/layout_tests/media/video-source-media.html
-/sdcard/android/layout_tests/media/video-controls-with-mutation-event-handler.html
-/sdcard/android/layout_tests/media/video-src-set.html
-/sdcard/android/layout_tests/media/video-display-none-crash.html
-/sdcard/android/layout_tests/media/video-width-height.html
-/sdcard/android/layout_tests/media/video-source.html
-/sdcard/android/layout_tests/media/fallback.html
-/sdcard/android/layout_tests/media/remove-from-document-no-load.html
-/sdcard/android/layout_tests/media/before-load-member-access.html
-/sdcard/android/layout_tests/media/video-play-pause-events.html
-/sdcard/android/layout_tests/media/media-constants.html
-/sdcard/android/layout_tests/media/video-src-source.html
-/sdcard/android/layout_tests/media/video-play-pause-exception.html
-/sdcard/android/layout_tests/media/video-dom-autobuffer.html
-/sdcard/android/layout_tests/media/video-seek-no-src-exception.html
-/sdcard/android/layout_tests/media/video-src.html
-/sdcard/android/layout_tests/plugins/createScriptableObject-before-start.html
-/sdcard/android/layout_tests/plugins/return-error-from-new-stream-callback-in-full-frame-plugin.html
-/sdcard/android/layout_tests/scrollbars/scrollbar-crash-on-refresh.html
-/sdcard/android/layout_tests/scrollbars/scrollbar-miss-mousemove.html
-/sdcard/android/layout_tests/security/autocomplete-cleared-on-back.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/complex-keys.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/clear.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/enumerate-storage.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/remove-item.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/string-conversion.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/simple-events.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/delete-removal.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/window-open.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/index-get-and-set.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/onstorage-attribute-setattribute.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/onstorage-attribute-setwindow.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/simple-usage.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/onstorage-attribute-markup.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/enumerate-with-length-and-key.html
-/sdcard/android/layout_tests/storage/domstorage/localstorage/complex-values.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/index-get-and-set.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/onstorage-attribute-setattribute.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/onstorage-attribute-setwindow.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/clear.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/enumerate-storage.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/string-conversion.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/simple-usage.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/simple-events.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/onstorage-attribute-markup.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/enumerate-with-length-and-key.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/delete-removal.html
-/sdcard/android/layout_tests/storage/domstorage/sessionstorage/window-open.html
-/sdcard/android/layout_tests/storage/domstorage/window-attributes-exist.html
-/sdcard/android/layout_tests/storage/hash-change-with-xhr.html
-/sdcard/android/layout_tests/storage/open-database-empty-version.html
-/sdcard/android/layout_tests/storage/quota-tracking.html
-/sdcard/android/layout_tests/storage/close-during-stress-test.html
-/sdcard/android/layout_tests/storage/database-lock-after-reload.html
-/sdcard/android/layout_tests/storage/multiple-databases-garbage-collection.html
-/sdcard/android/layout_tests/storage/empty-statement.html
-/sdcard/android/layout_tests/storage/multiple-transactions.html
-/sdcard/android/layout_tests/storage/success-callback.html
-/sdcard/android/layout_tests/storage/transaction-error-callback.html
-/sdcard/android/layout_tests/storage/sql-data-types.html
-/sdcard/android/layout_tests/storage/transaction-callback-exception-crash.html
-/sdcard/android/layout_tests/transforms/2d/transform-2d.html
-/sdcard/android/layout_tests/transforms/2d/compound-2d-transforms.html
-/sdcard/android/layout_tests/transforms/2d/computed-style-origin.html
-/sdcard/android/layout_tests/transforms/2d/transform-accuracy.html
-/sdcard/android/layout_tests/transforms/2d/transform-value-types.html
-/sdcard/android/layout_tests/transforms/3d/hit-testing/hit-preserves-3d.html
-/sdcard/android/layout_tests/transitions/cancel-transition.html
-/sdcard/android/layout_tests/transitions/transition-end-event-all-properties.html
-/sdcard/android/layout_tests/transitions/transition-end-event-window.html
-/sdcard/android/layout_tests/transitions/transition-end-event-multiple-03.html
-/sdcard/android/layout_tests/transitions/text-indent-transition.html
-/sdcard/android/layout_tests/transitions/transition-end-event-set-none.html
-/sdcard/android/layout_tests/transitions/zero-duration-without-units.html
-/sdcard/android/layout_tests/transitions/min-max-width-height-transitions.html
-/sdcard/android/layout_tests/transitions/shorthand-transitions.html
-/sdcard/android/layout_tests/transitions/mask-transitions.html
-/sdcard/android/layout_tests/transitions/zero-duration-with-non-zero-delay-start.html
-/sdcard/android/layout_tests/transitions/zero-duration-in-list.html
-/sdcard/android/layout_tests/transitions/shorthand-border-transitions.html
-/sdcard/android/layout_tests/transitions/inherit-other-props.html
-/sdcard/android/layout_tests/transitions/transition-end-event-multiple-04.html
-/sdcard/android/layout_tests/transitions/background-transitions.html
-/sdcard/android/layout_tests/transitions/transition-duration-cleared-in-transitionend-crash.html
-/sdcard/android/layout_tests/transitions/interrupt-zero-duration.html
-/sdcard/android/layout_tests/transitions/retargetted-transition.html
-/sdcard/android/layout_tests/transitions/transition-end-event-left.html
-/sdcard/android/layout_tests/transitions/override-transition-crash.html
-/sdcard/android/layout_tests/transitions/transition-end-event-multiple-01.html
-/sdcard/android/layout_tests/transitions/matched-transform-functions.html
-/sdcard/android/layout_tests/transitions/transform-op-list-match.html
-/sdcard/android/layout_tests/transitions/transition-end-event-container.html
-/sdcard/android/layout_tests/transitions/interrupt-transform-transition.html
-/sdcard/android/layout_tests/transitions/transition-end-event-nested.html
-/sdcard/android/layout_tests/transitions/change-values-during-transition.html
-/sdcard/android/layout_tests/transitions/transition-end-event-attributes.html
-/sdcard/android/layout_tests/transitions/inherit.html
-/sdcard/android/layout_tests/transitions/transition-end-event-create.html
-/sdcard/android/layout_tests/transitions/shadow.html
-/sdcard/android/layout_tests/transitions/transition-end-event-multiple-02.html
-/sdcard/android/layout_tests/transitions/transition-end-event-transform.html
-/sdcard/android/layout_tests/transitions/start-transform-transition.html
-/sdcard/android/layout_tests/transitions/transition-timing-function.html
-/sdcard/android/layout_tests/transitions/transform-op-list-no-match.html
-/sdcard/android/layout_tests/transitions/bad-transition-shorthand-crash.html
-/sdcard/android/layout_tests/transitions/transition-end-event-destroy-renderer.html
-/sdcard/android/layout_tests/transitions/extra-transition.html
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/010.xml
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/001.xml
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/002.xml
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/003.xml
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/004.xml
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/005.xml
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/006.xml
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/007.xml
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/008.xml
-/sdcard/android/layout_tests/traversal/hixie-node-iterator/009.xml
-/sdcard/android/layout_tests/traversal/node-iterator-003.html
-/sdcard/android/layout_tests/traversal/node-iterator-005.html
-/sdcard/android/layout_tests/traversal/node-iterator-007.html
-/sdcard/android/layout_tests/traversal/tree-walker-001.html
-/sdcard/android/layout_tests/traversal/node-iterator-009.html
-/sdcard/android/layout_tests/traversal/tree-walker-003.html
-/sdcard/android/layout_tests/traversal/tree-walker-005.html
-/sdcard/android/layout_tests/traversal/exception-forwarding.html
-/sdcard/android/layout_tests/traversal/stay-within-root.html
-/sdcard/android/layout_tests/traversal/node-iterator-002.html
-/sdcard/android/layout_tests/traversal/node-iterator-004.html
-/sdcard/android/layout_tests/traversal/node-iterator-006.html
-/sdcard/android/layout_tests/traversal/node-iterator-006a.html
-/sdcard/android/layout_tests/traversal/tree-walker-002.html
-/sdcard/android/layout_tests/traversal/node-iterator-008.html
-/sdcard/android/layout_tests/traversal/tree-walker-004.html
-/sdcard/android/layout_tests/traversal/tree-walker-006.html
-/sdcard/android/layout_tests/traversal/size-zero-run.html
-/sdcard/android/layout_tests/traversal/acid3-test-2.html
-/sdcard/android/layout_tests/traversal/tree-walker-filter-1.html
-/sdcard/android/layout_tests/traversal/node-iterator-001.html
diff --git a/tests/DumpRenderTree/assets/run_layout_tests.py b/tests/DumpRenderTree/assets/run_layout_tests.py
deleted file mode 100755
index 21c02ec..0000000
--- a/tests/DumpRenderTree/assets/run_layout_tests.py
+++ /dev/null
@@ -1,320 +0,0 @@
-#!/usr/bin/python
-
-"""Run layout tests using Android emulator and instrumentation.
-
-  First, you need to get an SD card or sdcard image that has layout tests on it.
-  Layout tests are in following directory:
-    /sdcard/webkit/layout_tests
-  For example, /sdcard/webkit/layout_tests/fast
-
-  Usage:
-    Run all tests under fast/ directory:
-      run_layout_tests.py, or
-      run_layout_tests.py fast
-
-    Run all tests under a sub directory:
-      run_layout_tests.py fast/dom
-
-    Run a single test:
-      run_layout_tests.py fast/dom/
-
-  After a merge, if there are changes of layout tests in SD card, you need to
-  use --refresh-test-list option *once* to re-generate test list on the card.
-
-  Some other options are:
-    --rebaseline generates expected layout tests results under /sdcard/webkit/expected_result/
-    --time-out-ms (default is 8000 millis) for each test
-    --adb-options="-e" passes option string to adb
-    --results-directory=..., (default is ./layout-test-results) directory name under which results are stored.
-    --js-engine the JavaScript engine currently in use, determines which set of Android-specific expected results we should use, should be 'jsc' or 'v8'
-"""
-
-import logging
-import optparse
-import os
-import subprocess
-import sys
-import time
-
-def CountLineNumber(filename):
-  """Compute the number of lines in a given file.
-
-  Args:
-    filename: a file name related to the current directory.
-  """
-
-  fp = open(os.path.abspath(filename), "r");
-  lines = 0
-  for line in fp.readlines():
-    lines = lines + 1
-  fp.close()
-  return lines
-
-def DumpRenderTreeFinished(adb_cmd):
-  """ Check if DumpRenderTree finished running tests
-
-  Args:
-    output: adb_cmd string
-  """
-
-  # pull /sdcard/webkit/running_test.txt, if the content is "#DONE", it's done
-  shell_cmd_str = adb_cmd + " shell cat /sdcard/webkit/running_test.txt"
-  adb_output = subprocess.Popen(shell_cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
-  return adb_output.strip() == "#DONE"
-
-def DiffResults(marker, new_results, old_results, diff_results, strip_reason,
-                new_count_first=True):
-   """ Given two result files, generate diff and
-       write to diff_results file. All arguments are absolute paths
-       to files.
-   """
-   old_file = open(old_results, "r")
-   new_file = open(new_results, "r")
-   diff_file = open(diff_results, "a")
-
-   # Read lines from each file
-   ndict = new_file.readlines()
-   cdict = old_file.readlines()
-
-   # Write marker to diff file
-   diff_file.writelines(marker + "\n")
-   diff_file.writelines("###############\n")
-
-   # Strip reason from result lines
-   if strip_reason is True:
-     for i in range(0, len(ndict)):
-       ndict[i] = ndict[i].split(' ')[0] + "\n"
-     for i in range(0, len(cdict)):
-       cdict[i] = cdict[i].split(' ')[0] + "\n"
-
-   params = {
-       "new": [0, ndict, cdict, "+"],
-       "miss": [0, cdict, ndict, "-"]
-       }
-   if new_count_first:
-     order = ["new", "miss"]
-   else:
-     order = ["miss", "new"]
-
-   for key in order:
-     for line in params[key][1]:
-       if line not in params[key][2]:
-         if line[-1] != "\n":
-           line += "\n";
-         diff_file.writelines(params[key][3] + line)
-         params[key][0] += 1
-
-   logging.info(marker + "  >>> " + str(params["new"][0]) + " new, " +
-                str(params["miss"][0]) + " misses")
-
-   diff_file.writelines("\n\n")
-
-   old_file.close()
-   new_file.close()
-   diff_file.close()
-   return
-
-def CompareResults(ref_dir, results_dir):
-  """Compare results in two directories
-
-  Args:
-    ref_dir: the reference directory having layout results as references
-    results_dir: the results directory
-  """
-  logging.info("Comparing results to " + ref_dir)
-
-  diff_result = os.path.join(results_dir, "layout_tests_diff.txt")
-  if os.path.exists(diff_result):
-    os.remove(diff_result)
-
-  files=["crashed", "failed", "passed", "nontext"]
-  for f in files:
-    result_file_name = "layout_tests_" + f + ".txt"
-    DiffResults(f, os.path.join(results_dir, result_file_name),
-                os.path.join(ref_dir, result_file_name), diff_result,
-                False, f != "passed")
-  logging.info("Detailed diffs are in " + diff_result)
-
-def main(options, args):
-  """Run the tests. Will call sys.exit when complete.
-
-  Args:
-    options: a dictionary of command line options
-    args: a list of sub directories or files to test
-  """
-
-  # Set up logging format.
-  log_level = logging.INFO
-  if options.verbose:
-    log_level = logging.DEBUG
-  logging.basicConfig(level=log_level,
-                      format='%(message)s')
-
-  # Include all tests if none are specified.
-  if not args:
-    path = '/';
-  else:
-    path = ' '.join(args);
-
-  adb_cmd = "adb ";
-  if options.adb_options:
-    adb_cmd += options.adb_options
-
-  # Re-generate the test list if --refresh-test-list is on
-  if options.refresh_test_list:
-    logging.info("Generating test list.");
-    generate_test_list_cmd_str = adb_cmd + " shell am instrument -e class com.android.dumprendertree.LayoutTestsAutoTest#generateTestList -e path \"" + path + "\" -w com.android.dumprendertree/.LayoutTestsAutoRunner"
-    adb_output = subprocess.Popen(generate_test_list_cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
-
-    if adb_output.find('Process crashed') != -1:
-       logging.info("Aborting because cannot generate test list.\n" + adb_output)
-       sys.exit(1)
-
-
-  logging.info("Running tests")
-
-  # Count crashed tests.
-  crashed_tests = []
-
-  timeout_ms = '15000'
-  if options.time_out_ms:
-    timeout_ms = options.time_out_ms
-
-  # Run test until it's done
-
-  run_layout_test_cmd_prefix = adb_cmd + " shell am instrument"
-
-  run_layout_test_cmd_postfix = " -e path \"" + path + "\" -e timeout " + timeout_ms
-  if options.rebaseline:
-    run_layout_test_cmd_postfix += " -e rebaseline true"
-
-  # If the JS engine is not specified on the command line, try reading the
-  # JS_ENGINE environment  variable, which is used by the build system in
-  # external/webkit/Android.mk.
-  js_engine = options.js_engine
-  if not js_engine and os.environ.has_key('JS_ENGINE'):
-    js_engine = os.environ['JS_ENGINE']
-  if js_engine:
-    run_layout_test_cmd_postfix += " -e jsengine " + js_engine
-
-  run_layout_test_cmd_postfix += " -w com.android.dumprendertree/.LayoutTestsAutoRunner"
-
-  # Call LayoutTestsAutoTest::startLayoutTests.
-  run_layout_test_cmd = run_layout_test_cmd_prefix + " -e class com.android.dumprendertree.LayoutTestsAutoTest#startLayoutTests" + run_layout_test_cmd_postfix
-
-  adb_output = subprocess.Popen(run_layout_test_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
-  while not DumpRenderTreeFinished(adb_cmd):
-    # Get the running_test.txt
-    logging.error("DumpRenderTree crashed, output:\n" + adb_output)
-
-    shell_cmd_str = adb_cmd + " shell cat /sdcard/webkit/running_test.txt"
-    crashed_test = ""
-    while not crashed_test:
-      (crashed_test, err) = subprocess.Popen(
-          shell_cmd_str, shell=True, stdout=subprocess.PIPE,
-          stderr=subprocess.PIPE).communicate()
-      crashed_test = crashed_test.strip()
-      if not crashed_test:
-        logging.error('Cannot get crashed test name, device offline?')
-        logging.error('stderr: ' + err)
-        logging.error('retrying in 10s...')
-        time.sleep(10)
-
-    logging.info(crashed_test + " CRASHED");
-    crashed_tests.append(crashed_test);
-
-    logging.info("Resuming layout test runner...");
-    # Call LayoutTestsAutoTest::resumeLayoutTests
-    run_layout_test_cmd = run_layout_test_cmd_prefix + " -e class com.android.dumprendertree.LayoutTestsAutoTest#resumeLayoutTests" + run_layout_test_cmd_postfix
-
-    adb_output = subprocess.Popen(run_layout_test_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
-
-  if adb_output.find('INSTRUMENTATION_FAILED') != -1:
-    logging.error("Error happened : " + adb_output)
-    sys.exit(1)
-
-  logging.debug(adb_output);
-  logging.info("Done\n");
-
-  # Pull results from /sdcard
-  results_dir = options.results_directory
-  if not os.path.exists(results_dir):
-    os.makedirs(results_dir)
-  if not os.path.isdir(results_dir):
-    logging.error("Cannot create results dir: " + results_dir);
-    sys.exit(1);
-
-  result_files = ["/sdcard/layout_tests_passed.txt",
-                  "/sdcard/layout_tests_failed.txt",
-                  "/sdcard/layout_tests_ignored.txt",
-                  "/sdcard/layout_tests_nontext.txt"]
-  for file in result_files:
-    shell_cmd_str = adb_cmd + " pull " + file + " " + results_dir
-    adb_output = subprocess.Popen(shell_cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
-    logging.debug(adb_output)
-
-  # Create the crash list.
-  fp = open(results_dir + "/layout_tests_crashed.txt", "w");
-  for crashed_test in crashed_tests:
-    fp.writelines(crashed_test + '\n')
-  fp.close()
-
-  # Count the number of tests in each category.
-  passed_tests = CountLineNumber(results_dir + "/layout_tests_passed.txt")
-  logging.info(str(passed_tests) + " passed")
-  failed_tests = CountLineNumber(results_dir + "/layout_tests_failed.txt")
-  logging.info(str(failed_tests) + " failed")
-  ignored_tests = CountLineNumber(results_dir + "/layout_tests_ignored.txt")
-  logging.info(str(ignored_tests) + " ignored results")
-  crashed_tests = CountLineNumber(results_dir + "/layout_tests_crashed.txt")
-  logging.info(str(crashed_tests) + " crashed")
-  nontext_tests = CountLineNumber(results_dir + "/layout_tests_nontext.txt")
-  logging.info(str(nontext_tests) + " no dumpAsText")
-  logging.info(str(passed_tests + failed_tests + ignored_tests + crashed_tests + nontext_tests) + " TOTAL")
-
-  logging.info("Results are stored under: " + results_dir + "\n")
-
-  # Comparing results to references to find new fixes and regressions.
-  results_dir = os.path.abspath(options.results_directory)
-  ref_dir = options.ref_directory
-
-  # if ref_dir is null, cannonify ref_dir to the script dir.
-  if not ref_dir:
-    script_self = sys.argv[0]
-    script_dir = os.path.dirname(script_self)
-    ref_dir = os.path.join(script_dir, "results")
-
-  ref_dir = os.path.abspath(ref_dir)
-
-  CompareResults(ref_dir, results_dir)
-
-if '__main__' == __name__:
-  option_parser = optparse.OptionParser()
-  option_parser.add_option("", "--rebaseline", action="store_true",
-                           default=False,
-                           help="generate expected results for those tests not having one")
-  option_parser.add_option("", "--time-out-ms",
-                           default=None,
-                           help="set the timeout for each test")
-  option_parser.add_option("", "--verbose", action="store_true",
-                           default=False,
-                           help="include debug-level logging")
-  option_parser.add_option("", "--refresh-test-list", action="store_true",
-                           default=False,
-                           help="re-generate test list, it may take some time.")
-  option_parser.add_option("", "--adb-options",
-                           default=None,
-                           help="pass options to adb, such as -d -e, etc");
-  option_parser.add_option("", "--results-directory",
-                           default="layout-test-results",
-                           help="directory which results are stored.")
-  option_parser.add_option("", "--ref-directory",
-                           default=None,
-                           dest="ref_directory",
-                           help="directory where reference results are stored.")
-  option_parser.add_option("", "--js-engine",
-                           default=None,
-                           help="The JavaScript engine currently in use, which determines which set of Android-specific expected results we should use. Should be 'jsc' or 'v8'.");
-
-  options, args = option_parser.parse_args();
-  main(options, args)
diff --git a/tests/DumpRenderTree/assets/run_page_cycler.py b/tests/DumpRenderTree/assets/run_page_cycler.py
deleted file mode 100755
index f995086..0000000
--- a/tests/DumpRenderTree/assets/run_page_cycler.py
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/usr/bin/python
-
-"""Run page cycler tests using Android instrumentation.
-
-  First, you need to get an SD card or sdcard image that has page cycler tests.
-
-  Usage:
-    Run a single page cycler test:
-      run_page_cycler.py "file:///sdcard/webkit/page_cycler/moz/start.html\?auto=1\&iterations=10"
-"""
-
-import logging
-import optparse
-import os
-import subprocess
-import sys
-import time
-
-
-
-def main(options, args):
-  """Run the tests. Will call sys.exit when complete.
-
-  """
-
-  # Set up logging format.
-  log_level = logging.INFO
-  if options.verbose:
-    log_level = logging.DEBUG
-  logging.basicConfig(level=log_level,
-                      format='%(message)s')
-
-  # Include all tests if none are specified.
-  if not args:
-    print "need a URL, e.g. file:///sdcard/webkit/page_cycler/moz/start.html\?auto=1\&iterations=10"
-    print "  or remote:android-browser-test:80/page_cycler/"
-    sys.exit(1)
-  else:
-    path = ' '.join(args);
-
-  if path[:7] == "remote:":
-    remote_path = path[7:]
-  else:
-    remote_path = None
-
-  adb_cmd = "adb ";
-  if options.adb_options:
-    adb_cmd += options.adb_options
-
-  logging.info("Running the test ...")
-
-  # Count crashed tests.
-  crashed_tests = []
-
-  timeout_ms = '0'
-  if options.time_out_ms:
-    timeout_ms = options.time_out_ms
-
-  # Run test until it's done
-
-  run_load_test_cmd_prefix = adb_cmd + " shell am instrument"
-  run_load_test_cmd_postfix = " -w com.android.dumprendertree/.LayoutTestsAutoRunner"
-
-  # Call LoadTestsAutoTest::runTest.
-  run_load_test_cmd = run_load_test_cmd_prefix + " -e class com.android.dumprendertree.LoadTestsAutoTest#runPageCyclerTest -e timeout " + timeout_ms
-
-  if remote_path:
-    if options.suite:
-      run_load_test_cmd += " -e suite %s -e forward %s " % (options.suite,
-                                                            remote_path)
-    else:
-      print "for network mode, need to specify --suite as well."
-      sys.exit(1)
-    if options.iteration:
-      run_load_test_cmd += " -e iteration %s" % options.iteration
-  else:
-    run_load_test_cmd += " -e path \"%s\" " % path
-
-
-  if options.drawtime:
-    run_load_test_cmd += " -e drawtime true "
-
-  if options.save_image:
-    run_load_test_cmd += " -e saveimage \"%s\"" % options.save_image
-
-  run_load_test_cmd += run_load_test_cmd_postfix
-
-  (adb_output, adb_error) = subprocess.Popen(run_load_test_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
-  fail_flag = False
-  for line in adb_output.splitlines():
-    line = line.strip()
-    if line.find('INSTRUMENTATION_CODE') == 0:
-      if not line[22:] == '-1':
-        fail_flag = True
-        break
-    if (line.find('INSTRUMENTATION_FAILED') != -1 or
-        line.find('Process crashed.') != -1):
-      fail_flag = True
-      break
-  if fail_flag:
-    logging.error("Error happened : " + adb_output)
-    sys.exit(1)
-
-  logging.info(adb_output);
-  logging.info(adb_error);
-  logging.info("Done\n");
-
-  # Pull results from /sdcard/load_test_result.txt
-  results_dir = options.results_directory
-  if not os.path.exists(results_dir):
-    os.makedirs(results_dir)
-  if not os.path.isdir(results_dir):
-    logging.error("Cannot create results dir: " + results_dir)
-    sys.exit(1)
-
-  result_file = "/sdcard/load_test_result.txt"
-  shell_cmd_str = adb_cmd + " pull " + result_file + " " + results_dir
-  (adb_output, err) = subprocess.Popen(
-      shell_cmd_str, shell=True,
-      stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
-  if not os.path.isfile(os.path.join(results_dir, "load_test_result.txt")):
-    logging.error("Failed to pull result file.")
-    logging.error("adb stdout:")
-    logging.error(adb_output)
-    logging.error("adb stderr:")
-    logging.error(err)
-  logging.info("Results are stored under: " + results_dir + "/load_test_result.txt\n")
-
-if '__main__' == __name__:
-  option_parser = optparse.OptionParser()
-  option_parser.add_option("-t", "--time-out-ms",
-                           default=None,
-                           help="set the timeout for each test")
-  option_parser.add_option("-v", "--verbose", action="store_true",
-                           default=False,
-                           help="include debug-level logging")
-  option_parser.add_option("-a", "--adb-options",
-                           default=None,
-                           help="pass options to adb, such as -d -e, etc");
-  option_parser.add_option("-r", "--results-directory",
-                           default="layout-test-results",
-                           help="directory which results are stored.")
-
-  option_parser.add_option("-d", "--drawtime", action="store_true",
-                           default=False,
-                           help="log draw time for each page rendered.")
-
-  option_parser.add_option("-s", "--save-image",
-                           default=None,
-                           help="stores rendered page to a location on device.")
-
-  option_parser.add_option("-u", "--suite",
-                           default=None,
-                           help="(for network mode) specify the suite to"
-                           " run by name")
-
-  option_parser.add_option("-i", "--iteration",
-                           default="5",
-                           help="(for network mode) specify how many iterations"
-                           " to run")
-
-  options, args = option_parser.parse_args();
-  main(options, args)
diff --git a/tests/DumpRenderTree/assets/run_reliability_tests.py b/tests/DumpRenderTree/assets/run_reliability_tests.py
deleted file mode 100755
index 59ac4a3..0000000
--- a/tests/DumpRenderTree/assets/run_reliability_tests.py
+++ /dev/null
@@ -1,276 +0,0 @@
-#!/usr/bin/python2.4
-
-"""Run reliability tests using Android instrumentation.
-
-  A test file consists of list web sites to test is needed as a parameter
-
-  Usage:
-    run_reliability_tests.py path/to/url/list
-"""
-
-import logging
-import optparse
-import os
-import subprocess
-import sys
-import time
-from Numeric import *
-
-TEST_LIST_FILE = "/sdcard/android/reliability_tests_list.txt"
-TEST_STATUS_FILE = "/sdcard/android/reliability_running_test.txt"
-TEST_TIMEOUT_FILE = "/sdcard/android/reliability_timeout_test.txt"
-TEST_LOAD_TIME_FILE = "/sdcard/android/reliability_load_time.txt"
-HTTP_URL_FILE = "urllist_http"
-HTTPS_URL_FILE = "urllist_https"
-NUM_URLS = 25
-
-
-def DumpRenderTreeFinished(adb_cmd):
-  """Check if DumpRenderTree finished running.
-
-  Args:
-    adb_cmd: adb command string
-
-  Returns:
-    True if DumpRenderTree has finished, False otherwise
-  """
-
-  # pull test status file and look for "#DONE"
-  shell_cmd_str = adb_cmd + " shell cat " + TEST_STATUS_FILE
-  adb_output = subprocess.Popen(shell_cmd_str,
-                                shell=True, stdout=subprocess.PIPE,
-                                stderr=subprocess.PIPE).communicate()[0]
-  return adb_output.strip() == "#DONE"
-
-
-def RemoveDeviceFile(adb_cmd, file_name):
-  shell_cmd_str = adb_cmd + " shell rm " + file_name
-  subprocess.Popen(shell_cmd_str,
-                   shell=True, stdout=subprocess.PIPE,
-                   stderr=subprocess.PIPE).communicate()
-
-
-def Bugreport(url, bugreport_dir, adb_cmd):
-  """Pull a bugreport from the device."""
-  bugreport_filename = "%s/reliability_bugreport_%d.txt" % (bugreport_dir,
-                                                            int(time.time()))
-
-  # prepend the report with url
-  handle = open(bugreport_filename, "w")
-  handle.writelines("Bugreport for crash in url - %s\n\n" % url)
-  handle.close()
-
-  cmd = "%s bugreport >> %s" % (adb_cmd, bugreport_filename)
-  os.system(cmd)
-
-
-def ProcessPageLoadTime(raw_log):
-  """Processes the raw page load time logged by test app."""
-  log_handle = open(raw_log, "r")
-  load_times = {}
-
-  for line in log_handle:
-    line = line.strip()
-    pair = line.split("|")
-    if len(pair) != 2:
-      logging.info("Line has more than one '|': " + line)
-      continue
-    if pair[0] not in load_times:
-      load_times[pair[0]] = []
-    try:
-      pair[1] = int(pair[1])
-    except ValueError:
-      logging.info("Lins has non-numeric load time: " + line)
-      continue
-    load_times[pair[0]].append(pair[1])
-
-  log_handle.close()
-
-  # rewrite the average time to file
-  log_handle = open(raw_log, "w")
-  for url, times in load_times.iteritems():
-    # calculate std
-    arr = array(times)
-    avg = average(arr)
-    d = arr - avg
-    std = sqrt(sum(d * d) / len(arr))
-    output = ("%-70s%-10d%-10d%-12.2f%-12.2f%s\n" %
-              (url, min(arr), max(arr), avg, std,
-               array2string(arr)))
-    log_handle.write(output)
-  log_handle.close()
-
-
-def main(options, args):
-  """Send the url list to device and start testing, restart if crashed."""
-
-  # Set up logging format.
-  log_level = logging.INFO
-  if options.verbose:
-    log_level = logging.DEBUG
-  logging.basicConfig(level=log_level,
-                      format="%(message)s")
-
-  # Include all tests if none are specified.
-  if not args:
-    print "Missing URL list file"
-    sys.exit(1)
-  else:
-    path = args[0]
-
-  if not options.crash_file:
-    print "Missing crash file name, use --crash-file to specify"
-    sys.exit(1)
-  else:
-    crashed_file = options.crash_file
-
-  if not options.timeout_file:
-    print "Missing timeout file, use --timeout-file to specify"
-    sys.exit(1)
-  else:
-    timedout_file = options.timeout_file
-
-  if not options.delay:
-    manual_delay = 0
-  else:
-    manual_delay = options.delay
-
-  if not options.bugreport:
-    bugreport_dir = "."
-  else:
-    bugreport_dir = options.bugreport
-  if not os.path.exists(bugreport_dir):
-    os.makedirs(bugreport_dir)
-  if not os.path.isdir(bugreport_dir):
-    logging.error("Cannot create results dir: " + bugreport_dir)
-    sys.exit(1)
-
-  adb_cmd = "adb "
-  if options.adb_options:
-    adb_cmd += options.adb_options + " "
-
-  # push url list to device
-  test_cmd = adb_cmd + " push \"" + path + "\" \"" + TEST_LIST_FILE + "\""
-  proc = subprocess.Popen(test_cmd, shell=True,
-                          stdout=subprocess.PIPE,
-                          stderr=subprocess.PIPE)
-  (adb_output, adb_error) = proc.communicate()
-  if proc.returncode != 0:
-    logging.error("failed to push url list to device.")
-    logging.error(adb_output)
-    logging.error(adb_error)
-    sys.exit(1)
-
-  # clean up previous results
-  RemoveDeviceFile(adb_cmd, TEST_STATUS_FILE)
-  RemoveDeviceFile(adb_cmd, TEST_TIMEOUT_FILE)
-  RemoveDeviceFile(adb_cmd, TEST_LOAD_TIME_FILE)
-
-  logging.info("Running the test ...")
-
-  # Count crashed tests.
-  crashed_tests = []
-
-  if options.time_out_ms:
-    timeout_ms = options.time_out_ms
-
-  # Run test until it's done
-  test_cmd_prefix = adb_cmd + " shell am instrument"
-  test_cmd_postfix = " -w com.android.dumprendertree/.LayoutTestsAutoRunner"
-
-  # Call ReliabilityTestsAutoTest#startReliabilityTests
-  test_cmd = (test_cmd_prefix + " -e class "
-              "com.android.dumprendertree.ReliabilityTest#"
-              "runReliabilityTest -e timeout %s -e delay %s" %
-              (str(timeout_ms), str(manual_delay)))
-
-  if options.logtime:
-    test_cmd += " -e logtime true"
-
-  test_cmd += test_cmd_postfix
-
-  adb_output = subprocess.Popen(test_cmd, shell=True,
-                                stdout=subprocess.PIPE,
-                                stderr=subprocess.PIPE).communicate()[0]
-  while not DumpRenderTreeFinished(adb_cmd):
-    logging.error("DumpRenderTree exited before all URLs are visited.")
-    shell_cmd_str = adb_cmd + " shell cat " + TEST_STATUS_FILE
-    crashed_test = ""
-    while not crashed_test:
-      (crashed_test, err) = subprocess.Popen(
-          shell_cmd_str, shell=True, stdout=subprocess.PIPE,
-          stderr=subprocess.PIPE).communicate()
-      crashed_test = crashed_test.strip()
-      if not crashed_test:
-        logging.error('Cannot get crashed test name, device offline?')
-        logging.error('stderr: ' + err)
-        logging.error('retrying in 10s...')
-        time.sleep(10)
-
-    logging.info(crashed_test + " CRASHED")
-    crashed_tests.append(crashed_test)
-    Bugreport(crashed_test, bugreport_dir, adb_cmd)
-    logging.info("Resuming reliability test runner...")
-
-    adb_output = subprocess.Popen(test_cmd, shell=True, stdout=subprocess.PIPE,
-                                  stderr=subprocess.PIPE).communicate()[0]
-
-  if (adb_output.find("INSTRUMENTATION_FAILED") != -1 or
-      adb_output.find("Process crashed.") != -1):
-    logging.error("Error happened : " + adb_output)
-    sys.exit(1)
-
-  logging.info(adb_output)
-  logging.info("Done\n")
-
-  if crashed_tests:
-    file_handle = open(crashed_file, "w")
-    file_handle.writelines("\n".join(crashed_tests))
-    logging.info("Crashed URL list stored in: " + crashed_file)
-    file_handle.close()
-  else:
-    logging.info("No crash found.")
-
-  # get timeout file from sdcard
-  test_cmd = (adb_cmd + "pull \"" + TEST_TIMEOUT_FILE + "\" \""
-              + timedout_file +  "\"")
-  subprocess.Popen(test_cmd, shell=True, stdout=subprocess.PIPE,
-                   stderr=subprocess.PIPE).communicate()
-
-  if options.logtime:
-    # get logged page load times from sdcard
-    test_cmd = (adb_cmd + "pull \"" + TEST_LOAD_TIME_FILE + "\" \""
-                + options.logtime +  "\"")
-    subprocess.Popen(test_cmd, shell=True, stdout=subprocess.PIPE,
-                     stderr=subprocess.PIPE).communicate()
-    ProcessPageLoadTime(options.logtime)
-
-
-if "__main__" == __name__:
-  option_parser = optparse.OptionParser()
-  option_parser.add_option("-t", "--time-out-ms",
-                           default=60000,
-                           help="set the timeout for each test")
-  option_parser.add_option("-v", "--verbose", action="store_true",
-                           default=False,
-                           help="include debug-level logging")
-  option_parser.add_option("-a", "--adb-options",
-                           default=None,
-                           help="pass options to adb, such as -d -e, etc")
-  option_parser.add_option("-c", "--crash-file",
-                           default="reliability_crashed_sites.txt",
-                           help="the list of sites that cause browser to crash")
-  option_parser.add_option("-f", "--timeout-file",
-                           default="reliability_timedout_sites.txt",
-                           help="the list of sites that timedout during test")
-  option_parser.add_option("-d", "--delay",
-                           default=0,
-                           help="add a manual delay between pages (in ms)")
-  option_parser.add_option("-b", "--bugreport",
-                           default=".",
-                           help="the directory to store bugreport for crashes")
-  option_parser.add_option("-l", "--logtime",
-                           default=None,
-                           help="Logs page load time for each url to the file")
-  opts, arguments = option_parser.parse_args()
-  main(opts, arguments)
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java b/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java
deleted file mode 100644
index 9d621d6..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package com.android.dumprendertree;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.webkit.WebStorage;
-
-import java.util.HashMap;
-
-public class CallbackProxy extends Handler implements EventSender, LayoutTestController {
-
-    private EventSender mEventSender;
-    private LayoutTestController mLayoutTestController;
-
-    private static final int EVENT_DOM_LOG = 1;
-    private static final int EVENT_FIRE_KBD = 2;
-    private static final int EVENT_KEY_DOWN_1 = 3;
-    private static final int EVENT_KEY_DOWN_2 = 4;
-    private static final int EVENT_LEAP = 5;
-    private static final int EVENT_MOUSE_CLICK = 6;
-    private static final int EVENT_MOUSE_DOWN = 7;
-    private static final int EVENT_MOUSE_MOVE = 8;
-    private static final int EVENT_MOUSE_UP = 9;
-    private static final int EVENT_TOUCH_START = 10;
-    private static final int EVENT_TOUCH_MOVE = 11;
-    private static final int EVENT_TOUCH_END = 12;
-    private static final int EVENT_TOUCH_CANCEL = 13;
-    private static final int EVENT_ADD_TOUCH_POINT = 14;
-    private static final int EVENT_UPDATE_TOUCH_POINT = 15;
-    private static final int EVENT_RELEASE_TOUCH_POINT = 16;
-    private static final int EVENT_CLEAR_TOUCH_POINTS = 17;
-    private static final int EVENT_CANCEL_TOUCH_POINT = 18;
-    private static final int EVENT_SET_TOUCH_MODIFIER = 19;
-    private static final int LAYOUT_CLEAR_LIST = 20;
-    private static final int LAYOUT_DISPLAY = 21;
-    private static final int LAYOUT_DUMP_TEXT = 22;
-    private static final int LAYOUT_DUMP_HISTORY = 23;
-    private static final int LAYOUT_DUMP_CHILD_SCROLL = 24;
-    private static final int LAYOUT_DUMP_EDIT_CB = 25;
-    private static final int LAYOUT_DUMP_SEL_RECT = 26;
-    private static final int LAYOUT_DUMP_TITLE_CHANGES = 27;
-    private static final int LAYOUT_KEEP_WEB_HISTORY = 28;
-    private static final int LAYOUT_NOTIFY_DONE = 29;
-    private static final int LAYOUT_QUEUE_BACK_NAV = 30;
-    private static final int LAYOUT_QUEUE_FWD_NAV = 31;
-    private static final int LAYOUT_QUEUE_LOAD = 32;
-    private static final int LAYOUT_QUEUE_RELOAD = 33;
-    private static final int LAYOUT_QUEUE_SCRIPT = 34;
-    private static final int LAYOUT_REPAINT_HORZ = 35;
-    private static final int LAYOUT_SET_ACCEPT_EDIT = 36;
-    private static final int LAYOUT_MAIN_FIRST_RESP = 37;
-    private static final int LAYOUT_SET_WINDOW_KEY = 38;
-    private static final int LAYOUT_TEST_REPAINT = 39;
-    private static final int LAYOUT_WAIT_UNTIL_DONE = 40;
-    private static final int LAYOUT_DUMP_DATABASE_CALLBACKS = 41;
-    private static final int LAYOUT_SET_CAN_OPEN_WINDOWS = 42;
-    private static final int OVERRIDE_PREFERENCE = 43;
-    private static final int LAYOUT_DUMP_CHILD_FRAMES_TEXT = 44;
-    private static final int SET_XSS_AUDITOR_ENABLED = 45;
-    
-    CallbackProxy(EventSender eventSender, 
-            LayoutTestController layoutTestController) {
-        mEventSender = eventSender;
-        mLayoutTestController = layoutTestController;
-    }
-    
-    public void handleMessage(Message msg) {
-        switch (msg.what) {
-        case EVENT_DOM_LOG:
-            mEventSender.enableDOMUIEventLogging(msg.arg1);
-            break;
-        case EVENT_FIRE_KBD:
-            mEventSender.fireKeyboardEventsToElement(msg.arg1);
-            break;
-        case EVENT_KEY_DOWN_1:
-            HashMap map = (HashMap) msg.obj;
-            mEventSender.keyDown((String) map.get("character"), 
-                    (String[]) map.get("withModifiers"));
-            break;
-
-        case EVENT_KEY_DOWN_2:
-            mEventSender.keyDown((String)msg.obj);
-            break;
-
-        case EVENT_LEAP:
-            mEventSender.leapForward(msg.arg1);
-            break;
-
-        case EVENT_MOUSE_CLICK:
-            mEventSender.mouseClick();
-            break;
-
-        case EVENT_MOUSE_DOWN:
-            mEventSender.mouseDown();
-            break;
-
-        case EVENT_MOUSE_MOVE:
-            mEventSender.mouseMoveTo(msg.arg1, msg.arg2);
-            break;
-
-        case EVENT_MOUSE_UP:
-            mEventSender.mouseUp();
-            break;
-
-        case EVENT_TOUCH_START:
-            mEventSender.touchStart();
-            break;
-
-        case EVENT_TOUCH_MOVE:
-            mEventSender.touchMove();
-            break;
-
-        case EVENT_TOUCH_END:
-            mEventSender.touchEnd();
-            break;
-
-        case EVENT_TOUCH_CANCEL:
-            mEventSender.touchCancel();
-            break;
-
-        case EVENT_ADD_TOUCH_POINT:
-            mEventSender.addTouchPoint(msg.arg1, msg.arg2);
-            break;
-
-        case EVENT_UPDATE_TOUCH_POINT:
-            Bundle args = (Bundle) msg.obj;
-            int x = args.getInt("x");
-            int y = args.getInt("y");
-            int id = args.getInt("id");
-            mEventSender.updateTouchPoint(id, x, y);
-            break;
-
-        case EVENT_SET_TOUCH_MODIFIER:
-            Bundle modifierArgs = (Bundle) msg.obj;
-            String modifier = modifierArgs.getString("modifier");
-            boolean enabled = modifierArgs.getBoolean("enabled");
-            mEventSender.setTouchModifier(modifier, enabled);
-            break;
-
-        case EVENT_RELEASE_TOUCH_POINT:
-            mEventSender.releaseTouchPoint(msg.arg1);
-            break;
-
-        case EVENT_CLEAR_TOUCH_POINTS:
-            mEventSender.clearTouchPoints();
-            break;
-
-        case EVENT_CANCEL_TOUCH_POINT:
-            mEventSender.cancelTouchPoint(msg.arg1);
-            break;
-
-        case LAYOUT_CLEAR_LIST:
-            mLayoutTestController.clearBackForwardList();
-            break;
-
-        case LAYOUT_DISPLAY:
-            mLayoutTestController.display();
-            break;
-
-        case LAYOUT_DUMP_TEXT:
-            mLayoutTestController.dumpAsText(msg.arg1 == 1);
-            break;
-
-        case LAYOUT_DUMP_CHILD_FRAMES_TEXT:
-            mLayoutTestController.dumpChildFramesAsText();
-            break;
-
-        case LAYOUT_DUMP_HISTORY:
-            mLayoutTestController.dumpBackForwardList();
-            break;
-
-        case LAYOUT_DUMP_CHILD_SCROLL:
-            mLayoutTestController.dumpChildFrameScrollPositions();
-            break;
-
-        case LAYOUT_DUMP_EDIT_CB:
-            mLayoutTestController.dumpEditingCallbacks();
-            break;
-
-        case LAYOUT_DUMP_SEL_RECT:
-            mLayoutTestController.dumpSelectionRect();
-            break;
-
-        case LAYOUT_DUMP_TITLE_CHANGES:
-            mLayoutTestController.dumpTitleChanges();
-            break;
-
-        case LAYOUT_KEEP_WEB_HISTORY:
-            mLayoutTestController.keepWebHistory();
-            break;
-
-        case LAYOUT_NOTIFY_DONE:
-            mLayoutTestController.notifyDone();
-            break;
-
-        case LAYOUT_QUEUE_BACK_NAV:
-            mLayoutTestController.queueBackNavigation(msg.arg1);
-            break;
-
-        case LAYOUT_QUEUE_FWD_NAV:
-            mLayoutTestController.queueForwardNavigation(msg.arg1);
-            break;
-
-        case LAYOUT_QUEUE_LOAD:
-            HashMap<String, String> loadMap = 
-                (HashMap<String, String>) msg.obj;
-            mLayoutTestController.queueLoad(loadMap.get("Url"), 
-                    loadMap.get("frameTarget"));
-            break;
-
-        case LAYOUT_QUEUE_RELOAD:
-            mLayoutTestController.queueReload();
-            break;
-
-        case LAYOUT_QUEUE_SCRIPT:
-            mLayoutTestController.queueScript((String)msg.obj);
-            break;
-
-        case LAYOUT_REPAINT_HORZ:
-            mLayoutTestController.repaintSweepHorizontally();
-            break;
-
-        case LAYOUT_SET_ACCEPT_EDIT:
-            mLayoutTestController.setAcceptsEditing(
-                    msg.arg1 == 1 ? true : false);
-            break;
-        case LAYOUT_MAIN_FIRST_RESP:
-            mLayoutTestController.setMainFrameIsFirstResponder(
-                    msg.arg1 == 1 ? true : false);
-            break;
-
-        case LAYOUT_SET_WINDOW_KEY:
-            mLayoutTestController.setWindowIsKey(
-                    msg.arg1 == 1 ? true : false);
-            break;
-
-        case LAYOUT_TEST_REPAINT:
-            mLayoutTestController.testRepaint();
-            break;
-
-        case LAYOUT_WAIT_UNTIL_DONE:
-            mLayoutTestController.waitUntilDone();
-            break;
-
-        case LAYOUT_DUMP_DATABASE_CALLBACKS:
-            mLayoutTestController.dumpDatabaseCallbacks();
-            break;
-
-        case LAYOUT_SET_CAN_OPEN_WINDOWS:
-            mLayoutTestController.setCanOpenWindows();
-            break;
-
-        case OVERRIDE_PREFERENCE:
-            String key = msg.getData().getString("key");
-            boolean value = msg.getData().getBoolean("value");
-            mLayoutTestController.overridePreference(key, value);
-            break;
-
-        case SET_XSS_AUDITOR_ENABLED:
-            mLayoutTestController.setXSSAuditorEnabled(msg.arg1 == 1);
-            break;
-        }
-    }
-
-    // EventSender Methods
-    
-    public void enableDOMUIEventLogging(int DOMNode) {
-        obtainMessage(EVENT_DOM_LOG, DOMNode, 0).sendToTarget();
-    }
-
-    public void fireKeyboardEventsToElement(int DOMNode) {
-        obtainMessage(EVENT_FIRE_KBD, DOMNode, 0).sendToTarget();
-    }
-
-    public void keyDown(String character, String[] withModifiers) {
-        // TODO Auto-generated method stub
-        HashMap map = new HashMap();
-        map.put("character", character);
-        map.put("withModifiers", withModifiers);
-        obtainMessage(EVENT_KEY_DOWN_1, map).sendToTarget();
-    }
-
-    public void keyDown(String character) {
-        obtainMessage(EVENT_KEY_DOWN_2, character).sendToTarget();
-    }
-
-    public void leapForward(int milliseconds) {
-        obtainMessage(EVENT_LEAP, milliseconds, 0).sendToTarget(); 
-    }
-
-    public void mouseClick() {
-        obtainMessage(EVENT_MOUSE_CLICK).sendToTarget();
-    }
-
-    public void mouseDown() {
-        obtainMessage(EVENT_MOUSE_DOWN).sendToTarget();
-    }
-
-    public void mouseMoveTo(int X, int Y) {
-        obtainMessage(EVENT_MOUSE_MOVE, X, Y).sendToTarget();
-    }
-
-    public void mouseUp() {
-        obtainMessage(EVENT_MOUSE_UP).sendToTarget();
-    }
-
-    public void touchStart() {
-        obtainMessage(EVENT_TOUCH_START).sendToTarget();
-    }
-
-    public void addTouchPoint(int x, int y) {
-        obtainMessage(EVENT_ADD_TOUCH_POINT, x, y).sendToTarget();
-    }
-
-    public void updateTouchPoint(int id, int x, int y) {
-        Bundle map = new Bundle();
-        map.putInt("x", x);
-        map.putInt("y", y);
-        map.putInt("id", id);
-        obtainMessage(EVENT_UPDATE_TOUCH_POINT, map).sendToTarget();
-    }
-
-    public void setTouchModifier(String modifier, boolean enabled) {
-        Bundle map = new Bundle();
-        map.putString("modifier", modifier);
-        map.putBoolean("enabled", enabled);
-        obtainMessage(EVENT_SET_TOUCH_MODIFIER, map).sendToTarget();
-    }
-
-    public void touchMove() {
-        obtainMessage(EVENT_TOUCH_MOVE).sendToTarget();
-    }
-
-    public void releaseTouchPoint(int id) {
-        obtainMessage(EVENT_RELEASE_TOUCH_POINT, id, 0).sendToTarget();
-    }
-
-    public void touchEnd() {
-        obtainMessage(EVENT_TOUCH_END).sendToTarget();
-    }
-
-    public void touchCancel() {
-        obtainMessage(EVENT_TOUCH_CANCEL).sendToTarget();
-    }
-
-
-    public void clearTouchPoints() {
-        obtainMessage(EVENT_CLEAR_TOUCH_POINTS).sendToTarget();
-    }
-
-    public void cancelTouchPoint(int id) {
-        obtainMessage(EVENT_CANCEL_TOUCH_POINT, id, 0).sendToTarget();
-    }
-    
-    // LayoutTestController Methods
-
-    public void clearBackForwardList() {
-        obtainMessage(LAYOUT_CLEAR_LIST).sendToTarget();
-    }
-
-    public void display() {
-        obtainMessage(LAYOUT_DISPLAY).sendToTarget();
-    }
-
-    public void dumpAsText() {
-        obtainMessage(LAYOUT_DUMP_TEXT, 0).sendToTarget();
-    }
-
-    public void dumpAsText(boolean enablePixelTests) {
-        obtainMessage(LAYOUT_DUMP_TEXT, enablePixelTests ? 1 : 0).sendToTarget();
-    }
-
-    public void dumpChildFramesAsText() {
-        obtainMessage(LAYOUT_DUMP_CHILD_FRAMES_TEXT).sendToTarget();
-    }
-
-    public void dumpBackForwardList() {
-        obtainMessage(LAYOUT_DUMP_HISTORY).sendToTarget();
-    }
-
-    public void dumpChildFrameScrollPositions() {
-        obtainMessage(LAYOUT_DUMP_CHILD_SCROLL).sendToTarget();
-    }
-
-    public void dumpEditingCallbacks() {
-        obtainMessage(LAYOUT_DUMP_EDIT_CB).sendToTarget(); 
-    }
-
-    public void dumpSelectionRect() {
-        obtainMessage(LAYOUT_DUMP_SEL_RECT).sendToTarget(); 
-    }
-
-    public void dumpTitleChanges() {
-        obtainMessage(LAYOUT_DUMP_TITLE_CHANGES).sendToTarget();
-    }
-
-    public void keepWebHistory() {
-        obtainMessage(LAYOUT_KEEP_WEB_HISTORY).sendToTarget();
-    }
-
-    public void notifyDone() {
-        obtainMessage(LAYOUT_NOTIFY_DONE).sendToTarget();
-    }
-
-    public void queueBackNavigation(int howfar) {
-        obtainMessage(LAYOUT_QUEUE_BACK_NAV, howfar, 0).sendToTarget();
-    }
-
-    public void queueForwardNavigation(int howfar) {
-        obtainMessage(LAYOUT_QUEUE_FWD_NAV, howfar, 0).sendToTarget();
-    }
-
-    public void queueLoad(String Url, String frameTarget) {
-        HashMap <String, String>map = new HashMap<String, String>();
-        map.put("Url", Url);
-        map.put("frameTarget", frameTarget);
-        obtainMessage(LAYOUT_QUEUE_LOAD, map).sendToTarget();
-    }
-
-    public void queueReload() {
-        obtainMessage(LAYOUT_QUEUE_RELOAD).sendToTarget();
-    }
-
-    public void queueScript(String scriptToRunInCurrentContext) {
-        obtainMessage(LAYOUT_QUEUE_SCRIPT, 
-                scriptToRunInCurrentContext).sendToTarget();
-    }
-
-    public void repaintSweepHorizontally() {
-        obtainMessage(LAYOUT_REPAINT_HORZ).sendToTarget();
-    }
-
-    public void setAcceptsEditing(boolean b) {
-        obtainMessage(LAYOUT_SET_ACCEPT_EDIT, b ? 1 : 0, 0).sendToTarget();
-    }
-
-    public void setMainFrameIsFirstResponder(boolean b) {
-        obtainMessage(LAYOUT_MAIN_FIRST_RESP, b ? 1 : 0, 0).sendToTarget();
-    }
-
-    public void setWindowIsKey(boolean b) {
-        obtainMessage(LAYOUT_SET_WINDOW_KEY, b ? 1 : 0, 0).sendToTarget();
-    }
-
-    public void testRepaint() {
-        obtainMessage(LAYOUT_TEST_REPAINT).sendToTarget(); 
-    }
-
-    public void waitUntilDone() {
-        obtainMessage(LAYOUT_WAIT_UNTIL_DONE).sendToTarget();
-    }
-
-    public void dumpDatabaseCallbacks() {
-        obtainMessage(LAYOUT_DUMP_DATABASE_CALLBACKS).sendToTarget();
-    }
-
-    public void clearAllDatabases() {
-        WebStorage.getInstance().deleteAllData();
-    }
-
-    public void setDatabaseQuota(long quota) {
-        WebStorage.getInstance().setQuotaForOrigin("file://", quota);
-    }
-
-    public void setAppCacheMaximumSize(long size) {
-        android.webkit.WebStorageClassic.getInstance().setAppCacheMaximumSize(size);
-    }
-
-    public void setCanOpenWindows() {
-        obtainMessage(LAYOUT_SET_CAN_OPEN_WINDOWS).sendToTarget();
-    }
-
-    public void setMockGeolocationPosition(double latitude,
-                                           double longitude,
-                                           double accuracy) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via the TestShellActivity
-        // as we need access to the Webview.
-        mLayoutTestController.setMockGeolocationPosition(latitude,
-                                                         longitude,
-                                                         accuracy);
-    }
-
-    public void setMockGeolocationError(int code, String message) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via the TestShellActivity
-        // as we need access to the Webview.
-        mLayoutTestController.setMockGeolocationError(code, message);
-    }
-
-    public void setGeolocationPermission(boolean allow) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via the TestShellActivity
-        // as we need access to the Webview.
-        mLayoutTestController.setGeolocationPermission(allow);
-    }
-
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via the TestShellActivity
-        // as we need access to the Webview.
-        mLayoutTestController.setMockDeviceOrientation(canProvideAlpha, alpha, canProvideBeta, beta,
-                canProvideGamma, gamma);
-    }
-
-    public void overridePreference(String key, boolean value) {
-        Message message = obtainMessage(OVERRIDE_PREFERENCE);
-        message.getData().putString("key", key);
-        message.getData().putBoolean("value", value);
-        message.sendToTarget();
-    }
-
-    public void setXSSAuditorEnabled(boolean flag) {
-        obtainMessage(SET_XSS_AUDITOR_ENABLED, flag ? 1 : 0, 0).sendToTarget();
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/EventSender.java b/tests/DumpRenderTree/src/com/android/dumprendertree/EventSender.java
deleted file mode 100644
index 23cc8f5..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/EventSender.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package com.android.dumprendertree;
-
-public interface EventSender {
-    	public void mouseDown();
-    	public void mouseUp();
-        public void mouseClick();
-        public void mouseMoveTo(int X, int Y);
-        public void leapForward(int milliseconds);
-        public void keyDown (String character, String[] withModifiers);
-        public void keyDown (String character);
-        public void enableDOMUIEventLogging(int DOMNode);
-        public void fireKeyboardEventsToElement(int DOMNode);
-        public void touchStart();
-        public void touchMove();
-        public void touchEnd();
-        public void touchCancel();
-        public void addTouchPoint(int x, int y);
-        public void updateTouchPoint(int id, int x, int y);
-        public void setTouchModifier(String modifier, boolean enabled);
-        public void releaseTouchPoint(int id);
-        public void clearTouchPoints();
-        public void cancelTouchPoint(int id);
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
deleted file mode 100644
index d373d8d..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package com.android.dumprendertree;
-
-import java.util.Vector;
-import android.util.*;
-
-public class FileFilter {
-
-    private static final String LOGTAG = "FileFilter";
-
-    // Returns whether we should ignore this test and skip running it.
-    // Currently we use this only for tests that crash or hang DumpRenderTree.
-    // TODO: Fix these and eliminate this method.
-    public static boolean ignoreTest(String file) {
-        for (int i = 0; i < ignoreTestList.length; i++) {
-            if (file.endsWith(ignoreTestList[i])) {
-                Log.v(LOGTAG, "File path in list of ignored tests: " + file);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Returns whether a directory does not contain layout tests and so can be
-    // ignored.
-    public static boolean isNonTestDir(String file) {
-        for (int i = 0; i < nonTestDirs.length; i++) {
-            if (file.endsWith(nonTestDirs[i])) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Returns whether we should ignore the result of this test.
-    public static boolean ignoreResult(String file) {
-        for (int i = 0; i < ignoreResultList.size(); i++) {
-            if (file.endsWith(ignoreResultList.get(i))) {
-                Log.v(LOGTAG, "File path in list of ignored results: " + file);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    final static Vector<String> ignoreResultList = new Vector<String>();
-
-    static {
-        fillIgnoreResultList();
-    }
-
-    static final String[] nonTestDirs = {
-        ".", // ignore hidden directories and files
-        "resources", // ignore resource directories
-        ".svn", // don't run anything under .svn folder
-        "platform"  // No-Android specific tests
-    };
-
-    static final String[] ignoreTestList = {
-        "canvas/philip/tests/2d.drawImage.broken.html", // blocks test, http://b/2982500
-        "editing/selection/move-left-right.html", // Causes DumpRenderTree to hang
-        "fast/js/excessive-comma-usage.html", // Tests huge initializer list, causes OOM.
-        "fast/js/regexp-charclass-crash.html", // RegExp is too large, causing OOM
-        "fast/js/regexp-overflow.html", // Result is too large, causing OOM when reading by DRT, http://b/2697589
-        "fast/regex/test1.html", // Causes DumpRenderTree to hang with V8
-        "fast/regex/slow.html", // Causes DumpRenderTree to hang with V8
-    };
-
-    static void fillIgnoreResultList() {
-        // This first block of tests are for features for which Android
-        // should pass all tests. They are skipped only temporarily.
-        // TODO: Fix these failing tests and remove them from this list.
-        ignoreResultList.add("fast/dom/HTMLKeygenElement/keygen.html"); // Missing layoutTestController.shadowRoot()
-        ignoreResultList.add("fast/dom/Geolocation/window-close-crash.html"); // Missing layoutTestContoller.setCloseRemainingWindowsWhenComplete()
-        ignoreResultList.add("fast/dom/Geolocation/page-reload-cancel-permission-requests.html"); // Missing layoutTestController.numberOfPendingGeolocationPermissionRequests()
-        ignoreResultList.add("fast/dom/HTMLLinkElement/link-and-subresource-test.html"); // Missing layoutTestController.dumpResourceResponseMIMETypes()
-        ignoreResultList.add("fast/dom/HTMLLinkElement/prefetch.html"); // Missing layoutTestController.dumpResourceResponseMIMETypes()
-        ignoreResultList.add("fast/dom/HTMLLinkElement/subresource.html"); // Missing layoutTestController.dumpResourceResponseMIMETypes()
-        ignoreResultList.add("fast/encoding/char-decoding.html"); // fails in Java HTTP stack, see http://b/issue?id=3047156
-        ignoreResultList.add("fast/encoding/hanarei-blog32-fc2-com.html"); // fails in Java HTTP stack, see http://b/issue?id=3046986
-        ignoreResultList.add("fast/encoding/mailto-always-utf-8.html"); // Requires waitForPolicyDelegate(), see http://b/issue?id=3043468
-        ignoreResultList.add("fast/encoding/percent-escaping.html"); // fails in Java HTTP stack, see http://b/issue?id=3046984
-        ignoreResultList.add("http/tests/appcache/empty-manifest.html"); // flaky
-        ignoreResultList.add("http/tests/appcache/fallback.html"); // http://b/issue?id=2713004
-        ignoreResultList.add("http/tests/appcache/foreign-fallback.html"); // Flaky, may be due to DRT, see http://b/3285647
-        ignoreResultList.add("http/tests/appcache/foreign-iframe-main.html"); // flaky - skips states
-        ignoreResultList.add("http/tests/appcache/manifest-with-empty-file.html"); // flaky
-        ignoreResultList.add("http/tests/appcache/origin-quota.html"); // needs clearAllApplicationCaches(), see http://b/issue?id=2944196
-        ignoreResultList.add("storage/database-lock-after-reload.html"); // Succeeds but DumpRenderTree does not read result correctly
-        ignoreResultList.add("storage/hash-change-with-xhr.html"); // Succeeds but DumpRenderTree does not read result correctly
-        ignoreResultList.add("storage/open-database-creation-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/statement-error-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/statement-success-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/storageinfo-query-usage.html"); // Need window.webkitStorageInfo
-        ignoreResultList.add("storage/transaction-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/transaction-error-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/transaction-success-callback-isolated-world.html"); // Requires layoutTestController.evaluateScriptInIsolatedWorld()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-1-prepare.html"); // Missing layoutTestController.originsWithLocalStorage()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-2-create.html"); // Missing layoutTestController.originsWithLocalStorage()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-3-delete-all.html"); // Missing layoutTestController.originsWithLocalStorage()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-4-create.html"); // Missing layoutTestController.originsWithLocalStorage()
-        ignoreResultList.add("storage/domstorage/localstorage/storagetracker/storage-tracker-5-delete-one.html"); // Missing layoutTestController.originsWithLocalStorage()
-
-
-        // Expected failures due to unsupported features or tests unsuitable for Android.
-        ignoreResultList.add("fast/encoding/char-decoding-mac.html"); // Mac-specific encodings (also marked Won't Fix in Chromium, bug 7388)
-        ignoreResultList.add("fast/encoding/char-encoding-mac.html"); // Mac-specific encodings (also marked Won't Fix in Chromium, bug 7388)
-        ignoreResultList.add("fast/encoding/idn-security.html"); // Mac-specific IDN checks (also marked Won't Fix in Chromium, bug 21814)
-        ignoreResultList.add("fast/events/touch/basic-multi-touch-events.html"); // Requires multi-touch gestures not supported by Android system
-        ignoreResultList.add("fast/events/touch/touch-coords-in-zoom-and-scroll.html"); // Requires eventSender.zoomPageIn(),zoomPageOut()
-        ignoreResultList.add("fast/events/touch/touch-target.html"); // Requires multi-touch gestures not supported by Android system
-        ignoreResultList.add("fast/workers"); // workers not supported
-        ignoreResultList.add("http/tests/cookies/third-party-cookie-relaxing.html"); // We don't support conditional acceptance of third-party cookies
-        ignoreResultList.add("http/tests/eventsource/workers"); // workers not supported
-        ignoreResultList.add("http/tests/workers"); // workers not supported
-        ignoreResultList.add("http/tests/xmlhttprequest/workers"); // workers not supported
-        ignoreResultList.add("storage/domstorage/localstorage/private-browsing-affects-storage.html"); // private browsing not supported
-        ignoreResultList.add("storage/domstorage/sessionstorage/private-browsing-affects-storage.html"); // private browsing not supported
-        ignoreResultList.add("storage/indexeddb"); // indexeddb not supported
-        ignoreResultList.add("storage/private-browsing-noread-nowrite.html"); // private browsing not supported
-        ignoreResultList.add("storage/private-browsing-readonly.html"); // private browsing not supported
-        ignoreResultList.add("websocket/tests/workers"); // workers not supported
-        ignoreResultList.add("dom/xhtml/level2/html/htmldocument04.xhtml"); // /mnt/sdcard on SR uses lowercase filesystem, this test checks filename and is case senstive.
-        ignoreResultList.add("dom/html/level2/html/htmldocument04.html"); // ditto
-
-        // Expected failures due to missing expected results
-        ignoreResultList.add("dom/xhtml/level3/core/canonicalform08.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/canonicalform09.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/documentgetinputencoding03.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/entitygetinputencoding02.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/entitygetxmlversion02.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri05.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri07.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri09.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri10.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri11.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri15.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri17.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodegetbaseuri18.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodelookupnamespaceuri01.xhtml");
-        ignoreResultList.add("dom/xhtml/level3/core/nodelookupprefix19.xhtml");
-
-        // TODO: These need to be triaged
-        ignoreResultList.add("fast/css/case-transform.html"); // will not fix #619707
-        ignoreResultList.add("fast/dom/Element/offsetLeft-offsetTop-body-quirk.html"); // different screen size result in extra spaces in Apple compared to us
-        ignoreResultList.add("fast/dom/Window/Plug-ins.html"); // need test plugin
-        ignoreResultList.add("fast/dom/Window/window-screen-properties.html"); // pixel depth
-        ignoreResultList.add("fast/dom/Window/window-xy-properties.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/dom/attribute-namespaces-get-set.html"); // http://b/733229
-        ignoreResultList.add("fast/dom/object-embed-plugin-scripting.html"); // dynamic plugins not supported
-        ignoreResultList.add("fast/dom/tabindex-clamp.html"); // there is extra spacing in the file due to multiple input boxes fitting on one line on Apple, ours are wrapped. Space at line ends are stripped.
-        ignoreResultList.add("fast/events/anchor-image-scrolled-x-y.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/arrow-navigation.html"); // http://b/735233
-        ignoreResultList.add("fast/events/capture-on-target.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/dblclick-addEventListener.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/drag-in-frames.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/drag-outside-window.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/event-view-toString.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/frame-click-focus.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/frame-tab-focus.html"); // http://b/734308
-        ignoreResultList.add("fast/events/iframe-object-onload.html"); // there is extra spacing in the file due to multiple frame boxes fitting on one line on Apple, ours are wrapped. Space at line ends are stripped.
-        ignoreResultList.add("fast/events/input-image-scrolled-x-y.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseclick-target-and-positioning.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseover-mouseout.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseover-mouseout2.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseup-outside-button.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/mouseup-outside-document.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/onclick-list-marker.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/ondragenter.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/onload-webkit-before-webcore.html"); // missing space in textrun, ok as text is wrapped. ignore. #714933
-        ignoreResultList.add("fast/events/option-tab.html"); // http://b/734308
-        ignoreResultList.add("fast/events/window-events-bubble.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/window-events-bubble2.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/events/window-events-capture.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/drag-into-textarea.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/focus-control-to-page.html"); // http://b/716638
-        ignoreResultList.add("fast/forms/focus2.html"); // http://b/735111
-        ignoreResultList.add("fast/forms/form-data-encoding-2.html"); // charset convert. #516936 ignore, won't fix
-        ignoreResultList.add("fast/forms/form-data-encoding.html"); // charset convert. #516936 ignore, won't fix
-        ignoreResultList.add("fast/forms/input-appearance-maxlength.html"); // execCommand "insertText" not supported
-        ignoreResultList.add("fast/forms/input-select-on-click.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/listbox-onchange.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/listbox-selection.html"); // http://b/735116
-        ignoreResultList.add("fast/forms/onselect-textarea.html"); // requires eventSender.mouseMoveTo, mouseDown & mouseUp and abs. position of mouse to select a word. ignore, won't fix #716583
-        ignoreResultList.add("fast/forms/onselect-textfield.html"); // requires eventSender.mouseMoveTo, mouseDown & mouseUp and abs. position of mouse to select a word. ignore, won't fix #716583
-        ignoreResultList.add("fast/forms/plaintext-mode-1.html"); // not implemented queryCommandEnabled:BackColor, Undo & Redo
-        ignoreResultList.add("fast/forms/search-cancel-button-mouseup.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/search-event-delay.html"); // http://b/735120
-        ignoreResultList.add("fast/forms/select-empty-list.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/forms/select-type-ahead-non-latin.html"); // http://b/735244
-        ignoreResultList.add("fast/forms/selected-index-assert.html"); // not capturing the console messages
-        ignoreResultList.add("fast/forms/selection-functions.html"); // there is extra spacing as the text areas and input boxes fit next to each other on Apple, but are wrapped on our screen.
-        ignoreResultList.add("fast/forms/textarea-appearance-wrap.html"); // Our text areas are a little thinner than Apples. Also RTL test failes
-        ignoreResultList.add("fast/forms/textarea-initial-caret-position.html"); // Text selection done differently on our platform. When a inputbox gets focus, the entire block is selected.
-        ignoreResultList.add("fast/forms/textarea-no-scroll-on-blur.html"); // Text selection done differently on our platform. When a inputbox gets focus, the entire block is selected.
-        ignoreResultList.add("fast/forms/textarea-paste-newline.html"); // Copy&Paste commands not supported
-        ignoreResultList.add("fast/forms/textarea-scrolled-endline-caret.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/frames/iframe-window-focus.html"); // http://b/735140
-        ignoreResultList.add("fast/frames/frameElement-widthheight.html"); // screen width&height are different
-        ignoreResultList.add("fast/frames/frame-js-url-clientWidth.html"); // screen width&height are different
-        ignoreResultList.add("fast/html/tab-order.html"); // http://b/719289
-        ignoreResultList.add("fast/js/navigator-mimeTypes-length.html"); // dynamic plugins not supported
-        ignoreResultList.add("fast/js/string-capitalization.html"); // http://b/516936
-        ignoreResultList.add("fast/loader/local-JavaScript-from-local.html"); // Requires LayoutTests to exist at /tmp/LayoutTests
-        ignoreResultList.add("fast/loader/local-iFrame-source-from-local.html"); // Requires LayoutTests to exist at /tmp/LayoutTests
-        ignoreResultList.add("fast/loader/opaque-base-url.html"); // extra spacing because iFrames rendered next to each other on Apple
-        ignoreResultList.add("fast/overflow/scroll-vertical-not-horizontal.html"); // http://b/735196
-        ignoreResultList.add("fast/parser/script-tag-with-trailing-slash.html"); // not capturing the console messages
-        ignoreResultList.add("fast/replaced/image-map.html"); // requires eventSender.mouseDown(),mouseUp()
-        ignoreResultList.add("fast/text/plain-text-line-breaks.html"); // extra spacing because iFrames rendered next to each other on Apple
-        ignoreResultList.add("profiler"); // profiler is not supported
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FileList.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FileList.java
deleted file mode 100644
index 4a47a0e..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/FileList.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package com.android.dumprendertree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.io.File;
-
-import android.app.AlertDialog;
-import android.app.ListActivity;
-import android.content.DialogInterface;
-import android.view.KeyEvent;
-import android.view.View;
-import android.widget.ListView;
-import android.widget.SimpleAdapter;
-import android.os.Bundle;
-import android.os.Environment;
-
-
-public abstract class FileList extends ListActivity
-{
-	public boolean onKeyDown(int keyCode, KeyEvent event) {
-		switch (keyCode)
-		{
-			case KeyEvent.KEYCODE_DPAD_LEFT:
-				if (mPath.length() > mBaseLength) {
-					File f = new File(mPath);
-					mFocusFile = f.getName();
-					mFocusIndex = 0;
-					f = f.getParentFile();
-					mPath = f.getPath();
-					updateList();
-					return true;
-				}
-				break;
-
-			case KeyEvent.KEYCODE_DPAD_RIGHT:
-				{
-					Map map = (Map) getListView().getItemAtPosition(getListView().getSelectedItemPosition());
-					String path = (String)map.get("path");
-					if ((new File(path)).isDirectory()) {
-						mPath = path;
-				        mFocusFile = null;
-						updateList();
-					} else {
-						processFile(path, false);
-					}
-                    return true;
-				}
-
-			default:
-				break;
-		}
-		return super.onKeyDown(keyCode, event);
-	}
-
-	public void onCreate(Bundle icicle)
-    {
-        super.onCreate(icicle);
-        setupPath();
-        updateList();
-    }
-
-    protected List getData()
-    {
-        List myData = new ArrayList<HashMap>();
-
-        File f = new File(mPath);
-        if (!f.exists()) {
-        	addItem(myData, "!LayoutTests path missing!", "");
-        	return myData;
-        }
-        String[] files = f.list();
-        Arrays.sort(files);
-
-        for (int i = 0; i < files.length; i++) {
-        	StringBuilder sb = new StringBuilder(mPath);
-        	sb.append(File.separatorChar);
-        	sb.append(files[i]);
-        	String path = sb.toString();
-        	File c = new File(path);
-        	if (fileFilter(c)) {
-	        	if (c.isDirectory()) {
-	        		addItem(myData, "<"+files[i]+">", path);
-	        		if (mFocusFile != null && mFocusFile.equals(files[i]))
-	        			mFocusIndex = myData.size()-1;
-	        	}
-	        	else
-	        	    addItem(myData, files[i], path);
-        	}
-        }
-
-        return myData;
-    }
-
-    protected void addItem(List<Map> data, String name, String path)
-    {
-        HashMap temp = new HashMap();
-        temp.put("title", name);
-        temp.put("path", path);
-        data.add(temp);
-    }
-
-    protected void onListItemClick(ListView l, View v, int position, long id)
-    {
-        Map map = (Map) l.getItemAtPosition(position);
-        final String path = (String)map.get("path");
-
-        if ((new File(path)).isDirectory()) {
-            final CharSequence[] items = {"Open", "Run"};
-            AlertDialog.Builder builder = new AlertDialog.Builder(this);
-            builder.setTitle("Select an Action");
-            builder.setSingleChoiceItems(items, -1,
-                    new DialogInterface.OnClickListener(){
-                public void onClick(DialogInterface dialog, int which) {
-                    switch (which) {
-                        case OPEN_DIRECTORY:
-                            dialog.dismiss();
-                            mPath = path;
-                            mFocusFile = null;
-                            updateList();
-                            break;
-                        case RUN_TESTS:
-                            dialog.dismiss();
-                            processDirectory(path, false);
-                            break;
-                    }
-                }
-            });
-            builder.create().show();
-        } else {
-            processFile(path, false);
-        }
-    }
-
-    /*
-     * This function is called when the user has selected a directory in the
-     * list and wants to perform an action on it instead of navigating into
-     * the directory.
-     */
-    abstract void processDirectory(String path, boolean selection);
-    /*
-     * This function is called when the user has selected a file in the
-     * file list. The selected file could be a file or a directory.
-     * The flag indicates if this was from a selection or not.
-     */
-    abstract void processFile(String filename, boolean selection);
-
-    /*
-     * This function is called when the file list is being built. Return
-     * true if the file is to be added to the file list.
-     */
-    abstract boolean fileFilter(File f);
-
-    protected void updateList() {
-        setListAdapter(new SimpleAdapter(this,
-                getData(),
-                android.R.layout.simple_list_item_1,
-                new String[] {"title"},
-                new int[] {android.R.id.text1}));
-        String title = mPath; //.substring(mBaseLength-11); // show the word LayoutTests
-        setTitle(title);
-        getListView().setSelection(mFocusIndex);
-    }
-
-    protected void setupPath() {
-        mPath = Environment.getExternalStorageDirectory() + "/webkit/layout_tests";
-        mBaseLength = mPath.length();
-    }
-
-    protected String mPath;
-    protected int mBaseLength;
-    protected String mFocusFile;
-    protected int mFocusIndex;
-
-    private final static int OPEN_DIRECTORY = 0;
-    private final static int RUN_TESTS = 1;
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FsUtils.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FsUtils.java
deleted file mode 100644
index b7d2c26..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/FsUtils.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.dumprendertree;
-
-import com.android.dumprendertree.forwarder.ForwardService;
-
-import android.os.Environment;
-import android.util.Log;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.regex.Pattern;
-
-public class FsUtils {
-
-    private static final String LOGTAG = "FsUtils";
-    static final String EXTERNAL_DIR = Environment.getExternalStorageDirectory().toString();
-    static final String HTTP_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/";
-    static final String HTTPS_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/ssl/";
-    static final String HTTP_LOCAL_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/local/";
-    static final String HTTP_MEDIA_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/media/";
-    static final String HTTP_WML_TESTS_PREFIX =
-        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/wml/";
-
-    private FsUtils() {
-        //no creation of instances
-    }
-
-    /**
-     * @return the number of tests in the list.
-     */
-    public static int writeLayoutTestListRecursively(BufferedOutputStream bos,
-            String dir, boolean ignoreResultsInDir) throws IOException {
-
-        int testCount = 0;
-        Log.v(LOGTAG, "Searching tests under " + dir);
-
-        File d = new File(dir);
-        if (!d.isDirectory()) {
-            throw new AssertionError("A directory expected, but got " + dir);
-        }
-        ignoreResultsInDir |= FileFilter.ignoreResult(dir);
-
-        String[] files = d.list();
-        for (int i = 0; i < files.length; i++) {
-            String s = dir + "/" + files[i];
-
-            File f = new File(s);
-            if (f.isDirectory()) {
-                // If this is not a test directory, we don't recurse into it.
-                if (!FileFilter.isNonTestDir(s)) {
-                    Log.v(LOGTAG, "Recursing on " + s);
-                    testCount += writeLayoutTestListRecursively(bos, s, ignoreResultsInDir);
-                }
-                continue;
-            }
-
-            // If this test should be ignored, we skip it completely.
-            if (FileFilter.ignoreTest(s)) {
-                Log.v(LOGTAG, "Ignoring: " + s);
-                continue;
-            }
-
-            if ((s.toLowerCase().endsWith(".html")
-                    || s.toLowerCase().endsWith(".xml")
-                    || s.toLowerCase().endsWith(".xhtml"))
-                    && !s.endsWith("TEMPLATE.html")) {
-                Log.v(LOGTAG, "Recording " + s);
-                bos.write(s.getBytes());
-                // If the result of this test should be ignored, we still run the test.
-                if (ignoreResultsInDir || FileFilter.ignoreResult(s)) {
-                    bos.write((" IGNORE_RESULT").getBytes());
-                }
-                bos.write('\n');
-                testCount++;
-            }
-        }
-        return testCount;
-    }
-
-    public static void updateTestStatus(String statusFile, String s) {
-        try {
-            BufferedOutputStream bos = new BufferedOutputStream(
-                    new FileOutputStream(statusFile));
-            bos.write(s.getBytes());
-            bos.close();
-        } catch (Exception e) {
-            Log.e(LOGTAG, "Cannot update file " + statusFile);
-        }
-    }
-
-    public static String readTestStatus(String statusFile) {
-        // read out the test name it stopped last time.
-        String status = null;
-        File testStatusFile = new File(statusFile);
-        if(testStatusFile.exists()) {
-            try {
-                BufferedReader inReader = new BufferedReader(
-                        new FileReader(testStatusFile));
-                status = inReader.readLine();
-                inReader.close();
-            } catch (IOException e) {
-                Log.e(LOGTAG, "Error reading test status.", e);
-            }
-        }
-        return status;
-    }
-
-    public static String getTestUrl(String path) {
-        String url = null;
-        if (!path.startsWith(HTTP_TESTS_PREFIX)) {
-            url = "file://" + path;
-        } else {
-            ForwardService.getForwardService().startForwardService();
-            if (path.startsWith(HTTPS_TESTS_PREFIX)) {
-                // still cut the URL after "http/tests/"
-                url = "https://127.0.0.1:8443/" + path.substring(HTTP_TESTS_PREFIX.length());
-            } else if (!path.startsWith(HTTP_LOCAL_TESTS_PREFIX)
-                    && !path.startsWith(HTTP_MEDIA_TESTS_PREFIX)
-                    && !path.startsWith(HTTP_WML_TESTS_PREFIX)) {
-                url = "http://127.0.0.1:8000/" + path.substring(HTTP_TESTS_PREFIX.length());
-            } else {
-                url = "file://" + path;
-            }
-        }
-        return url;
-    }
-
-    public static boolean diffIgnoreSpaces(String file1, String file2)  throws IOException {
-        BufferedReader br1 = new BufferedReader(new FileReader(file1));
-        BufferedReader br2 = new BufferedReader(new FileReader(file2));
-        boolean same = true;
-        Pattern trailingSpace = Pattern.compile("\\s+$");
-
-        while(true) {
-            String line1 = br1.readLine();
-            String line2 = br2.readLine();
-
-            if (line1 == null && line2 == null)
-                break;
-            if (line1 != null) {
-                line1 = trailingSpace.matcher(line1).replaceAll("");
-            } else {
-                line1 = "";
-            }
-            if (line2 != null) {
-                line2 = trailingSpace.matcher(line2).replaceAll("");
-            } else {
-                line2 = "";
-            }
-            if(!line1.equals(line2)) {
-                same = false;
-                break;
-            }
-        }
-
-        br1.close();
-        br2.close();
-
-        return same;
-    }
-
-    public static boolean isTestPageUrl(String url) {
-        int qmPostion = url.indexOf('?');
-        int slashPostion = url.lastIndexOf('/');
-        if (slashPostion < qmPostion) {
-            String fileName = url.substring(slashPostion + 1, qmPostion);
-            if ("index.html".equals(fileName)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static String getLastSegmentInPath(String path) {
-        int endPos = path.lastIndexOf('/');
-        path = path.substring(0, endPos);
-        endPos = path.lastIndexOf('/');
-        return path.substring(endPos + 1);
-    }
-
-    public static void writeDrawTime(String fileName, String url, long[] times) {
-        StringBuffer lineBuffer = new StringBuffer();
-        // grab the last segment of path in url
-        lineBuffer.append(getLastSegmentInPath(url));
-        for (long time : times) {
-            lineBuffer.append('\t');
-            lineBuffer.append(time);
-        }
-        lineBuffer.append('\n');
-        String line = lineBuffer.toString();
-        Log.v(LOGTAG, "logging draw times: " + line);
-        try {
-            FileWriter fw = new FileWriter(fileName, true);
-            fw.write(line);
-            fw.close();
-        } catch (IOException ioe) {
-            Log.e(LOGTAG, "Failed to log draw times", ioe);
-        }
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/HTMLHostApp.java b/tests/DumpRenderTree/src/com/android/dumprendertree/HTMLHostApp.java
deleted file mode 100644
index f610f5a..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/HTMLHostApp.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package com.android.dumprendertree;
-
-import android.app.Application;
-
-public class HTMLHostApp extends Application { 
-
-	public HTMLHostApp() {
-    }
-
-    public void onCreate() {
-    }
-
-    public void onTerminate() {
-    }
-	
-}
-
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestController.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestController.java
deleted file mode 100644
index c936a6c..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestController.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package com.android.dumprendertree;
-
-public interface LayoutTestController {
-
-    public void dumpAsText(boolean enablePixelTests);
-    public void dumpChildFramesAsText();
-    public void waitUntilDone();
-    public void notifyDone();
-
-    // Force a redraw of the page
-    public void display();
-    // Used with pixel dumps of content
-    public void testRepaint();
-
-    // If the page title changes, add the information to the output.
-    public void dumpTitleChanges();
-    public void dumpBackForwardList();
-    public void dumpChildFrameScrollPositions();
-    public void dumpEditingCallbacks();
-
-    // Show/Hide window for window.onBlur() testing
-    public void setWindowIsKey(boolean b);
-    // Mac function, used to disable events going to the window
-    public void setMainFrameIsFirstResponder(boolean b);
-
-    public void dumpSelectionRect();
-
-    // invalidate and draw one line at a time of the web view.
-    public void repaintSweepHorizontally();
-    
-    // History testing functions
-    public void keepWebHistory();
-    public void clearBackForwardList();
-    // navigate after page load has finished
-    public void queueBackNavigation(int howfar);
-    public void queueForwardNavigation(int howfar);
-    
-    // Reload when the page load has finished
-    public void queueReload();
-    // Execute the provided script in current context when page load has finished.
-    public void queueScript(String scriptToRunInCurrentContext);
-    // Load the provided URL into the provided frame
-    public void queueLoad(String Url, String frameTarget);
-
-    public void setAcceptsEditing(boolean b);
-
-    // For storage tests
-    public void dumpDatabaseCallbacks();
-    public void setCanOpenWindows();
-
-    // For Geolocation tests
-    public void setGeolocationPermission(boolean allow);
-
-    public void overridePreference(String key, boolean value);
-
-    // For XSSAuditor tests
-    public void setXSSAuditorEnabled(boolean flag);
-
-    // For Geolocation tests
-    public void setMockGeolocationPosition(double latitude, double longitude, double accuracy);
-    public void setMockGeolocationError(int code, String message);
-
-    // For DeviceOrientation tests
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma);
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java
deleted file mode 100644
index fb2a1f4..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java
+++ /dev/null
@@ -1,80 +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.
- */
-
-package com.android.dumprendertree;
-
-import android.os.Bundle;
-import android.test.InstrumentationTestRunner;
-import android.test.InstrumentationTestSuite;
-
-import junit.framework.TestSuite;
-
-
-/**
- * Instrumentation Test Runner for all DumpRenderTree tests.
- *
- * Running all tests:
- *
- * adb shell am instrument \
- *   -w com.android.dumprendertree.LayoutTestsAutoRunner
- */
-
-public class LayoutTestsAutoRunner extends InstrumentationTestRunner {
-    @Override
-    public TestSuite getAllTests() {
-        TestSuite suite = new InstrumentationTestSuite(this);
-        suite.addTestSuite(LayoutTestsAutoTest.class);
-        suite.addTestSuite(LoadTestsAutoTest.class);
-        return suite;
-    }
-
-    @Override
-    public ClassLoader getLoader() {
-        return LayoutTestsAutoRunner.class.getClassLoader();
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        this.mTestPath = (String) icicle.get("path");
-        String timeout_str = (String) icicle.get("timeout");
-        if (timeout_str != null) {
-            try {
-                this.mTimeoutInMillis = Integer.parseInt(timeout_str);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-
-        String r = icicle.getString("rebaseline");
-        this.mRebaseline = (r != null && r.toLowerCase().equals("true"));
-
-        mJsEngine = icicle.getString("jsengine");
-
-        mPageCyclerSuite = icicle.getString("suite");
-        mPageCyclerForwardHost = icicle.getString("forward");
-        mPageCyclerIteration = icicle.getString("iteration", "5");
-
-        super.onCreate(icicle);
-    }
-
-    String mPageCyclerSuite;
-    String mPageCyclerForwardHost;
-    String mPageCyclerIteration;
-    String mTestPath;
-    int mTimeoutInMillis = 0;
-    boolean mRebaseline;
-    String mJsEngine;
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
deleted file mode 100644
index 3fe4e70..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
+++ /dev/null
@@ -1,494 +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.
- */
-
-package com.android.dumprendertree;
-
-import com.android.dumprendertree.TestShellActivity.DumpDataType;
-import com.android.dumprendertree.forwarder.AdbUtils;
-import com.android.dumprendertree.forwarder.ForwardService;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Environment;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Vector;
-
-// TestRecorder creates four files ...
-// - passing tests
-// - failing tests
-// - tests for which results are ignored
-// - tests with no text results available
-// TestRecorder does not have the ability to clear the results.
-class MyTestRecorder {
-    private BufferedOutputStream mBufferedOutputPassedStream;
-    private BufferedOutputStream mBufferedOutputFailedStream;
-    private BufferedOutputStream mBufferedOutputIgnoreResultStream;
-    private BufferedOutputStream mBufferedOutputNoResultStream;
-
-    public void passed(String layout_file) {
-        try {
-            mBufferedOutputPassedStream.write(layout_file.getBytes());
-            mBufferedOutputPassedStream.write('\n');
-            mBufferedOutputPassedStream.flush();
-        } catch(Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void failed(String layout_file) {
-        try {
-            mBufferedOutputFailedStream.write(layout_file.getBytes());
-            mBufferedOutputFailedStream.write('\n');
-            mBufferedOutputFailedStream.flush();
-        } catch(Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void ignoreResult(String layout_file) {
-        try {
-            mBufferedOutputIgnoreResultStream.write(layout_file.getBytes());
-            mBufferedOutputIgnoreResultStream.write('\n');
-            mBufferedOutputIgnoreResultStream.flush();
-        } catch(Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void noResult(String layout_file) {
-        try {
-            mBufferedOutputNoResultStream.write(layout_file.getBytes());
-            mBufferedOutputNoResultStream.write('\n');
-            mBufferedOutputNoResultStream.flush();
-        } catch(Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public MyTestRecorder(boolean resume) {
-        try {
-            File externalDir = Environment.getExternalStorageDirectory();
-            File resultsPassedFile = new File(externalDir, "layout_tests_passed.txt");
-            File resultsFailedFile = new File(externalDir, "layout_tests_failed.txt");
-            File resultsIgnoreResultFile = new File(externalDir, "layout_tests_ignored.txt");
-            File noExpectedResultFile = new File(externalDir, "layout_tests_nontext.txt");
-
-            mBufferedOutputPassedStream =
-                new BufferedOutputStream(new FileOutputStream(resultsPassedFile, resume));
-            mBufferedOutputFailedStream =
-                new BufferedOutputStream(new FileOutputStream(resultsFailedFile, resume));
-            mBufferedOutputIgnoreResultStream =
-                new BufferedOutputStream(new FileOutputStream(resultsIgnoreResultFile, resume));
-            mBufferedOutputNoResultStream =
-                new BufferedOutputStream(new FileOutputStream(noExpectedResultFile, resume));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void close() {
-        try {
-            mBufferedOutputPassedStream.close();
-            mBufferedOutputFailedStream.close();
-            mBufferedOutputIgnoreResultStream.close();
-            mBufferedOutputNoResultStream.close();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-}
-
-
-public class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> {
-
-    private static final String LOGTAG = "LayoutTests";
-    static final int DEFAULT_TIMEOUT_IN_MILLIS = 5000;
-
-    static final String EXTERNAL_DIR = Environment.getExternalStorageDirectory().toString();
-    static final String LAYOUT_TESTS_ROOT = EXTERNAL_DIR + "/webkit/layout_tests/";
-    static final String LAYOUT_TESTS_RESULT_DIR = EXTERNAL_DIR + "/webkit/layout_tests_results/";
-    static final String ANDROID_EXPECTED_RESULT_DIR = EXTERNAL_DIR + "/webkit/expected_results/";
-    static final String LAYOUT_TESTS_LIST_FILE = EXTERNAL_DIR + "/webkit/layout_tests_list.txt";
-    static final String TEST_STATUS_FILE = EXTERNAL_DIR + "/webkit/running_test.txt";
-    static final String LAYOUT_TESTS_RESULTS_REFERENCE_FILES[] = {
-          "results/layout_tests_passed.txt",
-          "results/layout_tests_failed.txt",
-          "results/layout_tests_nontext.txt",
-          "results/layout_tests_crashed.txt",
-          "run_layout_tests.py"
-    };
-
-    static final String LAYOUT_RESULTS_FAILED_RESULT_FILE = "results/layout_tests_failed.txt";
-    static final String LAYOUT_RESULTS_NONTEXT_RESULT_FILE = "results/layout_tests_nontext.txt";
-    static final String LAYOUT_RESULTS_CRASHED_RESULT_FILE = "results/layout_tests_crashed.txt";
-    static final String LAYOUT_TESTS_RUNNER = "run_layout_tests.py";
-
-    private MyTestRecorder mResultRecorder;
-    private Vector<String> mTestList;
-    // Whether we should ignore the result for the corresponding test. Ordered same as mTestList.
-    private Vector<Boolean> mTestListIgnoreResult;
-    private boolean mRebaselineResults;
-    // The JavaScript engine currently in use. This determines which set of Android-specific
-    // expected test results we use.
-    private String mJsEngine;
-    private String mTestPathPrefix;
-    private boolean mFinished;
-    private int mTestCount;
-    private int mResumeIndex;
-
-    public LayoutTestsAutoTest() {
-      super(TestShellActivity.class);
-    }
-
-    private void getTestList() {
-        // Read test list.
-        try {
-            BufferedReader inReader = new BufferedReader(new FileReader(LAYOUT_TESTS_LIST_FILE));
-            String line = inReader.readLine();
-            while (line != null) {
-                if (line.startsWith(mTestPathPrefix)) {
-                    String[] components = line.split(" ");
-                    mTestList.add(components[0]);
-                    mTestListIgnoreResult.add(components.length > 1 && components[1].equals("IGNORE_RESULT"));
-                }
-                line = inReader.readLine();
-            }
-            inReader.close();
-            Log.v(LOGTAG, "Test list has " + mTestList.size() + " test(s).");
-        } catch (Exception e) {
-            Log.e(LOGTAG, "Error while reading test list : " + e.getMessage());
-        }
-        mTestCount = mTestList.size();
-    }
-
-    private void resumeTestList() {
-        // read out the test name it stoped last time.
-        try {
-            String line = FsUtils.readTestStatus(TEST_STATUS_FILE);
-            for (int i = 0; i < mTestList.size(); i++) {
-                if (mTestList.elementAt(i).equals(line)) {
-                    mTestList = new Vector<String>(mTestList.subList(i+1, mTestList.size()));
-                    mTestListIgnoreResult = new Vector<Boolean>(mTestListIgnoreResult.subList(i+1, mTestListIgnoreResult.size()));
-                    mResumeIndex = i + 1;
-                    break;
-                }
-            }
-        } catch (Exception e) {
-            Log.e(LOGTAG, "Error reading " + TEST_STATUS_FILE);
-        }
-    }
-
-    private void clearTestStatus() {
-        // Delete TEST_STATUS_FILE
-        try {
-            File f = new File(TEST_STATUS_FILE);
-            if (f.delete())
-                Log.v(LOGTAG, "Deleted " + TEST_STATUS_FILE);
-            else
-                Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE);
-        } catch (Exception e) {
-            Log.e(LOGTAG, "Fail to delete " + TEST_STATUS_FILE + " : " + e.getMessage());
-        }
-    }
-
-    private String getResultFile(String test) {
-        String shortName = test.substring(0, test.lastIndexOf('.'));
-        // Write actual results to result directory.
-        return shortName.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_RESULT_DIR) + "-result.txt";
-    }
-
-    // Gets the file which contains WebKit's expected results for this test.
-    private String getExpectedResultFile(String test) {
-        // The generic result is at <path>/<name>-expected.txt
-        // First try the Android-specific result at
-        // platform/android-<js-engine>/<path>/<name>-expected.txt
-        // then
-        // platform/android/<path>/<name>-expected.txt
-        int pos = test.lastIndexOf('.');
-        if (pos == -1)
-            return null;
-        String genericExpectedResult = test.substring(0, pos) + "-expected.txt";
-        String androidExpectedResultsDir = "platform/android-" + mJsEngine + "/";
-        String androidExpectedResult = genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT,
-                LAYOUT_TESTS_ROOT + androidExpectedResultsDir);
-        File f = new File(androidExpectedResult);
-        if (f.exists())
-            return androidExpectedResult;
-        androidExpectedResultsDir = "platform/android/";
-        androidExpectedResult = genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT,
-                LAYOUT_TESTS_ROOT + androidExpectedResultsDir);
-        f = new File(androidExpectedResult);
-        return f.exists() ? androidExpectedResult : genericExpectedResult;
-    }
-
-    // Gets the file which contains the actual results of running the test on
-    // Android, generated by a previous run which set a new baseline.
-    private String getAndroidExpectedResultFile(String expectedResultFile) {
-        return expectedResultFile.replaceFirst(LAYOUT_TESTS_ROOT, ANDROID_EXPECTED_RESULT_DIR);
-    }
-
-    // Wrap up
-    private void failedCase(String file) {
-        Log.w("Layout test: ", file + " failed");
-        mResultRecorder.failed(file);
-    }
-
-    private void passedCase(String file) {
-        Log.v("Layout test:", file + " passed");
-        mResultRecorder.passed(file);
-    }
-
-    private void ignoreResultCase(String file) {
-        Log.v("Layout test:", file + " ignore result");
-        mResultRecorder.ignoreResult(file);
-    }
-
-    private void noResultCase(String file) {
-        Log.v("Layout test:", file + " no expected result");
-        mResultRecorder.noResult(file);
-    }
-
-    private void processResult(String testFile, String actualResultFile, String expectedResultFile, boolean ignoreResult) {
-        Log.v(LOGTAG, "  Processing result: " + testFile);
-
-        if (ignoreResult) {
-            ignoreResultCase(testFile);
-            return;
-        }
-
-        File actual = new File(actualResultFile);
-        File expected = new File(expectedResultFile);
-        if (actual.exists() && expected.exists()) {
-            try {
-                if (FsUtils.diffIgnoreSpaces(actualResultFile, expectedResultFile)) {
-                    passedCase(testFile);
-                } else {
-                    failedCase(testFile);
-                }
-            } catch (FileNotFoundException ex) {
-                Log.e(LOGTAG, "File not found : " + ex.getMessage());
-            } catch (IOException ex) {
-                Log.e(LOGTAG, "IO Error : " + ex.getMessage());
-            }
-            return;
-        }
-
-        if (!expected.exists()) {
-            noResultCase(testFile);
-        }
-    }
-
-    private void runTestAndWaitUntilDone(TestShellActivity activity, String test, int timeout, boolean ignoreResult, int testNumber) {
-        activity.setCallback(new TestShellCallback() {
-            public void finished() {
-                synchronized (LayoutTestsAutoTest.this) {
-                    mFinished = true;
-                    LayoutTestsAutoTest.this.notifyAll();
-                }
-            }
-
-            public void timedOut(String url) {
-                Log.v(LOGTAG, "layout timeout: " + url);
-            }
-
-            @Override
-            public void dumpResult(String webViewDump) {
-            }
-        });
-
-        String resultFile = getResultFile(test);
-        if (resultFile == null) {
-            // Simply ignore this test.
-            return;
-        }
-        if (mRebaselineResults) {
-            String expectedResultFile = getExpectedResultFile(test);
-            File f = new File(expectedResultFile);
-            if (f.exists()) {
-                return;  // don't run test and don't overwrite default tests.
-            }
-
-            resultFile = getAndroidExpectedResultFile(expectedResultFile);
-        }
-
-        mFinished = false;
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setClass(activity, TestShellActivity.class);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.TEST_URL, FsUtils.getTestUrl(test));
-        intent.putExtra(TestShellActivity.RESULT_FILE, resultFile);
-        intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
-        intent.putExtra(TestShellActivity.TOTAL_TEST_COUNT, mTestCount);
-        intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, testNumber);
-        intent.putExtra(TestShellActivity.STOP_ON_REF_ERROR, true);
-        activity.startActivity(intent);
-
-        // Wait until done.
-        synchronized (this) {
-            while(!mFinished){
-                try {
-                    this.wait();
-                } catch (InterruptedException e) { }
-            }
-        }
-
-        if (!mRebaselineResults) {
-            String expectedResultFile = getExpectedResultFile(test);
-            File f = new File(expectedResultFile);
-            if (!f.exists()) {
-                expectedResultFile = getAndroidExpectedResultFile(expectedResultFile);
-            }
-
-            processResult(test, resultFile, expectedResultFile, ignoreResult);
-        }
-    }
-
-    // Invokes running of layout tests
-    // and waits till it has finished running.
-    public void executeLayoutTests(boolean resume) {
-        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
-        // A convenient method to be called by another activity.
-
-        if (runner.mTestPath == null) {
-            Log.e(LOGTAG, "No test specified");
-            return;
-        }
-
-        this.mTestList = new Vector<String>();
-        this.mTestListIgnoreResult = new Vector<Boolean>();
-
-        // Read settings
-        mTestPathPrefix = (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getAbsolutePath();
-        mRebaselineResults = runner.mRebaseline;
-        // V8 is the default JavaScript engine.
-        mJsEngine = runner.mJsEngine == null ? "v8" : runner.mJsEngine;
-
-        int timeout = runner.mTimeoutInMillis;
-        if (timeout <= 0) {
-            timeout = DEFAULT_TIMEOUT_IN_MILLIS;
-        }
-
-        this.mResultRecorder = new MyTestRecorder(resume);
-
-        if (!resume)
-            clearTestStatus();
-
-        getTestList();
-        if (resume)
-            resumeTestList();
-
-        TestShellActivity activity = getActivity();
-        activity.setDefaultDumpDataType(DumpDataType.EXT_REPR);
-
-        // Run tests.
-        for (int i = 0; i < mTestList.size(); i++) {
-            String s = mTestList.elementAt(i);
-            boolean ignoreResult = mTestListIgnoreResult.elementAt(i);
-            FsUtils.updateTestStatus(TEST_STATUS_FILE, s);
-            // Run tests
-            // i is 0 based, but test count is 1 based so add 1 to i here.
-            runTestAndWaitUntilDone(activity, s, runner.mTimeoutInMillis, ignoreResult,
-                    i + 1 + mResumeIndex);
-        }
-
-        FsUtils.updateTestStatus(TEST_STATUS_FILE, "#DONE");
-        ForwardService.getForwardService().stopForwardService();
-        activity.finish();
-    }
-
-    private String getTestPath() {
-        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
-
-        String test_path = LAYOUT_TESTS_ROOT;
-        if (runner.mTestPath != null) {
-            test_path += runner.mTestPath;
-        }
-        test_path = new File(test_path).getAbsolutePath();
-        Log.v("LayoutTestsAutoTest", " Test path : " + test_path);
-
-        return test_path;
-    }
-
-    public void generateTestList() {
-        try {
-            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
-            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false));
-            FsUtils.writeLayoutTestListRecursively(bos, getTestPath(), false); // Don't ignore results
-            bos.flush();
-            bos.close();
-       } catch (Exception e) {
-           Log.e(LOGTAG, "Error when creating test list: " + e.getMessage());
-       }
-    }
-
-    // Running all the layout tests at once sometimes
-    // causes the dumprendertree to run out of memory.
-    // So, additional tests are added to run the tests
-    // in chunks.
-    public void startLayoutTests() {
-        try {
-            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
-            if (!tests_list.exists())
-              generateTestList();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        executeLayoutTests(false);
-    }
-
-    public void resumeLayoutTests() {
-        executeLayoutTests(true);
-    }
-
-    public void copyResultsAndRunnerAssetsToCache() {
-        try {
-            Context targetContext = getInstrumentation().getTargetContext();
-            File cacheDir = targetContext.getCacheDir();
-
-            for( int i=0; i< LAYOUT_TESTS_RESULTS_REFERENCE_FILES.length; i++) {
-                InputStream in = targetContext.getAssets().open(
-                        LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]);
-                OutputStream out = new FileOutputStream(new File(cacheDir,
-                        LAYOUT_TESTS_RESULTS_REFERENCE_FILES[i]));
-
-                byte[] buf = new byte[2048];
-                int len;
-
-                while ((len = in.read(buf)) >= 0 ) {
-                    out.write(buf, 0, len);
-                }
-                out.close();
-                in.close();
-            }
-        }catch (IOException e) {
-          e.printStackTrace();
-        }
-
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
deleted file mode 100644
index 4b86a0b..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
+++ /dev/null
@@ -1,298 +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.
- */
-
-package com.android.dumprendertree;
-
-import com.android.dumprendertree.forwarder.AdbUtils;
-import com.android.dumprendertree.forwarder.ForwardServer;
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Debug;
-import android.os.Environment;
-import android.os.Process;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> {
-
-    private final static String LOGTAG = "LoadTest";
-    private final static String LOAD_TEST_RESULT =
-        Environment.getExternalStorageDirectory() + "/load_test_result.txt";
-    private final static int MAX_GC_WAIT_SEC = 10;
-    private final static int LOCAL_PORT = 17171;
-    private boolean mFinished;
-    static final String LOAD_TEST_RUNNER_FILES[] = {
-        "run_page_cycler.py"
-    };
-    private ForwardServer mForwardServer;
-
-    public LoadTestsAutoTest() {
-        super(TestShellActivity.class);
-    }
-
-    // This function writes the result of the layout test to
-    // Am status so that it can be picked up from a script.
-    public void passOrFailCallback(String file, boolean result) {
-        Instrumentation inst = getInstrumentation();
-        Bundle bundle = new Bundle();
-        bundle.putBoolean(file, result);
-        inst.sendStatus(0, bundle);
-    }
-
-    private String setUpForwarding(String forwardInfo, String suite, String iteration) throws IOException {
-        // read forwarding information first
-        Pattern forwardPattern = Pattern.compile("(.*):(\\d+)/(.*)/");
-        Matcher matcher = forwardPattern.matcher(forwardInfo);
-        if (!matcher.matches()) {
-            throw new RuntimeException("Invalid forward information");
-        }
-        String host = matcher.group(1);
-        int port = Integer.parseInt(matcher.group(2));
-        mForwardServer = new ForwardServer(LOCAL_PORT, AdbUtils.resolve(host), port);
-        mForwardServer.start();
-        return String.format("http://127.0.0.1:%d/%s/%s/start.html?auto=1&iterations=%s",
-                LOCAL_PORT, matcher.group(3), suite, iteration);
-    }
-
-    // Invokes running of layout tests
-    // and waits till it has finished running.
-    public void runPageCyclerTest() throws IOException {
-        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
-
-        if (runner.mPageCyclerSuite != null) {
-            // start forwarder to use page cycler suites hosted on external web server
-            if (runner.mPageCyclerForwardHost == null) {
-                throw new RuntimeException("no forwarder information provided");
-            }
-            runner.mTestPath = setUpForwarding(runner.mPageCyclerForwardHost,
-                    runner.mPageCyclerSuite, runner.mPageCyclerIteration);
-            Log.d(LOGTAG, "using path: " + runner.mTestPath);
-        }
-
-        if (runner.mTestPath == null) {
-            throw new RuntimeException("No test specified");
-        }
-
-        final TestShellActivity activity = (TestShellActivity) getActivity();
-
-        Log.v(LOGTAG, "About to run tests, calling gc first...");
-        freeMem();
-
-        // Run tests
-        runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis);
-
-        getInstrumentation().runOnMainSync(new Runnable() {
-
-            @Override
-            public void run() {
-                activity.clearCache();
-            }
-        });
-        if (mForwardServer != null) {
-            mForwardServer.stop();
-            mForwardServer = null;
-        }
-        try {
-            Thread.sleep(5000);
-        } catch (InterruptedException e) {
-        }
-        dumpMemoryInfo();
-
-        // Kill activity
-        activity.finish();
-    }
-
-    private void freeMem() {
-        Log.v(LOGTAG, "freeMem: calling gc...");
-        final CountDownLatch latch = new CountDownLatch(1);
-        @SuppressWarnings("unused")
-        Object dummy = new Object() {
-            // this object instance is used to track gc
-            @Override
-            protected void finalize() throws Throwable {
-                latch.countDown();
-                super.finalize();
-            }
-        };
-        dummy = null;
-        System.gc();
-        try {
-            if (!latch.await(MAX_GC_WAIT_SEC, TimeUnit.SECONDS)) {
-                Log.w(LOGTAG, "gc did not happen in 10s");
-            }
-        } catch (InterruptedException e) {
-            //ignore
-        }
-    }
-
-    private void printRow(PrintStream ps, String format, Object...objs) {
-        ps.println(String.format(format, objs));
-    }
-
-    private void dumpMemoryInfo() {
-        try {
-            freeMem();
-            Log.v(LOGTAG, "Dumping memory information.");
-
-            FileOutputStream out = new FileOutputStream(LOAD_TEST_RESULT, true);
-            PrintStream ps = new PrintStream(out);
-
-            ps.print("\n\n\n");
-            ps.println("** MEMINFO in pid " + Process.myPid()
-                    + " [com.android.dumprendertree] **");
-            String formatString = "%17s %8s %8s %8s %8s";
-
-            long nativeMax = Debug.getNativeHeapSize() / 1024;
-            long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024;
-            long nativeFree = Debug.getNativeHeapFreeSize() / 1024;
-            Runtime runtime = Runtime.getRuntime();
-            long dalvikMax = runtime.totalMemory() / 1024;
-            long dalvikFree = runtime.freeMemory() / 1024;
-            long dalvikAllocated = dalvikMax - dalvikFree;
-
-
-            Debug.MemoryInfo memInfo = new Debug.MemoryInfo();
-            Debug.getMemoryInfo(memInfo);
-
-            final int nativeShared = memInfo.nativeSharedDirty;
-            final int dalvikShared = memInfo.dalvikSharedDirty;
-            final int otherShared = memInfo.otherSharedDirty;
-
-            final int nativePrivate = memInfo.nativePrivateDirty;
-            final int dalvikPrivate = memInfo.dalvikPrivateDirty;
-            final int otherPrivate = memInfo.otherPrivateDirty;
-
-            printRow(ps, formatString, "", "native", "dalvik", "other", "total");
-            printRow(ps, formatString, "size:", nativeMax, dalvikMax, "N/A", nativeMax + dalvikMax);
-            printRow(ps, formatString, "allocated:", nativeAllocated, dalvikAllocated, "N/A",
-                    nativeAllocated + dalvikAllocated);
-            printRow(ps, formatString, "free:", nativeFree, dalvikFree, "N/A",
-                    nativeFree + dalvikFree);
-
-            printRow(ps, formatString, "(Pss):", memInfo.nativePss, memInfo.dalvikPss,
-                    memInfo.otherPss, memInfo.nativePss + memInfo.dalvikPss + memInfo.otherPss);
-
-            printRow(ps, formatString, "(shared dirty):", nativeShared, dalvikShared, otherShared,
-                    nativeShared + dalvikShared + otherShared);
-            printRow(ps, formatString, "(priv dirty):", nativePrivate, dalvikPrivate, otherPrivate,
-                    nativePrivate + dalvikPrivate + otherPrivate);
-            ps.print("\n\n\n");
-            ps.flush();
-            ps.close();
-            out.flush();
-            out.close();
-        } catch (IOException e) {
-            Log.e(LOGTAG, e.getMessage());
-        }
-    }
-
-    // A convenient method to be called by another activity.
-    private void runTestAndWaitUntilDone(TestShellActivity activity, String url, int timeout) {
-        activity.setCallback(new TestShellCallback() {
-            @Override
-            public void finished() {
-                synchronized (LoadTestsAutoTest.this) {
-                    mFinished = true;
-                    LoadTestsAutoTest.this.notifyAll();
-                }
-            }
-
-            @Override
-            public void timedOut(String url) {
-            }
-
-            @Override
-            public void dumpResult(String webViewDump) {
-                String lines[] = webViewDump.split("\\r?\\n");
-                for (String line : lines) {
-                    line = line.trim();
-                    // parse for a line like this:
-                    // totals:   9620.00 11947.00    10099.75    380.38
-                    // and return the 3rd number, which is mean
-                    if (line.startsWith("totals:")) {
-                        line = line.substring(7).trim(); // strip "totals:"
-                        String[] numbers = line.split("\\s+");
-                        if (numbers.length == 4) {
-                            Bundle b = new Bundle();
-                            b.putString("mean", numbers[2]);
-                            getInstrumentation().sendStatus(Activity.RESULT_FIRST_USER, b);
-                        }
-                    }
-                }
-            }
-        });
-
-        mFinished = false;
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setClass(activity, TestShellActivity.class);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.TEST_URL, url);
-        intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
-        intent.putExtra(TestShellActivity.RESULT_FILE, LOAD_TEST_RESULT);
-        activity.startActivity(intent);
-
-        // Wait until done.
-        synchronized (this) {
-            while(!mFinished) {
-                try {
-                    this.wait();
-                } catch (InterruptedException e) { }
-            }
-        }
-    }
-
-    public void copyRunnerAssetsToCache() {
-        try {
-            Context targetContext = getInstrumentation().getTargetContext();
-            File cacheDir = targetContext.getCacheDir();
-
-            for( int i=0; i< LOAD_TEST_RUNNER_FILES.length; i++) {
-                InputStream in = targetContext.getAssets().open(
-                        LOAD_TEST_RUNNER_FILES[i]);
-                OutputStream out = new FileOutputStream(
-                        new File(cacheDir, LOAD_TEST_RUNNER_FILES[i]));
-
-                byte[] buf = new byte[2048];
-                int len;
-
-                while ((len = in.read(buf)) >= 0 ) {
-                    out.write(buf, 0, len);
-                }
-                out.close();
-                in.close();
-            }
-        }catch (IOException e) {
-          e.printStackTrace();
-        }
-
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/Menu.java b/tests/DumpRenderTree/src/com/android/dumprendertree/Menu.java
deleted file mode 100644
index 0b00d65..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/Menu.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package com.android.dumprendertree;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Environment;
-import android.util.Log;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-
-public class Menu extends FileList {
-
-    private static final int MENU_START = 0x01;
-    private static String LOGTAG = "MenuActivity";
-    static final String LAYOUT_TESTS_LIST_FILE =
-        Environment.getExternalStorageDirectory() + "/android/layout_tests_list.txt";
-
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-    }
-
-    boolean fileFilter(File f) {
-    	if (f.getName().startsWith("."))
-    		return false;
-    	if (f.getName().equalsIgnoreCase("resources"))
-    		return false;
-    	if (f.isDirectory())
-    		return true;
-    	if (f.getPath().toLowerCase().endsWith("ml"))
-    		return true;
-    	return false;
-    }
-
-    void processFile(String filename, boolean selection) {
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setClass(this, TestShellActivity.class);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.TEST_URL, "file://" + filename);
-        intent.putExtra(TestShellActivity.TOTAL_TEST_COUNT, 1);
-        intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, 1);
-        startActivity(intent);
-    }
-
-    @Override
-    void processDirectory(String path, boolean selection) {
-        int testCount = generateTestList(path);
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setClass(this, TestShellActivity.class);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.UI_AUTO_TEST, LAYOUT_TESTS_LIST_FILE);
-        intent.putExtra(TestShellActivity.TOTAL_TEST_COUNT, testCount);
-        // TestShellActivity will process this intent once and increment the test index
-        // before running the first test, so pass 0 here to allow for that.
-        intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, 0);
-        startActivity(intent);
-    }
-
-    private int generateTestList(String path) {
-        int testCount = 0;
-        try {
-            File tests_list = new File(LAYOUT_TESTS_LIST_FILE);
-            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tests_list, false));
-            testCount = FsUtils.writeLayoutTestListRecursively(
-                    bos, path, false); // Don't ignore results
-            bos.flush();
-            bos.close();
-       } catch (Exception e) {
-           Log.e(LOGTAG, "Error when creating test list: " + e.getMessage());
-       }
-       return testCount;
-    }
-
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java
deleted file mode 100644
index 22b587f..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/ReliabilityTestActivity.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.dumprendertree;
-
-import android.app.Activity;
-import android.app.ActivityThread;
-import android.graphics.Bitmap;
-import android.net.http.SslError;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.util.Log;
-import android.view.ViewGroup;
-import android.webkit.HttpAuthHandler;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebChromeClient;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.webkit.WebSettings.LayoutAlgorithm;
-import android.widget.LinearLayout;
-import android.widget.LinearLayout.LayoutParams;
-
-public class ReliabilityTestActivity extends Activity {
-
-    public static final String TEST_URL_ACTION = "com.andrdoid.dumprendertree.TestUrlAction";
-    public static final String PARAM_URL = "URL";
-    public static final String PARAM_TIMEOUT = "Timeout";
-    public static final int RESULT_TIMEOUT = 0xDEAD;
-    public static final int MSG_TIMEOUT = 0xC001;
-    public static final int MSG_NAVIGATE = 0xC002;
-    public static final String MSG_NAV_URL = "url";
-    public static final String MSG_NAV_LOGTIME = "logtime";
-
-    private static final String LOGTAG = "ReliabilityTestActivity";
-
-    private WebView webView;
-    private SimpleWebViewClient webViewClient;
-    private SimpleChromeClient chromeClient;
-    private Handler handler;
-    private boolean timeoutFlag;
-    private boolean logTime;
-    private boolean pageDone;
-    private Object pageDoneLock;
-    private int pageStartCount;
-    private int manualDelay;
-    private long startTime;
-    private long pageLoadTime;
-    private PageDoneRunner pageDoneRunner = new PageDoneRunner();
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        Log.v(LOGTAG, "onCreate, inst=" + Integer.toHexString(hashCode()));
-
-        LinearLayout contentView = new LinearLayout(this);
-        contentView.setOrientation(LinearLayout.VERTICAL);
-        setContentView(contentView);
-        setTitle("Idle");
-
-        webView = new WebView(this);
-        webView.getSettings().setJavaScriptEnabled(true);
-        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
-        webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
-
-        webViewClient = new SimpleWebViewClient();
-        chromeClient = new SimpleChromeClient();
-        webView.setWebViewClient(webViewClient);
-        webView.setWebChromeClient(chromeClient);
-
-        contentView.addView(webView, new LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT, 0.0f));
-
-        handler = new Handler() {
-            @Override
-            public void handleMessage(Message msg) {
-                switch (msg.what) {
-                    case MSG_TIMEOUT:
-                        handleTimeout();
-                        return;
-                    case MSG_NAVIGATE:
-                        manualDelay = msg.arg2;
-                        navigate(msg.getData().getString(MSG_NAV_URL), msg.arg1);
-                        logTime = msg.getData().getBoolean(MSG_NAV_LOGTIME);
-                        return;
-                }
-            }
-        };
-
-        pageDoneLock = new Object();
-    }
-
-    public void reset() {
-        synchronized (pageDoneLock) {
-            pageDone = false;
-        }
-        timeoutFlag = false;
-        pageStartCount = 0;
-        chromeClient.resetJsTimeout();
-    }
-
-    private void navigate(String url, int timeout) {
-        if(url == null) {
-            Log.v(LOGTAG, "URL is null, cancelling...");
-            finish();
-        }
-        webView.stopLoading();
-        if(logTime) {
-            webView.clearCache(true);
-        }
-        startTime = System.currentTimeMillis();
-        Log.v(LOGTAG, "Navigating to URL: " + url);
-        webView.loadUrl(url);
-
-        if(timeout != 0) {
-            //set a timer with specified timeout (in ms)
-            handler.sendMessageDelayed(handler.obtainMessage(MSG_TIMEOUT),
-                    timeout);
-        }
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        Log.v(LOGTAG, "onDestroy, inst=" + Integer.toHexString(hashCode()));
-        webView.clearCache(true);
-        webView.destroy();
-    }
-
-    private boolean isPageDone() {
-        synchronized (pageDoneLock) {
-            return pageDone;
-        }
-    }
-
-    private void setPageDone(boolean pageDone) {
-        synchronized (pageDoneLock) {
-            this.pageDone = pageDone;
-            pageDoneLock.notifyAll();
-        }
-    }
-
-    private void handleTimeout() {
-        int progress = webView.getProgress();
-        webView.stopLoading();
-        Log.v(LOGTAG, "Page timeout triggered, progress = " + progress);
-        timeoutFlag = true;
-        handler.postDelayed(pageDoneRunner, manualDelay);
-    }
-
-    public boolean waitUntilDone() {
-        validateNotAppThread();
-        synchronized (pageDoneLock) {
-            while(!isPageDone()) {
-                try {
-                    pageDoneLock.wait();
-                } catch (InterruptedException ie) {
-                    //no-op
-                }
-            }
-        }
-        return timeoutFlag;
-    }
-
-    public Handler getHandler() {
-        return handler;
-    }
-
-    private final void validateNotAppThread() {
-        if (Looper.myLooper() == Looper.getMainLooper()) {
-            throw new RuntimeException(
-                "This method can not be called from the main application thread");
-        }
-    }
-
-    public long getPageLoadTime() {
-        return pageLoadTime;
-    }
-
-    class SimpleWebViewClient extends WebViewClient {
-
-        @Override
-        public void onReceivedError(WebView view, int errorCode, String description,
-                String failingUrl) {
-            Log.v(LOGTAG, "Received WebCore error: code=" + errorCode
-                    + ", description=" + description
-                    + ", url=" + failingUrl);
-        }
-
-        @Override
-        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
-            //ignore certificate error
-            Log.v(LOGTAG, "Received SSL error: " + error.toString());
-            handler.proceed();
-        }
-
-        @Override
-        public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,
-                String realm) {
-            // cancel http auth request
-            handler.cancel();
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            pageStartCount++;
-            Log.v(LOGTAG, "onPageStarted: " + url);
-        }
-
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            Log.v(LOGTAG, "onPageFinished: " + url);
-            // let handleTimeout take care of finishing the page
-            if(!timeoutFlag)
-                handler.postDelayed(new WebViewStatusChecker(), 500);
-        }
-    }
-
-    class SimpleChromeClient extends WebChromeClient {
-
-        private int timeoutCounter = 0;
-
-        @Override
-        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
-                JsPromptResult result) {
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsTimeout() {
-            timeoutCounter++;
-            Log.v(LOGTAG, "JavaScript timeout, count=" + timeoutCounter);
-            return timeoutCounter > 2;
-        }
-
-        public void resetJsTimeout() {
-            timeoutCounter = 0;
-        }
-
-        @Override
-        public void onReceivedTitle(WebView view, String title) {
-            ReliabilityTestActivity.this.setTitle(title);
-        }
-    }
-
-    class WebViewStatusChecker implements Runnable {
-
-        private int initialStartCount;
-
-        public WebViewStatusChecker() {
-            initialStartCount = pageStartCount;
-        }
-
-        public void run() {
-            if (initialStartCount == pageStartCount && !isPageDone()) {
-                handler.removeMessages(MSG_TIMEOUT);
-                webView.stopLoading();
-                handler.postDelayed(pageDoneRunner, manualDelay);
-            }
-        }
-    }
-
-    class PageDoneRunner implements Runnable {
-
-        public void run() {
-            Log.v(LOGTAG, "Finishing URL: " + webView.getUrl());
-            pageLoadTime = System.currentTimeMillis() - startTime;
-            setPageDone(true);
-        }
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
deleted file mode 100644
index 42d6457..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package com.android.dumprendertree;
-
-import com.android.dumprendertree.forwarder.ForwardService;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.net.http.SslError;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.webkit.ConsoleMessage;
-import android.webkit.CookieManager;
-import android.webkit.GeolocationPermissions;
-import android.webkit.HttpAuthHandler;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebChromeClient;
-import android.webkit.WebSettings;
-import android.webkit.WebSettingsClassic;
-import android.webkit.WebStorage;
-import android.webkit.WebView;
-import android.webkit.WebViewClassic;
-import android.webkit.WebViewClient;
-import android.widget.LinearLayout;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Vector;
-
-public class TestShellActivity extends Activity implements LayoutTestController {
-
-    static enum DumpDataType {DUMP_AS_TEXT, EXT_REPR, NO_OP}
-
-    // String constants for use with layoutTestController.overridePreferences
-    private final String WEBKIT_OFFLINE_WEB_APPLICATION_CACHE_ENABLED =
-            "WebKitOfflineWebApplicationCacheEnabled";
-    private final String WEBKIT_USES_PAGE_CACHE_PREFERENCE_KEY = "WebKitUsesPageCachePreferenceKey";
-
-    public class AsyncHandler extends Handler {
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == MSG_TIMEOUT) {
-                mTimedOut = true;
-                mWebView.stopLoading();
-                if (mCallback != null)
-                    mCallback.timedOut(mWebView.getUrl());
-                if (!mRequestedWebKitData) {
-                    requestWebKitData();
-                } else {
-                    // if timed out and webkit data has been dumped before
-                    // finish directly
-                    finished();
-                }
-                return;
-            } else if (msg.what == MSG_WEBKIT_DATA) {
-                Log.v(LOGTAG, "Received WebView dump data");
-                mHandler.removeMessages(MSG_DUMP_TIMEOUT);
-                TestShellActivity.this.dump(mTimedOut, (String)msg.obj);
-                return;
-            } else if (msg.what == MSG_DUMP_TIMEOUT) {
-                throw new RuntimeException("WebView dump timeout, is it pegged?");
-            }
-            super.handleMessage(msg);
-        }
-    }
-
-    public void requestWebKitData() {
-        setDumpTimeout(DUMP_TIMEOUT_MS);
-        Message callback = mHandler.obtainMessage(MSG_WEBKIT_DATA);
-
-        if (mRequestedWebKitData)
-            throw new AssertionError("Requested webkit data twice: " + mWebView.getUrl());
-
-        mRequestedWebKitData = true;
-        Log.v(LOGTAG, "message sent to WebView to dump text.");
-        switch (mDumpDataType) {
-            case DUMP_AS_TEXT:
-                callback.arg1 = mDumpTopFrameAsText ? 1 : 0;
-                callback.arg2 = mDumpChildFramesAsText ? 1 : 0;
-                mWebViewClassic.documentAsText(callback);
-                break;
-            case EXT_REPR:
-                mWebViewClassic.externalRepresentation(callback);
-                break;
-            default:
-                finished();
-                break;
-        }
-    }
-
-    private void setDumpTimeout(long timeout) {
-        Log.v(LOGTAG, "setting dump timeout at " + timeout);
-        Message msg = mHandler.obtainMessage(MSG_DUMP_TIMEOUT);
-        mHandler.sendMessageDelayed(msg, timeout);
-    }
-
-    public void clearCache() {
-      mWebView.freeMemory();
-    }
-
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        requestWindowFeature(Window.FEATURE_PROGRESS);
-
-        LinearLayout contentView = new LinearLayout(this);
-        contentView.setOrientation(LinearLayout.VERTICAL);
-        setContentView(contentView);
-
-        CookieManager.setAcceptFileSchemeCookies(true);
-        mWebView = new WebView(this);
-        mWebViewClassic = WebViewClassic.fromWebView(mWebView);
-        mEventSender = new WebViewEventSender(mWebView);
-        mCallbackProxy = new CallbackProxy(mEventSender, this);
-
-        mWebView.addJavascriptInterface(mCallbackProxy, "layoutTestController");
-        mWebView.addJavascriptInterface(mCallbackProxy, "eventSender");
-        setupWebViewForLayoutTests(mWebView, mCallbackProxy);
-
-        contentView.addView(mWebView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0.0f));
-
-        mWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
-
-        // Expose window.gc function to JavaScript. JSC build exposes
-        // this function by default, but V8 requires the flag to turn it on.
-        // WebView::setJsFlags is noop in JSC build.
-        mWebViewClassic.setJsFlags("--expose_gc");
-
-        mHandler = new AsyncHandler();
-
-        Intent intent = getIntent();
-        if (intent != null) {
-            executeIntent(intent);
-        }
-
-        // This is asynchronous, but it gets processed by WebCore before it starts loading pages.
-        mWebViewClassic.setUseMockDeviceOrientation();
-    }
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        executeIntent(intent);
-    }
-
-    private void executeIntent(Intent intent) {
-        resetTestStatus();
-        if (!Intent.ACTION_VIEW.equals(intent.getAction())) {
-            return;
-        }
-
-        mTotalTestCount = intent.getIntExtra(TOTAL_TEST_COUNT, mTotalTestCount);
-        mCurrentTestNumber = intent.getIntExtra(CURRENT_TEST_NUMBER, mCurrentTestNumber);
-
-        mTestUrl = intent.getStringExtra(TEST_URL);
-        if (mTestUrl == null) {
-            mUiAutoTestPath = intent.getStringExtra(UI_AUTO_TEST);
-            if(mUiAutoTestPath != null) {
-                beginUiAutoTest();
-            }
-            return;
-        }
-
-        mResultFile = intent.getStringExtra(RESULT_FILE);
-        mTimeoutInMillis = intent.getIntExtra(TIMEOUT_IN_MILLIS, 0);
-        mStopOnRefError = intent.getBooleanExtra(STOP_ON_REF_ERROR, false);
-        setTitle("Test " + mCurrentTestNumber + " of " + mTotalTestCount);
-        float ratio = (float)mCurrentTestNumber / mTotalTestCount;
-        int progress = (int)(ratio * Window.PROGRESS_END);
-        getWindow().setFeatureInt(Window.FEATURE_PROGRESS, progress);
-
-        Log.v(LOGTAG, "  Loading " + mTestUrl);
-
-        if (mTestUrl.contains("/dumpAsText/")) {
-            dumpAsText(false);
-        }
-
-        mWebView.loadUrl(mTestUrl);
-
-        if (mTimeoutInMillis > 0) {
-            // Create a timeout timer
-            Message m = mHandler.obtainMessage(MSG_TIMEOUT);
-            mHandler.sendMessageDelayed(m, mTimeoutInMillis);
-        }
-    }
-
-    private void beginUiAutoTest() {
-        try {
-            mTestListReader = new BufferedReader(
-                    new FileReader(mUiAutoTestPath));
-        } catch (IOException ioe) {
-            Log.e(LOGTAG, "Failed to open test list for read.", ioe);
-            finishUiAutoTest();
-            return;
-        }
-        moveToNextTest();
-    }
-
-    private void finishUiAutoTest() {
-        try {
-            if(mTestListReader != null)
-                mTestListReader.close();
-        } catch (IOException ioe) {
-            Log.w(LOGTAG, "Failed to close test list file.", ioe);
-        }
-        ForwardService.getForwardService().stopForwardService();
-        finished();
-    }
-
-    private void moveToNextTest() {
-        String url = null;
-        try {
-            url = mTestListReader.readLine();
-        } catch (IOException ioe) {
-            Log.e(LOGTAG, "Failed to read next test.", ioe);
-            finishUiAutoTest();
-            return;
-        }
-        if (url == null) {
-            mUiAutoTestPath = null;
-            finishUiAutoTest();
-            AlertDialog.Builder builder = new AlertDialog.Builder(this);
-            builder.setMessage("All tests finished. Exit?")
-                   .setCancelable(false)
-                   .setPositiveButton("Yes", new OnClickListener(){
-                       @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                           TestShellActivity.this.finish();
-                       }
-                   })
-                   .setNegativeButton("No", new OnClickListener(){
-                       @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                           dialog.cancel();
-                       }
-                   });
-            builder.create().show();
-            return;
-        }
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        intent.putExtra(TestShellActivity.TEST_URL, FsUtils.getTestUrl(url));
-        intent.putExtra(TestShellActivity.CURRENT_TEST_NUMBER, ++mCurrentTestNumber);
-        intent.putExtra(TIMEOUT_IN_MILLIS, 10000);
-        executeIntent(intent);
-    }
-
-    @Override
-    protected void onStop() {
-        super.onStop();
-        mWebView.stopLoading();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        mWebView.destroy();
-        mWebView = null;
-        mWebViewClassic = null;
-    }
-
-    @Override
-    public void onLowMemory() {
-        super.onLowMemory();
-        Log.e(LOGTAG, "Low memory, clearing caches");
-        mWebView.freeMemory();
-    }
-
-    // Dump the page
-    public void dump(boolean timeout, String webkitData) {
-        mDumpWebKitData = true;
-        if (mResultFile == null || mResultFile.length() == 0) {
-            finished();
-            return;
-        }
-
-        if (mCallback != null) {
-            mCallback.dumpResult(webkitData);
-        }
-
-        try {
-            File parentDir = new File(mResultFile).getParentFile();
-            if (!parentDir.exists()) {
-                parentDir.mkdirs();
-            }
-
-            FileOutputStream os = new FileOutputStream(mResultFile);
-            if (timeout) {
-                Log.w("Layout test: Timeout", mResultFile);
-                os.write(TIMEOUT_STR.getBytes());
-                os.write('\n');
-            }
-            if (mDumpTitleChanges)
-                os.write(mTitleChanges.toString().getBytes());
-            if (mDialogStrings != null)
-                os.write(mDialogStrings.toString().getBytes());
-            mDialogStrings = null;
-            if (mDatabaseCallbackStrings != null)
-                os.write(mDatabaseCallbackStrings.toString().getBytes());
-            mDatabaseCallbackStrings = null;
-            if (mConsoleMessages != null)
-                os.write(mConsoleMessages.toString().getBytes());
-            mConsoleMessages = null;
-            if (webkitData != null)
-                os.write(webkitData.getBytes());
-            os.flush();
-            os.close();
-        } catch (IOException ex) {
-            Log.e(LOGTAG, "Cannot write to " + mResultFile + ", " + ex.getMessage());
-        }
-
-        finished();
-    }
-
-    public void setCallback(TestShellCallback callback) {
-        mCallback = callback;
-    }
-
-    public boolean finished() {
-        if (canMoveToNextTest()) {
-            mHandler.removeMessages(MSG_TIMEOUT);
-            if (mUiAutoTestPath != null) {
-                //don't really finish here
-                moveToNextTest();
-            } else {
-                if (mCallback != null) {
-                    mCallback.finished();
-                }
-            }
-            return true;
-        }
-        return false;
-    }
-
-    public void setDefaultDumpDataType(DumpDataType defaultDumpDataType) {
-        mDefaultDumpDataType = defaultDumpDataType;
-    }
-
-    // .......................................
-    // LayoutTestController Functions
-    @Override
-    public void dumpAsText(boolean enablePixelTests) {
-        // Added after webkit update to r63859. See trac.webkit.org/changeset/63730.
-        if (enablePixelTests) {
-            Log.v(LOGTAG, "dumpAsText(enablePixelTests == true) not implemented on Android!");
-        }
-
-        mDumpDataType = DumpDataType.DUMP_AS_TEXT;
-        mDumpTopFrameAsText = true;
-        if (mWebView != null) {
-            String url = mWebView.getUrl();
-            Log.v(LOGTAG, "dumpAsText called: "+url);
-        }
-    }
-
-    @Override
-    public void dumpChildFramesAsText() {
-        mDumpDataType = DumpDataType.DUMP_AS_TEXT;
-        mDumpChildFramesAsText = true;
-        if (mWebView != null) {
-            String url = mWebView.getUrl();
-            Log.v(LOGTAG, "dumpChildFramesAsText called: "+url);
-        }
-    }
-
-    @Override
-    public void waitUntilDone() {
-        mWaitUntilDone = true;
-        String url = mWebView.getUrl();
-        Log.v(LOGTAG, "waitUntilDone called: " + url);
-    }
-
-    @Override
-    public void notifyDone() {
-        String url = mWebView.getUrl();
-        Log.v(LOGTAG, "notifyDone called: " + url);
-        if (mWaitUntilDone) {
-            mWaitUntilDone = false;
-            if (!mRequestedWebKitData && !mTimedOut && !finished()) {
-                requestWebKitData();
-            }
-        }
-    }
-
-    @Override
-    public void display() {
-        mWebView.invalidate();
-    }
-
-    @Override
-    public void clearBackForwardList() {
-        mWebView.clearHistory();
-
-    }
-
-    @Override
-    public void dumpBackForwardList() {
-        //printf("\n============== Back Forward List ==============\n");
-        // mWebHistory
-        //printf("===============================================\n");
-
-    }
-
-    @Override
-    public void dumpChildFrameScrollPositions() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void dumpEditingCallbacks() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void dumpSelectionRect() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void dumpTitleChanges() {
-        if (!mDumpTitleChanges) {
-            mTitleChanges = new StringBuffer();
-        }
-        mDumpTitleChanges = true;
-    }
-
-    @Override
-    public void keepWebHistory() {
-        if (!mKeepWebHistory) {
-            mWebHistory = new Vector();
-        }
-        mKeepWebHistory = true;
-    }
-
-    @Override
-    public void queueBackNavigation(int howfar) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void queueForwardNavigation(int howfar) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void queueLoad(String Url, String frameTarget) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void queueReload() {
-        mWebView.reload();
-    }
-
-    @Override
-    public void queueScript(String scriptToRunInCurrentContext) {
-        mWebView.loadUrl("javascript:"+scriptToRunInCurrentContext);
-    }
-
-    @Override
-    public void repaintSweepHorizontally() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setAcceptsEditing(boolean b) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setMainFrameIsFirstResponder(boolean b) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void setWindowIsKey(boolean b) {
-        // This is meant to show/hide the window. The best I can find
-        // is setEnabled()
-        mWebView.setEnabled(b);
-    }
-
-    @Override
-    public void testRepaint() {
-        mWebView.invalidate();
-    }
-
-    @Override
-    public void dumpDatabaseCallbacks() {
-        Log.v(LOGTAG, "dumpDatabaseCallbacks called.");
-        mDumpDatabaseCallbacks = true;
-    }
-
-    @Override
-    public void setCanOpenWindows() {
-        Log.v(LOGTAG, "setCanOpenWindows called.");
-        mCanOpenWindows = true;
-    }
-
-    @Override
-    public void setMockGeolocationPosition(double latitude, double longitude, double accuracy) {
-        WebViewClassic.fromWebView(mWebView).setMockGeolocationPosition(latitude, longitude,
-                accuracy);
-    }
-
-    @Override
-    public void setMockGeolocationError(int code, String message) {
-        WebViewClassic.fromWebView(mWebView).setMockGeolocationError(code, message);
-    }
-
-    @Override
-    public void setGeolocationPermission(boolean allow) {
-        Log.v(LOGTAG, "setGeolocationPermission() allow=" + allow);
-        WebViewClassic.fromWebView(mWebView).setMockGeolocationPermission(allow);
-    }
-
-    @Override
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma) {
-        WebViewClassic.fromWebView(mWebView).setMockDeviceOrientation(canProvideAlpha, alpha,
-                canProvideBeta, beta, canProvideGamma, gamma);
-    }
-
-    @Override
-    public void overridePreference(String key, boolean value) {
-        // TODO: We should look up the correct WebView for the frame which
-        // called the layoutTestController method. Currently, we just use the
-        // WebView for the main frame. EventSender suffers from the same
-        // problem.
-        if (WEBKIT_OFFLINE_WEB_APPLICATION_CACHE_ENABLED.equals(key)) {
-            mWebViewClassic.getSettings().setAppCacheEnabled(value);
-        } else if (WEBKIT_USES_PAGE_CACHE_PREFERENCE_KEY.equals(key)) {
-            // Cache the maximum possible number of pages.
-            mWebViewClassic.getSettings().setPageCacheCapacity(Integer.MAX_VALUE);
-        } else {
-            Log.w(LOGTAG, "LayoutTestController.overridePreference(): " +
-                  "Unsupported preference '" + key + "'");
-        }
-    }
-
-    @Override
-    public void setXSSAuditorEnabled (boolean flag) {
-        mWebViewClassic.getSettings().setXSSAuditorEnabled(flag);
-    }
-
-    private final WebViewClient mViewClient = new WebViewClient(){
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            Log.v(LOGTAG, "onPageFinished, url=" + url);
-            mPageFinished = true;
-
-            // Calling finished() will check if we've met all the conditions for completing
-            // this test and move to the next one if we are ready. Otherwise we ask WebCore to
-            // dump the page.
-            if (finished()) {
-                return;
-            }
-
-            if (!mWaitUntilDone && !mRequestedWebKitData && !mTimedOut) {
-                requestWebKitData();
-            } else {
-                if (mWaitUntilDone) {
-                    Log.v(LOGTAG, "page finished loading but waiting for notifyDone to be called: " + url);
-                }
-
-                if (mRequestedWebKitData) {
-                    Log.v(LOGTAG, "page finished loading but webkit data has already been requested: " + url);
-                }
-
-                if (mTimedOut) {
-                    Log.v(LOGTAG, "page finished loading but already timed out: " + url);
-                }
-            }
-
-            super.onPageFinished(view, url);
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            Log.v(LOGTAG, "onPageStarted, url=" + url);
-            mPageFinished = false;
-            super.onPageStarted(view, url, favicon);
-        }
-
-        @Override
-        public void onReceivedError(WebView view, int errorCode, String description,
-                String failingUrl) {
-            Log.v(LOGTAG, "onReceivedError, errorCode=" + errorCode
-                    + ", desc=" + description + ", url=" + failingUrl);
-            super.onReceivedError(view, errorCode, description, failingUrl);
-        }
-
-        @Override
-        public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler,
-                String host, String realm) {
-            if (handler.useHttpAuthUsernamePassword() && view != null) {
-                String[] credentials = view.getHttpAuthUsernamePassword(host, realm);
-                if (credentials != null && credentials.length == 2) {
-                    handler.proceed(credentials[0], credentials[1]);
-                    return;
-                }
-            }
-            handler.cancel();
-        }
-
-        @Override
-        public void onReceivedSslError(WebView view, SslErrorHandler handler,
-                SslError error) {
-            handler.proceed();
-        }
-    };
-
-
-    private final WebChromeClient mChromeClient = new WebChromeClient() {
-        @Override
-        public void onReceivedTitle(WebView view, String title) {
-            setTitle("Test " + mCurrentTestNumber + " of " + mTotalTestCount + ": "+ title);
-            if (mDumpTitleChanges) {
-                mTitleChanges.append("TITLE CHANGED: ");
-                mTitleChanges.append(title);
-                mTitleChanges.append("\n");
-            }
-        }
-
-        @Override
-        public boolean onJsAlert(WebView view, String url, String message,
-                JsResult result) {
-            if (mDialogStrings == null) {
-                mDialogStrings = new StringBuffer();
-            }
-            mDialogStrings.append("ALERT: ");
-            mDialogStrings.append(message);
-            mDialogStrings.append('\n');
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsConfirm(WebView view, String url, String message,
-                JsResult result) {
-            if (mDialogStrings == null) {
-                mDialogStrings = new StringBuffer();
-            }
-            mDialogStrings.append("CONFIRM: ");
-            mDialogStrings.append(message);
-            mDialogStrings.append('\n');
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsPrompt(WebView view, String url, String message,
-                String defaultValue, JsPromptResult result) {
-            if (mDialogStrings == null) {
-                mDialogStrings = new StringBuffer();
-            }
-            mDialogStrings.append("PROMPT: ");
-            mDialogStrings.append(message);
-            mDialogStrings.append(", default text: ");
-            mDialogStrings.append(defaultValue);
-            mDialogStrings.append('\n');
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsTimeout() {
-            Log.v(LOGTAG, "JavaScript timeout");
-            return false;
-        }
-
-        @Override
-        public void onExceededDatabaseQuota(String url_str,
-                String databaseIdentifier, long currentQuota,
-                long estimatedSize, long totalUsedQuota,
-                WebStorage.QuotaUpdater callback) {
-            if (mDumpDatabaseCallbacks) {
-                if (mDatabaseCallbackStrings == null) {
-                    mDatabaseCallbackStrings = new StringBuffer();
-                }
-
-                String protocol = "";
-                String host = "";
-                int port = 0;
-
-                try {
-                    URL url = new URL(url_str);
-                    protocol = url.getProtocol();
-                    host = url.getHost();
-                    if (url.getPort() > -1) {
-                        port = url.getPort();
-                    }
-                } catch (MalformedURLException e) {}
-
-                String databaseCallbackString =
-                        "UI DELEGATE DATABASE CALLBACK: " +
-                        "exceededDatabaseQuotaForSecurityOrigin:{" + protocol +
-                        ", " + host + ", " + port + "} database:" +
-                        databaseIdentifier + "\n";
-                Log.v(LOGTAG, "LOG: "+databaseCallbackString);
-                mDatabaseCallbackStrings.append(databaseCallbackString);
-            }
-            // Give 5MB more quota.
-            callback.updateQuota(currentQuota + 1024 * 1024 * 5);
-        }
-
-        @Override
-        public void onGeolocationPermissionsShowPrompt(String origin,
-                GeolocationPermissions.Callback callback) {
-            throw new RuntimeException(
-                    "The WebCore mock used by DRT should bypass the usual permissions flow.");
-        }
-
-        @Override
-        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
-            String msg = "CONSOLE MESSAGE: line " + consoleMessage.lineNumber() + ": "
-                    + consoleMessage.message() + "\n";
-            if (mConsoleMessages == null) {
-                mConsoleMessages = new StringBuffer();
-            }
-            mConsoleMessages.append(msg);
-            Log.v(LOGTAG, "LOG: " + msg);
-            // the rationale here is that if there's an error of either type, and the test was
-            // waiting for "notifyDone" signal to finish, then there's no point in waiting
-            // anymore because the JS execution is already terminated at this point and a
-            // "notifyDone" will never come out so it's just wasting time till timeout kicks in
-            if ((msg.contains("Uncaught ReferenceError:") || msg.contains("Uncaught TypeError:"))
-                    && mWaitUntilDone && mStopOnRefError) {
-                Log.w(LOGTAG, "Terminating test case on uncaught ReferenceError or TypeError.");
-                mHandler.postDelayed(new Runnable() {
-                    @Override
-                    public void run() {
-                        notifyDone();
-                    }
-                }, 500);
-            }
-            return true;
-        }
-
-        @Override
-        public boolean onCreateWindow(WebView view, boolean dialog,
-                boolean userGesture, Message resultMsg) {
-            if (!mCanOpenWindows) {
-                // We can't open windows, so just send null back.
-                WebView.WebViewTransport transport =
-                        (WebView.WebViewTransport) resultMsg.obj;
-                transport.setWebView(null);
-                resultMsg.sendToTarget();
-                return true;
-            }
-
-            // We never display the new window, just create the view and
-            // allow it's content to execute and be recorded by the test
-            // runner.
-
-            HashMap<String, Object> jsIfaces = new HashMap<String, Object>();
-            jsIfaces.put("layoutTestController", mCallbackProxy);
-            jsIfaces.put("eventSender", mCallbackProxy);
-            WebView newWindowView = new NewWindowWebView(TestShellActivity.this, jsIfaces);
-            setupWebViewForLayoutTests(newWindowView, mCallbackProxy);
-            WebView.WebViewTransport transport =
-                    (WebView.WebViewTransport) resultMsg.obj;
-            transport.setWebView(newWindowView);
-            resultMsg.sendToTarget();
-            return true;
-        }
-
-        @Override
-        public void onCloseWindow(WebView view) {
-            view.destroy();
-        }
-    };
-
-    private static class NewWindowWebView extends WebView {
-        public NewWindowWebView(Context context, Map<String, Object> jsIfaces) {
-            super(context, null, 0, jsIfaces, false);
-        }
-    }
-
-    private void resetTestStatus() {
-        mWaitUntilDone = false;
-        mDumpDataType = mDefaultDumpDataType;
-        mDumpTopFrameAsText = false;
-        mDumpChildFramesAsText = false;
-        mTimedOut = false;
-        mDumpTitleChanges = false;
-        mRequestedWebKitData = false;
-        mDumpDatabaseCallbacks = false;
-        mCanOpenWindows = false;
-        mEventSender.resetMouse();
-        mEventSender.clearTouchPoints();
-        mEventSender.clearTouchMetaState();
-        mPageFinished = false;
-        mDumpWebKitData = false;
-        setDefaultWebSettings(mWebView);
-        CookieManager.getInstance().removeAllCookie();
-        mWebViewClassic.setUseMockGeolocation();
-    }
-
-    private boolean canMoveToNextTest() {
-        return (mDumpWebKitData && mPageFinished && !mWaitUntilDone) || mTimedOut;
-    }
-
-    private void setupWebViewForLayoutTests(WebView webview, CallbackProxy callbackProxy) {
-        if (webview == null) {
-            return;
-        }
-
-        setDefaultWebSettings(webview);
-
-        webview.setWebChromeClient(mChromeClient);
-        webview.setWebViewClient(mViewClient);
-        // Setting a touch interval of -1 effectively disables the optimisation in WebView
-        // that stops repeated touch events flooding WebCore. The Event Sender only sends a
-        // single event rather than a stream of events (like what would generally happen in
-        // a real use of touch events in a WebView)  and so if the WebView drops the event,
-        // the test will fail as the test expects one callback for every touch it synthesizes.
-        WebViewClassic.fromWebView(webview).setTouchInterval(-1);
-    }
-
-    public void setDefaultWebSettings(WebView webview) {
-        WebSettingsClassic settings = WebViewClassic.fromWebView(webview).getSettings();
-        settings.setAppCacheEnabled(true);
-        settings.setAppCachePath(getApplicationContext().getCacheDir().getPath());
-        settings.setAppCacheMaxSize(Long.MAX_VALUE);
-        settings.setJavaScriptEnabled(true);
-        settings.setJavaScriptCanOpenWindowsAutomatically(true);
-        settings.setSupportMultipleWindows(true);
-        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
-        settings.setDatabaseEnabled(true);
-        settings.setDatabasePath(getDir("databases",0).getAbsolutePath());
-        settings.setDomStorageEnabled(true);
-        settings.setWorkersEnabled(false);
-        settings.setXSSAuditorEnabled(false);
-        settings.setPageCacheCapacity(0);
-        settings.setProperty("use_minimal_memory", "false");
-        settings.setAllowUniversalAccessFromFileURLs(true);
-        settings.setAllowFileAccessFromFileURLs(true);
-    }
-
-    private WebViewClassic mWebViewClassic;
-    private WebView mWebView;
-    private WebViewEventSender mEventSender;
-    private AsyncHandler mHandler;
-    private TestShellCallback mCallback;
-
-    private CallbackProxy mCallbackProxy;
-
-    private String mTestUrl;
-    private String mResultFile;
-    private int mTimeoutInMillis;
-    private String mUiAutoTestPath;
-    private BufferedReader mTestListReader;
-    private int mTotalTestCount;
-    private int mCurrentTestNumber;
-    private boolean mStopOnRefError;
-
-    // States
-    private boolean mTimedOut;
-    private boolean mRequestedWebKitData;
-    private boolean mFinishedRunning;
-
-    // Layout test controller variables.
-    private DumpDataType mDumpDataType;
-    private DumpDataType mDefaultDumpDataType = DumpDataType.EXT_REPR;
-    private boolean mDumpTopFrameAsText;
-    private boolean mDumpChildFramesAsText;
-    private boolean mWaitUntilDone;
-    private boolean mDumpTitleChanges;
-    private StringBuffer mTitleChanges;
-    private StringBuffer mDialogStrings;
-    private boolean mKeepWebHistory;
-    private Vector mWebHistory;
-    private boolean mDumpDatabaseCallbacks;
-    private StringBuffer mDatabaseCallbackStrings;
-    private StringBuffer mConsoleMessages;
-    private boolean mCanOpenWindows;
-
-    private boolean mPageFinished = false;
-    private boolean mDumpWebKitData = false;
-
-    static final String TIMEOUT_STR = "**Test timeout";
-    static final long DUMP_TIMEOUT_MS = 100000; // 100s timeout for dumping webview content
-
-    static final int MSG_TIMEOUT = 0;
-    static final int MSG_WEBKIT_DATA = 1;
-    static final int MSG_DUMP_TIMEOUT = 2;
-
-    static final String LOGTAG="TestShell";
-
-    static final String TEST_URL = "TestUrl";
-    static final String RESULT_FILE = "ResultFile";
-    static final String TIMEOUT_IN_MILLIS = "TimeoutInMillis";
-    static final String UI_AUTO_TEST = "UiAutoTest";
-    static final String GET_DRAW_TIME = "GetDrawTime";
-    static final String SAVE_IMAGE = "SaveImage";
-    static final String TOTAL_TEST_COUNT = "TestCount";
-    static final String CURRENT_TEST_NUMBER = "TestNumber";
-    static final String STOP_ON_REF_ERROR = "StopOnReferenceError";
-
-    static final int DRAW_RUNS = 5;
-    static final String DRAW_TIME_LOG = Environment.getExternalStorageDirectory() +
-        "/android/page_draw_time.txt";
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java b/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java
deleted file mode 100644
index 17345ae..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package com.android.dumprendertree;
-
-import android.os.SystemClock;
-import android.util.*;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.webkit.WebView;
-
-import java.util.Arrays;
-import java.util.Vector;
-
-public class WebViewEventSender implements EventSender {
-
-    private static final String LOGTAG = "WebViewEventSender";
-	
-    WebViewEventSender(WebView webView) {
-        mWebView = webView;
-        mWebView.getSettings().setBuiltInZoomControls(true);
-        mTouchPoints = new Vector<TouchPoint>();
-    }
-	
-	public void resetMouse() {
-		mouseX = mouseY = 0;
-	}
-
-	public void enableDOMUIEventLogging(int DOMNode) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void fireKeyboardEventsToElement(int DOMNode) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void keyDown(String character, String[] withModifiers) {
-        Log.e("EventSender", "KeyDown: " + character + "("
-                + character.getBytes()[0] + ") Modifiers: "
-                + Arrays.toString(withModifiers));
-        KeyEvent modifier = null;
-        if (withModifiers != null && withModifiers.length > 0) {
-            for (int i = 0; i < withModifiers.length; i++) {
-                int keyCode = modifierMapper(withModifiers[i]);
-                modifier = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
-                mWebView.onKeyDown(modifier.getKeyCode(), modifier);
-            }
-        }
-        int keyCode = keyMapper(character.toLowerCase().toCharArray()[0]);
-        KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
-        mWebView.onKeyDown(event.getKeyCode(), event);
-
-    }
-	
-	public void keyDown(String character) {
-        keyDown(character, null);
-	}
-
-	public void leapForward(int milliseconds) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void mouseClick() {
-		mouseDown();
-		mouseUp();
-	}
-
-    public void mouseDown() {
-        long ts = SystemClock.uptimeMillis();
-        MotionEvent event = MotionEvent.obtain(ts, ts, MotionEvent.ACTION_DOWN, mouseX, mouseY, 0);
-        mWebView.onTouchEvent(event);
-    }
-
-    public void mouseMoveTo(int X, int Y) {
-        mouseX= X;
-        mouseY= Y;
-    }
-
-     public void mouseUp() {
-        long ts = SystemClock.uptimeMillis();
-        MotionEvent event = MotionEvent.obtain(ts, ts, MotionEvent.ACTION_UP, mouseX, mouseY, 0);
-        mWebView.onTouchEvent(event);
-    }
-
-	// Assumes lowercase chars, case needs to be
-	// handled by calling function.
-	static int keyMapper(char c) {
-		// handle numbers
-		if (c >= '0' && c<= '9') {
-			int offset = c - '0';
-			return KeyEvent.KEYCODE_0 + offset;
-		}
-
-		// handle characters
-		if (c >= 'a' && c <= 'z') {
-			int offset = c - 'a';
-			return KeyEvent.KEYCODE_A + offset;
-		}
-
-		// handle all others
-		switch (c) {
-		case '*':
-			return KeyEvent.KEYCODE_STAR;
-		case '#':
-			return KeyEvent.KEYCODE_POUND;
-		case ',':
-			return KeyEvent.KEYCODE_COMMA;
-		case '.':
-			return KeyEvent.KEYCODE_PERIOD;
-		case '\t':
-			return KeyEvent.KEYCODE_TAB;
-		case ' ':
-			return KeyEvent.KEYCODE_SPACE;
-		case '\n':
-			return KeyEvent.KEYCODE_ENTER;
-		case '\b':
-        case 0x7F:
-			return KeyEvent.KEYCODE_DEL;
-		case '~':
-			return KeyEvent.KEYCODE_GRAVE;
-		case '-':
-			return KeyEvent.KEYCODE_MINUS;
-		case '=':
-			return KeyEvent.KEYCODE_EQUALS;
-		case '(':
-			return KeyEvent.KEYCODE_LEFT_BRACKET;
-		case ')':
-			return KeyEvent.KEYCODE_RIGHT_BRACKET;
-		case '\\':
-			return KeyEvent.KEYCODE_BACKSLASH;
-		case ';':
-			return KeyEvent.KEYCODE_SEMICOLON;
-		case '\'':
-			return KeyEvent.KEYCODE_APOSTROPHE;
-		case '/':
-			return KeyEvent.KEYCODE_SLASH;
-		default:
-			break;
-		}
-
-		return c;
-	}
-	
-	static int modifierMapper(String modifier) {
-		if (modifier.equals("ctrlKey")) {
-			return KeyEvent.KEYCODE_ALT_LEFT;
-		} else if (modifier.equals("shiftKey")) {
-			return KeyEvent.KEYCODE_SHIFT_LEFT;
-		} else if (modifier.equals("altKey")) {
-			return KeyEvent.KEYCODE_SYM;
-		} else if (modifier.equals("metaKey")) {
-			return KeyEvent.KEYCODE_UNKNOWN;
-		}
-		return KeyEvent.KEYCODE_UNKNOWN;
-	}
-
-    public void touchStart() {
-        final int numPoints = mTouchPoints.size();
-        if (numPoints == 0) {
-            return;
-        }
-
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-        long downTime = SystemClock.uptimeMillis();
-
-        for (int i = 0; i < numPoints; ++i) {
-            pointerIds[i] = mTouchPoints.get(i).getId();
-            pointerCoords[i] = new MotionEvent.PointerCoords();
-            pointerCoords[i].x = mTouchPoints.get(i).getX();
-            pointerCoords[i].y = mTouchPoints.get(i).getY();
-            mTouchPoints.get(i).setDownTime(downTime);
-        }
-
-        MotionEvent event = MotionEvent.obtain(downTime, downTime,
-            MotionEvent.ACTION_DOWN, numPoints, pointerIds, pointerCoords,
-            mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-
-        mWebView.onTouchEvent(event);
-    }
-
-    public void touchMove() {
-        final int numPoints = mTouchPoints.size();
-        if (numPoints == 0) {
-            return;
-        }
-
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-        int numMovedPoints = 0;
-        for (int i = 0; i < numPoints; ++i) {
-            TouchPoint tp = mTouchPoints.get(i);
-            if (tp.hasMoved()) {
-                pointerIds[numMovedPoints] = mTouchPoints.get(i).getId();
-                pointerCoords[i] = new MotionEvent.PointerCoords();
-                pointerCoords[numMovedPoints].x = mTouchPoints.get(i).getX();
-                pointerCoords[numMovedPoints].y = mTouchPoints.get(i).getY();
-                ++numMovedPoints;
-                tp.setMoved(false);
-            }
-        }
-
-        if (numMovedPoints == 0) {
-            return;
-        }
-
-        MotionEvent event = MotionEvent.obtain(mTouchPoints.get(0).downTime(),
-                SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE,
-                numMovedPoints, pointerIds, pointerCoords,
-                mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-        mWebView.onTouchEvent(event);
-    }
-
-    public void touchEnd() {
-        final int numPoints = mTouchPoints.size();
-        if (numPoints == 0) {
-            return;
-        }
-
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-
-        for (int i = 0; i < numPoints; ++i) {
-            pointerIds[i] = mTouchPoints.get(i).getId();
-            pointerCoords[i] = new MotionEvent.PointerCoords();
-            pointerCoords[i].x = mTouchPoints.get(i).getX();
-            pointerCoords[i].y = mTouchPoints.get(i).getY();
-        }
-
-        MotionEvent event = MotionEvent.obtain(mTouchPoints.get(0).downTime(),
-                SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,
-                numPoints, pointerIds, pointerCoords,
-                mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-        mWebView.onTouchEvent(event);
-
-        for (int i = numPoints - 1; i >= 0; --i) {  // remove released points.
-            TouchPoint tp = mTouchPoints.get(i);
-            if (tp.isReleased()) {
-              mTouchPoints.remove(i);
-            }
-        }
-    }
-
-    public void touchCancel() {
-        final int numPoints = mTouchPoints.size();
-        if (numPoints == 0) {
-            return;
-        }
-
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-        long cancelTime = SystemClock.uptimeMillis();
-        int numCanceledPoints = 0;
-
-        for (int i = 0; i < numPoints; ++i) {
-            TouchPoint tp = mTouchPoints.get(i);
-            if (tp.cancelled()) {
-                pointerIds[numCanceledPoints] = mTouchPoints.get(i).getId();
-                pointerCoords[numCanceledPoints] = new MotionEvent.PointerCoords();
-                pointerCoords[numCanceledPoints].x = mTouchPoints.get(i).getX();
-                pointerCoords[numCanceledPoints].y = mTouchPoints.get(i).getY();
-                ++numCanceledPoints;
-            }
-        }
-
-        if (numCanceledPoints == 0) {
-            return;
-        }
-
-        MotionEvent event = MotionEvent.obtain(mTouchPoints.get(0).downTime(),
-            SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL,
-            numCanceledPoints, pointerIds, pointerCoords,
-            mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-
-        mWebView.onTouchEvent(event);
-    }
-
-    public void cancelTouchPoint(int id) {
-        TouchPoint tp = mTouchPoints.get(id);
-        if (tp == null) {
-            return;
-        }
-
-        tp.cancel();
-    }
-
-    public void addTouchPoint(int x, int y) {
-        final int numPoints = mTouchPoints.size();
-        int id;
-        if (numPoints == 0) {
-          id = 0;
-        } else {
-          id = mTouchPoints.get(numPoints - 1).getId() + 1;
-        }
-
-        mTouchPoints.add(new TouchPoint(id, contentsToWindowX(x), contentsToWindowY(y)));
-    }
-
-    public void updateTouchPoint(int i, int x, int y) {
-        TouchPoint tp = mTouchPoints.get(i);
-        if (tp == null) {
-            return;
-        }
-
-        tp.update(contentsToWindowX(x), contentsToWindowY(y));
-        tp.setMoved(true);
-    }
-
-    public void setTouchModifier(String modifier, boolean enabled) {
-        int mask = 0;
-        if ("alt".equals(modifier.toLowerCase())) {
-            mask = KeyEvent.META_ALT_ON;
-        } else if ("shift".equals(modifier.toLowerCase())) {
-            mask = KeyEvent.META_SHIFT_ON;
-        } else if ("ctrl".equals(modifier.toLowerCase())) {
-            mask = KeyEvent.META_SYM_ON;
-        }
-
-        if (enabled) {
-            mTouchMetaState |= mask;
-        } else {
-            mTouchMetaState &= ~mask;
-        }
-    }
-
-    public void releaseTouchPoint(int id) {
-        TouchPoint tp = mTouchPoints.get(id);
-        if (tp == null) {
-            return;
-        }
-
-        tp.release();
-    }
-
-    public void clearTouchPoints() {
-        mTouchPoints.clear();
-    }
-
-    public void clearTouchMetaState() {
-        mTouchMetaState = 0;
-    }
-
-    private int contentsToWindowX(int x) {
-        return Math.round(x * mWebView.getScale()) - mWebView.getScrollX();
-    }
-
-    private int contentsToWindowY(int y) {
-        return Math.round(y * mWebView.getScale()) - mWebView.getScrollY();
-    }
-
-    private WebView mWebView = null;
-    private int mouseX;
-    private int mouseY;
-
-    private class TouchPoint {
-        private int mId;
-        private int mX;
-        private int mY;
-        private long mDownTime;
-        private boolean mReleased;
-        private boolean mMoved;
-        private boolean mCancelled;
-
-        public TouchPoint(int id, int x, int y) {
-            mId = id;
-            mX = x;
-            mY = y;
-            mReleased = false;
-            mMoved = false;
-            mCancelled = false;
-        }
-
-        public void setDownTime(long downTime) { mDownTime = downTime; }
-        public long downTime() { return mDownTime; }
-        public void cancel() { mCancelled = true; }
-
-        public boolean cancelled() { return mCancelled; }
-
-        public void release() { mReleased = true; }
-        public boolean isReleased() { return mReleased; }
-
-        public void setMoved(boolean moved) { mMoved = moved; }
-        public boolean hasMoved() { return mMoved; }
-
-        public int getId() { return mId; }
-        public int getX() { return mX; }
-        public int getY() { return mY; }
-
-        public void update(int x, int y) {
-            mX = x;
-            mY = y;
-        }
-    }
-
-    private Vector<TouchPoint> mTouchPoints;
-    private int mTouchMetaState;
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/AdbUtils.java b/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/AdbUtils.java
deleted file mode 100644
index c2ecf3a..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/AdbUtils.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.dumprendertree.forwarder;
-
-import android.util.Log;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-public class AdbUtils {
-
-    private static final String ADB_OK = "OKAY";
-    private static final int ADB_PORT = 5037;
-    private static final String ADB_HOST = "127.0.0.1";
-    private static final int ADB_RESPONSE_SIZE = 4;
-
-    private static final String LOGTAG = "AdbUtils";
-
-    /**
-     *
-     * Convert integer format IP into xxx.xxx.xxx.xxx format
-     *
-     * @param host IP address in integer format
-     * @return human readable format
-     */
-    public static String convert(int host) {
-        return ((host >> 24) & 0xFF) + "."
-        + ((host >> 16) & 0xFF) + "."
-        + ((host >> 8) & 0xFF) + "."
-        + (host & 0xFF);
-    }
-
-    /**
-     *
-     * Resolve DNS name into IP address
-     *
-     * @param host DNS name
-     * @return IP address in integer format
-     * @throws IOException
-     */
-    public static int resolve(String host)  throws IOException {
-        Socket localSocket = new Socket(ADB_HOST, ADB_PORT);
-        DataInputStream dis = new DataInputStream(localSocket.getInputStream());
-        OutputStream os = localSocket.getOutputStream();
-        int count_read = 0;
-
-        if (localSocket == null || dis == null || os == null)
-            return -1;
-        String cmd = "dns:" + host;
-
-        if(!sendAdbCmd(dis, os, cmd))
-            return -1;
-
-        count_read = dis.readInt();
-        localSocket.close();
-        return count_read;
-    }
-
-    /**
-     *
-     * Send an ADB command using existing socket connection
-     *
-     * the streams provided must be from a socket connected to adbd already
-     *
-     * @param is input stream of the socket connection
-     * @param os output stream of the socket
-     * @param cmd the adb command to send
-     * @return if adb gave a success response
-     * @throws IOException
-     */
-    public static boolean sendAdbCmd(InputStream is, OutputStream os,
-            String cmd) throws IOException {
-        byte[] buf = new byte[ADB_RESPONSE_SIZE];
-
-        cmd = String.format("%04X", cmd.length()) + cmd;
-        os.write(cmd.getBytes());
-        int read = is.read(buf);
-        if(read != ADB_RESPONSE_SIZE || !ADB_OK.equals(new String(buf))) {
-            Log.w(LOGTAG, "adb cmd faild.");
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     *
-     * Get a tcp socket connection to specified IP address and port proxied by adb
-     *
-     * The proxying is transparent, e.g. if a socket is returned, then it can be written to and
-     * read from as if it is directly connected to the target
-     *
-     * @param remoteAddress IP address of the host to connect to
-     * @param remotePort port of the host to connect to
-     * @return a valid Socket instance if successful, null otherwise
-     */
-    public static Socket getForwardedSocket(int remoteAddress, int remotePort) {
-        try {
-            Socket socket = new Socket(ADB_HOST, ADB_PORT);
-            String cmd = "tcp:" + remotePort + ":" + convert(remoteAddress);
-            if(!sendAdbCmd(socket.getInputStream(), socket.getOutputStream(), cmd)) {
-                socket.close();
-                return null;
-            }
-            return socket;
-        } catch (IOException ioe) {
-            Log.w(LOGTAG, "error creating adb socket", ioe);
-            return null;
-        }
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardServer.java b/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardServer.java
deleted file mode 100644
index 14f8fbe..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardServer.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.dumprendertree.forwarder;
-
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- *
- * A port forwarding server. Listens at specified local port and forward the tcp communications to
- * external host/port via adb networking proxy.
- *
- */
-public class ForwardServer {
-
-    private static final String LOGTAG = "ForwardServer";
-
-    private int remotePort;
-    private int remoteAddress;
-    private int localPort;
-    private ServerSocket serverSocket;
-    private boolean started;
-
-    private Set<Forwarder> forwarders;
-
-    public ForwardServer(int localPort, int remoteAddress, int remotePort) {
-        this.localPort = localPort;
-        this.remoteAddress = remoteAddress;
-        this.remotePort = remotePort;
-        started = false;
-        forwarders = new HashSet<Forwarder>();
-    }
-
-    public synchronized void start() throws IOException {
-        if(!started) {
-            serverSocket = new ServerSocket(localPort);
-            Thread serverThread = new Thread(new ServerRunner(serverSocket));
-            serverThread.setName(LOGTAG);
-            serverThread.start();
-            started = true;
-        }
-    }
-
-    public synchronized void stop() {
-        if(started) {
-            synchronized (forwarders) {
-                for(Forwarder forwarder : forwarders)
-                    forwarder.stop();
-                forwarders.clear();
-            }
-            try {
-                serverSocket.close();
-            } catch (IOException ioe) {
-                Log.v(LOGTAG, "exception while closing", ioe);
-            } finally {
-                started = false;
-            }
-        }
-    }
-
-    public synchronized boolean isRunning() {
-        return started;
-    }
-
-    private class ServerRunner implements Runnable {
-
-        private ServerSocket socket;
-
-        public ServerRunner(ServerSocket socket) {
-            this.socket = socket;
-        }
-
-        public void run() {
-            try {
-                while (true) {
-                    Socket localSocket = socket.accept();
-                    Socket remoteSocket = AdbUtils.getForwardedSocket(remoteAddress, remotePort);
-                    if(remoteSocket == null) {
-                        try {
-                            localSocket.close();
-                        } catch (IOException ioe) {
-                            Log.w(LOGTAG, "error while closing socket", ioe);
-                        } finally {
-                            Log.w(LOGTAG, "failed to start forwarding from " + localSocket);
-                        }
-                    } else {
-                        Forwarder forwarder = new Forwarder(localSocket, remoteSocket,
-                                ForwardServer.this);
-                        forwarder.start();
-                    }
-                }
-            } catch (IOException ioe) {
-                return;
-            }
-        }
-    }
-
-    public void register(Forwarder forwarder) {
-        synchronized (forwarders) {
-            if(!forwarders.contains(forwarder)) {
-                forwarders.add(forwarder);
-            }
-        }
-    }
-
-    public void unregister(Forwarder recyclable) {
-        synchronized (forwarders) {
-            if(forwarders.contains(recyclable)) {
-                recyclable.stop();
-                forwarders.remove(recyclable);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardService.java b/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardService.java
deleted file mode 100644
index 25dd04fd..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/ForwardService.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.dumprendertree.forwarder;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-import android.os.Environment;
-import android.util.Log;
-
-public class ForwardService {
-
-    private ForwardServer fs8000, fs8080, fs8443;
-
-    private static ForwardService inst;
-
-    private static final String LOGTAG = "ForwardService";
-
-    private static final String DEFAULT_TEST_HOST = "android-browser-test.mtv.corp.google.com";
-
-    private static final String FORWARD_HOST_CONF =
-        Environment.getExternalStorageDirectory() + "/drt_forward_host.txt";
-
-    private ForwardService() {
-        int addr = getForwardHostAddr();
-        if (addr != -1) {
-            fs8000 = new ForwardServer(8000, addr, 8000);
-            fs8080 = new ForwardServer(8080, addr, 8080);
-            fs8443 = new ForwardServer(8443, addr, 8443);
-        }
-    }
-
-    public static ForwardService getForwardService() {
-        if (inst == null) {
-            inst = new ForwardService();
-        }
-        return inst;
-    }
-
-    public void startForwardService() {
-        try {
-            if (fs8000 != null)
-                fs8000.start();
-            if (fs8080 != null)
-                fs8080.start();
-            if (fs8443 != null)
-                fs8443.start();
-        } catch (IOException ioe) {
-            Log.w(LOGTAG, "failed to start forwarder. http tests will fail.", ioe);
-            return;
-        }
-    }
-
-    public void stopForwardService() {
-        if (fs8000 != null) {
-            fs8000.stop();
-            fs8000 = null;
-        }
-        if (fs8080 != null) {
-            fs8080.stop();
-            fs8080 = null;
-        }
-        if (fs8443 != null) {
-            fs8443.stop();
-            fs8443 = null;
-        }
-        Log.v(LOGTAG, "forwarders stopped.");
-    }
-
-    private static int getForwardHostAddr() {
-        int addr = -1;
-        String host = null;
-        File forwardHostConf = new File(FORWARD_HOST_CONF);
-        if (forwardHostConf.isFile()) {
-            BufferedReader hostReader = null;
-            try {
-                hostReader = new BufferedReader(new FileReader(forwardHostConf));
-                host = hostReader.readLine();
-                Log.v(LOGTAG, "read forward host from file: " + host);
-            } catch (IOException ioe) {
-                Log.v(LOGTAG, "cannot read forward host from file", ioe);
-            } finally {
-                if (hostReader != null) {
-                    try {
-                        hostReader.close();
-                    } catch (IOException ioe) {
-                        // burn!!!
-                    }
-                }
-            }
-        }
-        if (host == null || host.length() == 0)
-            host = DEFAULT_TEST_HOST;
-        try {
-            addr = AdbUtils.resolve(host);
-        } catch (IOException ioe) {
-            Log.e(LOGTAG, "failed to resolve server address", ioe);
-        }
-        return addr;
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/Forwarder.java b/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/Forwarder.java
deleted file mode 100644
index a971e7b..0000000
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/forwarder/Forwarder.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.dumprendertree.forwarder;
-
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/**
- *
- * Worker class for {@link ForwardServer}. A Forwarder will be created once the ForwardServer
- * accepts an incoming connection, and it will then forward the incoming/outgoing streams to a
- * connection already proxied by adb networking (see also {@link AdbUtils}).
- *
- */
-public class Forwarder {
-
-    private ForwardServer server;
-    private Socket from, to;
-
-    private static final String LOGTAG = "Forwarder";
-    private static final int BUFFER_SIZE = 16384;
-
-    public Forwarder (Socket from, Socket to, ForwardServer server) {
-        this.server = server;
-        this.from = from;
-        this.to = to;
-        server.register(this);
-    }
-
-    public void start() {
-        Thread outgoing = new Thread(new SocketPipe(from, to));
-        Thread incoming = new Thread(new SocketPipe(to, from));
-        outgoing.setName(LOGTAG);
-        incoming.setName(LOGTAG);
-        outgoing.start();
-        incoming.start();
-    }
-
-    public void stop() {
-        shutdown(from);
-        shutdown(to);
-    }
-
-    private void shutdown(Socket socket) {
-        try {
-            socket.shutdownInput();
-        } catch (IOException e) {
-            Log.v(LOGTAG, "Socket#shutdownInput", e);
-        }
-        try {
-            socket.shutdownOutput();
-        } catch (IOException e) {
-            Log.v(LOGTAG, "Socket#shutdownOutput", e);
-        }
-        try {
-            socket.close();
-        } catch (IOException e) {
-            Log.v(LOGTAG, "Socket#close", e);
-        }
-    }
-
-    private class SocketPipe implements Runnable {
-
-        private Socket in, out;
-
-        public SocketPipe(Socket in, Socket out) {
-            this.in = in;
-            this.out = out;
-        }
-
-        public void run() {
-            try {
-                int length;
-                InputStream is = in.getInputStream();
-                OutputStream os = out.getOutputStream();
-                byte[] buffer = new byte[BUFFER_SIZE];
-                while ((length = is.read(buffer)) > 0) {
-                    os.write(buffer, 0, length);
-                }
-            } catch (IOException ioe) {
-            } finally {
-                server.unregister(Forwarder.this);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return "SocketPipe{" + in + "=>" + out  + "}";
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/Android.mk b/tests/DumpRenderTree2/Android.mk
deleted file mode 100644
index 81fc633..0000000
--- a/tests/DumpRenderTree2/Android.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# Copyright (C) 2010 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.
-#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-LOCAL_STATIC_JAVA_LIBRARIES := diff_match_patch
-
-LOCAL_PACKAGE_NAME := DumpRenderTree2
-
-include $(BUILD_PACKAGE)
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/AndroidManifest.xml b/tests/DumpRenderTree2/AndroidManifest.xml
deleted file mode 100644
index ea6571e..0000000
--- a/tests/DumpRenderTree2/AndroidManifest.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.dumprendertree2">
-    <application>
-        <uses-library android:name="android.test.runner" />
-
-        <activity android:name=".ui.DirListActivity"
-                  android:label="Dump Render Tree 2"
-                  android:configChanges="orientation">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.TEST" />
-            </intent-filter>
-        </activity>
-
-        <!-- android:launchMode="singleTask" is there so we only have a one instance
-             of this activity. However, it doesn't seem to work exactly like described in the
-             documentation, because the behaviour of the application suggest
-             there is only a single task for all 3 activities. We don't understand
-             how exactly it all works, but at the moment it works just fine.
-             It can lead to some weird behaviour in the future. -->
-        <activity android:name=".TestsListActivity"
-                  android:label="Tests' list activity"
-                  android:launchMode="singleTask"
-                  android:configChanges="orientation">
-        </activity>
-
-        <activity android:name=".LayoutTestsExecutor"
-                  android:theme="@style/WhiteBackground"
-                  android:label="Layout tests' executor"
-                  android:process=":executor">
-        </activity>
-
-        <service android:name="ManagerService">
-        </service>
-    </application>
-
-    <instrumentation android:name="com.android.dumprendertree2.scriptsupport.ScriptTestRunner"
-                     android:targetPackage="com.android.dumprendertree2"
-                     android:label="Layout tests script runner" />
-
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.WRITE_SDCARD" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.WAKE_LOCK" />
-</manifest>
diff --git a/tests/DumpRenderTree2/assets/run_apache2.py b/tests/DumpRenderTree2/assets/run_apache2.py
deleted file mode 100755
index 3806599..0000000
--- a/tests/DumpRenderTree2/assets/run_apache2.py
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (C) 2010 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.
-#
-"""Start, stop, or restart apache2 server.
-
-  Apache2 must be installed with mod_php!
-
-  Usage:
-    run_apache2.py start|stop|restart
-"""
-
-import sys
-import os
-import subprocess
-import logging
-import optparse
-import time
-
-def main(run_cmd, options):
-  # Setup logging class
-  logging.basicConfig(level=logging.INFO, format='%(message)s')
-
-  if not run_cmd in ("start", "stop", "restart"):
-    logging.info("illegal argument: " + run_cmd)
-    logging.info("Usage: python run_apache2.py start|stop|restart")
-    return False
-
-  # Create /tmp/WebKit if it doesn't exist. This is needed for various files used by apache2
-  tmp_WebKit = os.path.join("/tmp", "WebKit")
-  if not os.path.exists(tmp_WebKit):
-    os.mkdir(tmp_WebKit)
-
-  # Get the path to android tree root based on the script location.
-  # Basically we go 5 levels up
-  parent = os.pardir
-  script_location = os.path.abspath(os.path.dirname(sys.argv[0]))
-  android_tree_root = os.path.join(script_location, parent, parent, parent, parent, parent)
-  android_tree_root = os.path.normpath(android_tree_root)
-
-  # If any of these is relative, then it's relative to ServerRoot (in our case android_tree_root)
-  webkit_path = os.path.join("external", "webkit")
-  if (options.tests_root_directory != None):
-    # if options.tests_root_directory is absolute, os.getcwd() is discarded!
-    layout_tests_path = os.path.normpath(os.path.join(os.getcwd(), options.tests_root_directory))
-  else:
-    layout_tests_path = os.path.join(webkit_path, "LayoutTests")
-  http_conf_path = os.path.join(layout_tests_path, "http", "conf")
-
-  # Prepare the command to set ${APACHE_RUN_USER} and ${APACHE_RUN_GROUP}
-  envvars_path = os.path.join("/etc", "apache2", "envvars")
-  export_envvars_cmd = "source " + envvars_path
-
-  error_log_path = os.path.join(tmp_WebKit, "apache2-error.log")
-  custom_log_path = os.path.join(tmp_WebKit, "apache2-access.log")
-
-  # Prepare the command to (re)start/stop the server with specified settings
-  apache2_restart_template = "apache2 -k %s"
-  directives  = " -c \"ServerRoot " + android_tree_root + "\""
-
-  # The default config in apache2-debian-httpd.conf listens on ports 8080 and
-  # 8443. We also need to listen on port 8000 for HTTP tests.
-  directives += " -c \"Listen 8000\""
-
-  # We use http/tests as the document root as the HTTP tests use hardcoded
-  # resources at the server root. We then use aliases to make available the
-  # complete set of tests and the required scripts.
-  directives += " -c \"DocumentRoot " + os.path.join(layout_tests_path, "http", "tests/") + "\""
-  directives += " -c \"Alias /LayoutTests " + layout_tests_path + "\""
-  directives += " -c \"Alias /Tools/DumpRenderTree/android " + \
-    os.path.join(webkit_path, "Tools", "DumpRenderTree", "android") + "\""
-  directives += " -c \"Alias /ThirdPartyProject.prop " + \
-    os.path.join(webkit_path, "ThirdPartyProject.prop") + "\""
-
-  # This directive is commented out in apache2-debian-httpd.conf for some reason
-  # However, it is useful to browse through tests in the browser, so it's added here.
-  # One thing to note is that because of problems with mod_dir and port numbers, mod_dir
-  # is turned off. That means that there _must_ be a trailing slash at the end of URL
-  # for auto indexes to work correctly.
-  directives += " -c \"LoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so\""
-
-  directives += " -c \"ErrorLog " + error_log_path +"\""
-  directives += " -c \"CustomLog " + custom_log_path + " combined\""
-  directives += " -c \"SSLCertificateFile " + os.path.join(http_conf_path, "webkit-httpd.pem") + \
-    "\""
-  directives += " -c \"User ${APACHE_RUN_USER}\""
-  directives += " -c \"Group ${APACHE_RUN_GROUP}\""
-  directives += " -C \"TypesConfig " + \
-    os.path.join(android_tree_root, http_conf_path, "mime.types") + "\""
-  conf_file_cmd = " -f " + \
-    os.path.join(android_tree_root, http_conf_path, "apache2-debian-httpd.conf")
-
-  # Try to execute the commands
-  logging.info("Will " + run_cmd + " apache2 server.")
-
-  # It is worth noting here that if the configuration file with which we restart the server points
-  # to a different PidFile it will not work and will result in a second apache2 instance.
-  if (run_cmd == 'restart'):
-    logging.info("First will stop...")
-    if execute_cmd(envvars_path, error_log_path,
-                   export_envvars_cmd + " && " + (apache2_restart_template % ('stop')) + directives + conf_file_cmd) == False:
-      logging.info("Failed to stop Apache2")
-      return False
-    logging.info("Stopped. Will start now...")
-    # We need to sleep breifly to avoid errors with apache being stopped and started too quickly
-    time.sleep(0.5)
-
-  if execute_cmd(envvars_path, error_log_path,
-                 export_envvars_cmd + " && " +
-                 (apache2_restart_template % (run_cmd)) + directives +
-                 conf_file_cmd) == False:
-    logging.info("Failed to start Apache2")
-    return False
-
-  logging.info("Successfully started")
-  return True
-
-def execute_cmd(envvars_path, error_log_path, cmd):
-  p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  (out, err) = p.communicate()
-
-  # Output the stdout from the command to console
-  logging.info(out)
-
-  # Report any errors
-  if p.returncode != 0:
-    logging.info("!! ERRORS:")
-
-    if err.find(envvars_path) != -1:
-      logging.info(err)
-    elif err.find('command not found') != -1:
-      logging.info("apache2 is probably not installed")
-    else:
-      logging.info(err)
-      logging.info("Try looking in " + error_log_path + " for details")
-    return False
-
-  return True
-
-if __name__ == "__main__":
-  option_parser = optparse.OptionParser(usage="Usage: %prog [options] start|stop|restart")
-  option_parser.add_option("", "--tests-root-directory",
-                           help="The directory from which to take the tests, default is external/webkit/LayoutTests in this checkout of the Android tree")
-  options, args = option_parser.parse_args();
-
-  if len(args) < 1:
-    run_cmd = ""
-  else:
-    run_cmd = args[0]
-
-  main(run_cmd, options)
diff --git a/tests/DumpRenderTree2/assets/run_layout_tests.py b/tests/DumpRenderTree2/assets/run_layout_tests.py
deleted file mode 100755
index 161416a..0000000
--- a/tests/DumpRenderTree2/assets/run_layout_tests.py
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/python
-
-"""Run layout tests on the device.
-
-  It runs the specified tests on the device, downloads the summaries to the temporary directory
-  and optionally shows the detailed results the host's default browser.
-
-  Usage:
-    run_layout_tests.py --show-results-in-browser test-relative-path
-"""
-
-import logging
-import optparse
-import os
-import re
-import sys
-import subprocess
-import tempfile
-import webbrowser
-
-import run_apache2
-
-#TODO: These should not be hardcoded
-RESULTS_ABSOLUTE_PATH = "/sdcard/layout-test-results/"
-DETAILS_HTML = "details.html"
-SUMMARY_TXT = "summary.txt"
-
-def main(path, options):
-  tmpdir = tempfile.gettempdir()
-
-  # Restart the server
-  if run_apache2.main("restart", options) == False:
-    return
-
-  # Run the tests in path
-  adb_cmd = "adb"
-  if options.serial:
-    adb_cmd += " -s " + options.serial
-  cmd = adb_cmd + " shell am instrument "
-  cmd += "-e class com.android.dumprendertree2.scriptsupport.Starter#startLayoutTests "
-  cmd += "-e path \"" + path + "\" "
-  cmd += "-w com.android.dumprendertree2/com.android.dumprendertree2.scriptsupport.ScriptTestRunner"
-
-  logging.info("Running the tests...")
-  logging.debug("Command = %s" % cmd)
-  (stdoutdata, stderrdata) = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
-  if stderrdata != "":
-    logging.info("Failed to start tests:\n%s", stderrdata)
-    return
-  if re.search("^INSTRUMENTATION_STATUS_CODE: -1", stdoutdata, re.MULTILINE) != None:
-    logging.info("Failed to run the tests. Is DumpRenderTree2 installed on the device?")
-    return
-  if re.search("^OK \([0-9]+ tests?\)", stdoutdata, re.MULTILINE) == None:
-    logging.info("DumpRenderTree2 failed to run correctly:\n%s", stdoutdata)
-    return
-
-  logging.info("Downloading the summaries...")
-
-  # Download the txt summary to tmp folder
-  summary_txt_tmp_path = os.path.join(tmpdir, SUMMARY_TXT)
-  cmd = "rm -f " + summary_txt_tmp_path + ";"
-  cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + SUMMARY_TXT + " " + summary_txt_tmp_path
-  subprocess.Popen(cmd, shell=True).wait()
-
-  # Download the html summary to tmp folder
-  details_html_tmp_path = os.path.join(tmpdir, DETAILS_HTML)
-  cmd = "rm -f " + details_html_tmp_path + ";"
-  cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + DETAILS_HTML + " " + details_html_tmp_path
-  subprocess.Popen(cmd, shell=True).wait()
-
-  # Print summary to console
-  logging.info("All done.\n")
-  cmd = "cat " + summary_txt_tmp_path
-  os.system(cmd)
-  logging.info("")
-
-  # Open the browser with summary
-  if options.show_results_in_browser != "false":
-    webbrowser.open(details_html_tmp_path)
-
-if __name__ == "__main__":
-  option_parser = optparse.OptionParser(usage="Usage: %prog [options] test-relative-path")
-  option_parser.add_option("", "--show-results-in-browser", default="true",
-                           help="Show the results the host's default web browser, default=true")
-  option_parser.add_option("", "--tests-root-directory",
-                           help="The directory from which to take the tests, default is external/webkit/LayoutTests in this checkout of the Android tree")
-  option_parser.add_option("-s", "--serial", default=None, help="Specify the serial number of device to run test on")
-  options, args = option_parser.parse_args();
-
-  logging.basicConfig(level=logging.INFO, format='%(message)s')
-
-  if len(args) > 1:
-    logging.fatal("Usage: run_layout_tests.py [options] test-relative-path")
-  else:
-    if len(args) < 1:
-      path = "";
-    else:
-      path = args[0]
-    main(path, options);
diff --git a/tests/DumpRenderTree2/res/drawable/folder.png b/tests/DumpRenderTree2/res/drawable/folder.png
deleted file mode 100644
index 5b3fcec..0000000
--- a/tests/DumpRenderTree2/res/drawable/folder.png
+++ /dev/null
Binary files differ
diff --git a/tests/DumpRenderTree2/res/drawable/runtest.png b/tests/DumpRenderTree2/res/drawable/runtest.png
deleted file mode 100644
index 910c654..0000000
--- a/tests/DumpRenderTree2/res/drawable/runtest.png
+++ /dev/null
Binary files differ
diff --git a/tests/DumpRenderTree2/res/layout/dirlist_row.xml b/tests/DumpRenderTree2/res/layout/dirlist_row.xml
deleted file mode 100644
index e5578a6..0000000
--- a/tests/DumpRenderTree2/res/layout/dirlist_row.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="horizontal"
-    android:gravity="center_vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content">
-
-    <ImageView
-        android:id="@+id/icon"
-        android:layout_width="80px"
-        android:adjustViewBounds="true"
-        android:paddingLeft="15px"
-        android:paddingRight="15px"
-        android:paddingTop="15px"
-        android:paddingBottom="15px"
-        android:layout_height="wrap_content"
-    />
-
-    <TextView
-        android:id="@+id/label"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:minHeight="60px"
-        android:gravity="center_vertical"
-        android:textSize="14sp"
-    />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/res/menu/gui_menu.xml b/tests/DumpRenderTree2/res/menu/gui_menu.xml
deleted file mode 100644
index a5b2b65..0000000
--- a/tests/DumpRenderTree2/res/menu/gui_menu.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="@+id/run_all"
-          android:title="@string/run_all_tests" />
-</menu>
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/res/values/strings.xml b/tests/DumpRenderTree2/res/values/strings.xml
deleted file mode 100644
index 0496404..0000000
--- a/tests/DumpRenderTree2/res/values/strings.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<resources>
-    <string name="dialog_run_abort_dir_title_prefix">Directory:</string>
-    <string name="dialog_run_abort_dir_msg">This will run all the tests in this directory and all
-            the subdirectories. It may take a few hours!</string>
-    <string name="dialog_run_abort_dir_ok_button">Run tests!</string>
-    <string name="dialog_run_abort_dir_abort_button">Abort</string>
-
-    <string name="dialog_progress_title">Loading items.</string>
-    <string name="dialog_progress_msg">Please wait...</string>
-
-    <string name="runner_preloading_title">Preloading tests...</string>
-
-    <string name="run_all_tests">Run all tests in the current directory</string>
-</resources>
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/res/values/style.xml b/tests/DumpRenderTree2/res/values/style.xml
deleted file mode 100644
index 35f3419..0000000
--- a/tests/DumpRenderTree2/res/values/style.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2010 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.
--->
-<resources>
-    <style name="WhiteBackground">
-        <item name="android:background">@android:color/white</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java
deleted file mode 100644
index 614b03c..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AbstractResult.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.os.Bundle;
-import android.os.Message;
-import android.util.Log;
-import android.webkit.WebView;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-
-/**
- * A class that represent a result of the test. It is responsible for returning the result's
- * raw data and generating its own diff in HTML format.
- */
-public abstract class AbstractResult implements Comparable<AbstractResult>, Serializable {
-
-    private static final String LOG_TAG = "AbstractResult";
-
-    public enum TestType {
-        TEXT {
-            @Override
-            public AbstractResult createResult(Bundle bundle) {
-                return new TextResult(bundle);
-            }
-        },
-        RENDER_TREE {
-            @Override
-            public AbstractResult createResult(Bundle bundle) {
-                /** TODO: RenderTree tests are not yet supported */
-                return null;
-            }
-        };
-
-        public abstract AbstractResult createResult(Bundle bundle);
-    }
-
-    /**
-     * A code representing the result of comparing actual and expected results.
-     */
-    public enum ResultCode implements Serializable {
-        RESULTS_MATCH("Results match"),
-        RESULTS_DIFFER("Results differ"),
-        NO_EXPECTED_RESULT("No expected result"),
-        NO_ACTUAL_RESULT("No actual result");
-
-        private String mTitle;
-
-        private ResultCode(String title) {
-            mTitle = title;
-        }
-
-        @Override
-        public String toString() {
-            return mTitle;
-        }
-    }
-
-    String mAdditionalTextOutputString;
-
-    public int compareTo(AbstractResult another) {
-        return getRelativePath().compareTo(another.getRelativePath());
-    }
-
-    public void setAdditionalTextOutputString(String additionalTextOutputString) {
-        mAdditionalTextOutputString = additionalTextOutputString;
-    }
-
-    public String getAdditionalTextOutputString() {
-        return mAdditionalTextOutputString;
-    }
-
-    public byte[] getBytes() {
-        ByteArrayOutputStream baos = null;
-        ObjectOutputStream oos = null;
-        try {
-            try {
-                baos = new ByteArrayOutputStream();
-                oos = new ObjectOutputStream(baos);
-                oos.writeObject(this);
-            } finally {
-                if (baos != null) {
-                    baos.close();
-                }
-                if (oos != null) {
-                    oos.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Unable to serialize result: " + getRelativePath(), e);
-        }
-
-        return baos == null ? null : baos.toByteArray();
-    }
-
-    public static AbstractResult create(byte[] bytes) {
-        ByteArrayInputStream bais = null;
-        ObjectInputStream ois = null;
-        AbstractResult result = null;
-        try {
-            try {
-                bais = new ByteArrayInputStream(bytes);
-                ois = new ObjectInputStream(bais);
-                result = (AbstractResult)ois.readObject();
-            } finally {
-                if (bais != null) {
-                    bais.close();
-                }
-                if (ois != null) {
-                    ois.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Unable to deserialize result!", e);
-        } catch (ClassNotFoundException e) {
-            Log.e(LOG_TAG, "Unable to deserialize result!", e);
-        }
-        return result;
-    }
-
-    public void clearResults() {
-        mAdditionalTextOutputString = null;
-    }
-
-    /**
-     * Makes the result object obtain the results of the test from the webview
-     * and store them in the format that suits itself bests. This method is asynchronous.
-     * The message passed as a parameter is a message that should be sent to its target
-     * when the result finishes obtaining the result.
-     *
-     * @param webview
-     * @param resultObtainedMsg
-     */
-    public abstract void obtainActualResults(WebView webview, Message resultObtainedMsg);
-
-    public abstract void setExpectedImageResult(byte[] expectedResult);
-
-    public abstract void setExpectedImageResultPath(String relativePath);
-
-    public abstract String getExpectedImageResultPath();
-
-    public abstract void setExpectedTextResult(String expectedResult);
-
-    public abstract void setExpectedTextResultPath(String relativePath);
-
-    public abstract String getExpectedTextResultPath();
-
-    /**
-     * Returns result's image data that can be written to the disk. It can be null
-     * if there is an error of some sort or for example the test times out.
-     *
-     * <p> Some tests will not provide data (like text tests)
-     *
-     * @return
-     *      results image data
-     */
-    public abstract byte[] getActualImageResult();
-
-    /**
-     * Returns result's text data. It can be null
-     * if there is an error of some sort or for example the test times out.
-     *
-     * @return
-     *      results text data
-     */
-    public abstract String getActualTextResult();
-
-    /**
-     * Returns the status code representing the result of comparing actual and expected results.
-     *
-     * @return
-     *      the status code from comparing actual and expected results
-     */
-    public abstract ResultCode getResultCode();
-
-    /**
-     * Returns whether this test crashed.
-     *
-     * @return
-     *      whether this test crashed
-     */
-    public abstract boolean didCrash();
-
-    /**
-     * Returns whether this test timed out.
-     *
-     * @return
-     *      whether this test timed out
-     */
-    public abstract boolean didTimeOut();
-
-    /**
-     * Sets that this test timed out.
-     */
-    public abstract void setDidTimeOut();
-
-    /**
-     * Returns whether the test passed.
-     *
-     * @return
-     *      whether the test passed
-     */
-    public boolean didPass() {
-        // Tests that crash can't have timed out or have an actual result.
-        assert !(didCrash() && didTimeOut());
-        assert !(didCrash() && getResultCode() != ResultCode.NO_ACTUAL_RESULT);
-        return !didCrash() && !didTimeOut() && getResultCode() == ResultCode.RESULTS_MATCH;
-    }
-
-    /**
-     * Return the type of the result data.
-     *
-     * @return
-     *      the type of the result data.
-     */
-    public abstract TestType getType();
-
-    public abstract String getRelativePath();
-
-    /**
-     * Returns a piece of HTML code that presents a visual diff between a result and
-     * the expected result.
-     *
-     * @return
-     *      a piece of HTML code with a visual diff between the result and the expected result
-     */
-    public abstract String getDiffAsHtml();
-
-    public abstract Bundle getBundle();
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AdditionalTextOutput.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/AdditionalTextOutput.java
deleted file mode 100644
index bb9a916..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/AdditionalTextOutput.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.util.Log;
-import android.webkit.ConsoleMessage;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-/**
- * A class that stores consoles messages, database callbacks, alert messages, etc.
- */
-public class AdditionalTextOutput {
-    private static final String LOG_TAG = "AdditionalTextOutput";
-
-    /**
-     * Ordering of enums is important as it determines ordering of the toString method!
-     * StringBuilders will be printed in the order the corresponding types appear here.
-     */
-    private enum OutputType {
-        JS_DIALOG,
-        EXCEEDED_DB_QUOTA_MESSAGE,
-        CONSOLE_MESSAGE;
-    }
-
-    StringBuilder[] mOutputs = new StringBuilder[OutputType.values().length];
-
-    private StringBuilder getStringBuilderForType(OutputType outputType) {
-        int index = outputType.ordinal();
-        if (mOutputs[index] == null) {
-            mOutputs[index] = new StringBuilder();
-        }
-        return mOutputs[index];
-    }
-
-    public void appendExceededDbQuotaMessage(String urlString, String databaseIdentifier) {
-        StringBuilder output = getStringBuilderForType(OutputType.EXCEEDED_DB_QUOTA_MESSAGE);
-
-        String protocol = "";
-        String host = "";
-        int port = 0;
-
-        try {
-            URL url = new URL(urlString);
-            protocol = url.getProtocol();
-            host = url.getHost();
-            if (url.getPort() > -1) {
-                port = url.getPort();
-            }
-        } catch (MalformedURLException e) {
-            Log.e(LOG_TAG, "urlString=" + urlString + " databaseIdentifier=" + databaseIdentifier,
-                    e);
-        }
-
-        output.append("UI DELEGATE DATABASE CALLBACK: ");
-        output.append("exceededDatabaseQuotaForSecurityOrigin:{");
-        output.append(protocol + ", " + host + ", " + port + "} ");
-        output.append("database:" + databaseIdentifier + "\n");
-    }
-
-    public void appendConsoleMessage(ConsoleMessage consoleMessage) {
-        StringBuilder output = getStringBuilderForType(OutputType.CONSOLE_MESSAGE);
-
-        output.append("CONSOLE MESSAGE: line " + consoleMessage.lineNumber());
-        output.append(": " + consoleMessage.message() + "\n");
-    }
-
-    public void appendJsAlert(String message) {
-        StringBuilder output = getStringBuilderForType(OutputType.JS_DIALOG);
-
-        output.append("ALERT: ");
-        output.append(message);
-        output.append('\n');
-    }
-
-    public void appendJsConfirm(String message) {
-        StringBuilder output = getStringBuilderForType(OutputType.JS_DIALOG);
-
-        output.append("CONFIRM: ");
-        output.append(message);
-        output.append('\n');
-    }
-
-    public void appendJsPrompt(String message, String defaultValue) {
-        StringBuilder output = getStringBuilderForType(OutputType.JS_DIALOG);
-
-        output.append("PROMPT: ");
-        output.append(message);
-        output.append(", default text: ");
-        output.append(defaultValue);
-        output.append('\n');
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder result = new StringBuilder();
-        for (int i = 0; i < mOutputs.length; i++) {
-            if (mOutputs[i] != null) {
-                result.append(mOutputs[i].toString());
-            }
-        }
-        return result.toString();
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/CrashedDummyResult.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/CrashedDummyResult.java
deleted file mode 100644
index 4831168..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/CrashedDummyResult.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.os.Bundle;
-import android.os.Message;
-import android.webkit.WebView;
-
-/**
- * A dummy class representing test that crashed.
- *
- * TODO: All the methods regarding expected results need implementing.
- */
-public class CrashedDummyResult extends AbstractResult {
-    String mRelativePath;
-
-    public CrashedDummyResult(String relativePath) {
-        mRelativePath = relativePath;
-    }
-
-    @Override
-    public byte[] getActualImageResult() {
-        return null;
-    }
-
-    @Override
-    public String getActualTextResult() {
-        return null;
-    }
-
-    @Override
-    public Bundle getBundle() {
-        /** TODO:  */
-        return null;
-    }
-
-    @Override
-    public String getDiffAsHtml() {
-        /** TODO: Probably show at least expected results */
-        return "Ooops, I crashed...";
-    }
-
-    @Override
-    public String getRelativePath() {
-        return mRelativePath;
-    }
-
-    @Override
-    public ResultCode getResultCode() {
-        return ResultCode.NO_ACTUAL_RESULT;
-    }
-
-    @Override
-    public boolean didCrash() {
-        return true;
-    }
-
-    @Override
-    public boolean didTimeOut() {
-        return false;
-    }
-
-    @Override
-    public void setDidTimeOut() {
-        /** This method is not applicable for this type of result */
-        assert false;
-    }
-
-    @Override
-    public TestType getType() {
-        return null;
-    }
-
-    @Override
-    public void obtainActualResults(WebView webview, Message resultObtainedMsg) {
-        /** This method is not applicable for this type of result */
-        assert false;
-    }
-
-    @Override
-    public void setExpectedImageResult(byte[] expectedResult) {
-        /** TODO */
-    }
-
-    @Override
-    public void setExpectedTextResult(String expectedResult) {
-        /** TODO */
-    }
-
-    @Override
-    public String getExpectedImageResultPath() {
-        /** TODO */
-        return null;
-    }
-
-    @Override
-    public String getExpectedTextResultPath() {
-        /** TODO */
-        return null;
-    }
-
-    @Override
-    public void setExpectedImageResultPath(String relativePath) {
-        /** TODO */
-    }
-
-    @Override
-    public void setExpectedTextResultPath(String relativePath) {
-        /** TODO */
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSender.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSender.java
deleted file mode 100644
index 5b7cbc4..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSender.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.webkit.WebView;
-
-/**
- * A class that acts as a JS interface for webview to mock various touch events,
- * mouse actions and key presses.
- *
- * The methods here just call corresponding methods on EventSenderImpl
- * that contains the logic of how to execute the methods.
- */
-public class EventSender {
-    EventSenderImpl mEventSenderImpl = new EventSenderImpl();
-
-    public void reset(WebView webView) {
-        mEventSenderImpl.reset(webView);
-    }
-
-    public void enableDOMUIEventLogging(int domNode) {
-        mEventSenderImpl.enableDOMUIEventLogging(domNode);
-    }
-
-    public void fireKeyboardEventsToElement(int domNode) {
-        mEventSenderImpl.fireKeyboardEventsToElement(domNode);
-    }
-
-    public void keyDown(String character, String[] withModifiers) {
-        mEventSenderImpl.keyDown(character, withModifiers);
-    }
-
-    public void keyDown(String character) {
-        keyDown(character, null);
-    }
-
-    public void leapForward(int milliseconds) {
-        mEventSenderImpl.leapForward(milliseconds);
-    }
-
-    public void mouseClick() {
-        mEventSenderImpl.mouseClick();
-    }
-
-    public void mouseDown() {
-        mEventSenderImpl.mouseDown();
-    }
-
-    public void mouseMoveTo(int x, int y) {
-        mEventSenderImpl.mouseMoveTo(x, y);
-    }
-
-    public void mouseUp() {
-        mEventSenderImpl.mouseUp();
-    }
-
-    public void touchStart() {
-        mEventSenderImpl.touchStart();
-    }
-
-    public void addTouchPoint(int x, int y) {
-        mEventSenderImpl.addTouchPoint(x, y);
-    }
-
-    public void updateTouchPoint(int id, int x, int y) {
-        mEventSenderImpl.updateTouchPoint(id, x, y);
-    }
-
-    public void setTouchModifier(String modifier, boolean enabled) {
-        mEventSenderImpl.setTouchModifier(modifier, enabled);
-    }
-
-    public void touchMove() {
-        mEventSenderImpl.touchMove();
-    }
-
-    public void releaseTouchPoint(int id) {
-        mEventSenderImpl.releaseTouchPoint(id);
-    }
-
-    public void touchEnd() {
-        mEventSenderImpl.touchEnd();
-    }
-
-    public void touchCancel() {
-        mEventSenderImpl.touchCancel();
-    }
-
-    public void clearTouchPoints() {
-        mEventSenderImpl.clearTouchPoints();
-    }
-
-    public void cancelTouchPoint(int id) {
-        mEventSenderImpl.cancelTouchPoint(id);
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSenderImpl.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSenderImpl.java
deleted file mode 100644
index af22039..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/EventSenderImpl.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.webkit.WebView;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * An implementation of EventSender
- */
-public class EventSenderImpl {
-    private static final String LOG_TAG = "EventSenderImpl";
-
-    private static final int MSG_ENABLE_DOM_UI_EVENT_LOGGING = 0;
-    private static final int MSG_FIRE_KEYBOARD_EVENTS_TO_ELEMENT = 1;
-    private static final int MSG_LEAP_FORWARD = 2;
-
-    private static final int MSG_KEY_DOWN = 3;
-
-    private static final int MSG_MOUSE_DOWN = 4;
-    private static final int MSG_MOUSE_UP = 5;
-    private static final int MSG_MOUSE_CLICK = 6;
-    private static final int MSG_MOUSE_MOVE_TO = 7;
-
-    private static final int MSG_ADD_TOUCH_POINT = 8;
-    private static final int MSG_TOUCH_START = 9;
-    private static final int MSG_UPDATE_TOUCH_POINT = 10;
-    private static final int MSG_TOUCH_MOVE = 11;
-    private static final int MSG_CLEAR_TOUCH_POINTS = 12;
-    private static final int MSG_TOUCH_CANCEL = 13;
-    private static final int MSG_RELEASE_TOUCH_POINT = 14;
-    private static final int MSG_TOUCH_END = 15;
-    private static final int MSG_SET_TOUCH_MODIFIER = 16;
-    private static final int MSG_CANCEL_TOUCH_POINT = 17;
-
-    private static class Point {
-        private int mX;
-        private int mY;
-
-        public Point(int x, int y) {
-            mX = x;
-            mY = y;
-        }
-        public int x() {
-            return mX;
-        }
-        public int y() {
-            return mY;
-        }
-    }
-
-    private Point createViewPointFromContentCoordinates(int x, int y) {
-        return new Point(Math.round(x * mWebView.getScale()) - mWebView.getScrollX(),
-                         Math.round(y * mWebView.getScale()) - mWebView.getScrollY());
-    }
-
-    public static class TouchPoint {
-        private int mId;
-        private Point mPoint;
-        private long mDownTime;
-        private boolean mReleased = false;
-        private boolean mMoved = false;
-        private boolean mCancelled = false;
-
-        public TouchPoint(int id, Point point) {
-            mId = id;
-            mPoint = point;
-        }
-
-        public int getId() {
-          return mId;
-        }
-
-        public int getX() {
-            return mPoint.x();
-        }
-
-        public int getY() {
-            return mPoint.y();
-        }
-
-        public boolean hasMoved() {
-            return mMoved;
-        }
-
-        public void move(Point point) {
-            mPoint = point;
-            mMoved = true;
-        }
-
-        public void resetHasMoved() {
-            mMoved = false;
-        }
-
-        public long getDownTime() {
-            return mDownTime;
-        }
-
-        public void setDownTime(long downTime) {
-            mDownTime = downTime;
-        }
-
-        public boolean isReleased() {
-            return mReleased;
-        }
-
-        public void release() {
-            mReleased = true;
-        }
-
-        public boolean isCancelled() {
-            return mCancelled;
-        }
-
-        public void cancel() {
-            mCancelled = true;
-        }
-    }
-
-    private List<TouchPoint> mTouchPoints;
-    private int mTouchMetaState;
-    private Point mMousePoint;
-
-    private WebView mWebView;
-
-    private Handler mEventSenderHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            Bundle bundle;
-            MotionEvent event;
-            long ts;
-
-            switch (msg.what) {
-                case MSG_ENABLE_DOM_UI_EVENT_LOGGING:
-                    /** TODO: implement */
-                    break;
-
-                case MSG_FIRE_KEYBOARD_EVENTS_TO_ELEMENT:
-                    /** TODO: implement */
-                    break;
-
-                case MSG_LEAP_FORWARD:
-                    /** TODO: implement */
-                    break;
-
-                case MSG_KEY_DOWN:
-                    bundle = (Bundle)msg.obj;
-                    String character = bundle.getString("character");
-                    String[] withModifiers = bundle.getStringArray("withModifiers");
-
-                    if (withModifiers != null && withModifiers.length > 0) {
-                        for (int i = 0; i < withModifiers.length; i++) {
-                            executeKeyEvent(KeyEvent.ACTION_DOWN,
-                                    modifierToKeyCode(withModifiers[i]));
-                        }
-                    }
-                    executeKeyEvent(KeyEvent.ACTION_DOWN,
-                            charToKeyCode(character.toLowerCase().toCharArray()[0]));
-                    break;
-
-                /** MOUSE */
-
-                case MSG_MOUSE_DOWN:
-                    if (mMousePoint != null) {
-                        ts = SystemClock.uptimeMillis();
-                        event = MotionEvent.obtain(ts, ts, MotionEvent.ACTION_DOWN, mMousePoint.x(), mMousePoint.y(), 0);
-                        mWebView.onTouchEvent(event);
-                    }
-                    break;
-
-                case MSG_MOUSE_UP:
-                    if (mMousePoint != null) {
-                        ts = SystemClock.uptimeMillis();
-                        event = MotionEvent.obtain(ts, ts, MotionEvent.ACTION_UP, mMousePoint.x(), mMousePoint.y(), 0);
-                        mWebView.onTouchEvent(event);
-                    }
-                    break;
-
-                case MSG_MOUSE_CLICK:
-                    mouseDown();
-                    mouseUp();
-                    break;
-
-                case MSG_MOUSE_MOVE_TO:
-                    mMousePoint = createViewPointFromContentCoordinates(msg.arg1, msg.arg2);
-                    break;
-
-                /** TOUCH */
-
-                case MSG_ADD_TOUCH_POINT:
-                    int numPoints = getTouchPoints().size();
-                    int id;
-                    if (numPoints == 0) {
-                        id = 0;
-                    } else {
-                        id = getTouchPoints().get(numPoints - 1).getId() + 1;
-                    }
-                    getTouchPoints().add(
-                            new TouchPoint(id, createViewPointFromContentCoordinates(msg.arg1, msg.arg2)));
-                    break;
-
-                case MSG_TOUCH_START:
-                    if (getTouchPoints().isEmpty()) {
-                        return;
-                    }
-                    for (int i = 0; i < getTouchPoints().size(); ++i) {
-                        getTouchPoints().get(i).setDownTime(SystemClock.uptimeMillis());
-                    }
-                    executeTouchEvent(MotionEvent.ACTION_DOWN);
-                    break;
-
-                case MSG_UPDATE_TOUCH_POINT:
-                    bundle = (Bundle)msg.obj;
-
-                    int index = bundle.getInt("id");
-                    if (index >= getTouchPoints().size()) {
-                        Log.w(LOG_TAG + "::MSG_UPDATE_TOUCH_POINT", "TouchPoint out of bounds: "
-                                + index);
-                        break;
-                    }
-
-                    getTouchPoints().get(index).move(
-                            createViewPointFromContentCoordinates(bundle.getInt("x"), bundle.getInt("y")));
-                    break;
-
-                case MSG_TOUCH_MOVE:
-                    /**
-                     * FIXME: At the moment we don't support multi-touch. Hence, we only examine
-                     * the first touch point. In future this method will need rewriting.
-                     */
-                    if (getTouchPoints().isEmpty()) {
-                        return;
-                    }
-                    executeTouchEvent(MotionEvent.ACTION_MOVE);
-                    for (int i = 0; i < getTouchPoints().size(); ++i) {
-                        getTouchPoints().get(i).resetHasMoved();
-                    }
-                    break;
-
-                case MSG_CANCEL_TOUCH_POINT:
-                    if (msg.arg1 >= getTouchPoints().size()) {
-                        Log.w(LOG_TAG + "::MSG_RELEASE_TOUCH_POINT", "TouchPoint out of bounds: "
-                                + msg.arg1);
-                        break;
-                    }
-
-                    getTouchPoints().get(msg.arg1).cancel();
-                    break;
-
-                case MSG_TOUCH_CANCEL:
-                    /**
-                     * FIXME: At the moment we don't support multi-touch. Hence, we only examine
-                     * the first touch point. In future this method will need rewriting.
-                     */
-                    if (getTouchPoints().isEmpty()) {
-                        return;
-                    }
-                    executeTouchEvent(MotionEvent.ACTION_CANCEL);
-                    break;
-
-                case MSG_RELEASE_TOUCH_POINT:
-                    if (msg.arg1 >= getTouchPoints().size()) {
-                        Log.w(LOG_TAG + "::MSG_RELEASE_TOUCH_POINT", "TouchPoint out of bounds: "
-                                + msg.arg1);
-                        break;
-                    }
-
-                    getTouchPoints().get(msg.arg1).release();
-                    break;
-
-                case MSG_TOUCH_END:
-                    /**
-                     * FIXME: At the moment we don't support multi-touch. Hence, we only examine
-                     * the first touch point. In future this method will need rewriting.
-                     */
-                    if (getTouchPoints().isEmpty()) {
-                        return;
-                    }
-                    executeTouchEvent(MotionEvent.ACTION_UP);
-                    // remove released points.
-                    for (int i = getTouchPoints().size() - 1; i >= 0; --i) {
-                        if (getTouchPoints().get(i).isReleased()) {
-                            getTouchPoints().remove(i);
-                        }
-                    }
-                    break;
-
-                case MSG_SET_TOUCH_MODIFIER:
-                    bundle = (Bundle)msg.obj;
-                    String modifier = bundle.getString("modifier");
-                    boolean enabled = bundle.getBoolean("enabled");
-
-                    int mask = 0;
-                    if ("alt".equals(modifier.toLowerCase())) {
-                        mask = KeyEvent.META_ALT_ON;
-                    } else if ("shift".equals(modifier.toLowerCase())) {
-                        mask = KeyEvent.META_SHIFT_ON;
-                    } else if ("ctrl".equals(modifier.toLowerCase())) {
-                        mask = KeyEvent.META_SYM_ON;
-                    }
-
-                    if (enabled) {
-                        mTouchMetaState |= mask;
-                    } else {
-                        mTouchMetaState &= ~mask;
-                    }
-
-                    break;
-
-                case MSG_CLEAR_TOUCH_POINTS:
-                    getTouchPoints().clear();
-                    break;
-
-                default:
-                    break;
-            }
-        }
-    };
-
-    public void reset(WebView webView) {
-        mWebView = webView;
-        mTouchPoints = null;
-        mTouchMetaState = 0;
-        mMousePoint = null;
-    }
-
-    public void enableDOMUIEventLogging(int domNode) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_ENABLE_DOM_UI_EVENT_LOGGING);
-        msg.arg1 = domNode;
-        msg.sendToTarget();
-    }
-
-    public void fireKeyboardEventsToElement(int domNode) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_FIRE_KEYBOARD_EVENTS_TO_ELEMENT);
-        msg.arg1 = domNode;
-        msg.sendToTarget();
-    }
-
-    public void leapForward(int milliseconds) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_LEAP_FORWARD);
-        msg.arg1 = milliseconds;
-        msg.sendToTarget();
-    }
-
-    public void keyDown(String character, String[] withModifiers) {
-        Bundle bundle = new Bundle();
-        bundle.putString("character", character);
-        bundle.putStringArray("withModifiers", withModifiers);
-        mEventSenderHandler.obtainMessage(MSG_KEY_DOWN, bundle).sendToTarget();
-    }
-
-    /** MOUSE */
-
-    public void mouseDown() {
-        mEventSenderHandler.sendEmptyMessage(MSG_MOUSE_DOWN);
-    }
-
-    public void mouseUp() {
-        mEventSenderHandler.sendEmptyMessage(MSG_MOUSE_UP);
-    }
-
-    public void mouseClick() {
-        mEventSenderHandler.sendEmptyMessage(MSG_MOUSE_CLICK);
-    }
-
-    public void mouseMoveTo(int x, int y) {
-        mEventSenderHandler.obtainMessage(MSG_MOUSE_MOVE_TO, x, y).sendToTarget();
-    }
-
-    /** TOUCH */
-
-    public void addTouchPoint(int x, int y) {
-        mEventSenderHandler.obtainMessage(MSG_ADD_TOUCH_POINT, x, y).sendToTarget();
-    }
-
-    public void touchStart() {
-        mEventSenderHandler.sendEmptyMessage(MSG_TOUCH_START);
-    }
-
-    public void updateTouchPoint(int id, int x, int y) {
-        Bundle bundle = new Bundle();
-        bundle.putInt("id", id);
-        bundle.putInt("x", x);
-        bundle.putInt("y", y);
-        mEventSenderHandler.obtainMessage(MSG_UPDATE_TOUCH_POINT, bundle).sendToTarget();
-    }
-
-    public void touchMove() {
-        mEventSenderHandler.sendEmptyMessage(MSG_TOUCH_MOVE);
-    }
-
-    public void cancelTouchPoint(int id) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_CANCEL_TOUCH_POINT);
-        msg.arg1 = id;
-        msg.sendToTarget();
-    }
-
-    public void touchCancel() {
-        mEventSenderHandler.sendEmptyMessage(MSG_TOUCH_CANCEL);
-    }
-
-    public void releaseTouchPoint(int id) {
-        Message msg = mEventSenderHandler.obtainMessage(MSG_RELEASE_TOUCH_POINT);
-        msg.arg1 = id;
-        msg.sendToTarget();
-    }
-
-    public void touchEnd() {
-        mEventSenderHandler.sendEmptyMessage(MSG_TOUCH_END);
-    }
-
-    public void setTouchModifier(String modifier, boolean enabled) {
-        Bundle bundle = new Bundle();
-        bundle.putString("modifier", modifier);
-        bundle.putBoolean("enabled", enabled);
-        mEventSenderHandler.obtainMessage(MSG_SET_TOUCH_MODIFIER, bundle).sendToTarget();
-    }
-
-    public void clearTouchPoints() {
-        mEventSenderHandler.sendEmptyMessage(MSG_CLEAR_TOUCH_POINTS);
-    }
-
-    private List<TouchPoint> getTouchPoints() {
-        if (mTouchPoints == null) {
-            mTouchPoints = new LinkedList<TouchPoint>();
-        }
-
-        return mTouchPoints;
-    }
-
-    private void executeTouchEvent(int action) {
-        int numPoints = getTouchPoints().size();
-        int[] pointerIds = new int[numPoints];
-        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[numPoints];
-
-        for (int i = 0; i < numPoints; ++i) {
-            boolean isNeeded = false;
-            switch(action) {
-            case MotionEvent.ACTION_DOWN:
-            case MotionEvent.ACTION_UP:
-                isNeeded = true;
-                break;
-            case MotionEvent.ACTION_MOVE:
-                isNeeded = getTouchPoints().get(i).hasMoved();
-                break;
-            case MotionEvent.ACTION_CANCEL:
-                isNeeded = getTouchPoints().get(i).isCancelled();
-                break;
-            default:
-                Log.w(LOG_TAG + "::executeTouchEvent(),", "action not supported:" + action);
-                break;
-            }
-
-            numPoints = 0;
-            if (isNeeded) {
-                pointerIds[numPoints] = getTouchPoints().get(i).getId();
-                pointerCoords[numPoints] = new MotionEvent.PointerCoords();
-                pointerCoords[numPoints].x = getTouchPoints().get(i).getX();
-                pointerCoords[numPoints].y = getTouchPoints().get(i).getY();
-                ++numPoints;
-            }
-        }
-
-        if (numPoints == 0) {
-            return;
-        }
-
-        MotionEvent event = MotionEvent.obtain(mTouchPoints.get(0).getDownTime(),
-                SystemClock.uptimeMillis(), action,
-                numPoints, pointerIds, pointerCoords,
-                mTouchMetaState, 1.0f, 1.0f, 0, 0, 0, 0);
-
-        mWebView.onTouchEvent(event);
-    }
-
-    private void executeKeyEvent(int action, int keyCode) {
-        KeyEvent event = new KeyEvent(action, keyCode);
-        mWebView.onKeyDown(event.getKeyCode(), event);
-    }
-
-    /**
-     * Assumes lowercase chars, case needs to be handled by calling function.
-     */
-    private static int charToKeyCode(char c) {
-        // handle numbers
-        if (c >= '0' && c <= '9') {
-            int offset = c - '0';
-            return KeyEvent.KEYCODE_0 + offset;
-        }
-
-        // handle characters
-        if (c >= 'a' && c <= 'z') {
-            int offset = c - 'a';
-            return KeyEvent.KEYCODE_A + offset;
-        }
-
-        // handle all others
-        switch (c) {
-            case '*':
-                return KeyEvent.KEYCODE_STAR;
-
-            case '#':
-                return KeyEvent.KEYCODE_POUND;
-
-            case ',':
-                return KeyEvent.KEYCODE_COMMA;
-
-            case '.':
-                return KeyEvent.KEYCODE_PERIOD;
-
-            case '\t':
-                return KeyEvent.KEYCODE_TAB;
-
-            case ' ':
-                return KeyEvent.KEYCODE_SPACE;
-
-            case '\n':
-                return KeyEvent.KEYCODE_ENTER;
-
-            case '\b':
-            case 0x7F:
-                return KeyEvent.KEYCODE_DEL;
-
-            case '~':
-                return KeyEvent.KEYCODE_GRAVE;
-
-            case '-':
-                return KeyEvent.KEYCODE_MINUS;
-
-            case '=':
-                return KeyEvent.KEYCODE_EQUALS;
-
-            case '(':
-                return KeyEvent.KEYCODE_LEFT_BRACKET;
-
-            case ')':
-                return KeyEvent.KEYCODE_RIGHT_BRACKET;
-
-            case '\\':
-                return KeyEvent.KEYCODE_BACKSLASH;
-
-            case ';':
-                return KeyEvent.KEYCODE_SEMICOLON;
-
-            case '\'':
-                return KeyEvent.KEYCODE_APOSTROPHE;
-
-            case '/':
-                return KeyEvent.KEYCODE_SLASH;
-
-            default:
-                return c;
-        }
-    }
-
-    private static int modifierToKeyCode(String modifier) {
-        if (modifier.equals("ctrlKey")) {
-            return KeyEvent.KEYCODE_ALT_LEFT;
-        } else if (modifier.equals("shiftKey")) {
-            return KeyEvent.KEYCODE_SHIFT_LEFT;
-        } else if (modifier.equals("altKey")) {
-            return KeyEvent.KEYCODE_SYM;
-        }
-
-        return KeyEvent.KEYCODE_UNKNOWN;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java
deleted file mode 100644
index 5360e3d..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FileFilter.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.util.Log;
-
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A utility to filter out some files/directories from the views and tests that run.
- */
-public class FileFilter {
-    private static final String LOG_TAG = "FileFilter";
-
-    private static final String TEST_EXPECTATIONS_TXT_PATH =
-            "platform/android/test_expectations.txt";
-
-    private static final String HTTP_TESTS_PATH = "http/tests/";
-    private static final String SSL_PATH = "ssl/";
-
-    private static final String TOKEN_CRASH = "CRASH";
-    private static final String TOKEN_FAIL = "FAIL";
-    private static final String TOKEN_SLOW = "SLOW";
-
-    private final Set<String> mCrashList = new HashSet<String>();
-    private final Set<String> mFailList = new HashSet<String>();
-    private final Set<String> mSlowList = new HashSet<String>();
-
-    public FileFilter() {
-        loadTestExpectations();
-    }
-
-    private static final String trimTrailingSlashIfPresent(String path) {
-        File file = new File(path);
-        return file.getPath();
-    }
-
-    public void loadTestExpectations() {
-        URL url = null;
-        try {
-            url = new URL(ForwarderManager.getHostSchemePort(false) +
-                    "LayoutTests/" + TEST_EXPECTATIONS_TXT_PATH);
-        } catch (MalformedURLException e) {
-            assert false;
-        }
-
-        try {
-            InputStream inputStream = null;
-            BufferedReader bufferedReader = null;
-            try {
-                byte[] httpAnswer = FsUtils.readDataFromUrl(url);
-                if (httpAnswer == null) {
-                    Log.w(LOG_TAG, "loadTestExpectations(): File not found: " +
-                            TEST_EXPECTATIONS_TXT_PATH);
-                    return;
-                }
-                bufferedReader = new BufferedReader(new StringReader(
-                        new String(httpAnswer)));
-                String line;
-                String entry;
-                String[] parts;
-                String path;
-                Set<String> tokens;
-                while (true) {
-                    line = bufferedReader.readLine();
-                    if (line == null) {
-                        break;
-                    }
-
-                    /** Remove the comment and trim */
-                    entry = line.split("//", 2)[0].trim();
-
-                    /** Omit empty lines, advance to next line */
-                    if (entry.isEmpty()) {
-                        continue;
-                    }
-
-                    /** Split on whitespace into path part and the rest */
-                    parts = entry.split("\\s", 2);
-
-                    /** At this point parts.length >= 1 */
-                    if (parts.length == 1) {
-                        Log.w(LOG_TAG + "::reloadConfiguration",
-                                "There are no options specified for the test!");
-                        continue;
-                    }
-
-                    path = trimTrailingSlashIfPresent(parts[0]);
-
-                    /** Split on whitespace */
-                    tokens = new HashSet<String>(Arrays.asList(
-                            parts[1].split("\\s", 0)));
-
-                    /** Chose the right collections to add to */
-                    if (tokens.contains(TOKEN_CRASH)) {
-                        mCrashList.add(path);
-
-                        /** If test is on skip list we ignore any further options */
-                        continue;
-                    }
-
-                    if (tokens.contains(TOKEN_FAIL)) {
-                        mFailList.add(path);
-                    }
-                    if (tokens.contains(TOKEN_SLOW)) {
-                        mSlowList.add(path);
-                    }
-                }
-            } finally {
-                if (inputStream != null) {
-                    inputStream.close();
-                }
-                if (bufferedReader != null) {
-                    bufferedReader.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "url=" + url, e);
-        }
-    }
-
-    /**
-     * Checks if test is expected to crash.
-     *
-     * <p>
-     * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html
-     *
-     * @param testPath
-     *            - a relative path within LayoutTests folder
-     * @return if the test is supposed to be skipped
-     */
-    public boolean isCrash(String testPath) {
-        for (String prefix : getPrefixes(testPath)) {
-            if (mCrashList.contains(prefix)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks if test result is supposed to be "failed".
-     *
-     * <p>
-     * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html
-     *
-     * @param testPath
-     *            - a relative path within LayoutTests folder
-     * @return if the test result is supposed to be "failed"
-     */
-    public boolean isFail(String testPath) {
-        for (String prefix : getPrefixes(testPath)) {
-            if (mFailList.contains(prefix)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks if test is slow and should have timeout increased.
-     *
-     * <p>
-     * Path given should relative within LayoutTests folder, e.g. fast/dom/foo.html
-     *
-     * @param testPath
-     *            - a relative path within LayoutTests folder
-     * @return if the test is slow and should have timeout increased.
-     */
-    public boolean isSlow(String testPath) {
-        for (String prefix : getPrefixes(testPath)) {
-            if (mSlowList.contains(prefix)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the list of all path prefixes of the given path.
-     *
-     * <p>
-     * e.g. this/is/a/path returns the list: this this/is this/is/a this/is/a/path
-     *
-     * @param path
-     * @return the list of all path prefixes of the given path.
-     */
-    private static List<String> getPrefixes(String path) {
-        File file = new File(path);
-        List<String> prefixes = new ArrayList<String>(8);
-
-        do {
-            prefixes.add(file.getPath());
-            file = file.getParentFile();
-        } while (file != null);
-
-        return prefixes;
-    }
-
-    /**
-     * Checks if the directory may contain tests or contains just helper files.
-     *
-     * @param dirName
-     * @return
-     *      if the directory may contain tests
-     */
-    public static boolean isTestDir(String dirName) {
-        return (!dirName.equals("script-tests")
-                && !dirName.equals("resources") && !dirName.startsWith("."));
-    }
-
-    /**
-     * Checks if the file is a test.
-     * Currently we run .html, .xhtml and .php tests.
-     *
-     * @warning You MUST also call isTestDir() on the parent directory before
-     * assuming that a file is a test.
-     *
-     * @param testName
-     * @return if the file is a test
-     */
-    public static boolean isTestFile(String testName) {
-        return testName.endsWith(".html")
-            || testName.endsWith(".xhtml")
-            || testName.endsWith(".php");
-    }
-
-    /**
-     * Return a URL of the test on the server.
-     *
-     * @param relativePath
-     * @param allowHttps Whether to allow the use of HTTPS, even if the file is in the SSL
-     *     directory.
-     * @return a URL of the test on the server
-     */
-    public static URL getUrl(String relativePath, boolean allowHttps) {
-        String urlBase = ForwarderManager.getHostSchemePort(false);
-
-        /**
-         * URL is formed differently for HTTP vs non-HTTP tests, because HTTP tests
-         * expect different document root. See run_apache2.py and .conf file for details
-         */
-        if (relativePath.startsWith(HTTP_TESTS_PATH)) {
-            relativePath = relativePath.substring(HTTP_TESTS_PATH.length());
-            if (relativePath.startsWith(SSL_PATH) && allowHttps) {
-                urlBase = ForwarderManager.getHostSchemePort(true);
-            }
-        } else {
-            relativePath = "LayoutTests/" + relativePath;
-        }
-
-        try {
-            return new URL(urlBase + relativePath);
-        } catch (MalformedURLException e) {
-            Log.e(LOG_TAG, "Malformed URL!", e);
-        }
-
-        return null;
-    }
-
-    /**
-     * If the path contains extension (e.g .foo at the end of the file) then it changes
-     * this (.foo) into newEnding (so it has to contain the dot if we want to preserve it).
-     *
-     * <p>If the path doesn't contain an extension, it adds the ending to the path.
-     *
-     * @param relativePath
-     * @param newEnding
-     * @return
-     *      a new path, containing the newExtension
-     */
-    public static String setPathEnding(String relativePath, String newEnding) {
-        int dotPos = relativePath.lastIndexOf('.');
-        if (dotPos == -1) {
-            return relativePath + newEnding;
-        }
-
-        return relativePath.substring(0, dotPos) + newEnding;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
deleted file mode 100644
index 54cbfda..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.util.Log;
-
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.conn.scheme.PlainSocketFactory;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.conn.ssl.SSLSocketFactory;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.util.EntityUtils;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- *
- */
-public class FsUtils {
-    public static final String LOG_TAG = "FsUtils";
-
-    private static final String SCRIPT_URL = ForwarderManager.getHostSchemePort(false) +
-            "Tools/DumpRenderTree/android/get_layout_tests_dir_contents.php";
-
-    private static final int HTTP_TIMEOUT_MS = 5000;
-
-    private static HttpClient sHttpClient;
-
-    private static HttpClient getHttpClient() {
-        if (sHttpClient == null) {
-            HttpParams params = new BasicHttpParams();
-
-            SchemeRegistry schemeRegistry = new SchemeRegistry();
-            schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(),
-                    ForwarderManager.HTTP_PORT));
-            schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(),
-                    ForwarderManager.HTTPS_PORT));
-
-            ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params,
-                    schemeRegistry);
-            sHttpClient = new DefaultHttpClient(connectionManager, params);
-            HttpConnectionParams.setSoTimeout(sHttpClient.getParams(), HTTP_TIMEOUT_MS);
-            HttpConnectionParams.setConnectionTimeout(sHttpClient.getParams(), HTTP_TIMEOUT_MS);
-        }
-        return sHttpClient;
-    }
-
-    public static void writeDataToStorage(File file, byte[] bytes, boolean append) {
-        Log.d(LOG_TAG, "writeDataToStorage(): " + file.getAbsolutePath());
-        try {
-            OutputStream outputStream = null;
-            try {
-                file.getParentFile().mkdirs();
-                file.createNewFile();
-                Log.d(LOG_TAG, "writeDataToStorage(): File created: " + file.getAbsolutePath());
-                outputStream = new FileOutputStream(file, append);
-                outputStream.write(bytes);
-            } finally {
-                if (outputStream != null) {
-                    outputStream.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "file.getAbsolutePath=" + file.getAbsolutePath() + " append=" + append,
-                    e);
-        }
-    }
-
-    public static byte[] readDataFromStorage(File file) {
-        if (!file.exists()) {
-            Log.d(LOG_TAG, "readDataFromStorage(): File does not exist: "
-                    + file.getAbsolutePath());
-            return null;
-        }
-
-        byte[] bytes = null;
-        try {
-            FileInputStream fis = null;
-            try {
-                fis = new FileInputStream(file);
-                bytes = new byte[(int)file.length()];
-                fis.read(bytes);
-            } finally {
-                if (fis != null) {
-                    fis.close();
-                }
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "file.getAbsolutePath=" + file.getAbsolutePath(), e);
-        }
-
-        return bytes;
-    }
-
-    static class UrlDataGetter extends Thread {
-        private URL mUrl;
-        private byte[] mBytes;
-        private boolean mGetComplete;
-        public UrlDataGetter(URL url) {
-            mUrl = url;
-        }
-        public byte[] get() {
-            start();
-            synchronized(this) {
-                while (!mGetComplete) {
-                    try{
-                        wait();
-                    } catch(InterruptedException e) {
-                    }
-                }
-            }
-            return mBytes;
-        }
-        public synchronized void run() {
-            mGetComplete = false;
-            HttpGet httpRequest = new HttpGet(mUrl.toString());
-            ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {
-                @Override
-                public byte[] handleResponse(HttpResponse response) throws IOException {
-                    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
-                        return null;
-                    }
-                    HttpEntity entity = response.getEntity();
-                    return (entity == null ? null : EntityUtils.toByteArray(entity));
-                }
-            };
-
-            mBytes = null;
-            try {
-                /**
-                 * TODO: Not exactly sure why some requests hang indefinitely, but adding this
-                 * timeout (in static getter for http client) in loop helps.
-                 */
-                boolean timedOut;
-                do {
-                    timedOut = false;
-                    try {
-                        mBytes = getHttpClient().execute(httpRequest, handler);
-                    } catch (SocketTimeoutException e) {
-                        timedOut = true;
-                        Log.w(LOG_TAG, "Expected SocketTimeoutException: " + mUrl, e);
-                    }
-                } while (timedOut);
-            } catch (IOException e) {
-                Log.e(LOG_TAG, "url=" + mUrl, e);
-            }
-
-            mGetComplete = true;
-            notify();
-        }
-    }
-
-    public static byte[] readDataFromUrl(URL url) {
-        if (url == null) {
-            Log.w(LOG_TAG, "readDataFromUrl(): url is null!");
-            return null;
-        }
-
-        UrlDataGetter getter = new UrlDataGetter(url);
-        return getter.get();
-    }
-
-    public static List<String> getLayoutTestsDirContents(String dirRelativePath, boolean recurse,
-            boolean mode) {
-        String modeString = (mode ? "folders" : "files");
-
-        URL url = null;
-        try {
-            url = new URL(SCRIPT_URL +
-                    "?path=" + dirRelativePath +
-                    "&recurse=" + recurse +
-                    "&mode=" + modeString);
-        } catch (MalformedURLException e) {
-            Log.e(LOG_TAG, "path=" + dirRelativePath + " recurse=" + recurse + " mode=" +
-                    modeString, e);
-            return new LinkedList<String>();
-        }
-
-        HttpGet httpRequest = new HttpGet(url.toString());
-        ResponseHandler<LinkedList<String>> handler = new ResponseHandler<LinkedList<String>>() {
-            @Override
-            public LinkedList<String> handleResponse(HttpResponse response)
-                    throws IOException {
-                LinkedList<String> lines = new LinkedList<String>();
-
-                if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
-                    return lines;
-                }
-                HttpEntity entity = response.getEntity();
-                if (entity == null) {
-                    return lines;
-                }
-
-                BufferedReader reader =
-                        new BufferedReader(new InputStreamReader(entity.getContent()));
-                String line;
-                try {
-                    while ((line = reader.readLine()) != null) {
-                        lines.add(line);
-                    }
-                } finally {
-                    if (reader != null) {
-                        reader.close();
-                    }
-                }
-
-                return lines;
-            }
-        };
-
-        try {
-            return getHttpClient().execute(httpRequest, handler);
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "getLayoutTestsDirContents(): HTTP GET failed for URL " + url);
-            return null;
-        }
-    }
-
-    public static void closeInputStream(InputStream inputStream) {
-        try {
-            if (inputStream != null) {
-                inputStream.close();
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Couldn't close stream!", e);
-        }
-    }
-
-    public static void closeOutputStream(OutputStream outputStream) {
-        try {
-            if (outputStream != null) {
-                outputStream.close();
-            }
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Couldn't close stream!", e);
-        }
-    }
-
-    public static List<String> loadTestListFromStorage(String path) {
-        List<String> list = new ArrayList<String>();
-        if (path != null && !path.isEmpty()) {
-            try {
-                File file = new File(path);
-                Log.d(LOG_TAG, "test list loaded from " + path);
-                BufferedReader reader = new BufferedReader(new FileReader(file));
-                String line = null;
-                while ((line = reader.readLine()) != null) {
-                    list.add(line);
-                }
-                reader.close();
-            } catch (IOException ioe) {
-                Log.e(LOG_TAG, "failed to load test list", ioe);
-            }
-        }
-        return list;
-    }
-
-    public static void saveTestListToStorage(File file, int start, List<String> testList) {
-        try {
-            BufferedWriter writer = new BufferedWriter(
-                    new FileWriter(file));
-            for (String line : testList.subList(start, testList.size())) {
-                writer.write(line + '\n');
-            }
-            writer.flush();
-            writer.close();
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "failed to write test list", e);
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestController.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestController.java
deleted file mode 100644
index c9c35ce..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestController.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.net.Uri;
-import android.util.Log;
-import android.webkit.MockGeolocation;
-import android.webkit.WebStorage;
-
-import java.io.File;
-
-/**
- * A class that is registered as JS interface for webview in LayoutTestExecutor
- */
-public class LayoutTestController {
-    private static final String LOG_TAG = "LayoutTestController";
-
-    LayoutTestsExecutor mLayoutTestsExecutor;
-
-    public LayoutTestController(LayoutTestsExecutor layoutTestsExecutor) {
-        mLayoutTestsExecutor = layoutTestsExecutor;
-    }
-
-    public void clearAllDatabases() {
-        Log.i(LOG_TAG, "clearAllDatabases() called");
-        WebStorage.getInstance().deleteAllData();
-    }
-
-    public void dumpAsText() {
-        dumpAsText(false);
-    }
-
-    public void dumpAsText(boolean enablePixelTest) {
-        mLayoutTestsExecutor.dumpAsText(enablePixelTest);
-    }
-
-    public void dumpChildFramesAsText() {
-        mLayoutTestsExecutor.dumpChildFramesAsText();
-    }
-
-    public void dumpDatabaseCallbacks() {
-        mLayoutTestsExecutor.dumpDatabaseCallbacks();
-    }
-
-    public void notifyDone() {
-        mLayoutTestsExecutor.notifyDone();
-    }
-
-    public void overridePreference(String key, boolean value) {
-        mLayoutTestsExecutor.overridePreference(key, value);
-    }
-
-    public void setAppCacheMaximumSize(long size) {
-        Log.i(LOG_TAG, "setAppCacheMaximumSize() called with: " + size);
-        android.webkit.WebStorageClassic.getInstance().setAppCacheMaximumSize(size);
-    }
-
-    public void setCanOpenWindows() {
-        mLayoutTestsExecutor.setCanOpenWindows();
-    }
-
-    public void setDatabaseQuota(long quota) {
-        /** TODO: Reset this before every test! */
-        Log.i(LOG_TAG, "setDatabaseQuota() called with: " + quota);
-        WebStorage.getInstance().setQuotaForOrigin(Uri.fromFile(new File("")).toString(),
-                quota);
-    }
-
-    public void setMockGeolocationPosition(double latitude, double longitude, double accuracy) {
-        Log.i(LOG_TAG, "setMockGeolocationPosition(): " + "latitude=" + latitude +
-                " longitude=" + longitude + " accuracy=" + accuracy);
-        mLayoutTestsExecutor.setMockGeolocationPosition(latitude, longitude, accuracy);
-    }
-
-    public void setMockGeolocationError(int code, String message) {
-        Log.i(LOG_TAG, "setMockGeolocationError(): " + "code=" + code + " message=" + message);
-        mLayoutTestsExecutor.setMockGeolocationError(code, message);
-    }
-
-    public void setGeolocationPermission(boolean allow) {
-        mLayoutTestsExecutor.setGeolocationPermission(allow);
-    }
-
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma) {
-        // Configuration is in WebKit, so stay on WebCore thread, but go via LayoutTestsExecutor
-        // as we need access to the Webview.
-        Log.i(LOG_TAG, "setMockDeviceOrientation(" + canProvideAlpha +
-                ", " + alpha + ", " + canProvideBeta + ", " + beta + ", " + canProvideGamma +
-                ", " + gamma + ")");
-        mLayoutTestsExecutor.setMockDeviceOrientation(
-                canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma);
-    }
-
-    public void setXSSAuditorEnabled(boolean flag) {
-        mLayoutTestsExecutor.setXSSAuditorEnabled(flag);
-    }
-
-    public void waitUntilDone() {
-        mLayoutTestsExecutor.waitUntilDone();
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
deleted file mode 100644
index 25ac700..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
+++ /dev/null
@@ -1,732 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.net.http.SslError;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.os.Process;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.Window;
-import android.webkit.ConsoleMessage;
-import android.webkit.GeolocationPermissions;
-import android.webkit.HttpAuthHandler;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebChromeClient;
-import android.webkit.WebSettings;
-import android.webkit.WebSettingsClassic;
-import android.webkit.WebStorage;
-import android.webkit.WebStorage.QuotaUpdater;
-import android.webkit.WebView;
-import android.webkit.WebViewClassic;
-import android.webkit.WebViewClient;
-
-import java.lang.Thread.UncaughtExceptionHandler;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This activity executes the test. It contains WebView and logic of LayoutTestController
- * functions. It runs in a separate process and sends the results of running the test
- * to ManagerService. The reason why is to handle crashing (test that crashes brings down
- * whole process with it).
- */
-public class LayoutTestsExecutor extends Activity {
-
-    private enum CurrentState {
-        IDLE,
-        RENDERING_PAGE,
-        WAITING_FOR_ASYNCHRONOUS_TEST,
-        OBTAINING_RESULT;
-
-        public boolean isRunningState() {
-            return this == CurrentState.RENDERING_PAGE ||
-                    this == CurrentState.WAITING_FOR_ASYNCHRONOUS_TEST;
-        }
-    }
-
-    private static final String LOG_TAG = "LayoutTestsExecutor";
-
-    public static final String EXTRA_TESTS_FILE = "TestsList";
-    public static final String EXTRA_TEST_INDEX = "TestIndex";
-
-    private static final int MSG_ACTUAL_RESULT_OBTAINED = 0;
-    private static final int MSG_TEST_TIMED_OUT = 1;
-
-    private static final int DEFAULT_TIME_OUT_MS = 15 * 1000;
-
-    /** A list of tests that remain to run since last crash */
-    private List<String> mTestsList;
-
-    /**
-     * This is a number of currently running test. It is 0-based and doesn't reset after
-     * the crash. Initial index is passed to LayoutTestsExecuter in the intent that starts
-     * it.
-     */
-    private int mCurrentTestIndex;
-
-    /** The total number of tests to run, doesn't reset after crash */
-    private int mTotalTestCount;
-
-    private WebView mCurrentWebView;
-    private String mCurrentTestRelativePath;
-    private String mCurrentTestUri;
-    private CurrentState mCurrentState = CurrentState.IDLE;
-
-    private boolean mCurrentTestTimedOut;
-    private AbstractResult mCurrentResult;
-    private AdditionalTextOutput mCurrentAdditionalTextOutput;
-
-    private LayoutTestController mLayoutTestController = new LayoutTestController(this);
-    private boolean mCanOpenWindows;
-    private boolean mDumpDatabaseCallbacks;
-
-    private EventSender mEventSender = new EventSender();
-
-    private WakeLock mScreenDimLock;
-
-    /** COMMUNICATION WITH ManagerService */
-
-    private Messenger mManagerServiceMessenger;
-
-    private ServiceConnection mServiceConnection = new ServiceConnection() {
-
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            mManagerServiceMessenger = new Messenger(service);
-            startTests();
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            /** TODO */
-        }
-    };
-
-    private final Handler mResultHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_ACTUAL_RESULT_OBTAINED:
-                    onActualResultsObtained();
-                    break;
-
-                case MSG_TEST_TIMED_OUT:
-                    onTestTimedOut();
-                    break;
-
-                default:
-                    break;
-            }
-        }
-    };
-
-    /** WEBVIEW CONFIGURATION */
-
-    private WebViewClient mWebViewClient = new WebViewClient() {
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            /** Some tests fire up many page loads, we don't want to detect them */
-            if (!url.equals(mCurrentTestUri)) {
-                return;
-            }
-
-            if (mCurrentState == CurrentState.RENDERING_PAGE) {
-                onTestFinished();
-            }
-        }
-
-         @Override
-         public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler,
-                 String host, String realm) {
-             if (handler.useHttpAuthUsernamePassword() && view != null) {
-                 String[] credentials = view.getHttpAuthUsernamePassword(host, realm);
-                 if (credentials != null && credentials.length == 2) {
-                     handler.proceed(credentials[0], credentials[1]);
-                     return;
-                 }
-             }
-             handler.cancel();
-         }
-
-         @Override
-         public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
-             // We ignore SSL errors. In particular, the certificate used by the LayoutTests server
-             // produces an error as it lacks a CN field.
-             handler.proceed();
-         }
-    };
-
-    private WebChromeClient mWebChromeClient = new WebChromeClient() {
-        @Override
-        public void onExceededDatabaseQuota(String url, String databaseIdentifier,
-                long currentQuota, long estimatedSize, long totalUsedQuota,
-                QuotaUpdater quotaUpdater) {
-            /** TODO: This should be recorded as part of the text result */
-            /** TODO: The quota should also probably be reset somehow for every test? */
-            if (mDumpDatabaseCallbacks) {
-                getCurrentAdditionalTextOutput().appendExceededDbQuotaMessage(url,
-                        databaseIdentifier);
-            }
-            quotaUpdater.updateQuota(currentQuota + 5 * 1024 * 1024);
-        }
-
-        @Override
-        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
-            getCurrentAdditionalTextOutput().appendJsAlert(message);
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
-            getCurrentAdditionalTextOutput().appendJsConfirm(message);
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
-                JsPromptResult result) {
-            getCurrentAdditionalTextOutput().appendJsPrompt(message, defaultValue);
-            result.confirm();
-            return true;
-        }
-
-        @Override
-        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
-            getCurrentAdditionalTextOutput().appendConsoleMessage(consoleMessage);
-            return true;
-        }
-
-        @Override
-        public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture,
-                Message resultMsg) {
-            WebView.WebViewTransport transport = (WebView.WebViewTransport)resultMsg.obj;
-            /** By default windows cannot be opened, so just send null back. */
-            WebView newWindowWebView = null;
-
-            if (mCanOpenWindows) {
-                /**
-                 * We never display the new window, just create the view and allow it's content to
-                 * execute and be recorded by the executor.
-                 */
-                newWindowWebView = createWebViewWithJavascriptInterfaces();
-                setupWebView(newWindowWebView);
-            }
-
-            transport.setWebView(newWindowWebView);
-            resultMsg.sendToTarget();
-            return true;
-        }
-
-        @Override
-        public void onGeolocationPermissionsShowPrompt(String origin,
-                GeolocationPermissions.Callback callback) {
-            throw new RuntimeException(
-                    "The WebCore mock used by DRT should bypass the usual permissions flow.");
-        }
-    };
-
-    /** IMPLEMENTATION */
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        /**
-         * It detects the crash by catching all the uncaught exceptions. However, we
-         * still have to kill the process, because after catching the exception the
-         * activity remains in a strange state, where intents don't revive it.
-         * However, we send the message to the service to speed up the rebooting
-         * (we don't have to wait for time-out to kick in).
-         */
-        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
-            @Override
-            public void uncaughtException(Thread thread, Throwable e) {
-                Log.w(LOG_TAG,
-                        "onTestCrashed(): " + mCurrentTestRelativePath + " thread=" + thread, e);
-
-                try {
-                    Message serviceMsg =
-                            Message.obtain(null, ManagerService.MSG_CURRENT_TEST_CRASHED);
-
-                    mManagerServiceMessenger.send(serviceMsg);
-                } catch (RemoteException e2) {
-                    Log.e(LOG_TAG, "mCurrentTestRelativePath=" + mCurrentTestRelativePath, e2);
-                }
-
-                Process.killProcess(Process.myPid());
-            }
-        });
-
-        requestWindowFeature(Window.FEATURE_PROGRESS);
-
-        Intent intent = getIntent();
-        mTestsList = FsUtils.loadTestListFromStorage(intent.getStringExtra(EXTRA_TESTS_FILE));
-        mCurrentTestIndex = intent.getIntExtra(EXTRA_TEST_INDEX, -1);
-        mTotalTestCount = mCurrentTestIndex + mTestsList.size();
-
-        PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
-        mScreenDimLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK
-                | PowerManager.ON_AFTER_RELEASE, "WakeLock in LayoutTester");
-        mScreenDimLock.acquire();
-
-        bindService(new Intent(this, ManagerService.class), mServiceConnection,
-                Context.BIND_AUTO_CREATE);
-    }
-
-    private void reset() {
-        WebView previousWebView = mCurrentWebView;
-
-        resetLayoutTestController();
-
-        mCurrentTestTimedOut = false;
-        mCurrentResult = null;
-        mCurrentAdditionalTextOutput = null;
-
-        mCurrentWebView = createWebViewWithJavascriptInterfaces();
-        // When we create the first WebView, we need to pause to wait for the WebView thread to spin
-        // and up and for it to register its message handlers.
-        if (previousWebView == null) {
-            try {
-                Thread.currentThread().sleep(1000);
-            } catch (Exception e) {}
-        }
-        setupWebView(mCurrentWebView);
-
-        mEventSender.reset(mCurrentWebView);
-
-        setContentView(mCurrentWebView);
-        if (previousWebView != null) {
-            Log.d(LOG_TAG + "::reset", "previousWebView != null");
-            previousWebView.destroy();
-        }
-    }
-
-    private static class WebViewWithJavascriptInterfaces extends WebView {
-        public WebViewWithJavascriptInterfaces(
-                Context context, Map<String, Object> javascriptInterfaces) {
-            super(context,
-                  null, // attribute set
-                  0, // default style resource ID
-                  javascriptInterfaces,
-                  false); // is private browsing
-        }
-    }
-    private WebView createWebViewWithJavascriptInterfaces() {
-        Map<String, Object> javascriptInterfaces = new HashMap<String, Object>();
-        javascriptInterfaces.put("layoutTestController", mLayoutTestController);
-        javascriptInterfaces.put("eventSender", mEventSender);
-        return new WebViewWithJavascriptInterfaces(this, javascriptInterfaces);
-    }
-
-    private void setupWebView(WebView webView) {
-        webView.setWebViewClient(mWebViewClient);
-        webView.setWebChromeClient(mWebChromeClient);
-
-        /**
-         * Setting a touch interval of -1 effectively disables the optimisation in WebView
-         * that stops repeated touch events flooding WebCore. The Event Sender only sends a
-         * single event rather than a stream of events (like what would generally happen in
-         * a real use of touch events in a WebView)  and so if the WebView drops the event,
-         * the test will fail as the test expects one callback for every touch it synthesizes.
-         */
-        WebViewClassic webViewClassic = WebViewClassic.fromWebView(webView);
-        webViewClassic.setTouchInterval(-1);
-
-        webViewClassic.clearCache(true);
-
-        WebSettingsClassic webViewSettings = webViewClassic.getSettings();
-        webViewSettings.setAppCacheEnabled(true);
-        webViewSettings.setAppCachePath(getApplicationContext().getCacheDir().getPath());
-        // Use of larger values causes unexplained AppCache database corruption.
-        // TODO: Investigate what's really going on here.
-        webViewSettings.setAppCacheMaxSize(100 * 1024 * 1024);
-        webViewSettings.setJavaScriptEnabled(true);
-        webViewSettings.setJavaScriptCanOpenWindowsAutomatically(true);
-        webViewSettings.setSupportMultipleWindows(true);
-        webViewSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
-        webViewSettings.setDatabaseEnabled(true);
-        webViewSettings.setDatabasePath(getDir("databases", 0).getAbsolutePath());
-        webViewSettings.setDomStorageEnabled(true);
-        webViewSettings.setWorkersEnabled(false);
-        webViewSettings.setXSSAuditorEnabled(false);
-        webViewSettings.setPageCacheCapacity(0);
-
-        // This is asynchronous, but it gets processed by WebCore before it starts loading pages.
-        WebViewClassic.fromWebView(mCurrentWebView).setUseMockGeolocation();
-        WebViewClassic.fromWebView(mCurrentWebView).setUseMockDeviceOrientation();
-
-        // Must do this after setting the AppCache path.
-        WebStorage.getInstance().deleteAllData();
-    }
-
-    private void startTests() {
-        // This is called when the tests are started and after each crash.
-        // We only send the reset message in the former case.
-        if (mCurrentTestIndex <= 0) {
-            sendResetMessage();
-        }
-        if (mCurrentTestIndex == 0) {
-            sendFirstTestMessage();
-        }
-
-        runNextTest();
-    }
-
-    private void sendResetMessage() {
-        try {
-            Message serviceMsg = Message.obtain(null, ManagerService.MSG_RESET);
-            mManagerServiceMessenger.send(serviceMsg);
-        } catch (RemoteException e) {
-            Log.e(LOG_TAG, "Error sending message to manager service:", e);
-        }
-    }
-
-    private void sendFirstTestMessage() {
-        try {
-            Message serviceMsg = Message.obtain(null, ManagerService.MSG_FIRST_TEST);
-
-            Bundle bundle = new Bundle();
-            bundle.putString("firstTest", mTestsList.get(0));
-            bundle.putInt("index", mCurrentTestIndex);
-
-            serviceMsg.setData(bundle);
-            mManagerServiceMessenger.send(serviceMsg);
-        } catch (RemoteException e) {
-            Log.e(LOG_TAG, "Error sending message to manager service:", e);
-        }
-    }
-
-    private void runNextTest() {
-        assert mCurrentState == CurrentState.IDLE : "mCurrentState = " + mCurrentState.name();
-
-        if (mTestsList.isEmpty()) {
-            onAllTestsFinished();
-            return;
-        }
-
-        mCurrentTestRelativePath = mTestsList.remove(0);
-
-        Log.i(LOG_TAG, "runNextTest(): Start: " + mCurrentTestRelativePath +
-                " (" + mCurrentTestIndex + ")");
-
-        mCurrentTestUri = FileFilter.getUrl(mCurrentTestRelativePath, true).toString();
-
-        reset();
-
-        /** Start time-out countdown and the test */
-        mCurrentState = CurrentState.RENDERING_PAGE;
-        mResultHandler.sendEmptyMessageDelayed(MSG_TEST_TIMED_OUT, DEFAULT_TIME_OUT_MS);
-        mCurrentWebView.loadUrl(mCurrentTestUri);
-    }
-
-    private void onTestTimedOut() {
-        assert mCurrentState.isRunningState() : "mCurrentState = " + mCurrentState.name();
-
-        Log.w(LOG_TAG, "onTestTimedOut(): " + mCurrentTestRelativePath);
-        mCurrentTestTimedOut = true;
-
-        /**
-         * While it is theoretically possible that the test times out because
-         * of webview becoming unresponsive, it is very unlikely. Therefore it's
-         * assumed that obtaining results (that calls various webview methods)
-         * will not itself hang.
-         */
-        obtainActualResultsFromWebView();
-    }
-
-    private void onTestFinished() {
-        assert mCurrentState.isRunningState() : "mCurrentState = " + mCurrentState.name();
-
-        Log.i(LOG_TAG, "onTestFinished(): " + mCurrentTestRelativePath);
-        mResultHandler.removeMessages(MSG_TEST_TIMED_OUT);
-        obtainActualResultsFromWebView();
-    }
-
-    private void obtainActualResultsFromWebView() {
-        /**
-         * If the result has not been set by the time the test finishes we create
-         * a default type of result.
-         */
-        if (mCurrentResult == null) {
-            /** TODO: Default type should be RenderTreeResult. We don't support it now. */
-            mCurrentResult = new TextResult(mCurrentTestRelativePath);
-        }
-
-        mCurrentState = CurrentState.OBTAINING_RESULT;
-
-        if (mCurrentTestTimedOut) {
-            mCurrentResult.setDidTimeOut();
-        }
-        mCurrentResult.obtainActualResults(mCurrentWebView,
-                mResultHandler.obtainMessage(MSG_ACTUAL_RESULT_OBTAINED));
-    }
-
-    private void onActualResultsObtained() {
-        assert mCurrentState == CurrentState.OBTAINING_RESULT
-                : "mCurrentState = " + mCurrentState.name();
-
-        Log.i(LOG_TAG, "onActualResultsObtained(): " + mCurrentTestRelativePath);
-        mCurrentState = CurrentState.IDLE;
-
-        reportResultToService();
-        mCurrentTestIndex++;
-        updateProgressBar();
-        runNextTest();
-    }
-
-    private void reportResultToService() {
-        if (mCurrentAdditionalTextOutput != null) {
-            mCurrentResult.setAdditionalTextOutputString(mCurrentAdditionalTextOutput.toString());
-        }
-
-        try {
-            Message serviceMsg =
-                    Message.obtain(null, ManagerService.MSG_PROCESS_ACTUAL_RESULTS);
-
-            Bundle bundle = mCurrentResult.getBundle();
-            bundle.putInt("testIndex", mCurrentTestIndex);
-            if (!mTestsList.isEmpty()) {
-                bundle.putString("nextTest", mTestsList.get(0));
-            }
-
-            serviceMsg.setData(bundle);
-            mManagerServiceMessenger.send(serviceMsg);
-        } catch (RemoteException e) {
-            Log.e(LOG_TAG, "mCurrentTestRelativePath=" + mCurrentTestRelativePath, e);
-        }
-    }
-
-    private void updateProgressBar() {
-        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
-                mCurrentTestIndex * Window.PROGRESS_END / mTotalTestCount);
-        setTitle(mCurrentTestIndex * 100 / mTotalTestCount + "% " +
-                "(" + mCurrentTestIndex + "/" + mTotalTestCount + ")");
-    }
-
-    private void onAllTestsFinished() {
-        mScreenDimLock.release();
-
-        try {
-            Message serviceMsg =
-                    Message.obtain(null, ManagerService.MSG_ALL_TESTS_FINISHED);
-            mManagerServiceMessenger.send(serviceMsg);
-        } catch (RemoteException e) {
-            Log.e(LOG_TAG, "mCurrentTestRelativePath=" + mCurrentTestRelativePath, e);
-        }
-
-        unbindService(mServiceConnection);
-    }
-
-    private AdditionalTextOutput getCurrentAdditionalTextOutput() {
-        if (mCurrentAdditionalTextOutput == null) {
-            mCurrentAdditionalTextOutput = new AdditionalTextOutput();
-        }
-        return mCurrentAdditionalTextOutput;
-    }
-
-    /** LAYOUT TEST CONTROLLER */
-
-    private static final int MSG_WAIT_UNTIL_DONE = 0;
-    private static final int MSG_NOTIFY_DONE = 1;
-    private static final int MSG_DUMP_AS_TEXT = 2;
-    private static final int MSG_DUMP_CHILD_FRAMES_AS_TEXT = 3;
-    private static final int MSG_SET_CAN_OPEN_WINDOWS = 4;
-    private static final int MSG_DUMP_DATABASE_CALLBACKS = 5;
-    private static final int MSG_OVERRIDE_PREFERENCE = 6;
-    private static final int MSG_SET_XSS_AUDITOR_ENABLED = 7;
-
-    /** String constants for use with layoutTestController.overridePreference() */
-    private final String WEBKIT_OFFLINE_WEB_APPLICATION_CACHE_ENABLED =
-            "WebKitOfflineWebApplicationCacheEnabled";
-    private final String WEBKIT_USES_PAGE_CACHE_PREFERENCE_KEY = "WebKitUsesPageCachePreferenceKey";
-
-    Handler mLayoutTestControllerHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            assert mCurrentState.isRunningState() : "mCurrentState = " + mCurrentState.name();
-
-            switch (msg.what) {
-                case MSG_DUMP_AS_TEXT:
-                    if (mCurrentResult == null) {
-                        mCurrentResult = new TextResult(mCurrentTestRelativePath);
-                    }
-                    assert mCurrentResult instanceof TextResult
-                            : "mCurrentResult instanceof" + mCurrentResult.getClass().getName();
-                    break;
-
-                case MSG_DUMP_CHILD_FRAMES_AS_TEXT:
-                    /** If dumpAsText was not called we assume that the result should be text */
-                    if (mCurrentResult == null) {
-                        mCurrentResult = new TextResult(mCurrentTestRelativePath);
-                    }
-
-                    assert mCurrentResult instanceof TextResult
-                            : "mCurrentResult instanceof" + mCurrentResult.getClass().getName();
-
-                    ((TextResult)mCurrentResult).setDumpChildFramesAsText(true);
-                    break;
-
-                case MSG_DUMP_DATABASE_CALLBACKS:
-                    mDumpDatabaseCallbacks = true;
-                    break;
-
-                case MSG_NOTIFY_DONE:
-                    if (mCurrentState == CurrentState.WAITING_FOR_ASYNCHRONOUS_TEST) {
-                        onTestFinished();
-                    }
-                    break;
-
-                case MSG_OVERRIDE_PREFERENCE:
-                    /**
-                     * TODO: We should look up the correct WebView for the frame which
-                     * called the layoutTestController method. Currently, we just use the
-                     * WebView for the main frame. EventSender suffers from the same
-                     * problem.
-                     */
-                    String key = msg.getData().getString("key");
-                    boolean value = msg.getData().getBoolean("value");
-                    if (WEBKIT_OFFLINE_WEB_APPLICATION_CACHE_ENABLED.equals(key)) {
-                        WebViewClassic.fromWebView(mCurrentWebView).getSettings().
-                                setAppCacheEnabled(value);
-                    } else if (WEBKIT_USES_PAGE_CACHE_PREFERENCE_KEY.equals(key)) {
-                        // Cache the maximum possible number of pages.
-                        WebViewClassic.fromWebView(mCurrentWebView).getSettings().
-                                setPageCacheCapacity(Integer.MAX_VALUE);
-                    } else {
-                        Log.w(LOG_TAG, "LayoutTestController.overridePreference(): " +
-                              "Unsupported preference '" + key + "'");
-                    }
-                    break;
-
-                case MSG_SET_CAN_OPEN_WINDOWS:
-                    mCanOpenWindows = true;
-                    break;
-
-                case MSG_SET_XSS_AUDITOR_ENABLED:
-                    WebViewClassic.fromWebView(mCurrentWebView).getSettings().
-                            setXSSAuditorEnabled(msg.arg1 == 1);
-                    break;
-
-                case MSG_WAIT_UNTIL_DONE:
-                    mCurrentState = CurrentState.WAITING_FOR_ASYNCHRONOUS_TEST;
-                    break;
-
-                default:
-                    assert false : "msg.what=" + msg.what;
-                    break;
-            }
-        }
-    };
-
-    private void resetLayoutTestController() {
-        mCanOpenWindows = false;
-        mDumpDatabaseCallbacks = false;
-    }
-
-    public void dumpAsText(boolean enablePixelTest) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": dumpAsText(" + enablePixelTest + ") called");
-        /** TODO: Implement */
-        if (enablePixelTest) {
-            Log.w(LOG_TAG, "enablePixelTest not implemented, switching to false");
-        }
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_DUMP_AS_TEXT);
-    }
-
-    public void dumpChildFramesAsText() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": dumpChildFramesAsText() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_DUMP_CHILD_FRAMES_AS_TEXT);
-    }
-
-    public void dumpDatabaseCallbacks() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": dumpDatabaseCallbacks() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_DUMP_DATABASE_CALLBACKS);
-    }
-
-    public void notifyDone() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": notifyDone() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_NOTIFY_DONE);
-    }
-
-    public void overridePreference(String key, boolean value) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": overridePreference(" + key + ", " + value +
-        ") called");
-        Message msg = mLayoutTestControllerHandler.obtainMessage(MSG_OVERRIDE_PREFERENCE);
-        msg.getData().putString("key", key);
-        msg.getData().putBoolean("value", value);
-        msg.sendToTarget();
-    }
-
-    public void setCanOpenWindows() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": setCanOpenWindows() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_SET_CAN_OPEN_WINDOWS);
-    }
-
-    public void setMockGeolocationPosition(double latitude, double longitude, double accuracy) {
-        WebViewClassic.fromWebView(mCurrentWebView).setMockGeolocationPosition(latitude, longitude,
-                accuracy);
-    }
-
-    public void setMockGeolocationError(int code, String message) {
-        WebViewClassic.fromWebView(mCurrentWebView).setMockGeolocationError(code, message);
-    }
-
-    public void setGeolocationPermission(boolean allow) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": setGeolocationPermission(" + allow +
-                ") called");
-        WebViewClassic.fromWebView(mCurrentWebView).setMockGeolocationPermission(allow);
-    }
-
-    public void setMockDeviceOrientation(boolean canProvideAlpha, double alpha,
-            boolean canProvideBeta, double beta, boolean canProvideGamma, double gamma) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": setMockDeviceOrientation(" + canProvideAlpha +
-                ", " + alpha + ", " + canProvideBeta + ", " + beta + ", " + canProvideGamma +
-                ", " + gamma + ")");
-        WebViewClassic.fromWebView(mCurrentWebView).setMockDeviceOrientation(canProvideAlpha,
-                alpha, canProvideBeta, beta, canProvideGamma, gamma);
-    }
-
-    public void setXSSAuditorEnabled(boolean flag) {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": setXSSAuditorEnabled(" + flag + ") called");
-        Message msg = mLayoutTestControllerHandler.obtainMessage(MSG_SET_XSS_AUDITOR_ENABLED);
-        msg.arg1 = flag ? 1 : 0;
-        msg.sendToTarget();
-    }
-
-    public void waitUntilDone() {
-        Log.i(LOG_TAG, mCurrentTestRelativePath + ": waitUntilDone() called");
-        mLayoutTestControllerHandler.sendEmptyMessage(MSG_WAIT_UNTIL_DONE);
-    }
-
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
deleted file mode 100644
index 4783cc7..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.util.Log;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A service that handles managing the results of tests, informing of crashes, generating
- * summaries, etc.
- */
-public class ManagerService extends Service {
-
-    private static final String LOG_TAG = "ManagerService";
-
-    private static final int MSG_CRASH_TIMEOUT_EXPIRED = 0;
-    private static final int MSG_SUMMARIZER_DONE = 1;
-
-    private static final int CRASH_TIMEOUT_MS = 20 * 1000;
-
-    /** TODO: make it a setting */
-    static final String RESULTS_ROOT_DIR_PATH =
-            Environment.getExternalStorageDirectory() + File.separator + "layout-test-results";
-
-    /** TODO: Make it a setting */
-    private static final List<String> EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES =
-            new ArrayList<String>(3);
-    {
-        EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.add("platform" + File.separator +
-                "android-v8" + File.separator);
-        EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.add("platform" + File.separator +
-                "android" + File.separator);
-        EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.add("");
-    }
-
-    /** TODO: Make these settings */
-    private static final String TEXT_RESULT_EXTENSION = "txt";
-    private static final String IMAGE_RESULT_EXTENSION = "png";
-
-    static final int MSG_PROCESS_ACTUAL_RESULTS = 0;
-    static final int MSG_ALL_TESTS_FINISHED = 1;
-    static final int MSG_FIRST_TEST = 2;
-    static final int MSG_CURRENT_TEST_CRASHED = 3;
-    static final int MSG_RESET = 4;
-
-    /**
-     * This handler is purely for IPC. It is used to create mMessenger
-     * that generates a binder returned in onBind method.
-     */
-    private Handler mIncomingHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_RESET:
-                    mSummarizer.reset();
-                    break;
-
-                case MSG_FIRST_TEST:
-                    Bundle bundle = msg.getData();
-                    ensureNextTestSetup(bundle.getString("firstTest"), bundle.getInt("index"));
-                    break;
-
-                case MSG_PROCESS_ACTUAL_RESULTS:
-                    Log.d(LOG_TAG,"mIncomingHandler: " + msg.getData().getString("relativePath"));
-                    onActualResultsObtained(msg.getData());
-                    break;
-
-                case MSG_CURRENT_TEST_CRASHED:
-                    mInternalMessagesHandler.removeMessages(MSG_CRASH_TIMEOUT_EXPIRED);
-                    onTestCrashed();
-                    break;
-
-                case MSG_ALL_TESTS_FINISHED:
-                    /** We run it in a separate thread to avoid ANR */
-                    new Thread() {
-                        @Override
-                        public void run() {
-                            mSummarizer.setTestsRelativePath(mAllTestsRelativePath);
-                            Message msg = Message.obtain(mInternalMessagesHandler,
-                                    MSG_SUMMARIZER_DONE);
-                            mSummarizer.summarize(msg);
-                        }
-                    }.start();
-            }
-        }
-    };
-
-    private Messenger mMessenger = new Messenger(mIncomingHandler);
-
-    private Handler mInternalMessagesHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_CRASH_TIMEOUT_EXPIRED:
-                    onTestCrashed();
-                    break;
-
-                case MSG_SUMMARIZER_DONE:
-                    Intent intent = new Intent(ManagerService.this, TestsListActivity.class);
-                    intent.setAction(Intent.ACTION_SHUTDOWN);
-                    /** This flag is needed because we send the intent from the service */
-                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                    startActivity(intent);
-                    break;
-            }
-        }
-    };
-
-    private Summarizer mSummarizer;
-
-    private String mCurrentlyRunningTest;
-    private int mCurrentlyRunningTestIndex;
-
-    /**
-     * These are implementation details of getExpectedResultPath() used to reduce the number
-     * of requests required to the host server.
-     */
-    private String mLastExpectedResultPathRequested;
-    private String mLastExpectedResultPathFetched;
-
-    private String mAllTestsRelativePath;
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-
-        mSummarizer = new Summarizer(RESULTS_ROOT_DIR_PATH, getApplicationContext());
-    }
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-        mAllTestsRelativePath = intent.getStringExtra("path");
-        assert mAllTestsRelativePath != null;
-        return START_STICKY;
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mMessenger.getBinder();
-    }
-
-    private void onActualResultsObtained(Bundle bundle) {
-        mInternalMessagesHandler.removeMessages(MSG_CRASH_TIMEOUT_EXPIRED);
-        ensureNextTestSetup(bundle.getString("nextTest"), bundle.getInt("testIndex") + 1);
-
-        AbstractResult results =
-                AbstractResult.TestType.valueOf(bundle.getString("type")).createResult(bundle);
-
-        Log.i(LOG_TAG, "onActualResultObtained: " + results.getRelativePath());
-        handleResults(results);
-    }
-
-    private void ensureNextTestSetup(String nextTest, int index) {
-        if (nextTest == null) {
-            Log.w(LOG_TAG, "ensureNextTestSetup(): nextTest=null");
-            return;
-        }
-
-        mCurrentlyRunningTest = nextTest;
-        mCurrentlyRunningTestIndex = index;
-        mInternalMessagesHandler.sendEmptyMessageDelayed(MSG_CRASH_TIMEOUT_EXPIRED, CRASH_TIMEOUT_MS);
-    }
-
-    /**
-     * This sends an intent to TestsListActivity to restart LayoutTestsExecutor.
-     * The more detailed description of the flow is in the comment of onNewIntent
-     * method in TestsListActivity.
-     */
-    private void onTestCrashed() {
-        handleResults(new CrashedDummyResult(mCurrentlyRunningTest));
-
-        Log.w(LOG_TAG, "onTestCrashed(): " + mCurrentlyRunningTest +
-                " (" + mCurrentlyRunningTestIndex + ")");
-
-        Intent intent = new Intent(this, TestsListActivity.class);
-        intent.setAction(Intent.ACTION_REBOOT);
-        /** This flag is needed because we send the intent from the service */
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        intent.putExtra("crashedTestIndex", mCurrentlyRunningTestIndex);
-        startActivity(intent);
-    }
-
-    private void handleResults(AbstractResult results) {
-        String relativePath = results.getRelativePath();
-        results.setExpectedTextResult(getExpectedTextResult(relativePath));
-        results.setExpectedTextResultPath(getExpectedTextResultPath(relativePath));
-        results.setExpectedImageResult(getExpectedImageResult(relativePath));
-        results.setExpectedImageResultPath(getExpectedImageResultPath(relativePath));
-
-        dumpActualTextResult(results);
-        dumpActualImageResult(results);
-
-        mSummarizer.appendTest(results);
-    }
-
-    private void dumpActualTextResult(AbstractResult result) {
-        String testPath = result.getRelativePath();
-        String actualTextResult = result.getActualTextResult();
-        if (actualTextResult == null) {
-            return;
-        }
-
-        String resultPath = FileFilter.setPathEnding(testPath, "-actual." + TEXT_RESULT_EXTENSION);
-        FsUtils.writeDataToStorage(new File(RESULTS_ROOT_DIR_PATH, resultPath),
-                actualTextResult.getBytes(), false);
-    }
-
-    private void dumpActualImageResult(AbstractResult result) {
-        String testPath = result.getRelativePath();
-        byte[] actualImageResult = result.getActualImageResult();
-        if (actualImageResult == null) {
-            return;
-        }
-
-        String resultPath = FileFilter.setPathEnding(testPath,
-                "-actual." + IMAGE_RESULT_EXTENSION);
-        FsUtils.writeDataToStorage(new File(RESULTS_ROOT_DIR_PATH, resultPath),
-                actualImageResult, false);
-    }
-
-    public String getExpectedTextResult(String relativePath) {
-        byte[] result = getExpectedResult(relativePath, TEXT_RESULT_EXTENSION);
-        if (result != null) {
-            return new String(result);
-        }
-        return null;
-    }
-
-    public byte[] getExpectedImageResult(String relativePath) {
-        return getExpectedResult(relativePath, IMAGE_RESULT_EXTENSION);
-    }
-
-    private byte[] getExpectedResult(String relativePath, String extension) {
-        String originalRelativePath =
-                FileFilter.setPathEnding(relativePath, "-expected." + extension);
-        mLastExpectedResultPathRequested = originalRelativePath;
-
-        byte[] bytes = null;
-        List<String> locations = EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES;
-
-        int size = EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.size();
-        for (int i = 0; bytes == null && i < size; i++) {
-            relativePath = locations.get(i) + originalRelativePath;
-            bytes = FsUtils.readDataFromUrl(FileFilter.getUrl(relativePath, false));
-        }
-
-        mLastExpectedResultPathFetched = bytes == null ? null : relativePath;
-        return bytes;
-    }
-
-    private String getExpectedTextResultPath(String relativePath) {
-        return getExpectedResultPath(relativePath, TEXT_RESULT_EXTENSION);
-    }
-
-    private String getExpectedImageResultPath(String relativePath) {
-        return getExpectedResultPath(relativePath, IMAGE_RESULT_EXTENSION);
-    }
-
-    private String getExpectedResultPath(String relativePath, String extension) {
-        String originalRelativePath =
-            FileFilter.setPathEnding(relativePath, "-expected." + extension);
-        if (!originalRelativePath.equals(mLastExpectedResultPathRequested)) {
-            getExpectedResult(relativePath, extension);
-        }
-
-        return mLastExpectedResultPathFetched;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
deleted file mode 100644
index bae8e6b..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.content.Context;
-import android.content.res.AssetManager;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.os.Build;
-import android.os.Message;
-import android.util.DisplayMetrics;
-import android.util.Log;
-
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A class that collects information about tests that ran and can create HTML
- * files with summaries and easy navigation.
- */
-public class Summarizer {
-
-    private static final String LOG_TAG = "Summarizer";
-
-    private static final String CSS =
-            "<style type=\"text/css\">" +
-            "* {" +
-            "       font-family: Verdana;" +
-            "       border: 0;" +
-            "       margin: 0;" +
-            "       padding: 0;}" +
-            "body {" +
-            "       margin: 10px;}" +
-            "h1 {" +
-            "       font-size: 24px;" +
-            "       margin: 4px 0 4px 0;}" +
-            "h2 {" +
-            "       font-size:18px;" +
-            "       text-transform: uppercase;" +
-            "       margin: 20px 0 3px 0;}" +
-            "h3, h3 a {" +
-            "       font-size: 14px;" +
-            "       color: black;" +
-            "       text-decoration: none;" +
-            "       margin-top: 4px;" +
-            "       margin-bottom: 2px;}" +
-            "h3 a span.path {" +
-            "       text-decoration: underline;}" +
-            "h3 span.tri {" +
-            "       text-decoration: none;" +
-            "       float: left;" +
-            "       width: 20px;}" +
-            "h3 span.sqr {" +
-            "       text-decoration: none;" +
-            "       float: left;" +
-            "       width: 20px;}" +
-            "h3 span.sqr_pass {" +
-            "       color: #8ee100;}" +
-            "h3 span.sqr_fail {" +
-            "       color: #c30000;}" +
-            "span.source {" +
-            "       display: block;" +
-            "       font-size: 10px;" +
-            "       color: #888;" +
-            "       margin-left: 20px;" +
-            "       margin-bottom: 1px;}" +
-            "span.source a {" +
-            "       font-size: 10px;" +
-            "       color: #888;}" +
-            "h3 img {" +
-            "       width: 8px;" +
-            "       margin-right: 4px;}" +
-            "div.diff {" +
-            "       margin-bottom: 25px;}" +
-            "div.diff a {" +
-            "       font-size: 12px;" +
-            "       color: #888;}" +
-            "table.visual_diff {" +
-            "       border-bottom: 0px solid;" +
-            "       border-collapse: collapse;" +
-            "       width: 100%;" +
-            "       margin-bottom: 2px;}" +
-            "table.visual_diff tr.headers td {" +
-            "       border-bottom: 1px solid;" +
-            "       border-top: 0;" +
-            "       padding-bottom: 3px;}" +
-            "table.visual_diff tr.results td {" +
-            "       border-top: 1px dashed;" +
-            "       border-right: 1px solid;" +
-            "       font-size: 15px;" +
-            "       vertical-align: top;}" +
-            "table.visual_diff tr.results td.line_count {" +
-            "       background-color:#aaa;" +
-            "       min-width:20px;" +
-            "       text-align: right;" +
-            "       border-right: 1px solid;" +
-            "       border-left: 1px solid;" +
-            "       padding: 2px 1px 2px 0px;}" +
-            "table.visual_diff tr.results td.line {" +
-            "       padding: 2px 0px 2px 4px;" +
-            "       border-right: 1px solid;" +
-            "       width: 49.8%;}" +
-            "table.visual_diff tr.footers td {" +
-            "       border-top: 1px solid;" +
-            "       border-bottom: 0;}" +
-            "table.visual_diff tr td.space {" +
-            "       border: 0;" +
-            "       width: 0.4%}" +
-            "div.space {" +
-            "       margin-top:4px;}" +
-            "span.eql {" +
-            "       background-color: #f3f3f3;}" +
-            "span.del {" +
-            "       background-color: #ff8888; }" +
-            "span.ins {" +
-            "       background-color: #88ff88; }" +
-            "table.summary {" +
-            "       border: 1px solid black;" +
-            "       margin-top: 20px;}" +
-            "table.summary td {" +
-            "       padding: 3px;}" +
-            "span.listItem {" +
-            "       font-size: 11px;" +
-            "       font-weight: normal;" +
-            "       text-transform: uppercase;" +
-            "       padding: 3px;" +
-            "       -webkit-border-radius: 4px;}" +
-            "span." + AbstractResult.ResultCode.RESULTS_DIFFER.name() + "{" +
-            "       background-color: #ccc;" +
-            "       color: black;}" +
-            "span." + AbstractResult.ResultCode.NO_EXPECTED_RESULT.name() + "{" +
-            "       background-color: #a700e4;" +
-            "       color: #fff;}" +
-            "span.timed_out {" +
-            "       background-color: #f3cb00;" +
-            "       color: black;}" +
-            "span.crashed {" +
-            "       background-color: #c30000;" +
-            "       color: #fff;}" +
-            "span.noLtc {" +
-            "       background-color: #944000;" +
-            "       color: #fff;}" +
-            "span.noEventSender {" +
-            "       background-color: #815600;" +
-            "       color: #fff;}" +
-            "</style>";
-
-    private static final String SCRIPT =
-            "<script type=\"text/javascript\">" +
-            "    function toggleDisplay(id) {" +
-            "        element = document.getElementById(id);" +
-            "        triangle = document.getElementById('tri.' + id);" +
-            "        if (element.style.display == 'none') {" +
-            "            element.style.display = 'inline';" +
-            "            triangle.innerHTML = '&#x25bc; ';" +
-            "        } else {" +
-            "            element.style.display = 'none';" +
-            "            triangle.innerHTML = '&#x25b6; ';" +
-            "        }" +
-            "    }" +
-            "</script>";
-
-    /** TODO: Make it a setting */
-    private static final String HTML_DETAILS_RELATIVE_PATH = "details.html";
-    private static final String TXT_SUMMARY_RELATIVE_PATH = "summary.txt";
-
-    private static final int RESULTS_PER_DUMP = 500;
-    private static final int RESULTS_PER_DB_ACCESS = 50;
-
-    private int mCrashedTestsCount = 0;
-    private List<AbstractResult> mUnexpectedFailures = new ArrayList<AbstractResult>();
-    private List<AbstractResult> mExpectedFailures = new ArrayList<AbstractResult>();
-    private List<AbstractResult> mExpectedPasses = new ArrayList<AbstractResult>();
-    private List<AbstractResult> mUnexpectedPasses = new ArrayList<AbstractResult>();
-
-    private Cursor mUnexpectedFailuresCursor;
-    private Cursor mExpectedFailuresCursor;
-    private Cursor mUnexpectedPassesCursor;
-    private Cursor mExpectedPassesCursor;
-
-    private FileFilter mFileFilter;
-    private String mResultsRootDirPath;
-    private String mTestsRelativePath;
-    private Date mDate;
-
-    private int mResultsSinceLastHtmlDump = 0;
-    private int mResultsSinceLastDbAccess = 0;
-
-    private SummarizerDBHelper mDbHelper;
-
-    public Summarizer(String resultsRootDirPath, Context context) {
-        mFileFilter = new FileFilter();
-        mResultsRootDirPath = resultsRootDirPath;
-
-        /**
-         * We don't run the database I/O in a separate thread to avoid consumer/producer problem
-         * and to simplify code.
-         */
-        mDbHelper = new SummarizerDBHelper(context);
-        mDbHelper.open();
-    }
-
-    public static URI getDetailsUri() {
-        return new File(ManagerService.RESULTS_ROOT_DIR_PATH + File.separator +
-                HTML_DETAILS_RELATIVE_PATH).toURI();
-    }
-
-    public void appendTest(AbstractResult result) {
-        String relativePath = result.getRelativePath();
-
-        if (result.didCrash()) {
-            mCrashedTestsCount++;
-        }
-
-        if (result.didPass()) {
-            result.clearResults();
-            if (mFileFilter.isFail(relativePath)) {
-                mUnexpectedPasses.add(result);
-            } else {
-                mExpectedPasses.add(result);
-            }
-        } else {
-            if (mFileFilter.isFail(relativePath)) {
-                mExpectedFailures.add(result);
-            } else {
-                mUnexpectedFailures.add(result);
-            }
-        }
-
-        if (++mResultsSinceLastDbAccess == RESULTS_PER_DB_ACCESS) {
-            persistLists();
-            clearLists();
-        }
-    }
-
-    private void clearLists() {
-        mUnexpectedFailures.clear();
-        mExpectedFailures.clear();
-        mUnexpectedPasses.clear();
-        mExpectedPasses.clear();
-    }
-
-    private void persistLists() {
-        persistListToTable(mUnexpectedFailures, SummarizerDBHelper.UNEXPECTED_FAILURES_TABLE);
-        persistListToTable(mExpectedFailures, SummarizerDBHelper.EXPECTED_FAILURES_TABLE);
-        persistListToTable(mUnexpectedPasses, SummarizerDBHelper.UNEXPECTED_PASSES_TABLE);
-        persistListToTable(mExpectedPasses, SummarizerDBHelper.EXPECTED_PASSES_TABLE);
-        mResultsSinceLastDbAccess = 0;
-    }
-
-    private void persistListToTable(List<AbstractResult> results, String table) {
-        for (AbstractResult abstractResult : results) {
-            mDbHelper.insertAbstractResult(abstractResult, table);
-        }
-    }
-
-    public void setTestsRelativePath(String testsRelativePath) {
-        mTestsRelativePath = testsRelativePath;
-    }
-
-    public void summarize(Message onFinishMessage) {
-        persistLists();
-        clearLists();
-
-        mUnexpectedFailuresCursor =
-            mDbHelper.getAbstractResults(SummarizerDBHelper.UNEXPECTED_FAILURES_TABLE);
-        mUnexpectedPassesCursor =
-            mDbHelper.getAbstractResults(SummarizerDBHelper.UNEXPECTED_PASSES_TABLE);
-        mExpectedFailuresCursor =
-            mDbHelper.getAbstractResults(SummarizerDBHelper.EXPECTED_FAILURES_TABLE);
-        mExpectedPassesCursor =
-            mDbHelper.getAbstractResults(SummarizerDBHelper.EXPECTED_PASSES_TABLE);
-
-        String webKitRevision = getWebKitRevision();
-        createHtmlDetails(webKitRevision);
-        createTxtSummary(webKitRevision);
-
-        clearLists();
-        mUnexpectedFailuresCursor.close();
-        mUnexpectedPassesCursor.close();
-        mExpectedFailuresCursor.close();
-        mExpectedPassesCursor.close();
-
-        onFinishMessage.sendToTarget();
-    }
-
-    public void reset() {
-        mCrashedTestsCount = 0;
-        clearLists();
-        mDbHelper.reset();
-        mDate = new Date();
-    }
-
-    private void dumpHtmlToFile(StringBuilder html, boolean append) {
-        FsUtils.writeDataToStorage(new File(mResultsRootDirPath, HTML_DETAILS_RELATIVE_PATH),
-                html.toString().getBytes(), append);
-        html.setLength(0);
-        mResultsSinceLastHtmlDump = 0;
-    }
-
-    private void createTxtSummary(String webKitRevision) {
-        StringBuilder txt = new StringBuilder();
-
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
-        txt.append("Path: " + mTestsRelativePath + "\n");
-        txt.append("Date: " + dateFormat.format(mDate) + "\n");
-        txt.append("Build fingerprint: " + Build.FINGERPRINT + "\n");
-        txt.append("WebKit version: " + getWebKitVersionFromUserAgentString() + "\n");
-        txt.append("WebKit revision: " + webKitRevision + "\n");
-
-        txt.append("TOTAL:                     " + getTotalTestCount() + "\n");
-        txt.append("CRASHED (among all tests): " + mCrashedTestsCount + "\n");
-        txt.append("UNEXPECTED FAILURES:       " + mUnexpectedFailuresCursor.getCount() + "\n");
-        txt.append("UNEXPECTED PASSES:         " + mUnexpectedPassesCursor.getCount() + "\n");
-        txt.append("EXPECTED FAILURES:         " + mExpectedFailuresCursor.getCount() + "\n");
-        txt.append("EXPECTED PASSES:           " + mExpectedPassesCursor.getCount() + "\n");
-
-        FsUtils.writeDataToStorage(new File(mResultsRootDirPath, TXT_SUMMARY_RELATIVE_PATH),
-                txt.toString().getBytes(), false);
-    }
-
-    private void createHtmlDetails(String webKitRevision) {
-        StringBuilder html = new StringBuilder();
-
-        html.append("<html><head>");
-        html.append(CSS);
-        html.append(SCRIPT);
-        html.append("</head><body>");
-
-        createTopSummaryTable(webKitRevision, html);
-        dumpHtmlToFile(html, false);
-
-        createResultsList(html, "Unexpected failures", mUnexpectedFailuresCursor);
-        createResultsList(html, "Unexpected passes", mUnexpectedPassesCursor);
-        createResultsList(html, "Expected failures", mExpectedFailuresCursor);
-        createResultsList(html, "Expected passes", mExpectedPassesCursor);
-
-        html.append("</body></html>");
-        dumpHtmlToFile(html, true);
-    }
-
-    private int getTotalTestCount() {
-        return mUnexpectedFailuresCursor.getCount() +
-                mUnexpectedPassesCursor.getCount() +
-                mExpectedPassesCursor.getCount() +
-                mExpectedFailuresCursor.getCount();
-    }
-
-    private String getWebKitVersionFromUserAgentString() {
-        Resources resources = new Resources(new AssetManager(), new DisplayMetrics(),
-                new Configuration());
-        String userAgent =
-                resources.getString(com.android.internal.R.string.web_user_agent);
-
-        Matcher matcher = Pattern.compile("AppleWebKit/([0-9]+?\\.[0-9])").matcher(userAgent);
-        if (matcher.find()) {
-            return matcher.group(1);
-        }
-        return "unknown";
-    }
-
-    private String getWebKitRevision() {
-        URL url = null;
-        try {
-            url = new URL(ForwarderManager.getHostSchemePort(false) + "ThirdPartyProject.prop");
-        } catch (MalformedURLException e) {
-            assert false;
-        }
-
-        String thirdPartyProjectContents = new String(FsUtils.readDataFromUrl(url));
-        Matcher matcher = Pattern.compile("^version=([0-9]+)", Pattern.MULTILINE).matcher(
-                thirdPartyProjectContents);
-        if (matcher.find()) {
-            return matcher.group(1);
-        }
-        return "unknown";
-    }
-
-    private void createTopSummaryTable(String webKitRevision, StringBuilder html) {
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
-        html.append("<h1>" + "Layout tests' results for: " +
-                (mTestsRelativePath.equals("") ? "all tests" : mTestsRelativePath) + "</h1>");
-        html.append("<h3>" + "Date: " + dateFormat.format(new Date()) + "</h3>");
-        html.append("<h3>" + "Build fingerprint: " + Build.FINGERPRINT + "</h3>");
-        html.append("<h3>" + "WebKit version: " + getWebKitVersionFromUserAgentString() + "</h3>");
-
-        html.append("<h3>" + "WebKit revision: ");
-        html.append("<a href=\"http://trac.webkit.org/browser/trunk?rev=" + webKitRevision +
-                "\" target=\"_blank\"><span class=\"path\">" + webKitRevision + "</span></a>");
-        html.append("</h3>");
-
-        html.append("<table class=\"summary\">");
-        createSummaryTableRow(html, "TOTAL", getTotalTestCount());
-        createSummaryTableRow(html, "CRASHED (among all tests)", mCrashedTestsCount);
-        createSummaryTableRow(html, "UNEXPECTED FAILURES", mUnexpectedFailuresCursor.getCount());
-        createSummaryTableRow(html, "UNEXPECTED PASSES", mUnexpectedPassesCursor.getCount());
-        createSummaryTableRow(html, "EXPECTED FAILURES", mExpectedFailuresCursor.getCount());
-        createSummaryTableRow(html, "EXPECTED PASSES", mExpectedPassesCursor.getCount());
-        html.append("</table>");
-    }
-
-    private void createSummaryTableRow(StringBuilder html, String caption, int size) {
-        html.append("<tr>");
-        html.append("    <td>" + caption + "</td>");
-        html.append("    <td>" + size + "</td>");
-        html.append("</tr>");
-    }
-
-    private void createResultsList(
-            StringBuilder html, String title, Cursor cursor) {
-        String relativePath;
-        String id = "";
-        AbstractResult.ResultCode resultCode;
-
-        html.append("<h2>" + title + " [" + cursor.getCount() + "]</h2>");
-
-        if (!cursor.moveToFirst()) {
-            return;
-        }
-
-        AbstractResult result;
-        do {
-            result = SummarizerDBHelper.getAbstractResult(cursor);
-
-            relativePath = result.getRelativePath();
-            resultCode = result.getResultCode();
-
-            html.append("<h3>");
-
-            /**
-             * Technically, two different paths could end up being the same, because
-             * ':' is a valid  character in a path. However, it is probably not going
-             * to cause any problems in this case
-             */
-            id = relativePath.replace(File.separator, ":");
-
-            /** Write the test name */
-            if (resultCode == AbstractResult.ResultCode.RESULTS_DIFFER) {
-                html.append("<a href=\"#\" onClick=\"toggleDisplay('" + id + "');");
-                html.append("return false;\">");
-                html.append("<span class=\"tri\" id=\"tri." + id + "\">&#x25b6; </span>");
-                html.append("<span class=\"path\">" + relativePath + "</span>");
-                html.append("</a>");
-            } else {
-                html.append("<a href=\"" + getViewSourceUrl(result.getRelativePath()).toString() + "\"");
-                html.append(" target=\"_blank\">");
-                html.append("<span class=\"sqr sqr_" + (result.didPass() ? "pass" : "fail"));
-                html.append("\">&#x25a0; </span>");
-                html.append("<span class=\"path\">" + result.getRelativePath() + "</span>");
-                html.append("</a>");
-            }
-
-            if (!result.didPass()) {
-                appendTags(html, result);
-            }
-
-            html.append("</h3>");
-            appendExpectedResultsSources(result, html);
-
-            if (resultCode == AbstractResult.ResultCode.RESULTS_DIFFER) {
-                html.append("<div class=\"diff\" style=\"display: none;\" id=\"" + id + "\">");
-                html.append(result.getDiffAsHtml());
-                html.append("<a href=\"#\" onClick=\"toggleDisplay('" + id + "');");
-                html.append("return false;\">Hide</a>");
-                html.append(" | ");
-                html.append("<a href=\"" + getViewSourceUrl(relativePath).toString() + "\"");
-                html.append(" target=\"_blank\">Show source</a>");
-                html.append("</div>");
-            }
-
-            html.append("<div class=\"space\"></div>");
-
-            if (++mResultsSinceLastHtmlDump == RESULTS_PER_DUMP) {
-                dumpHtmlToFile(html, true);
-            }
-
-            cursor.moveToNext();
-        } while (!cursor.isAfterLast());
-    }
-
-    private void appendTags(StringBuilder html, AbstractResult result) {
-        /** Tag tests which crash, time out or where results don't match */
-        if (result.didCrash()) {
-            html.append(" <span class=\"listItem crashed\">Crashed</span>");
-        } else {
-            if (result.didTimeOut()) {
-                html.append(" <span class=\"listItem timed_out\">Timed out</span>");
-            }
-            AbstractResult.ResultCode resultCode = result.getResultCode();
-            if (resultCode != AbstractResult.ResultCode.RESULTS_MATCH) {
-                html.append(" <span class=\"listItem " + resultCode.name() + "\">");
-                html.append(resultCode.toString());
-                html.append("</span>");
-            }
-        }
-
-        /** Detect missing LTC function */
-        String additionalTextOutputString = result.getAdditionalTextOutputString();
-        if (additionalTextOutputString != null &&
-                additionalTextOutputString.contains("com.android.dumprendertree") &&
-                additionalTextOutputString.contains("has no method")) {
-            if (additionalTextOutputString.contains("LayoutTestController")) {
-                html.append(" <span class=\"listItem noLtc\">LTC function missing</span>");
-            }
-            if (additionalTextOutputString.contains("EventSender")) {
-                html.append(" <span class=\"listItem noEventSender\">");
-                html.append("ES function missing</span>");
-            }
-        }
-    }
-
-    private static final void appendExpectedResultsSources(AbstractResult result,
-            StringBuilder html) {
-        String textSource = result.getExpectedTextResultPath();
-        String imageSource = result.getExpectedImageResultPath();
-
-        if (result.didCrash()) {
-            html.append("<span class=\"source\">Did not look for expected results</span>");
-            return;
-        }
-
-        if (textSource == null) {
-            // Show if a text result is missing. We may want to revisit this decision when we add
-            // support for image results.
-            html.append("<span class=\"source\">Expected textual result missing</span>");
-        } else {
-            html.append("<span class=\"source\">Expected textual result from: ");
-            html.append("<a href=\"" + ForwarderManager.getHostSchemePort(false) + "LayoutTests/" +
-                    textSource + "\"");
-            html.append(" target=\"_blank\">");
-            html.append(textSource + "</a></span>");
-        }
-        if (imageSource != null) {
-            html.append("<span class=\"source\">Expected image result from: ");
-            html.append("<a href=\"" + ForwarderManager.getHostSchemePort(false) + "LayoutTests/" +
-                    imageSource + "\"");
-            html.append(" target=\"_blank\">");
-            html.append(imageSource + "</a></span>");
-        }
-    }
-
-    private static final URL getViewSourceUrl(String relativePath) {
-        URL url = null;
-        try {
-            url = new URL("http", "localhost", ForwarderManager.HTTP_PORT,
-                    "/Tools/DumpRenderTree/android/view_source.php?src=" +
-                    relativePath);
-        } catch (MalformedURLException e) {
-            assert false : "relativePath=" + relativePath;
-        }
-        return url;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/SummarizerDBHelper.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/SummarizerDBHelper.java
deleted file mode 100644
index 23e13ec..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/SummarizerDBHelper.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.SQLException;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A basic class that wraps database accesses inside itself and provides functionality to
- * store and retrieve AbstractResults.
- */
-public class SummarizerDBHelper {
-    private static final String KEY_ID = "id";
-    private static final String KEY_PATH = "path";
-    private static final String KEY_BYTES = "bytes";
-
-    private static final String DATABASE_NAME = "SummarizerDB";
-    private static final int DATABASE_VERSION = 1;
-
-    static final String EXPECTED_FAILURES_TABLE = "expectedFailures";
-    static final String UNEXPECTED_FAILURES_TABLE = "unexpectedFailures";
-    static final String EXPECTED_PASSES_TABLE = "expextedPasses";
-    static final String UNEXPECTED_PASSES_TABLE = "unexpextedPasses";
-    private static final Set<String> TABLES_NAMES = new HashSet<String>();
-    {
-        TABLES_NAMES.add(EXPECTED_FAILURES_TABLE);
-        TABLES_NAMES.add(EXPECTED_PASSES_TABLE);
-        TABLES_NAMES.add(UNEXPECTED_FAILURES_TABLE);
-        TABLES_NAMES.add(UNEXPECTED_PASSES_TABLE);
-    }
-
-    private static final void createTables(SQLiteDatabase db) {
-        String cmd;
-        for (String tableName : TABLES_NAMES) {
-            cmd = "create table " + tableName + " ("
-                    + KEY_ID + " integer primary key autoincrement, "
-                    + KEY_PATH + " text not null, "
-                    + KEY_BYTES + " blob not null);";
-            db.execSQL(cmd);
-        }
-    }
-
-    private static final void dropTables(SQLiteDatabase db) {
-        for (String tableName : TABLES_NAMES) {
-            db.execSQL("DROP TABLE IF EXISTS " + tableName);
-        }
-    }
-
-    private static class DatabaseHelper extends SQLiteOpenHelper {
-        DatabaseHelper(Context context) {
-            super(context, DATABASE_NAME, null, DATABASE_VERSION);
-        }
-
-        @Override
-        public void onCreate(SQLiteDatabase db) {
-            dropTables(db);
-            createTables(db);
-        }
-
-        @Override
-        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-            /** NOOP for now, because we will never upgrade the db */
-        }
-
-        public void reset(SQLiteDatabase db) {
-            dropTables(db);
-            createTables(db);
-        }
-    }
-
-    private DatabaseHelper mDbHelper;
-    private SQLiteDatabase mDb;
-
-    private final Context mContext;
-
-    public SummarizerDBHelper(Context ctx) {
-        mContext = ctx;
-        mDbHelper = new DatabaseHelper(mContext);
-    }
-
-    public void reset() {
-        mDbHelper.reset(this.mDb);
-    }
-
-    public void open() throws SQLException {
-        mDb = mDbHelper.getWritableDatabase();
-    }
-
-    public void close() {
-        mDbHelper.close();
-    }
-
-    public void insertAbstractResult(AbstractResult result, String table) {
-        ContentValues cv = new ContentValues();
-        cv.put(KEY_PATH, result.getRelativePath());
-        cv.put(KEY_BYTES, result.getBytes());
-        mDb.insert(table, null, cv);
-    }
-
-    public Cursor getAbstractResults(String table) throws SQLException {
-        return mDb.query(false, table, new String[] {KEY_BYTES}, null, null, null, null,
-                KEY_PATH + " ASC", null);
-    }
-
-    public static AbstractResult getAbstractResult(Cursor cursor) {
-        return AbstractResult.create(cursor.getBlob(cursor.getColumnIndex(KEY_BYTES)));
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java
deleted file mode 100644
index e374c1b..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListActivity.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import com.android.dumprendertree2.scriptsupport.OnEverythingFinishedCallback;
-
-import android.app.Activity;
-import android.app.ProgressDialog;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.view.Gravity;
-import android.view.Window;
-import android.webkit.WebView;
-import android.widget.Toast;
-
-import java.io.File;
-import java.util.ArrayList;
-
-/**
- * An Activity that generates a list of tests and sends the intent to
- * LayoutTestsExecuter to run them. It also restarts the LayoutTestsExecuter
- * after it crashes.
- */
-public class TestsListActivity extends Activity {
-
-    private static final int MSG_TEST_LIST_PRELOADER_DONE = 0;
-
-    /** Constants for adding extras to an intent */
-    public static final String EXTRA_TEST_PATH = "TestPath";
-
-    private static ProgressDialog sProgressDialog;
-
-    private Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_TEST_LIST_PRELOADER_DONE:
-                    sProgressDialog.dismiss();
-                    mTestsList = (ArrayList<String>)msg.obj;
-                    mTotalTestCount = mTestsList.size();
-                    restartExecutor(0);
-                    break;
-            }
-        }
-    };
-
-    private ArrayList<String> mTestsList;
-    private int mTotalTestCount;
-
-    private OnEverythingFinishedCallback mOnEverythingFinishedCallback;
-    private boolean mEverythingFinished;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        /** Prepare the progress dialog */
-        sProgressDialog = new ProgressDialog(TestsListActivity.this);
-        sProgressDialog.setCancelable(false);
-        sProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
-        sProgressDialog.setTitle(R.string.dialog_progress_title);
-        sProgressDialog.setMessage(getText(R.string.dialog_progress_msg));
-
-        requestWindowFeature(Window.FEATURE_PROGRESS);
-
-        Intent intent = getIntent();
-        if (!intent.getAction().equals(Intent.ACTION_RUN)) {
-            return;
-        }
-        String path = intent.getStringExtra(EXTRA_TEST_PATH);
-
-        sProgressDialog.show();
-        Message doneMsg = Message.obtain(mHandler, MSG_TEST_LIST_PRELOADER_DONE);
-
-        Intent serviceIntent = new Intent(this, ManagerService.class);
-        serviceIntent.putExtra("path", path);
-        startService(serviceIntent);
-
-        new TestsListPreloaderThread(path, doneMsg).start();
-    }
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        if (intent.getAction().equals(Intent.ACTION_REBOOT)) {
-            onCrashIntent(intent);
-        } else if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) {
-            onEverythingFinishedIntent(intent);
-        }
-    }
-
-    /**
-     * This method handles an intent that comes from ManageService when crash is detected.
-     * The intent contains an index in mTestsList of the test that crashed. TestsListActivity
-     * restarts the LayoutTestsExecutor from the following test in mTestsList, by sending
-     * an intent to it. This new intent contains a list of remaining tests to run,
-     * total count of all tests, and the index of the first test to run after restarting.
-     * LayoutTestExecutor runs then as usual, sending reports to ManagerService. If it
-     * detects the crash it sends a new intent and the flow repeats.
-     */
-    private void onCrashIntent(Intent intent) {
-        int nextTestToRun = intent.getIntExtra("crashedTestIndex", -1) + 1;
-        if (nextTestToRun > 0 && nextTestToRun <= mTotalTestCount) {
-            restartExecutor(nextTestToRun);
-        }
-    }
-
-    public void registerOnEverythingFinishedCallback(OnEverythingFinishedCallback callback) {
-        mOnEverythingFinishedCallback = callback;
-        if (mEverythingFinished) {
-            mOnEverythingFinishedCallback.onFinished();
-        }
-    }
-
-    private void onEverythingFinishedIntent(Intent intent) {
-        Toast toast = Toast.makeText(this,
-                "All tests finished.\nPress back key to return to the tests' list.",
-                Toast.LENGTH_LONG);
-        toast.setGravity(Gravity.CENTER, -40, 0);
-        toast.show();
-
-        /** Show the details to the user */
-        WebView webView = new WebView(this);
-        webView.getSettings().setJavaScriptEnabled(true);
-        webView.getSettings().setBuiltInZoomControls(true);
-        webView.getSettings().setEnableSmoothTransition(true);
-        /** This enables double-tap to zoom */
-        webView.getSettings().setUseWideViewPort(true);
-
-        setContentView(webView);
-        webView.loadUrl(Summarizer.getDetailsUri().toString());
-
-        mEverythingFinished = true;
-        if (mOnEverythingFinishedCallback != null) {
-            mOnEverythingFinishedCallback.onFinished();
-        }
-    }
-
-    /**
-     * This, together with android:configChanges="orientation" in manifest file, prevents
-     * the activity from restarting on orientation change.
-     */
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        outState.putStringArrayList("testsList", mTestsList);
-        outState.putInt("totalCount", mTotalTestCount);
-
-        super.onSaveInstanceState(outState);
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Bundle savedInstanceState) {
-        super.onRestoreInstanceState(savedInstanceState);
-
-        mTestsList = savedInstanceState.getStringArrayList("testsList");
-        mTotalTestCount = savedInstanceState.getInt("totalCount");
-    }
-
-    /**
-     * (Re)starts the executer activity from the given test number (inclusive, 0-based).
-     * This number is an index in mTestsList, not the sublist passed in the intent.
-     *
-     * @param startFrom
-     *      test index in mTestsList to start the tests from (inclusive, 0-based)
-     */
-    private void restartExecutor(int startFrom) {
-        Intent intent = new Intent();
-        intent.setClass(this, LayoutTestsExecutor.class);
-        intent.setAction(Intent.ACTION_RUN);
-
-        if (startFrom < mTotalTestCount) {
-            File testListFile = new File(getExternalFilesDir(null), "test_list.txt");
-            FsUtils.saveTestListToStorage(testListFile, startFrom, mTestsList);
-            intent.putExtra(LayoutTestsExecutor.EXTRA_TESTS_FILE, testListFile.getAbsolutePath());
-            intent.putExtra(LayoutTestsExecutor.EXTRA_TEST_INDEX, startFrom);
-        } else {
-            intent.putExtra(LayoutTestsExecutor.EXTRA_TESTS_FILE, "");
-        }
-
-        startActivity(intent);
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java
deleted file mode 100644
index ab98830..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TestsListPreloaderThread.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.os.Environment;
-import android.os.Message;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * A Thread that is responsible for generating a lists of tests to run.
- */
-public class TestsListPreloaderThread extends Thread {
-
-    private static final String LOG_TAG = "TestsListPreloaderThread";
-
-    /** A list containing relative paths of tests to run */
-    private ArrayList<String> mTestsList = new ArrayList<String>();
-
-    private FileFilter mFileFilter;
-
-    /**
-     * A relative path to the directory with the tests we want to run or particular test.
-     * Used up to and including preloadTests().
-     */
-    private String mRelativePath;
-
-    private Message mDoneMsg;
-
-    /**
-     * The given path must be relative to the root dir.
-     *
-     * @param path
-     * @param doneMsg
-     */
-    public TestsListPreloaderThread(String path, Message doneMsg) {
-        mRelativePath = path;
-        mDoneMsg = doneMsg;
-    }
-
-    @Override
-    public void run() {
-        mFileFilter = new FileFilter();
-        if (FileFilter.isTestFile(mRelativePath)) {
-            mTestsList.add(mRelativePath);
-        } else {
-            loadTestsFromUrl(mRelativePath);
-        }
-
-        mDoneMsg.obj = mTestsList;
-        mDoneMsg.sendToTarget();
-    }
-
-    /**
-     * Loads all the tests from the given directories and all the subdirectories
-     * into mTestsList.
-     *
-     * @param dirRelativePath
-     */
-    private void loadTestsFromUrl(String rootRelativePath) {
-        LinkedList<String> directoriesList = new LinkedList<String>();
-        directoriesList.add(rootRelativePath);
-
-        String relativePath;
-        String itemName;
-        while (!directoriesList.isEmpty()) {
-            relativePath = directoriesList.removeFirst();
-
-            List<String> dirRelativePaths = FsUtils.getLayoutTestsDirContents(relativePath, false, true);
-            if (dirRelativePaths != null) {
-                for (String dirRelativePath : dirRelativePaths) {
-                    itemName = new File(dirRelativePath).getName();
-                    if (FileFilter.isTestDir(itemName)) {
-                        directoriesList.add(dirRelativePath);
-                    }
-                }
-            }
-
-            List<String> testRelativePaths = FsUtils.getLayoutTestsDirContents(relativePath, false, false);
-            if (testRelativePaths != null) {
-                for (String testRelativePath : testRelativePaths) {
-                    itemName = new File(testRelativePath).getName();
-                    if (FileFilter.isTestFile(itemName)) {
-                        /** We choose to skip all the tests that are expected to crash. */
-                        if (!mFileFilter.isCrash(testRelativePath)) {
-                            mTestsList.add(testRelativePath);
-                        } else {
-                            /**
-                             * TODO: Summarizer is now in service - figure out how to send the info.
-                             * Previously: mSummarizer.addSkippedTest(relativePath);
-                             */
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TextResult.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/TextResult.java
deleted file mode 100644
index fd1c0ad..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/TextResult.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.webkit.WebView;
-import android.webkit.WebViewClassic;
-
-import name.fraser.neil.plaintext.diff_match_patch;
-
-import java.util.LinkedList;
-
-/**
- * A result object for which the expected output is text. It does not have an image
- * expected result.
- *
- * <p>Created if layoutTestController.dumpAsText() was called.
- */
-public class TextResult extends AbstractResult {
-
-    private static final int MSG_DOCUMENT_AS_TEXT = 0;
-
-    private String mExpectedResult;
-    private String mExpectedResultPath;
-    private String mActualResult;
-    private String mRelativePath;
-    private boolean mDidTimeOut;
-    private ResultCode mResultCode;
-    transient private Message mResultObtainedMsg;
-
-    private boolean mDumpChildFramesAsText;
-
-    transient private Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == MSG_DOCUMENT_AS_TEXT) {
-                mActualResult = (String)msg.obj;
-                mResultObtainedMsg.sendToTarget();
-            }
-        }
-    };
-
-    public TextResult(String relativePath) {
-        mRelativePath = relativePath;
-    }
-
-    public void setDumpChildFramesAsText(boolean dumpChildFramesAsText) {
-        mDumpChildFramesAsText = dumpChildFramesAsText;
-    }
-
-    /**
-     * Used to recreate the Result when received by the service.
-     *
-     * @param bundle
-     *      bundle with data used to recreate the result
-     */
-    public TextResult(Bundle bundle) {
-        mExpectedResult = bundle.getString("expectedTextualResult");
-        mExpectedResultPath = bundle.getString("expectedTextualResultPath");
-        mActualResult = bundle.getString("actualTextualResult");
-        setAdditionalTextOutputString(bundle.getString("additionalTextOutputString"));
-        mRelativePath = bundle.getString("relativePath");
-        mDidTimeOut = bundle.getBoolean("didTimeOut");
-    }
-
-    @Override
-    public void clearResults() {
-        super.clearResults();
-        mExpectedResult = null;
-        mActualResult = null;
-    }
-
-    @Override
-    public ResultCode getResultCode() {
-        if (mResultCode == null) {
-            mResultCode = resultsMatch() ? AbstractResult.ResultCode.RESULTS_MATCH
-                    : AbstractResult.ResultCode.RESULTS_DIFFER;
-        }
-        return mResultCode;
-    }
-
-    private boolean resultsMatch() {
-        assert mExpectedResult != null;
-        assert mActualResult != null;
-        // Trim leading and trailing empty lines, as other WebKit platforms do.
-        String leadingEmptyLines = "^\\n+";
-        String trailingEmptyLines = "\\n+$";
-        String trimmedExpectedResult = mExpectedResult.replaceFirst(leadingEmptyLines, "")
-                .replaceFirst(trailingEmptyLines, "");
-        String trimmedActualResult = mActualResult.replaceFirst(leadingEmptyLines, "")
-                .replaceFirst(trailingEmptyLines, "");
-        return trimmedExpectedResult.equals(trimmedActualResult);
-    }
-
-    @Override
-    public boolean didCrash() {
-        return false;
-    }
-
-    @Override
-    public boolean didTimeOut() {
-        return mDidTimeOut;
-    }
-
-    @Override
-    public void setDidTimeOut() {
-        mDidTimeOut = true;
-    }
-
-    @Override
-    public byte[] getActualImageResult() {
-        return null;
-    }
-
-    @Override
-    public String getActualTextResult() {
-        String additionalTextResultString = getAdditionalTextOutputString();
-        if (additionalTextResultString != null) {
-            return additionalTextResultString + mActualResult;
-        }
-
-        return mActualResult;
-    }
-
-    @Override
-    public void setExpectedImageResult(byte[] expectedResult) {
-        /** This method is not applicable to this type of result */
-    }
-
-    @Override
-    public void setExpectedImageResultPath(String relativePath) {
-        /** This method is not applicable to this type of result */
-    }
-
-    @Override
-    public String getExpectedImageResultPath() {
-        /** This method is not applicable to this type of result */
-        return null;
-    }
-
-    @Override
-    public void setExpectedTextResultPath(String relativePath) {
-        mExpectedResultPath = relativePath;
-    }
-
-    @Override
-    public String getExpectedTextResultPath() {
-        return mExpectedResultPath;
-    }
-
-    @Override
-    public void setExpectedTextResult(String expectedResult) {
-        // For text results, we use an empty string for the expected result when none is
-        // present, as other WebKit platforms do.
-        mExpectedResult = expectedResult == null ? "" : expectedResult;
-    }
-
-    @Override
-    public String getDiffAsHtml() {
-        assert mExpectedResult != null;
-        assert mActualResult != null;
-
-        StringBuilder html = new StringBuilder();
-        html.append("<table class=\"visual_diff\">");
-        html.append("    <tr class=\"headers\">");
-        html.append("        <td colspan=\"2\">Expected result:</td>");
-        html.append("        <td class=\"space\"></td>");
-        html.append("        <td colspan=\"2\">Actual result:</td>");
-        html.append("    </tr>");
-
-        appendDiffHtml(html);
-
-        html.append("    <tr class=\"footers\">");
-        html.append("        <td colspan=\"2\"></td>");
-        html.append("        <td class=\"space\"></td>");
-        html.append("        <td colspan=\"2\"></td>");
-        html.append("    </tr>");
-        html.append("</table>");
-
-        return html.toString();
-    }
-
-    private void appendDiffHtml(StringBuilder html) {
-        LinkedList<diff_match_patch.Diff> diffs =
-                new diff_match_patch().diff_main(mExpectedResult, mActualResult);
-
-        diffs = VisualDiffUtils.splitDiffsOnNewline(diffs);
-
-        LinkedList<String> expectedLines = new LinkedList<String>();
-        LinkedList<Integer> expectedLineNums = new LinkedList<Integer>();
-        LinkedList<String> actualLines = new LinkedList<String>();
-        LinkedList<Integer> actualLineNums = new LinkedList<Integer>();
-
-        VisualDiffUtils.generateExpectedResultLines(diffs, expectedLineNums, expectedLines);
-        VisualDiffUtils.generateActualResultLines(diffs, actualLineNums, actualLines);
-        // TODO: We should use a map for each line number and lines pair.
-        assert expectedLines.size() == expectedLineNums.size();
-        assert actualLines.size() == actualLineNums.size();
-        assert expectedLines.size() == actualLines.size();
-
-        html.append(VisualDiffUtils.getHtml(expectedLineNums, expectedLines,
-                actualLineNums, actualLines));
-    }
-
-    @Override
-    public TestType getType() {
-        return TestType.TEXT;
-    }
-
-    @Override
-    public void obtainActualResults(WebView webview, Message resultObtainedMsg) {
-        mResultObtainedMsg = resultObtainedMsg;
-        Message msg = mHandler.obtainMessage(MSG_DOCUMENT_AS_TEXT);
-
-        /**
-         * arg1 - should dump top frame as text
-         * arg2 - should dump child frames as text
-         */
-        msg.arg1 = 1;
-        msg.arg2 = mDumpChildFramesAsText ? 1 : 0;
-        WebViewClassic.fromWebView(webview).documentAsText(msg);
-    }
-
-    @Override
-    public Bundle getBundle() {
-        Bundle bundle = new Bundle();
-        bundle.putString("expectedTextualResult", mExpectedResult);
-        bundle.putString("expectedTextualResultPath", mExpectedResultPath);
-        bundle.putString("actualTextualResult", getActualTextResult());
-        bundle.putString("additionalTextOutputString", getAdditionalTextOutputString());
-        bundle.putString("relativePath", mRelativePath);
-        bundle.putBoolean("didTimeOut", mDidTimeOut);
-        bundle.putString("type", getType().name());
-        return bundle;
-    }
-
-    @Override
-    public String getRelativePath() {
-        return mRelativePath;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/VisualDiffUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/VisualDiffUtils.java
deleted file mode 100644
index d7f7313..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/VisualDiffUtils.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2;
-
-import name.fraser.neil.plaintext.diff_match_patch;
-
-import java.util.LinkedList;
-
-/**
- * Helper methods fo TextResult.getDiffAsHtml()
- */
-public class VisualDiffUtils {
-
-    private static final int DONT_PRINT_LINE_NUMBER = -1;
-
-    /**
-     * Preprocesses the list of diffs so that new line characters appear only at the end of
-     * diff.text
-     *
-     * @param diffs
-     * @return
-     *      LinkedList of diffs where new line character appears only on the end of
-     *      diff.text
-     */
-    public static LinkedList<diff_match_patch.Diff> splitDiffsOnNewline(
-            LinkedList<diff_match_patch.Diff> diffs) {
-        LinkedList<diff_match_patch.Diff> newDiffs = new LinkedList<diff_match_patch.Diff>();
-
-        String[] parts;
-        int lengthMinusOne;
-        for (diff_match_patch.Diff diff : diffs) {
-            parts = diff.text.split("\n", -1);
-            if (parts.length == 1) {
-                newDiffs.add(diff);
-                continue;
-            }
-
-            lengthMinusOne = parts.length - 1;
-            for (int i = 0; i < lengthMinusOne; i++) {
-                newDiffs.add(new diff_match_patch.Diff(diff.operation, parts[i] + "\n"));
-            }
-            if (!parts[lengthMinusOne].isEmpty()) {
-                newDiffs.add(new diff_match_patch.Diff(diff.operation, parts[lengthMinusOne]));
-            }
-        }
-
-        return newDiffs;
-    }
-
-    public static void generateExpectedResultLines(LinkedList<diff_match_patch.Diff> diffs,
-            LinkedList<Integer> lineNums, LinkedList<String> lines) {
-        String delSpan = "<span class=\"del\">";
-        String eqlSpan = "<span class=\"eql\">";
-
-        String line = "";
-        int i = 1;
-        diff_match_patch.Diff diff;
-        int size = diffs.size();
-        boolean isLastDiff;
-        for (int j = 0; j < size; j++) {
-            diff = diffs.get(j);
-            isLastDiff = j == size - 1;
-            switch (diff.operation) {
-                case DELETE:
-                    line = processDiff(diff, lineNums, lines, line, i, delSpan, isLastDiff);
-                    if (line.equals("")) {
-                        i++;
-                    }
-                    break;
-
-                case INSERT:
-                    // If the line is currently empty and this insertion is the entire line, the
-                    // expected line is absent, so it has no line number.
-                    if (diff.text.endsWith("\n") || isLastDiff) {
-                        lineNums.add(line.equals("") ? DONT_PRINT_LINE_NUMBER : i++);
-                        lines.add(line);
-                        line = "";
-                    }
-                    break;
-
-                case EQUAL:
-                    line = processDiff(diff, lineNums, lines, line, i, eqlSpan, isLastDiff);
-                    if (line.equals("")) {
-                        i++;
-                    }
-                    break;
-            }
-        }
-    }
-
-    public static void generateActualResultLines(LinkedList<diff_match_patch.Diff> diffs,
-            LinkedList<Integer> lineNums, LinkedList<String> lines) {
-        String insSpan = "<span class=\"ins\">";
-        String eqlSpan = "<span class=\"eql\">";
-
-        String line = "";
-        int i = 1;
-        diff_match_patch.Diff diff;
-        int size = diffs.size();
-        boolean isLastDiff;
-        for (int j = 0; j < size; j++) {
-            diff = diffs.get(j);
-            isLastDiff = j == size - 1;
-            switch (diff.operation) {
-                case INSERT:
-                    line = processDiff(diff, lineNums, lines, line, i, insSpan, isLastDiff);
-                    if (line.equals("")) {
-                        i++;
-                    }
-                    break;
-
-                case DELETE:
-                    // If the line is currently empty and deletion is the entire line, the
-                    // actual line is absent, so it has no line number.
-                    if (diff.text.endsWith("\n") || isLastDiff) {
-                        lineNums.add(line.equals("") ? DONT_PRINT_LINE_NUMBER : i++);
-                        lines.add(line);
-                        line = "";
-                    }
-                    break;
-
-                case EQUAL:
-                    line = processDiff(diff, lineNums, lines, line, i, eqlSpan, isLastDiff);
-                    if (line.equals("")) {
-                        i++;
-                    }
-                    break;
-            }
-        }
-    }
-
-    /**
-     * Generate or append a line for a given diff and add it to given collections if necessary.
-     * It puts diffs in HTML spans.
-     *
-     * @param diff
-     * @param lineNums
-     * @param lines
-     * @param line
-     * @param i
-     * @param begSpan
-     * @param forceOutputLine Force the current line to be output
-     * @return
-     */
-    public static String processDiff(diff_match_patch.Diff diff, LinkedList<Integer> lineNums,
-            LinkedList<String> lines, String line, int i, String begSpan, boolean forceOutputLine) {
-        String endSpan = "</span>";
-        String br = "&nbsp;";
-
-        if (diff.text.endsWith("\n") || forceOutputLine) {
-            lineNums.add(i);
-            /** TODO: Think of better way to replace stuff */
-            line += begSpan + diff.text.replace("  ", "&nbsp;&nbsp;")
-                    + endSpan + br;
-            lines.add(line);
-            line = "";
-        } else {
-            line += begSpan + diff.text.replace("  ", "&nbsp;&nbsp;") + endSpan;
-        }
-
-        return line;
-    }
-
-    public static String getHtml(LinkedList<Integer> lineNums1, LinkedList<String> lines1,
-            LinkedList<Integer> lineNums2, LinkedList<String> lines2) {
-        StringBuilder html = new StringBuilder();
-        int lineNum;
-        int size = lines1.size();
-        for (int i = 0; i < size; i++) {
-            html.append("<tr class=\"results\">");
-
-            html.append("    <td class=\"line_count\">");
-            lineNum = lineNums1.removeFirst();
-            if (lineNum > 0) {
-                html.append(lineNum);
-            }
-            html.append("    </td>");
-
-            html.append("    <td class=\"line\">");
-            html.append(lines1.removeFirst());
-            html.append("    </td>");
-
-            html.append("    <td class=\"space\"></td>");
-
-            html.append("    <td class=\"line_count\">");
-            lineNum = lineNums2.removeFirst();
-            if (lineNum > 0) {
-                html.append(lineNum);
-            }
-            html.append("    </td>");
-
-            html.append("    <td class=\"line\">");
-            html.append(lines2.removeFirst());
-            html.append("    </td>");
-
-            html.append("</tr>");
-        }
-        return html.toString();
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java
deleted file mode 100644
index 224509d..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/AdbUtils.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2.forwarder;
-
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/**
- * The utility class that can setup a socket allowing the device to communicate with remote
- * machines through the machine that the device is connected to via adb.
- */
-public class AdbUtils {
-    private static final String LOG_TAG = "AdbUtils";
-
-    private static final String ADB_OK = "OKAY";
-    private static final int ADB_PORT = 5037;
-    private static final String ADB_HOST = "127.0.0.1";
-    private static final int ADB_RESPONSE_SIZE = 4;
-
-    /**
-     * Creates a new socket that can be configured to serve as a transparent proxy to a
-     * remote machine. This can be achieved by calling configureSocket()
-     *
-     * @return a socket that can be configured to link to remote machine
-     * @throws IOException
-     */
-    public static Socket createSocket() throws IOException{
-        return new Socket(ADB_HOST, ADB_PORT);
-    }
-
-    /**
-     * Configures the connection to serve as a transparent proxy to a remote machine.
-     * The given streams must belong to a socket created by createSocket().
-     *
-     * @param inputStream inputStream of the socket we want to configure
-     * @param outputStream outputStream of the socket we want to configure
-     * @param remoteAddress address of the remote machine (as you would type in a browser
-     *      in a machine that the device is connected to via adb)
-     * @param remotePort port on which to connect
-     * @return if the configuration suceeded
-     * @throws IOException
-     */
-    public static boolean configureConnection(InputStream inputStream, OutputStream outputStream,
-            String remoteAddress, int remotePort) throws IOException {
-        String cmd = "tcp:" + remotePort + ":" + remoteAddress;
-        cmd = String.format("%04X", cmd.length()) + cmd;
-
-        byte[] buf = new byte[ADB_RESPONSE_SIZE];
-        outputStream.write(cmd.getBytes());
-        int read = inputStream.read(buf);
-        if (read != ADB_RESPONSE_SIZE || !ADB_OK.equals(new String(buf))) {
-            Log.w(LOG_TAG, "adb cmd failed.");
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java
deleted file mode 100644
index f19cd41..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ConnectionHandler.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2.forwarder;
-
-import android.util.Log;
-
-import com.android.dumprendertree2.FsUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/**
- * Worker class for {@link Forwarder}. A ConnectionHandler will be created once the Forwarder
- * accepts an incoming connection, and it will then forward the incoming/outgoing streams to a
- * connection already proxied by adb networking (see also {@link AdbUtils}).
- */
-public class ConnectionHandler {
-
-    private static final String LOG_TAG = "ConnectionHandler";
-
-    public static interface OnFinishedCallback {
-        public void onFinished();
-    }
-
-    private class SocketPipeThread extends Thread {
-
-        private InputStream mInputStream;
-        private OutputStream mOutputStream;
-
-        public SocketPipeThread(InputStream inputStream, OutputStream outputStream) {
-            mInputStream = inputStream;
-            mOutputStream = outputStream;
-            setName("SocketPipeThread: " + getName());
-        }
-
-        @Override
-        public void run() {
-            byte[] buffer = new byte[4096];
-            int length;
-            while (true) {
-                try {
-                    if ((length = mInputStream.read(buffer)) < 0) {
-                        break;
-                    }
-                    mOutputStream.write(buffer, 0, length);
-                } catch (IOException e) {
-                    /** This exception means one of the streams is closed */
-                    Log.v(LOG_TAG, this.toString(), e);
-                    break;
-                }
-            }
-
-            synchronized (mThreadsRunning) {
-                mThreadsRunning--;
-                if (mThreadsRunning == 0) {
-                    ConnectionHandler.this.stop();
-                    mOnFinishedCallback.onFinished();
-                }
-            }
-        }
-
-        @Override
-        public String toString() {
-            return getName();
-        }
-    }
-
-    private Integer mThreadsRunning;
-
-    private Socket mFromSocket, mToSocket;
-    private SocketPipeThread mFromToPipe, mToFromPipe;
-    private InputStream mFromSocketInputStream, mToSocketInputStream;
-    private OutputStream mFromSocketOutputStream, mToSocketOutputStream;
-
-    private int mPort;
-    private String mRemoteMachineIpAddress;
-
-    private OnFinishedCallback mOnFinishedCallback;
-
-    public ConnectionHandler(String remoteMachineIp, int port, Socket fromSocket, Socket toSocket)
-            throws IOException {
-        mRemoteMachineIpAddress = remoteMachineIp;
-        mPort = port;
-
-        mFromSocket = fromSocket;
-        mToSocket = toSocket;
-
-        try {
-            mFromSocketInputStream = mFromSocket.getInputStream();
-            mToSocketInputStream = mToSocket.getInputStream();
-            mFromSocketOutputStream = mFromSocket.getOutputStream();
-            mToSocketOutputStream = mToSocket.getOutputStream();
-            AdbUtils.configureConnection(mToSocketInputStream, mToSocketOutputStream,
-                    mRemoteMachineIpAddress, mPort);
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "Unable to start ConnectionHandler", e);
-            closeStreams();
-            throw e;
-        }
-
-        mFromToPipe = new SocketPipeThread(mFromSocketInputStream, mToSocketOutputStream);
-        mToFromPipe = new SocketPipeThread(mToSocketInputStream, mFromSocketOutputStream);
-    }
-
-    public void registerOnConnectionHandlerFinishedCallback(OnFinishedCallback callback) {
-        mOnFinishedCallback = callback;
-    }
-
-    private void closeStreams() {
-        FsUtils.closeInputStream(mFromSocketInputStream);
-        FsUtils.closeInputStream(mToSocketInputStream);
-        FsUtils.closeOutputStream(mFromSocketOutputStream);
-        FsUtils.closeOutputStream(mToSocketOutputStream);
-    }
-
-    public void start() {
-        /** We have 2 threads running, one for each pipe, that we start here. */
-        mThreadsRunning = 2;
-        mFromToPipe.start();
-        mToFromPipe.start();
-    }
-
-    public void stop() {
-        shutdown(mFromSocket);
-        shutdown(mToSocket);
-    }
-
-    private void shutdown(Socket socket) {
-        synchronized (mFromToPipe) {
-            synchronized (mToFromPipe) {
-                /** This will stop the while loop in the run method */
-                try {
-                    if (!socket.isInputShutdown()) {
-                        socket.shutdownInput();
-                    }
-                } catch (IOException e) {
-                    Log.e(LOG_TAG, "mFromToPipe=" + mFromToPipe + " mToFromPipe=" + mToFromPipe, e);
-                }
-                try {
-                    if (!socket.isOutputShutdown()) {
-                        socket.shutdownOutput();
-                    }
-                } catch (IOException e) {
-                    Log.e(LOG_TAG, "mFromToPipe=" + mFromToPipe + " mToFromPipe=" + mToFromPipe, e);
-                }
-                try {
-                    if (!socket.isClosed()) {
-                        socket.close();
-                    }
-                } catch (IOException e) {
-                    Log.e(LOG_TAG, "mFromToPipe=" + mFromToPipe + " mToFromPipe=" + mToFromPipe, e);
-                }
-            }
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java
deleted file mode 100644
index ce22fa0..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/Forwarder.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2.forwarder;
-
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A port forwarding server. Listens on localhost on specified port and forwards the tcp
- * communications to external socket via adb networking proxy.
- */
-public class Forwarder extends Thread {
-    private static final String LOG_TAG = "Forwarder";
-
-    private int mPort;
-    private String mRemoteMachineIpAddress;
-
-    private ServerSocket mServerSocket;
-
-    private Set<ConnectionHandler> mConnectionHandlers = new HashSet<ConnectionHandler>();
-
-    public Forwarder(int port, String remoteMachineIpAddress) {
-        mPort = port;
-        mRemoteMachineIpAddress = remoteMachineIpAddress;
-    }
-
-    @Override
-    public void start() {
-        Log.i(LOG_TAG, "start(): Starting fowarder on port: " + mPort);
-
-        try {
-            mServerSocket = new ServerSocket(mPort);
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "mPort=" + mPort, e);
-            return;
-        }
-
-        super.start();
-    }
-
-    @Override
-    public void run() {
-        while (true) {
-            Socket localSocket;
-            try {
-                localSocket = mServerSocket.accept();
-            } catch (IOException e) {
-                /** This most likely means that mServerSocket is already closed */
-                Log.w(LOG_TAG, "mPort=" + mPort, e);
-                break;
-            }
-
-            Socket remoteSocket = null;
-            final ConnectionHandler connectionHandler;
-            try {
-                remoteSocket = AdbUtils.createSocket();
-                connectionHandler = new ConnectionHandler(
-                        mRemoteMachineIpAddress, mPort, localSocket, remoteSocket);
-            } catch (IOException exception) {
-                try {
-                    localSocket.close();
-                } catch (IOException e) {
-                    Log.e(LOG_TAG, "mPort=" + mPort, e);
-                }
-                if (remoteSocket != null) {
-                    try {
-                        remoteSocket.close();
-                    } catch (IOException e) {
-                        Log.e(LOG_TAG, "mPort=" + mPort, e);
-                    }
-                }
-                continue;
-            }
-
-            /**
-             * We have to close the sockets after the ConnectionHandler finishes, so we
-             * don't get "Too may open files" exception. We also remove the ConnectionHandler
-             * from the collection to avoid memory issues.
-             * */
-            ConnectionHandler.OnFinishedCallback callback =
-                    new ConnectionHandler.OnFinishedCallback() {
-                @Override
-                public void onFinished() {
-                    synchronized (this) {
-                        if (!mConnectionHandlers.remove(connectionHandler)) {
-                            assert false : "removeConnectionHandler(): not in the collection";
-                        }
-                    }
-                }
-            };
-            connectionHandler.registerOnConnectionHandlerFinishedCallback(callback);
-
-            synchronized (this) {
-                mConnectionHandlers.add(connectionHandler);
-            }
-            connectionHandler.start();
-        }
-
-        synchronized (this) {
-            for (ConnectionHandler connectionHandler : mConnectionHandlers) {
-                connectionHandler.stop();
-            }
-        }
-    }
-
-    public void finish() {
-        try {
-            mServerSocket.close();
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "mPort=" + mPort, e);
-        }
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ForwarderManager.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ForwarderManager.java
deleted file mode 100644
index cff436ff..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/forwarder/ForwarderManager.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2.forwarder;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import android.util.Log;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A simple class to start and stop Forwarders running on some ports.
- *
- * It uses a singleton pattern and is thread safe.
- */
-public class ForwarderManager {
-    private static final String LOG_TAG = "ForwarderManager";
-
-    /**
-     * The IP address of the server serving the tests.
-     */
-    private static final String HOST_IP = "127.0.0.1";
-
-    /**
-     * We use these ports because other webkit platforms do. They are set up in
-     * external/webkit/LayoutTests/http/conf/apache2-debian-httpd.conf
-     */
-    public static final int HTTP_PORT = 8000;
-    public static final int HTTPS_PORT = 8443;
-
-    private static ForwarderManager forwarderManager;
-
-    private Set<Forwarder> mForwarders;
-    private boolean mIsStarted;
-
-    private ForwarderManager() {
-        mForwarders = new HashSet<Forwarder>(2);
-        mForwarders.add(new Forwarder(HTTP_PORT, HOST_IP));
-        mForwarders.add(new Forwarder(HTTPS_PORT, HOST_IP));
-    }
-
-    /**
-     * Returns the main part of the URL with the trailing slash
-     *
-     * @param isHttps
-     * @return
-     */
-    public static final String getHostSchemePort(boolean isHttps) {
-        int port;
-        String protocol;
-        if (isHttps) {
-            protocol = "https";
-            port = HTTPS_PORT;
-        } else {
-            protocol = "http";
-            port = HTTP_PORT;
-        }
-
-        URL url = null;
-        try {
-            url = new URL(protocol, HOST_IP, port, "/");
-        } catch (MalformedURLException e) {
-            assert false : "isHttps=" + isHttps;
-        }
-
-        return url.toString();
-    }
-
-    public static synchronized ForwarderManager getForwarderManager() {
-        if (forwarderManager == null) {
-            forwarderManager = new ForwarderManager();
-        }
-        return forwarderManager;
-    }
-
-    @Override
-    public Object clone() throws CloneNotSupportedException {
-        throw new CloneNotSupportedException();
-    }
-
-    public synchronized void start() {
-        if (mIsStarted) {
-            Log.w(LOG_TAG, "start(): ForwarderManager already running! NOOP.");
-            return;
-        }
-
-        for (Forwarder forwarder : mForwarders) {
-            forwarder.start();
-        }
-
-        mIsStarted = true;
-        Log.i(LOG_TAG, "ForwarderManager started.");
-    }
-
-    public synchronized void stop() {
-        if (!mIsStarted) {
-            Log.w(LOG_TAG, "stop(): ForwarderManager already stopped! NOOP.");
-            return;
-        }
-
-        for (Forwarder forwarder : mForwarders) {
-            forwarder.finish();
-        }
-
-        mIsStarted = false;
-        Log.i(LOG_TAG, "ForwarderManager stopped.");
-    }
-}
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/OnEverythingFinishedCallback.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/OnEverythingFinishedCallback.java
deleted file mode 100644
index e1d4364..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/OnEverythingFinishedCallback.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2.scriptsupport;
-
-/**
- * Callback used to inform scriptsupport.Starter that everything is finished and
- * we can exit
- */
-public interface OnEverythingFinishedCallback {
-    public void onFinished();
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/ScriptTestRunner.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/ScriptTestRunner.java
deleted file mode 100644
index 78f58d5..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/ScriptTestRunner.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2.scriptsupport;
-
-import android.os.Bundle;
-import android.test.InstrumentationTestRunner;
-
-/**
- * Extends InstrumentationTestRunner to allow the script to pass arguments to the application
- */
-public class ScriptTestRunner extends InstrumentationTestRunner {
-    String mTestsRelativePath;
-
-    @Override
-    public void onCreate(Bundle arguments) {
-        mTestsRelativePath = arguments.getString("path");
-        super.onCreate(arguments);
-    }
-
-    public String getTestsRelativePath() {
-        return mTestsRelativePath;
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/Starter.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/Starter.java
deleted file mode 100644
index 6f41a0f..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/scriptsupport/Starter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2.scriptsupport;
-
-import android.content.Intent;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-
-import com.android.dumprendertree2.TestsListActivity;
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-/**
- * A class which provides methods that can be invoked by a script running on the host machine to
- * run the tests.
- *
- * It starts a TestsListActivity and does not return until all the tests finish executing.
- */
-public class Starter extends ActivityInstrumentationTestCase2<TestsListActivity> {
-    private static final String LOG_TAG = "Starter";
-    private boolean mEverythingFinished;
-
-    public Starter() {
-        super(TestsListActivity.class);
-    }
-
-    /**
-     * This method is called from adb to start executing the tests. It doesn't return
-     * until everything is finished so that the script can wait for the end if it needs
-     * to.
-     */
-    public void startLayoutTests() {
-        ScriptTestRunner runner = (ScriptTestRunner)getInstrumentation();
-        String relativePath = runner.getTestsRelativePath();
-
-        ForwarderManager.getForwarderManager().start();
-
-        Intent intent = new Intent();
-        intent.setClassName("com.android.dumprendertree2", "TestsListActivity");
-        intent.setAction(Intent.ACTION_RUN);
-        intent.putExtra(TestsListActivity.EXTRA_TEST_PATH, relativePath);
-        setActivityIntent(intent);
-        getActivity().registerOnEverythingFinishedCallback(new OnEverythingFinishedCallback() {
-            /** This method is safe to call on any thread */
-            @Override
-            public void onFinished() {
-                synchronized (Starter.this) {
-                    mEverythingFinished = true;
-                    Starter.this.notifyAll();
-                }
-            }
-        });
-
-        synchronized (this) {
-            while (!mEverythingFinished) {
-                try {
-                    this.wait();
-                } catch (InterruptedException e) {
-                    Log.e(LOG_TAG, "startLayoutTests()", e);
-                }
-            }
-        }
-
-        ForwarderManager.getForwarderManager().stop();
-    }
-}
\ No newline at end of file
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java
deleted file mode 100644
index 5de69a7..0000000
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ui/DirListActivity.java
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-package com.android.dumprendertree2.ui;
-
-import com.android.dumprendertree2.FileFilter;
-import com.android.dumprendertree2.FsUtils;
-import com.android.dumprendertree2.TestsListActivity;
-import com.android.dumprendertree2.R;
-import com.android.dumprendertree2.forwarder.ForwarderManager;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ListActivity;
-import android.app.ProgressDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Message;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An Activity that allows navigating through tests folders and choosing folders or tests to run.
- */
-public class DirListActivity extends ListActivity {
-
-    private static final String LOG_TAG = "DirListActivity";
-
-    /** TODO: This is just a guess - think of a better way to achieve it */
-    private static final int MEAN_TITLE_CHAR_SIZE = 13;
-
-    private static final int PROGRESS_DIALOG_DELAY_MS = 200;
-
-    /** Code for the dialog, used in showDialog and onCreateDialog */
-    private static final int DIALOG_RUN_ABORT_DIR = 0;
-
-    /** Messages codes */
-    private static final int MSG_LOADED_ITEMS = 0;
-    private static final int MSG_SHOW_PROGRESS_DIALOG = 1;
-
-    private static final CharSequence NO_RESPONSE_MESSAGE =
-            "No response from host when getting directory contents. Is the host server running?";
-
-    /** Initialized lazily before first sProgressDialog.show() */
-    private static ProgressDialog sProgressDialog;
-
-    private ListView mListView;
-
-    /** This is a relative path! */
-    private String mCurrentDirPath;
-
-    /**
-     * A thread responsible for loading the contents of the directory from sd card
-     * and sending them via Message to main thread that then loads them into
-     * ListView
-     */
-    private class LoadListItemsThread extends Thread {
-        private Handler mHandler;
-        private String mRelativePath;
-
-        public LoadListItemsThread(String relativePath, Handler handler) {
-            mRelativePath = relativePath;
-            mHandler = handler;
-        }
-
-        @Override
-        public void run() {
-            Message msg = mHandler.obtainMessage(MSG_LOADED_ITEMS);
-            msg.obj = getDirList(mRelativePath);
-            mHandler.sendMessage(msg);
-        }
-    }
-
-    /**
-     * Very simple object to use inside ListView as an item.
-     */
-    private static class ListItem implements Comparable<ListItem> {
-        private String mRelativePath;
-        private String mName;
-        private boolean mIsDirectory;
-
-        public ListItem(String relativePath, boolean isDirectory) {
-            mRelativePath = relativePath;
-            mName = new File(relativePath).getName();
-            mIsDirectory = isDirectory;
-        }
-
-        public boolean isDirectory() {
-            return mIsDirectory;
-        }
-
-        public String getRelativePath() {
-            return mRelativePath;
-        }
-
-        public String getName() {
-            return mName;
-        }
-
-        @Override
-        public int compareTo(ListItem another) {
-            return mRelativePath.compareTo(another.getRelativePath());
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (!(o instanceof ListItem)) {
-                return false;
-            }
-
-            return mRelativePath.equals(((ListItem)o).getRelativePath());
-        }
-
-        @Override
-        public int hashCode() {
-            return mRelativePath.hashCode();
-        }
-
-    }
-
-    /**
-     * A custom adapter that sets the proper icon and label in the list view.
-     */
-    private static class DirListAdapter extends ArrayAdapter<ListItem> {
-        private Activity mContext;
-        private ListItem[] mItems;
-
-        public DirListAdapter(Activity context, ListItem[] items) {
-            super(context, R.layout.dirlist_row, items);
-
-            mContext = context;
-            mItems = items;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            LayoutInflater inflater = mContext.getLayoutInflater();
-            View row = inflater.inflate(R.layout.dirlist_row, null);
-
-            TextView label = (TextView)row.findViewById(R.id.label);
-            label.setText(mItems[position].getName());
-
-            ImageView icon = (ImageView)row.findViewById(R.id.icon);
-            if (mItems[position].isDirectory()) {
-                icon.setImageResource(R.drawable.folder);
-            } else {
-                icon.setImageResource(R.drawable.runtest);
-            }
-
-            return row;
-        }
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        ForwarderManager.getForwarderManager().start();
-
-        mListView = getListView();
-
-        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                ListItem item = (ListItem)parent.getItemAtPosition(position);
-
-                if (item.isDirectory()) {
-                    showDir(item.getRelativePath());
-                } else {
-                    /** Run the test */
-                    runAllTestsUnder(item.getRelativePath());
-                }
-            }
-        });
-
-        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
-            @Override
-            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
-                ListItem item = (ListItem)parent.getItemAtPosition(position);
-
-                if (item.isDirectory()) {
-                    Bundle arguments = new Bundle(1);
-                    arguments.putString("name", item.getName());
-                    arguments.putString("relativePath", item.getRelativePath());
-                    showDialog(DIALOG_RUN_ABORT_DIR, arguments);
-                } else {
-                    /** TODO: Maybe show some info about a test? */
-                }
-
-                return true;
-            }
-        });
-
-        /** All the paths are relative to test root dir where possible */
-        showDir("");
-    }
-
-    private void runAllTestsUnder(String relativePath) {
-        Intent intent = new Intent();
-        intent.setClass(DirListActivity.this, TestsListActivity.class);
-        intent.setAction(Intent.ACTION_RUN);
-        intent.putExtra(TestsListActivity.EXTRA_TEST_PATH, relativePath);
-        startActivity(intent);
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        MenuInflater inflater = getMenuInflater();
-        inflater.inflate(R.menu.gui_menu, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case R.id.run_all:
-                runAllTestsUnder(mCurrentDirPath);
-                return true;
-            default:
-                return super.onOptionsItemSelected(item);
-        }
-    }
-
-    @Override
-    /**
-     * Moves to the parent directory if one exists. Does not allow to move above
-     * the test 'root' directory.
-     */
-    public void onBackPressed() {
-        File currentDirParent = new File(mCurrentDirPath).getParentFile();
-        if (currentDirParent != null) {
-            showDir(currentDirParent.getPath());
-        } else {
-            showDir("");
-        }
-    }
-
-    /**
-     * Prevents the activity from recreating on change of orientation. The title needs to
-     * be recalculated.
-     */
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-
-        setTitle(shortenTitle(mCurrentDirPath));
-    }
-
-    @Override
-    protected Dialog onCreateDialog(int id, final Bundle args) {
-        Dialog dialog = null;
-        AlertDialog.Builder builder = new AlertDialog.Builder(this);
-
-        switch (id) {
-            case DIALOG_RUN_ABORT_DIR:
-                builder.setTitle(getText(R.string.dialog_run_abort_dir_title_prefix) + " " +
-                        args.getString("name"));
-                builder.setMessage(R.string.dialog_run_abort_dir_msg);
-                builder.setCancelable(true);
-
-                builder.setPositiveButton(R.string.dialog_run_abort_dir_ok_button,
-                        new DialogInterface.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        removeDialog(DIALOG_RUN_ABORT_DIR);
-                        runAllTestsUnder(args.getString("relativePath"));
-                    }
-                });
-
-                builder.setNegativeButton(R.string.dialog_run_abort_dir_abort_button,
-                        new DialogInterface.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        removeDialog(DIALOG_RUN_ABORT_DIR);
-                    }
-                });
-
-                dialog = builder.create();
-                dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
-                    @Override
-                    public void onCancel(DialogInterface dialog) {
-                        removeDialog(DIALOG_RUN_ABORT_DIR);
-                    }
-                });
-                break;
-        }
-
-        return dialog;
-    }
-
-    /**
-     * Loads the contents of dir into the list view.
-     *
-     * @param dirPath
-     *      directory to load into list view
-     */
-    private void showDir(String dirPath) {
-        mCurrentDirPath = dirPath;
-
-        /** Show progress dialog with a delay */
-        final Handler delayedDialogHandler = new Handler() {
-            @Override
-            public void handleMessage(Message msg) {
-                if (msg.what == MSG_SHOW_PROGRESS_DIALOG) {
-                    if (sProgressDialog == null) {
-                        sProgressDialog = new ProgressDialog(DirListActivity.this);
-                        sProgressDialog.setCancelable(false);
-                        sProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
-                        sProgressDialog.setTitle(R.string.dialog_progress_title);
-                        sProgressDialog.setMessage(getText(R.string.dialog_progress_msg));
-                    }
-                    sProgressDialog.show();
-                }
-            }
-        };
-        Message msgShowDialog = delayedDialogHandler.obtainMessage(MSG_SHOW_PROGRESS_DIALOG);
-        delayedDialogHandler.sendMessageDelayed(msgShowDialog, PROGRESS_DIALOG_DELAY_MS);
-
-        /** Delegate loading contents from SD card to a new thread */
-        new LoadListItemsThread(mCurrentDirPath, new Handler() {
-            @Override
-            public void handleMessage(Message msg) {
-                if (msg.what == MSG_LOADED_ITEMS) {
-                    setTitle(shortenTitle(mCurrentDirPath));
-                    delayedDialogHandler.removeMessages(MSG_SHOW_PROGRESS_DIALOG);
-                    if (sProgressDialog != null) {
-                        sProgressDialog.dismiss();
-                    }
-                    if (msg.obj == null) {
-                        Toast.makeText(DirListActivity.this, NO_RESPONSE_MESSAGE,
-                                Toast.LENGTH_LONG).show();
-                    } else {
-                        setListAdapter(new DirListAdapter(DirListActivity.this,
-                                (ListItem[])msg.obj));
-                    }
-                }
-            }
-        }).start();
-    }
-
-    /**
-     * TODO: find a neat way to determine number of characters that fit in the title
-     * bar.
-     * */
-    private String shortenTitle(String title) {
-        if (title.equals("")) {
-            return "Tests' root dir:";
-        }
-        int charCount = mListView.getWidth() / MEAN_TITLE_CHAR_SIZE;
-
-        if (title.length() > charCount) {
-            return "..." + title.substring(title.length() - charCount);
-        } else {
-            return title;
-        }
-    }
-
-    /**
-     * Return the array with contents of the given directory.
-     * First it contains the subfolders, then the files. Both sorted
-     * alphabetically.
-     *
-     * The dirPath is relative.
-     */
-    private ListItem[] getDirList(String dirPath) {
-        List<ListItem> subDirs = new ArrayList<ListItem>();
-        List<ListItem> subFiles = new ArrayList<ListItem>();
-
-        List<String> dirRelativePaths = FsUtils.getLayoutTestsDirContents(dirPath, false, true);
-        if (dirRelativePaths == null) {
-            return null;
-        }
-        for (String dirRelativePath : dirRelativePaths) {
-            if (FileFilter.isTestDir(new File(dirRelativePath).getName())) {
-                subDirs.add(new ListItem(dirRelativePath, true));
-            }
-        }
-
-        List<String> testRelativePaths = FsUtils.getLayoutTestsDirContents(dirPath, false, false);
-        if (testRelativePaths == null) {
-            return null;
-        }
-        for (String testRelativePath : testRelativePaths) {
-            if (FileFilter.isTestFile(new File(testRelativePath).getName())) {
-                subFiles.add(new ListItem(testRelativePath, false));
-            }
-        }
-
-        /** Concatenate the two lists */
-        subDirs.addAll(subFiles);
-
-        return subDirs.toArray(new ListItem[subDirs.size()]);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java
deleted file mode 100644
index 5763ad3..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/PerformanceTest.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package com.test.tilebenchmark;
-
-import com.test.tilebenchmark.ProfileActivity.ProfileCallback;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.os.Environment;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-import android.webkit.WebSettings;
-import android.widget.Spinner;
-
-public class PerformanceTest extends
-        ActivityInstrumentationTestCase2<ProfileActivity> {
-
-    public static class AnimStat {
-        double aggVal = 0;
-        double aggSqrVal = 0;
-        double count = 0;
-    }
-
-    private class StatAggregator extends PlaybackGraphs {
-        private HashMap<String, Double> mDataMap = new HashMap<String, Double>();
-        private HashMap<String, AnimStat> mAnimDataMap = new HashMap<String, AnimStat>();
-        private int mCount = 0;
-
-
-        public void aggregate() {
-            boolean inAnimTests = mAnimTests != null;
-            Resources resources = mWeb.getResources();
-            String animFramerateString = resources.getString(R.string.animation_framerate);
-            for (Map.Entry<String, Double> e : mSingleStats.entrySet()) {
-                String name = e.getKey();
-                if (inAnimTests) {
-                    if (name.equals(animFramerateString)) {
-                        // in animation testing phase, record animation framerate and aggregate
-                        // stats, differentiating on values of mAnimTestNr and mDoubleBuffering
-                        String fullName = ANIM_TEST_NAMES[mAnimTestNr] + " " + name;
-                        fullName += mDoubleBuffering ? " tiled" : " webkit";
-
-                        if (!mAnimDataMap.containsKey(fullName)) {
-                            mAnimDataMap.put(fullName, new AnimStat());
-                        }
-                        AnimStat statVals = mAnimDataMap.get(fullName);
-                        statVals.aggVal += e.getValue();
-                        statVals.aggSqrVal += e.getValue() * e.getValue();
-                        statVals.count += 1;
-                    }
-                } else {
-                    double aggVal = mDataMap.containsKey(name)
-                            ? mDataMap.get(name) : 0;
-                    mDataMap.put(name, aggVal + e.getValue());
-                }
-            }
-
-            if (inAnimTests) {
-                return;
-            }
-
-            mCount++;
-            for (int metricIndex = 0; metricIndex < Metrics.length; metricIndex++) {
-                for (int statIndex = 0; statIndex < Stats.length; statIndex++) {
-                    String metricLabel = resources.getString(
-                            Metrics[metricIndex].getLabelId());
-                    String statLabel = resources.getString(
-                            Stats[statIndex].getLabelId());
-
-                    String label = metricLabel + " " + statLabel;
-                    double aggVal = mDataMap.containsKey(label) ? mDataMap
-                            .get(label) : 0;
-
-                    aggVal += mStats[metricIndex][statIndex];
-                    mDataMap.put(label, aggVal);
-                }
-            }
-
-        }
-
-        // build the final bundle of results
-        public Bundle getBundle() {
-            Bundle b = new Bundle();
-            int count = (0 == mCount) ? Integer.MAX_VALUE : mCount;
-            for (Map.Entry<String, Double> e : mDataMap.entrySet()) {
-                b.putDouble(e.getKey(), e.getValue() / count);
-            }
-
-            for (Map.Entry<String, AnimStat> e : mAnimDataMap.entrySet()) {
-                String statName = e.getKey();
-                AnimStat statVals = e.getValue();
-
-                double avg = statVals.aggVal/statVals.count;
-                double stdDev = Math.sqrt((statVals.aggSqrVal / statVals.count) - avg * avg);
-
-                b.putDouble(statName, avg);
-                b.putDouble(statName + " STD DEV", stdDev);
-            }
-
-            return b;
-        }
-    }
-
-    ProfileActivity mActivity;
-    ProfiledWebView mWeb;
-    Spinner mMovementSpinner;
-    StatAggregator mStats;
-
-    private static final String LOGTAG = "PerformanceTest";
-    private static final String TEST_LOCATION = "webkit/page_cycler";
-    private static final String URL_PREFIX = "file://";
-    private static final String URL_POSTFIX = "/index.html?skip=true";
-    private static final int MAX_ITERATIONS = 4;
-    private static final String SCROLL_TEST_DIRS[] = {
-        "alexa25_2011"
-    };
-    private static final String ANIM_TEST_DIRS[] = {
-        "dhtml"
-    };
-
-    public PerformanceTest() {
-        super(ProfileActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mActivity = getActivity();
-        mWeb = (ProfiledWebView) mActivity.findViewById(R.id.web);
-        mMovementSpinner = (Spinner) mActivity.findViewById(R.id.movement);
-        mStats = new StatAggregator();
-
-        // use mStats as a condition variable between the UI thread and
-        // this(the testing) thread
-        mActivity.setCallback(new ProfileCallback() {
-            @Override
-            public void profileCallback(RunData data) {
-                mStats.setData(data);
-                synchronized (mStats) {
-                    mStats.notify();
-                }
-            }
-        });
-
-    }
-
-    private boolean loadUrl(final String url) {
-        try {
-            Log.d(LOGTAG, "test starting for url " + url);
-            mActivity.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    mWeb.loadUrl(url);
-                }
-            });
-            synchronized (mStats) {
-                mStats.wait();
-            }
-
-            mStats.aggregate();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-            return false;
-        }
-        return true;
-    }
-
-    private boolean validTest(String nextTest) {
-        // if testing animations, test must be in mAnimTests
-        if (mAnimTests == null)
-            return true;
-
-        for (String test : mAnimTests) {
-            if (test.equals(nextTest)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean runIteration(String[] testDirs) {
-        File sdFile = Environment.getExternalStorageDirectory();
-        for (String testDirName : testDirs) {
-            File testDir = new File(sdFile, TEST_LOCATION + "/" + testDirName);
-            Log.d(LOGTAG, "Testing dir: '" + testDir.getAbsolutePath()
-                    + "', exists=" + testDir.exists());
-
-            for (File siteDir : testDir.listFiles()) {
-                if (!siteDir.isDirectory() || !validTest(siteDir.getName())) {
-                    continue;
-                }
-
-                if (!loadUrl(URL_PREFIX + siteDir.getAbsolutePath()
-                        + URL_POSTFIX)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    private boolean  runTestDirs(String[] testDirs) {
-        for (int i = 0; i < MAX_ITERATIONS; i++)
-            if (!runIteration(testDirs)) {
-                return false;
-            }
-        return true;
-    }
-
-    private void pushDoubleBuffering() {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            public void run() {
-                mWeb.setDoubleBuffering(mDoubleBuffering);
-            }
-        });
-    }
-
-    private void setScrollingTestingMode(final boolean scrolled) {
-        getInstrumentation().runOnMainSync(new Runnable() {
-            public void run() {
-                mMovementSpinner.setSelection(scrolled ? 0 : 2);
-            }
-        });
-    }
-
-
-    private String[] mAnimTests = null;
-    private int mAnimTestNr = -1;
-    private boolean mDoubleBuffering = true;
-    private static final String[] ANIM_TEST_NAMES = {
-        "slow", "fast"
-    };
-    private static final String[][] ANIM_TESTS = {
-        {"scrolling", "replaceimages", "layers5", "layers1"},
-        {"slidingballs", "meter", "slidein", "fadespacing", "colorfade",
-                "mozilla", "movingtext", "diagball", "zoom", "imageslide"},
-    };
-
-    private boolean checkMedia() {
-        String state = Environment.getExternalStorageState();
-
-        if (!Environment.MEDIA_MOUNTED.equals(state)
-                && !Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
-            Log.d(LOGTAG, "ARG Can't access sd card!");
-            // Can't read the SD card, fail and die!
-            getInstrumentation().sendStatus(1, null);
-            return false;
-        }
-        return true;
-    }
-
-    public void testMetrics() {
-        setScrollingTestingMode(true);
-        if (checkMedia() && runTestDirs(SCROLL_TEST_DIRS)) {
-            getInstrumentation().sendStatus(0, mStats.getBundle());
-        } else {
-            getInstrumentation().sendStatus(1, null);
-        }
-    }
-
-    public void testMetricsMinimalMemory() {
-        mActivity.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mWeb.setUseMinimalMemory(true);
-            }
-        });
-
-        setScrollingTestingMode(true);
-        if (checkMedia() && runTestDirs(SCROLL_TEST_DIRS)) {
-            getInstrumentation().sendStatus(0, mStats.getBundle());
-        } else {
-            getInstrumentation().sendStatus(1, null);
-        }
-    }
-
-    private boolean runAnimationTests() {
-        for (int doubleBuffer = 0; doubleBuffer <= 1; doubleBuffer++) {
-            mDoubleBuffering = doubleBuffer == 1;
-            pushDoubleBuffering();
-            for (mAnimTestNr = 0; mAnimTestNr < ANIM_TESTS.length; mAnimTestNr++) {
-                mAnimTests = ANIM_TESTS[mAnimTestNr];
-                if (!runTestDirs(ANIM_TEST_DIRS)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    public void testAnimations() {
-        // instead of autoscrolling, load each page until either an timer fires,
-        // or the animation signals complete via javascript
-        setScrollingTestingMode(false);
-
-        if (checkMedia() && runAnimationTests()) {
-            getInstrumentation().sendStatus(0, mStats.getBundle());
-        } else {
-            getInstrumentation().sendStatus(1, null);
-        }
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackActivity.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackActivity.java
deleted file mode 100644
index 1eb1c00..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackActivity.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package com.test.tilebenchmark;
-
-import android.app.Activity;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.view.GestureDetector.SimpleOnGestureListener;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-
-/**
- * Interface for playing back WebView tile rendering status. Draws viewport and
- * states of tiles and statistics for off-line analysis.
- */
-public class PlaybackActivity extends Activity {
-    private static final float SCROLL_SCALER = 0.125f;
-
-    PlaybackView mPlaybackView;
-    SeekBar mSeekBar;
-    Button mForward;
-    Button mBackward;
-    TextView mFrameDisplay;
-
-    private int mFrame = -1;
-    private int mFrameMax;
-
-    private class TouchFrameChangeListener extends SimpleOnGestureListener {
-        float mDist = 0;
-
-        @Override
-        public boolean onScroll(MotionEvent e1, MotionEvent e2,
-                float distanceX, float distanceY) {
-            // aggregate scrolls so that small ones can add up
-            mDist += distanceY * SCROLL_SCALER;
-            int intComponent = (int) Math.floor(Math.abs(mDist));
-            if (intComponent >= 1) {
-                int scrollDist = (mDist > 0) ? intComponent : -intComponent;
-                setFrame(null, mFrame + scrollDist);
-                mDist -= scrollDist;
-            }
-            return super.onScroll(e1, e2, distanceX, distanceY);
-        }
-    };
-
-    private class SeekFrameChangeListener implements OnSeekBarChangeListener {
-        @Override
-        public void onStopTrackingTouch(SeekBar seekBar) {
-        }
-
-        @Override
-        public void onStartTrackingTouch(SeekBar seekBar) {
-        }
-
-        @Override
-        public void onProgressChanged(SeekBar seekBar, int progress,
-                boolean fromUser) {
-            setFrame(seekBar, progress);
-        }
-    };
-
-    private class LoadFileTask extends AsyncTask<String, Void, RunData> {
-        @Override
-        protected RunData doInBackground(String... params) {
-            RunData data = null;
-            try {
-                FileInputStream fis = openFileInput(params[0]);
-                ObjectInputStream in = new ObjectInputStream(fis);
-                data = (RunData) in.readObject();
-                in.close();
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            } catch (ClassNotFoundException ex) {
-                ex.printStackTrace();
-            }
-            return data;
-        }
-
-        @Override
-        protected void onPostExecute(RunData data) {
-            if (data == null) {
-                Toast.makeText(getApplicationContext(),
-                        getResources().getString(R.string.error_no_data),
-                        Toast.LENGTH_LONG).show();
-                return;
-            }
-            mPlaybackView.setData(data);
-
-            mFrameMax = data.frames.length - 1;
-            mSeekBar.setMax(mFrameMax);
-
-            setFrame(null, 0);
-        }
-    }
-
-    private void setFrame(View changer, int f) {
-        if (f < 0) {
-            f = 0;
-        } else if (f > mFrameMax) {
-            f = mFrameMax;
-        }
-
-        if (mFrame == f) {
-            return;
-        }
-
-        mFrame = f;
-        mForward.setEnabled(mFrame != mFrameMax);
-        mBackward.setEnabled(mFrame != 0);
-        if (changer != mSeekBar) {
-            mSeekBar.setProgress(mFrame);
-        }
-        mFrameDisplay.setText(Integer.toString(mFrame));
-        mPlaybackView.setFrame(mFrame);
-    };
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.playback);
-
-        mPlaybackView = (PlaybackView) findViewById(R.id.playback);
-        mSeekBar = (SeekBar) findViewById(R.id.seek_bar);
-        mForward = (Button) findViewById(R.id.forward);
-        mBackward = (Button) findViewById(R.id.backward);
-        mFrameDisplay = (TextView) findViewById(R.id.frame_display);
-
-        mForward.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                setFrame(v, mFrame + 1);
-            }
-        });
-
-        mBackward.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                setFrame(v, mFrame - 1);
-            }
-        });
-
-        mSeekBar.setOnSeekBarChangeListener(new SeekFrameChangeListener());
-
-        mPlaybackView.setOnGestureListener(new TouchFrameChangeListener());
-
-        new LoadFileTask().execute(ProfileActivity.TEMP_FILENAME);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java
deleted file mode 100644
index 065e86f..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package com.test.tilebenchmark;
-
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.drawable.ShapeDrawable;
-
-import com.test.tilebenchmark.RunData.TileData;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-
-public class PlaybackGraphs {
-    private static final int BAR_WIDTH = PlaybackView.TILE_SCALE * 3;
-    private static final float CANVAS_SCALE = 0.2f;
-    private static final double IDEAL_FRAMES = 60;
-    private static final int LABELOFFSET = 100;
-    private static Paint whiteLabels;
-
-    private static double viewportCoverage(TileData view, TileData tile) {
-        if (tile.left < (view.right * view.scale)
-                && tile.right >= (view.left * view.scale)
-                && tile.top < (view.bottom * view.scale)
-                && tile.bottom >= (view.top * view.scale)) {
-            return 1.0f;
-        }
-        return 0.0f;
-    }
-
-    protected interface MetricGen {
-        public double getValue(TileData[] frame);
-
-        public double getMax();
-
-        public int getLabelId();
-    };
-
-    protected static MetricGen[] Metrics = new MetricGen[] {
-            new MetricGen() {
-                // framerate graph
-                @Override
-                public double getValue(TileData[] frame) {
-                    int renderTimeUS = frame[0].level;
-                    return 1.0e6f / renderTimeUS;
-                }
-
-                @Override
-                public double getMax() {
-                    return IDEAL_FRAMES;
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.frames_per_second;
-                }
-            }, new MetricGen() {
-                // coverage graph
-                @Override
-                public double getValue(TileData[] frame) {
-                    double total = 0, totalCount = 0;
-                    for (int tileID = 1; tileID < frame.length; tileID++) {
-                        TileData data = frame[tileID];
-                        double coverage = viewportCoverage(frame[0], data);
-                        total += coverage * (data.isReady ? 100 : 0);
-                        totalCount += coverage;
-                    }
-                    if (totalCount == 0) {
-                        return -1;
-                    }
-                    return total / totalCount;
-                }
-
-                @Override
-                public double getMax() {
-                    return 100;
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.viewport_coverage;
-                }
-            }
-    };
-
-    protected interface StatGen {
-        public double getValue(double sortedValues[]);
-
-        public int getLabelId();
-    }
-
-    public static double getPercentile(double sortedValues[], double ratioAbove) {
-        if (sortedValues.length == 0)
-            return -1;
-
-        double index = ratioAbove * (sortedValues.length - 1);
-        int intIndex = (int) Math.floor(index);
-        if (index == intIndex) {
-            return sortedValues[intIndex];
-        }
-        double alpha = index - intIndex;
-        return sortedValues[intIndex] * (1 - alpha)
-                + sortedValues[intIndex + 1] * (alpha);
-    }
-
-    public static double getMean(double sortedValues[]) {
-        if (sortedValues.length == 0)
-            return -1;
-
-        double agg = 0;
-        for (double val : sortedValues) {
-            agg += val;
-        }
-        return agg / sortedValues.length;
-    }
-
-    public static double getStdDev(double sortedValues[]) {
-        if (sortedValues.length == 0)
-            return -1;
-
-        double agg = 0;
-        double sqrAgg = 0;
-        for (double val : sortedValues) {
-            agg += val;
-            sqrAgg += val*val;
-        }
-        double mean = agg / sortedValues.length;
-        return Math.sqrt((sqrAgg / sortedValues.length) - (mean * mean));
-    }
-
-    protected static StatGen[] Stats = new StatGen[] {
-            new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getPercentile(sortedValues, 0.25);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.percentile_25;
-                }
-            }, new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getPercentile(sortedValues, 0.5);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.percentile_50;
-                }
-            }, new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getPercentile(sortedValues, 0.75);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.percentile_75;
-                }
-            }, new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getStdDev(sortedValues);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.std_dev;
-                }
-            }, new StatGen() {
-                @Override
-                public double getValue(double[] sortedValues) {
-                    return getMean(sortedValues);
-                }
-
-                @Override
-                public int getLabelId() {
-                    return R.string.mean;
-                }
-            },
-    };
-
-    public PlaybackGraphs() {
-        whiteLabels = new Paint();
-        whiteLabels.setColor(Color.WHITE);
-        whiteLabels.setTextSize(PlaybackView.TILE_SCALE / 3);
-    }
-
-    private ArrayList<ShapeDrawable> mShapes = new ArrayList<ShapeDrawable>();
-    protected final double[][] mStats = new double[Metrics.length][Stats.length];
-    protected HashMap<String, Double> mSingleStats;
-
-    private void gatherFrameMetric(int metricIndex, double metricValues[], RunData data) {
-        // create graph out of rectangles, one per frame
-        int lastBar = 0;
-        for (int frameIndex = 0; frameIndex < data.frames.length; frameIndex++) {
-            TileData frame[] = data.frames[frameIndex];
-            int newBar = (int)((frame[0].top + frame[0].bottom) * frame[0].scale / 2.0f);
-
-            MetricGen s = Metrics[metricIndex];
-            double absoluteValue = s.getValue(frame);
-            double relativeValue = absoluteValue / s.getMax();
-            relativeValue = Math.min(1,relativeValue);
-            relativeValue = Math.max(0,relativeValue);
-            int rightPos = (int) (-BAR_WIDTH * metricIndex);
-            int leftPos = (int) (-BAR_WIDTH * (metricIndex + relativeValue));
-
-            ShapeDrawable graphBar = new ShapeDrawable();
-            graphBar.getPaint().setColor(Color.BLUE);
-            graphBar.setBounds(leftPos, lastBar, rightPos, newBar);
-
-            mShapes.add(graphBar);
-            metricValues[frameIndex] = absoluteValue;
-            lastBar = newBar;
-        }
-    }
-
-    public void setData(RunData data) {
-        mShapes.clear();
-        double metricValues[] = new double[data.frames.length];
-
-        mSingleStats = data.singleStats;
-
-        if (data.frames.length == 0) {
-            return;
-        }
-
-        for (int metricIndex = 0; metricIndex < Metrics.length; metricIndex++) {
-            // calculate metric based on list of frames
-            gatherFrameMetric(metricIndex, metricValues, data);
-
-            // store aggregate statistics per metric (median, and similar)
-            Arrays.sort(metricValues);
-            for (int statIndex = 0; statIndex < Stats.length; statIndex++) {
-                mStats[metricIndex][statIndex] =
-                        Stats[statIndex].getValue(metricValues);
-            }
-        }
-    }
-
-    public void drawVerticalShiftedShapes(Canvas canvas,
-            ArrayList<ShapeDrawable> shapes) {
-        // Shapes drawn here are drawn relative to the viewRect
-        Rect viewRect = shapes.get(shapes.size() - 1).getBounds();
-        canvas.translate(0, 5 * PlaybackView.TILE_SCALE - viewRect.top);
-
-        for (ShapeDrawable shape : mShapes) {
-            shape.draw(canvas);
-        }
-        for (ShapeDrawable shape : shapes) {
-            shape.draw(canvas);
-        }
-    }
-
-    public void draw(Canvas canvas, ArrayList<ShapeDrawable> shapes,
-            ArrayList<String> strings, Resources resources) {
-        canvas.scale(CANVAS_SCALE, CANVAS_SCALE);
-
-        canvas.translate(BAR_WIDTH * Metrics.length, 0);
-
-        canvas.save();
-        drawVerticalShiftedShapes(canvas, shapes);
-        canvas.restore();
-
-        for (int metricIndex = 0; metricIndex < Metrics.length; metricIndex++) {
-            String label = resources.getString(
-                    Metrics[metricIndex].getLabelId());
-            int xPos = (metricIndex + 1) * -BAR_WIDTH;
-            int yPos = LABELOFFSET;
-            canvas.drawText(label, xPos, yPos, whiteLabels);
-            for (int statIndex = 0; statIndex < Stats.length; statIndex++) {
-                String statLabel = resources.getString(
-                        Stats[statIndex].getLabelId()).substring(0,3);
-                label = statLabel + " " + resources.getString(
-                        R.string.format_stat, mStats[metricIndex][statIndex]);
-                yPos = LABELOFFSET + (1 + statIndex) * PlaybackView.TILE_SCALE
-                        / 2;
-                canvas.drawText(label, xPos, yPos, whiteLabels);
-            }
-        }
-        for (int stringIndex = 0; stringIndex < strings.size(); stringIndex++) {
-            int yPos = LABELOFFSET + stringIndex * PlaybackView.TILE_SCALE / 2;
-            canvas.drawText(strings.get(stringIndex), 0, yPos, whiteLabels);
-        }
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackView.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackView.java
deleted file mode 100644
index 5459c1f..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackView.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package com.test.tilebenchmark;
-
-import android.animation.ArgbEvaluator;
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.drawable.ShapeDrawable;
-import android.util.AttributeSet;
-import android.view.GestureDetector;
-import android.view.GestureDetector.OnGestureListener;
-import android.view.MotionEvent;
-import android.view.View;
-
-import com.test.tilebenchmark.RunData.TileData;
-
-import java.util.ArrayList;
-
-public class PlaybackView extends View {
-    public static final int TILE_SCALE = 256;
-    private static final int INVAL_FLAG = -2;
-    private static final int INVAL_CYCLE = 250;
-
-    private Paint levelPaint = null, coordPaint = null, goldPaint = null;
-    private PlaybackGraphs mGraphs;
-
-    private ArrayList<ShapeDrawable> mTempShapes = new ArrayList<ShapeDrawable>();
-    private RunData mProfData = null;
-    private GestureDetector mGestureDetector = null;
-    private ArrayList<String> mRenderStrings = new ArrayList<String>();
-
-    private class TileDrawable extends ShapeDrawable {
-        TileData tile;
-        String label;
-
-        public TileDrawable(TileData t, int colorId) {
-            this.tile = t;
-            getPaint().setColor(getResources().getColor(colorId));
-            if (colorId == R.color.ready_tile
-                    || colorId == R.color.unready_tile) {
-
-                label = (int) (t.left / TILE_SCALE) + ", "
-                        + (int) (t.top / TILE_SCALE);
-                // ignore scale value for tiles
-                setBounds(t.left, t.top,
-                        t.right, t.bottom);
-            } else {
-                setBounds((int) (t.left * t.scale),
-                        (int) (t.top * t.scale),
-                        (int) (t.right * t.scale),
-                        (int) (t.bottom * t.scale));
-            }
-        }
-
-        @SuppressWarnings("unused")
-        public void setColor(int color) {
-            getPaint().setColor(color);
-        }
-
-        @Override
-        public void draw(Canvas canvas) {
-            super.draw(canvas);
-            if (label != null) {
-                canvas.drawText(Integer.toString(tile.level), getBounds().left,
-                        getBounds().bottom, levelPaint);
-                canvas.drawText(label, getBounds().left,
-                        ((getBounds().bottom + getBounds().top) / 2),
-                        coordPaint);
-            }
-        }
-    }
-
-    public PlaybackView(Context context) {
-        super(context);
-        init();
-    }
-
-    public PlaybackView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init();
-    }
-
-    public PlaybackView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        init();
-    }
-
-    public void setOnGestureListener(OnGestureListener gl) {
-        mGestureDetector = new GestureDetector(getContext(), gl);
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        mGestureDetector.onTouchEvent(event);
-        return true;
-    }
-
-    private void init() {
-        levelPaint = new Paint();
-        levelPaint.setColor(Color.WHITE);
-        levelPaint.setTextSize(TILE_SCALE / 2);
-        coordPaint = new Paint();
-        coordPaint.setColor(Color.BLACK);
-        coordPaint.setTextSize(TILE_SCALE / 3);
-        goldPaint = new Paint();
-        goldPaint.setColor(0xffa0e010);
-        mGraphs = new PlaybackGraphs();
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        if (mTempShapes == null || mTempShapes.isEmpty()) {
-            return;
-        }
-
-        mGraphs.draw(canvas, mTempShapes, mRenderStrings, getResources());
-        invalidate(); // may have animations, force redraw
-    }
-
-    private String statString(int labelId, int value) {
-        return getResources().getString(R.string.format_stat_name,
-                getResources().getString(labelId), value);
-    }
-    private String tileString(int formatStringId, TileData t) {
-        return getResources().getString(formatStringId,
-                t.left, t.top, t.right, t.bottom);
-    }
-
-    public int setFrame(int frame) {
-        if (mProfData == null || mProfData.frames.length == 0) {
-            return 0;
-        }
-
-        int readyTiles = 0, unreadyTiles = 0, unplacedTiles = 0, numInvals = 0;
-        mTempShapes.clear();
-        mRenderStrings.clear();
-
-        // create tile shapes (as they're drawn on bottom)
-        for (TileData t : mProfData.frames[frame]) {
-            if (t == mProfData.frames[frame][0]){
-                // viewport 'tile', add coords to render strings
-                mRenderStrings.add(tileString(R.string.format_view_pos, t));
-            } else  if (t.level != INVAL_FLAG) {
-                int colorId;
-                if (t.isReady) {
-                    readyTiles++;
-                    colorId = R.color.ready_tile;
-                } else {
-                    unreadyTiles++;
-                    colorId = R.color.unready_tile;
-                }
-                if (t.left < 0 || t.top < 0) {
-                    unplacedTiles++;
-                }
-                mTempShapes.add(new TileDrawable(t, colorId));
-            } else {
-                // inval 'tile', count and add coords to render strings
-                numInvals++;
-                mRenderStrings.add(tileString(R.string.format_inval_pos, t));
-            }
-        }
-
-        // create invalidate shapes (drawn above tiles)
-        int invalId = 0;
-        for (TileData t : mProfData.frames[frame]) {
-            if (t.level == INVAL_FLAG && t != mProfData.frames[frame][0]) {
-                TileDrawable invalShape = new TileDrawable(t,
-                        R.color.inval_region_start);
-                ValueAnimator tileAnimator = ObjectAnimator.ofInt(invalShape,
-                        "color",
-                        getResources().getColor(R.color.inval_region_start),
-                        getResources().getColor(R.color.inval_region_stop));
-                tileAnimator.setDuration(numInvals * INVAL_CYCLE);
-                tileAnimator.setEvaluator(new ArgbEvaluator());
-                tileAnimator.setRepeatCount(ValueAnimator.INFINITE);
-                tileAnimator.setRepeatMode(ValueAnimator.RESTART);
-                float delay = (float) (invalId) * INVAL_CYCLE;
-                tileAnimator.setStartDelay((int) delay);
-                invalId++;
-                tileAnimator.start();
-
-                mTempShapes.add(invalShape);
-            }
-        }
-
-        mRenderStrings.add(statString(R.string.ready_tiles, readyTiles));
-        mRenderStrings.add(statString(R.string.unready_tiles, unreadyTiles));
-        mRenderStrings.add(statString(R.string.unplaced_tiles, unplacedTiles));
-        mRenderStrings.add(statString(R.string.number_invalidates, numInvals));
-
-        // draw view rect (using first TileData object, on top)
-        TileDrawable viewShape = new TileDrawable(mProfData.frames[frame][0],
-                R.color.view);
-        mTempShapes.add(viewShape);
-        this.invalidate();
-        return frame;
-    }
-
-    public void setData(RunData tileProfilingData) {
-        mProfData = tileProfilingData;
-
-        mGraphs.setData(mProfData);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java b/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java
deleted file mode 100644
index 2e77157..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package com.test.tilebenchmark;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.CountDownTimer;
-import android.util.Log;
-import android.util.Pair;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemSelectedListener;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.Spinner;
-import android.widget.TextView;
-import android.widget.TextView.OnEditorActionListener;
-import android.widget.ToggleButton;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-
-/**
- * Interface for profiling the webview's scrolling, with simple controls on how
- * to scroll, and what content to load.
- */
-public class ProfileActivity extends Activity {
-
-    private static final int TIMED_RECORD_MILLIS = 2000;
-
-    public interface ProfileCallback {
-        public void profileCallback(RunData data);
-    }
-
-    public static final String TEMP_FILENAME = "profile.tiles";
-
-    Button mInspectButton;
-    ToggleButton mCaptureButton;
-    Spinner mVelocitySpinner;
-    Spinner mMovementSpinner;
-    EditText mUrl;
-    ProfiledWebView mWeb;
-    ProfileCallback mCallback;
-
-    LoggingWebViewClient mLoggingWebViewClient = new LoggingWebViewClient();
-    AutoLoggingWebViewClient mAutoLoggingWebViewClient = new AutoLoggingWebViewClient();
-    TimedLoggingWebViewClient mTimedLoggingWebViewClient = new TimedLoggingWebViewClient();
-
-    private enum TestingState {
-        NOT_TESTING,
-        PRE_TESTING,
-        START_TESTING,
-        STOP_TESTING,
-        SAVED_TESTING
-    };
-
-    private class VelocitySelectedListener implements OnItemSelectedListener {
-        @Override
-        public void onItemSelected(AdapterView<?> parent, View view,
-                int position, long id) {
-            String speedStr = parent.getItemAtPosition(position).toString();
-            int speedInt = Integer.parseInt(speedStr);
-            mWeb.setAutoScrollSpeed(speedInt);
-        }
-
-        @Override
-        public void onNothingSelected(AdapterView<?> parent) {
-        }
-    }
-
-    private class MovementSelectedListener implements OnItemSelectedListener {
-        @Override
-        public void onItemSelected(AdapterView<?> parent, View view,
-                int position, long id) {
-            String movementStr = parent.getItemAtPosition(position).toString();
-            if (movementStr == getResources().getString(R.string.movement_auto_scroll)) {
-                mWeb.setWebViewClient(mAutoLoggingWebViewClient);
-                mCaptureButton.setEnabled(false);
-                mVelocitySpinner.setEnabled(true);
-            } else if (movementStr == getResources().getString(R.string.movement_manual)) {
-                mWeb.setWebViewClient(mLoggingWebViewClient);
-                mCaptureButton.setEnabled(true);
-                mVelocitySpinner.setEnabled(false);
-            } else if (movementStr == getResources().getString(R.string.movement_timed)) {
-                mWeb.setWebViewClient(mTimedLoggingWebViewClient);
-                mCaptureButton.setEnabled(false);
-                mVelocitySpinner.setEnabled(false);
-            }
-        }
-
-        @Override
-        public void onNothingSelected(AdapterView<?> parent) {
-        }
-    }
-
-    private class LoggingWebViewClient extends WebViewClient {
-        @Override
-        public boolean shouldOverrideUrlLoading(WebView view, String url) {
-            return false;
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            super.onPageStarted(view, url, favicon);
-            mUrl.setText(url);
-        }
-
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            super.onPageFinished(view, url);
-            view.requestFocus();
-            ((ProfiledWebView)view).onPageFinished();
-        }
-    }
-
-    private class AutoLoggingWebViewClient extends LoggingWebViewClient {
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            super.onPageFinished(view, url);
-            startViewProfiling(true);
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            super.onPageStarted(view, url, favicon);
-            setTestingState(TestingState.PRE_TESTING);
-        }
-    }
-
-    private class TimedLoggingWebViewClient extends LoggingWebViewClient {
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            super.onPageFinished(view, url);
-            startViewProfiling(false);
-
-            // after a fixed time after page finished, stop testing
-            new CountDownTimer(TIMED_RECORD_MILLIS, TIMED_RECORD_MILLIS) {
-                @Override
-                public void onTick(long millisUntilFinished) {
-                }
-
-                @Override
-                public void onFinish() {
-                    mWeb.stopScrollTest();
-                }
-            }.start();
-        }
-
-        @Override
-        public void onPageStarted(WebView view, String url, Bitmap favicon) {
-            super.onPageStarted(view, url, favicon);
-            setTestingState(TestingState.PRE_TESTING);
-        }
-    }
-
-    private class StoreFileTask extends
-            AsyncTask<Pair<String, RunData>, Void, Void> {
-
-        @Override
-        protected Void doInBackground(Pair<String, RunData>... params) {
-            try {
-                FileOutputStream fos = openFileOutput(params[0].first,
-                        Context.MODE_PRIVATE);
-                ObjectOutputStream out = new ObjectOutputStream(fos);
-                out.writeObject(params[0].second);
-                out.close();
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-            return null;
-        }
-
-        @Override
-        protected void onPostExecute(Void v) {
-            setTestingState(TestingState.SAVED_TESTING);
-        }
-    }
-
-    public void setTestingState(TestingState state) {
-        switch (state) {
-            case NOT_TESTING:
-                mUrl.setBackgroundResource(R.color.background_not_testing);
-                mInspectButton.setEnabled(true);
-                mMovementSpinner.setEnabled(true);
-                break;
-            case PRE_TESTING:
-                mInspectButton.setEnabled(false);
-                mMovementSpinner.setEnabled(false);
-                break;
-            case START_TESTING:
-                mCaptureButton.setChecked(true);
-                mUrl.setBackgroundResource(R.color.background_start_testing);
-                mInspectButton.setEnabled(false);
-                mMovementSpinner.setEnabled(false);
-                break;
-            case STOP_TESTING:
-                mCaptureButton.setChecked(false);
-                mUrl.setBackgroundResource(R.color.background_stop_testing);
-                break;
-            case SAVED_TESTING:
-                mInspectButton.setEnabled(true);
-                mMovementSpinner.setEnabled(true);
-                break;
-        }
-    }
-
-    /** auto - automatically scroll. */
-    private void startViewProfiling(boolean auto) {
-        // toggle capture button to indicate capture state to user
-        mWeb.startScrollTest(mCallback, auto);
-        setTestingState(TestingState.START_TESTING);
-    }
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-        mInspectButton = (Button) findViewById(R.id.inspect);
-        mCaptureButton = (ToggleButton) findViewById(R.id.capture);
-        mVelocitySpinner = (Spinner) findViewById(R.id.velocity);
-        mMovementSpinner = (Spinner) findViewById(R.id.movement);
-        mUrl = (EditText) findViewById(R.id.url);
-        mWeb = (ProfiledWebView) findViewById(R.id.web);
-        setCallback(new ProfileCallback() {
-            @SuppressWarnings("unchecked")
-            @Override
-            public void profileCallback(RunData data) {
-                new StoreFileTask().execute(new Pair<String, RunData>(
-                        TEMP_FILENAME, data));
-                Log.d("ProfileActivity", "stored " + data.frames.length + " frames in file");
-                setTestingState(TestingState.STOP_TESTING);
-            }
-        });
-
-        // Inspect button (opens PlaybackActivity)
-        mInspectButton.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                startActivity(new Intent(ProfileActivity.this,
-                        PlaybackActivity.class));
-            }
-        });
-
-        // Velocity spinner
-        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
-                this, R.array.velocity_array,
-                android.R.layout.simple_spinner_item);
-        adapter.setDropDownViewResource(
-                android.R.layout.simple_spinner_dropdown_item);
-        mVelocitySpinner.setAdapter(adapter);
-        mVelocitySpinner.setOnItemSelectedListener(
-                new VelocitySelectedListener());
-        mVelocitySpinner.setSelection(3);
-
-        // Movement spinner
-        String content[] = {
-                getResources().getString(R.string.movement_auto_scroll),
-                getResources().getString(R.string.movement_manual),
-                getResources().getString(R.string.movement_timed)
-        };
-        adapter = new ArrayAdapter<CharSequence>(this,
-                android.R.layout.simple_spinner_item, content);
-        adapter.setDropDownViewResource(
-                android.R.layout.simple_spinner_dropdown_item);
-        mMovementSpinner.setAdapter(adapter);
-        mMovementSpinner.setOnItemSelectedListener(
-                new MovementSelectedListener());
-        mMovementSpinner.setSelection(0);
-
-        // Capture toggle button
-        mCaptureButton.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mCaptureButton.isChecked()) {
-                    startViewProfiling(false);
-                } else {
-                    mWeb.stopScrollTest();
-                }
-            }
-        });
-
-        // Custom profiling WebView
-        mWeb.init(this);
-        mWeb.setWebViewClient(new LoggingWebViewClient());
-
-        // URL text entry
-        mUrl.setOnEditorActionListener(new OnEditorActionListener() {
-            public boolean onEditorAction(TextView v, int actionId,
-                    KeyEvent event) {
-                String url = mUrl.getText().toString();
-                mWeb.loadUrl(url);
-                mWeb.requestFocus();
-                return true;
-            }
-        });
-
-        setTestingState(TestingState.NOT_TESTING);
-    }
-
-    public void setCallback(ProfileCallback callback) {
-        mCallback = callback;
-    }
-
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWeb.canGoBack()) {
-            mWeb.goBack();
-            return true;
-        }
-        return super.onKeyDown(keyCode, event);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java b/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java
deleted file mode 100644
index d3b572c..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package com.test.tilebenchmark;
-
-import android.content.Context;
-import android.os.CountDownTimer;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.webkit.WebSettingsClassic;
-import android.webkit.WebView;
-import android.webkit.WebViewClassic;
-
-import java.util.ArrayList;
-
-import com.test.tilebenchmark.ProfileActivity.ProfileCallback;
-import com.test.tilebenchmark.RunData.TileData;
-
-public class ProfiledWebView extends WebView implements WebViewClassic.PageSwapDelegate {
-    private static final String LOGTAG = "ProfiledWebView";
-
-    private int mSpeed;
-
-    private boolean mIsTesting = false;
-    private boolean mIsScrolling = false;
-    private ProfileCallback mCallback;
-    private long mContentInvalMillis;
-    private static final int LOAD_STALL_MILLIS = 2000; // nr of millis after load,
-                                                       // before test is forced
-
-    // ignore anim end events until this many millis after load
-    private static final long ANIM_SAFETY_THRESHOLD = 200;
-    private long mLoadTime;
-    private long mAnimationTime;
-
-    public ProfiledWebView(Context context) {
-        super(context);
-    }
-
-    public ProfiledWebView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public ProfiledWebView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public ProfiledWebView(Context context, AttributeSet attrs, int defStyle,
-            boolean privateBrowsing) {
-        super(context, attrs, defStyle, privateBrowsing);
-    }
-
-    private class JavaScriptInterface {
-        Context mContext;
-
-        /** Instantiate the interface and set the context */
-        JavaScriptInterface(Context c) {
-            mContext = c;
-        }
-
-        public void animationComplete() {
-            mAnimationTime = System.currentTimeMillis();
-        }
-    }
-
-    public void init(Context c) {
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        settings.setJavaScriptEnabled(true);
-        settings.setSupportZoom(true);
-        settings.setEnableSmoothTransition(true);
-        settings.setBuiltInZoomControls(true);
-        settings.setLoadWithOverviewMode(true);
-        settings.setProperty("use_minimal_memory", "false"); // prefetch tiles, as browser does
-        addJavascriptInterface(new JavaScriptInterface(c), "Android");
-        mAnimationTime = 0;
-        mLoadTime = 0;
-    }
-
-    public void setUseMinimalMemory(boolean minimal) {
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        settings.setProperty("use_minimal_memory", minimal ? "true" : "false");
-    }
-
-    public void onPageFinished() {
-        mLoadTime = System.currentTimeMillis();
-    }
-
-    @Override
-    protected void onDraw(android.graphics.Canvas canvas) {
-        if (mIsTesting && mIsScrolling) {
-            if (canScrollVertically(1)) {
-                scrollBy(0, mSpeed);
-            } else {
-                stopScrollTest();
-                mIsScrolling = false;
-            }
-        }
-        super.onDraw(canvas);
-    }
-
-    /*
-     * Called once the page is loaded to start scrolling for evaluating tiles.
-     * If autoScrolling isn't set, stop must be called manually. Before
-     * scrolling, invalidate all content and redraw it, measuring time taken.
-     */
-    public void startScrollTest(ProfileCallback callback, boolean autoScrolling) {
-        mCallback = callback;
-        mIsTesting = false;
-        mIsScrolling = false;
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        settings.setProperty("tree_updates", "0");
-
-
-        if (autoScrolling) {
-            // after a while, force it to start even if the pages haven't swapped
-            new CountDownTimer(LOAD_STALL_MILLIS, LOAD_STALL_MILLIS) {
-                @Override
-                public void onTick(long millisUntilFinished) {
-                }
-
-                @Override
-                public void onFinish() {
-                    // invalidate all content, and kick off redraw
-                    Log.d("ProfiledWebView",
-                            "kicking off test with callback registration, and tile discard...");
-                    getWebViewClassic().discardAllTextures();
-                    invalidate();
-                    mIsScrolling = true;
-                    mContentInvalMillis = System.currentTimeMillis();
-                }
-            }.start();
-        } else {
-            mIsTesting = true;
-            getWebViewClassic().tileProfilingStart();
-        }
-    }
-
-    /*
-     * Called after the manual contentInvalidateAll, after the tiles have all
-     * been redrawn.
-     * From PageSwapDelegate.
-     */
-    @Override
-    public void onPageSwapOccurred(boolean startAnim) {
-        if (!mIsTesting && mIsScrolling) {
-            // kick off testing
-            mContentInvalMillis = System.currentTimeMillis() - mContentInvalMillis;
-            Log.d("ProfiledWebView", "REDRAW TOOK " + mContentInvalMillis + "millis");
-            mIsTesting = true;
-            invalidate(); // ensure a redraw so that auto-scrolling can occur
-            getWebViewClassic().tileProfilingStart();
-        }
-    }
-
-    private double animFramerate() {
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        String updatesString = settings.getProperty("tree_updates");
-        int updates = (updatesString == null) ? -1 : Integer.parseInt(updatesString);
-
-        long animationTime;
-        if (mAnimationTime == 0 || mAnimationTime - mLoadTime < ANIM_SAFETY_THRESHOLD) {
-            animationTime = System.currentTimeMillis() - mLoadTime;
-        } else {
-            animationTime = mAnimationTime - mLoadTime;
-        }
-
-        return updates * 1000.0 / animationTime;
-    }
-
-    public void setDoubleBuffering(boolean useDoubleBuffering) {
-        WebSettingsClassic settings = getWebViewClassic().getSettings();
-        settings.setProperty("use_double_buffering", useDoubleBuffering ? "true" : "false");
-    }
-
-    /*
-     * Called once the page has stopped scrolling
-     */
-    public void stopScrollTest() {
-        getWebViewClassic().tileProfilingStop();
-        mIsTesting = false;
-
-        if (mCallback == null) {
-            getWebViewClassic().tileProfilingClear();
-            return;
-        }
-
-        RunData data = new RunData(getWebViewClassic().tileProfilingNumFrames());
-        // record the time spent (before scrolling) rendering the page
-        data.singleStats.put(getResources().getString(R.string.render_millis),
-                (double)mContentInvalMillis);
-
-        // record framerate
-        double framerate = animFramerate();
-        Log.d(LOGTAG, "anim framerate was "+framerate);
-        data.singleStats.put(getResources().getString(R.string.animation_framerate),
-                framerate);
-
-        for (int frame = 0; frame < data.frames.length; frame++) {
-            data.frames[frame] = new TileData[
-                    getWebViewClassic().tileProfilingNumTilesInFrame(frame)];
-            for (int tile = 0; tile < data.frames[frame].length; tile++) {
-                int left = getWebViewClassic().tileProfilingGetInt(frame, tile, "left");
-                int top = getWebViewClassic().tileProfilingGetInt(frame, tile, "top");
-                int right = getWebViewClassic().tileProfilingGetInt(frame, tile, "right");
-                int bottom = getWebViewClassic().tileProfilingGetInt(frame, tile, "bottom");
-
-                boolean isReady = getWebViewClassic().tileProfilingGetInt(
-                        frame, tile, "isReady") == 1;
-                int level = getWebViewClassic().tileProfilingGetInt(frame, tile, "level");
-
-                float scale = getWebViewClassic().tileProfilingGetFloat(frame, tile, "scale");
-
-                data.frames[frame][tile] = data.new TileData(left, top, right, bottom,
-                        isReady, level, scale);
-            }
-        }
-        getWebViewClassic().tileProfilingClear();
-
-        mCallback.profileCallback(data);
-    }
-
-    @Override
-    public void loadUrl(String url) {
-        mAnimationTime = 0;
-        mLoadTime = 0;
-        if (!url.startsWith("http://") && !url.startsWith("file://")) {
-            url = "http://" + url;
-        }
-        super.loadUrl(url);
-    }
-
-    public void setAutoScrollSpeed(int speedInt) {
-        mSpeed = speedInt;
-    }
-
-    public WebViewClassic getWebViewClassic() {
-        return WebViewClassic.fromWebView(this);
-    }
-}
diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java b/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java
deleted file mode 100644
index 5e48afd..0000000
--- a/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package com.test.tilebenchmark;
-
-import java.io.Serializable;
-import java.util.HashMap;
-
-public class RunData implements Serializable {
-    public TileData[][] frames;
-    public HashMap<String, Double> singleStats = new HashMap<String, Double>();
-
-    public RunData(int frames) {
-        this.frames = new TileData[frames][];
-    }
-
-    public class TileData implements Serializable {
-        public int left, top, right, bottom;
-        public boolean isReady;
-        public int level;
-        public float scale;
-
-        public TileData(int left, int top, int right, int bottom,
-                boolean isReady, int level, float scale) {
-            this.left = left;
-            this.right = right;
-            this.top = top;
-            this.bottom = bottom;
-            this.isReady = isReady;
-            this.level = level;
-            this.scale = scale;
-        }
-
-        public String toString() {
-            return "Tile (" + left + "," + top + ")->("
-                    + right + "," + bottom + ")"
-                    + (isReady ? "ready" : "NOTready") + " at scale " + scale;
-        }
-    }
-
-}
diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java
index 3f6fb6e..4baab1f 100644
--- a/wifi/java/android/net/wifi/WifiConfigStore.java
+++ b/wifi/java/android/net/wifi/WifiConfigStore.java
@@ -31,6 +31,7 @@
 import android.net.wifi.NetworkUpdateResult;
 import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
 import android.os.Environment;
+import android.os.FileObserver;
 import android.os.Message;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -42,12 +43,16 @@
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.EOFException;
+import java.io.File;
 import java.io.FileDescriptor;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.InetAddress;
@@ -111,6 +116,8 @@
     private static final String TAG = "WifiConfigStore";
     private static final boolean DBG = true;
 
+    private static final String SUPPLICANT_CONFIG_FILE = "/data/misc/wifi/wpa_supplicant.conf";
+
     /* configured networks with network id as the key */
     private HashMap<Integer, WifiConfiguration> mConfiguredNetworks =
             new HashMap<Integer, WifiConfiguration>();
@@ -147,6 +154,7 @@
     private static final String EOS = "eos";
 
     private final LocalLog mLocalLog;
+    WpaConfigFileObserver mFileObserver;
 
     private WifiNative mWifiNative;
     private final KeyStore mKeyStore = KeyStore.getInstance();
@@ -156,11 +164,28 @@
         mWifiNative = wn;
 
         if (DBG) {
-            mLocalLog = new LocalLog(1024);                         // takes about 64 K
-            mWifiNative.setLocalLog(mLocalLog);
+            mLocalLog = mWifiNative.getLocalLog();
+            mFileObserver = new WpaConfigFileObserver();
+            mFileObserver.startWatching();
         }
     }
 
+    class WpaConfigFileObserver extends FileObserver {
+
+        public WpaConfigFileObserver() {
+            super(SUPPLICANT_CONFIG_FILE, CLOSE_WRITE);
+        }
+
+        @Override
+        public void onEvent(int event, String path) {
+            if (event == CLOSE_WRITE) {
+                File file = new File(SUPPLICANT_CONFIG_FILE);
+                localLog("wpa_supplicant.conf changed; new size = " + file.length());
+            }
+        }
+    }
+
+
     /**
      * Fetch the list of configured networks
      * and enable all stored networks in supplicant.
@@ -332,7 +357,7 @@
         if (result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID) {
             sendConfiguredNetworksChangedBroadcast(mConfiguredNetworks.get(result.getNetworkId()),
                     result.isNewNetwork ? WifiManager.CHANGE_REASON_ADDED :
-                        WifiManager.CHANGE_REASON_CONFIG_CHANGE);
+                            WifiManager.CHANGE_REASON_CONFIG_CHANGE);
         }
         return result.getNetworkId();
     }
@@ -636,6 +661,7 @@
             try {
                 config.networkId = Integer.parseInt(result[0]);
             } catch(NumberFormatException e) {
+                loge("Failed to read network-id '" + result[0] + "'");
                 continue;
             }
             if (result.length > 3) {
@@ -663,6 +689,31 @@
         sendConfiguredNetworksChangedBroadcast();
 
         localLog("loadConfiguredNetworks loaded " + mNetworkIds.size() + " networks");
+
+        if (mNetworkIds.size() == 0) {
+            // no networks? Lets log if the wpa_supplicant.conf file contents
+            BufferedReader reader = null;
+            try {
+                reader = new BufferedReader(new FileReader(SUPPLICANT_CONFIG_FILE));
+                localLog("--- Begin wpa_supplicant.conf Contents ---");
+                for (String line = reader.readLine(); line != null; line = reader.readLine()) {
+                    localLog(line);
+                }
+                localLog("--- End wpa_supplicant.conf Contents ---");
+            } catch (FileNotFoundException e) {
+                localLog("Could not open " + SUPPLICANT_CONFIG_FILE + ", " + e);
+            } catch (IOException e) {
+                localLog("Could not read " + SUPPLICANT_CONFIG_FILE + ", " + e);
+            } finally {
+                try {
+                    if (reader != null) {
+                        reader.close();
+                    }
+                } catch (IOException e) {
+                    // Just ignore the fact that we couldn't close
+                }
+            }
+        }
     }
 
     /* Mark all networks except specified netId as disabled */
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index ea259be..f86a51c9 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -48,6 +48,10 @@
     static final int SCAN_WITHOUT_CONNECTION_SETUP          = 1;
     static final int SCAN_WITH_CONNECTION_SETUP             = 2;
 
+    // Hold this lock before calling supplicant - it is required to
+    // mutually exclude access from Wifi and P2p state machines
+    static final Object mLock = new Object();
+
     public final String mInterfaceName;
     public final String mInterfacePrefix;
 
@@ -92,11 +96,17 @@
         }
     }
 
+    private static final LocalLog mLocalLog = new LocalLog(1024);
 
-    private LocalLog mLocalLog;
+    // hold mLock before accessing mCmdIdLock
+    private int mCmdId;
 
-    public void setLocalLog(LocalLog l) {
-        mLocalLog = l;
+    public LocalLog getLocalLog() {
+        return mLocalLog;
+    }
+
+    private int getNewCmdIdLocked() {
+        return mCmdId++;
     }
 
     private void localLog(String s) {
@@ -105,30 +115,59 @@
     }
 
     public boolean connectToSupplicant() {
+        // No synchronization necessary .. it is implemented in WifiMonitor
+        localLog(mInterfacePrefix + "connectToSupplicant");
         return connectToSupplicantNative();
     }
 
     public void closeSupplicantConnection() {
+        localLog(mInterfacePrefix + "closeSupplicantConnection");
         closeSupplicantConnectionNative();
     }
 
     public String waitForEvent() {
+        // No synchronization necessary .. it is implemented in WifiMonitor
         return waitForEventNative();
     }
 
     private boolean doBooleanCommand(String command) {
         if (DBG) Log.d(mTAG, "doBoolean: " + command);
-        return doBooleanCommandNative(mInterfacePrefix + command);
+        synchronized (mLock) {
+            int cmdId = getNewCmdIdLocked();
+            localLog(cmdId + "->" + mInterfacePrefix + command);
+            boolean result = doBooleanCommandNative(mInterfacePrefix + command);
+            localLog(cmdId + "<-" + result);
+            return result;
+        }
     }
 
     private int doIntCommand(String command) {
         if (DBG) Log.d(mTAG, "doInt: " + command);
-        return doIntCommandNative(mInterfacePrefix + command);
+        synchronized (mLock) {
+            int cmdId = getNewCmdIdLocked();
+            localLog(cmdId + "->" + mInterfacePrefix + command);
+            int result = doIntCommandNative(mInterfacePrefix + command);
+            localLog(cmdId + "<-" + result);
+            return result;
+        }
     }
 
     private String doStringCommand(String command) {
         if (DBG) Log.d(mTAG, "doString: " + command);
-        return doStringCommandNative(mInterfacePrefix + command);
+        synchronized (mLock) {
+            int cmdId = getNewCmdIdLocked();
+            localLog(cmdId + "->" + mInterfacePrefix + command);
+            String result = doStringCommandNative(mInterfacePrefix + command);
+            localLog(cmdId + "<-" + result);
+            return result;
+        }
+    }
+
+    private String doStringCommandWithoutLogging(String command) {
+        if (DBG) Log.d(mTAG, "doString: " + command);
+        synchronized (mLock) {
+            return doStringCommandNative(mInterfacePrefix + command);
+        }
     }
 
     public boolean ping() {
@@ -157,48 +196,42 @@
     }
 
     public String listNetworks() {
-        localLog("LIST_NETWORKS");
         return doStringCommand("LIST_NETWORKS");
     }
 
     public int addNetwork() {
-        localLog("ADD_NETWORK");
         return doIntCommand("ADD_NETWORK");
     }
 
     public boolean setNetworkVariable(int netId, String name, String value) {
         if (TextUtils.isEmpty(name) || TextUtils.isEmpty(value)) return false;
-        localLog("SET_NETWORK " + netId + " " + name + "=" + value);
         return doBooleanCommand("SET_NETWORK " + netId + " " + name + " " + value);
     }
 
     public String getNetworkVariable(int netId, String name) {
         if (TextUtils.isEmpty(name)) return null;
-        return doStringCommand("GET_NETWORK " + netId + " " + name);
+
+        // GET_NETWORK will likely flood the logs ...
+        return doStringCommandWithoutLogging("GET_NETWORK " + netId + " " + name);
     }
 
     public boolean removeNetwork(int netId) {
-        localLog("REMOVE_NETWORK " + netId);
         return doBooleanCommand("REMOVE_NETWORK " + netId);
     }
 
     public boolean enableNetwork(int netId, boolean disableOthers) {
         if (disableOthers) {
-            localLog("SELECT_NETWORK " + netId);
             return doBooleanCommand("SELECT_NETWORK " + netId);
         } else {
-            localLog("ENABLE_NETWORK " + netId);
             return doBooleanCommand("ENABLE_NETWORK " + netId);
         }
     }
 
     public boolean disableNetwork(int netId) {
-        localLog("DISABLE_NETWORK " + netId);
         return doBooleanCommand("DISABLE_NETWORK " + netId);
     }
 
     public boolean reconnect() {
-        localLog("RECONNECT");
         return doBooleanCommand("RECONNECT");
     }
 
@@ -242,7 +275,7 @@
      * MASK=<N> see wpa_supplicant/src/common/wpa_ctrl.h for details
      */
     public String scanResults(int sid) {
-        return doStringCommand("BSS RANGE=" + sid + "- MASK=0x21987");
+        return doStringCommandWithoutLogging("BSS RANGE=" + sid + "- MASK=0x21987");
     }
 
     /**
@@ -401,7 +434,6 @@
     }
 
     public boolean saveConfig() {
-        localLog("SAVE_CONFIG");
         return doBooleanCommand("SAVE_CONFIG");
     }
 
@@ -456,7 +488,7 @@
      * FREQUENCY=0
      */
     public String signalPoll() {
-        return doStringCommand("SIGNAL_POLL");
+        return doStringCommandWithoutLogging("SIGNAL_POLL");
     }
 
     /** Example outout:
@@ -480,10 +512,12 @@
     }
 
     public boolean startWpsPbc(String iface, String bssid) {
-        if (TextUtils.isEmpty(bssid)) {
-            return doBooleanCommandNative("IFNAME=" + iface + " WPS_PBC");
-        } else {
-            return doBooleanCommandNative("IFNAME=" + iface + " WPS_PBC " + bssid);
+        synchronized (mLock) {
+            if (TextUtils.isEmpty(bssid)) {
+                return doBooleanCommandNative("IFNAME=" + iface + " WPS_PBC");
+            } else {
+                return doBooleanCommandNative("IFNAME=" + iface + " WPS_PBC " + bssid);
+            }
         }
     }
 
@@ -494,7 +528,9 @@
 
     public boolean startWpsPinKeypad(String iface, String pin) {
         if (TextUtils.isEmpty(pin)) return false;
-        return doBooleanCommandNative("IFNAME=" + iface + " WPS_PIN any " + pin);
+        synchronized (mLock) {
+            return doBooleanCommandNative("IFNAME=" + iface + " WPS_PIN any " + pin);
+        }
     }
 
 
@@ -507,10 +543,12 @@
     }
 
     public String startWpsPinDisplay(String iface, String bssid) {
-        if (TextUtils.isEmpty(bssid)) {
-            return doStringCommandNative("IFNAME=" + iface + " WPS_PIN any");
-        } else {
-            return doStringCommandNative("IFNAME=" + iface + " WPS_PIN " + bssid);
+        synchronized (mLock) {
+            if (TextUtils.isEmpty(bssid)) {
+                return doStringCommandNative("IFNAME=" + iface + " WPS_PIN any");
+            } else {
+                return doStringCommandNative("IFNAME=" + iface + " WPS_PIN " + bssid);
+            }
         }
     }
 
@@ -562,7 +600,9 @@
     }
 
     public boolean setP2pGroupIdle(String iface, int time) {
-        return doBooleanCommandNative("IFNAME=" + iface + " SET p2p_group_idle " + time);
+        synchronized (mLock) {
+            return doBooleanCommandNative("IFNAME=" + iface + " SET p2p_group_idle " + time);
+        }
     }
 
     public void setPowerSave(boolean enabled) {
@@ -574,10 +614,12 @@
     }
 
     public boolean setP2pPowerSave(String iface, boolean enabled) {
-        if (enabled) {
-            return doBooleanCommandNative("IFNAME=" + iface + " P2P_SET ps 1");
-        } else {
-            return doBooleanCommandNative("IFNAME=" + iface + " P2P_SET ps 0");
+        synchronized (mLock) {
+            if (enabled) {
+                return doBooleanCommandNative("IFNAME=" + iface + " P2P_SET ps 1");
+            } else {
+                return doBooleanCommandNative("IFNAME=" + iface + " P2P_SET ps 0");
+            }
         }
     }
 
@@ -746,7 +788,9 @@
 
     public boolean p2pGroupRemove(String iface) {
         if (TextUtils.isEmpty(iface)) return false;
-        return doBooleanCommandNative("IFNAME=" + iface + " P2P_GROUP_REMOVE " + iface);
+        synchronized (mLock) {
+            return doBooleanCommandNative("IFNAME=" + iface + " P2P_GROUP_REMOVE " + iface);
+        }
     }
 
     public boolean p2pReject(String deviceAddress) {
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 85fbdd8..d4e98c5 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -723,7 +723,7 @@
 
         setInitialState(mInitialState);
 
-        setLogRecSize(300);
+        setLogRecSize(2000);
         setLogOnlyTransitions(false);
         if (DBG) setDbg(true);