Merge "Doc change: Tools section of the dev guide restructuring"
diff --git a/api/11.xml b/api/11.xml
index 5fd9c8c..43bb440 100644
--- a/api/11.xml
+++ b/api/11.xml
@@ -165317,7 +165317,7 @@
 <package name="android.text.method"
 >
 <class name="ArrowKeyMovementMethod"
- extends="java.lang.Object"
+ extends="android.text.method.BaseMovementMethod"
  abstract="false"
  static="false"
  final="false"
@@ -166987,7 +166987,7 @@
 </method>
 </class>
 <class name="ScrollingMovementMethod"
- extends="java.lang.Object"
+ extends="android.text.method.BaseMovementMethod"
  abstract="false"
  static="false"
  final="false"
diff --git a/api/current.xml b/api/current.xml
index 6ff0ee3..3357d1e 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -2748,6 +2748,17 @@
  visibility="public"
 >
 </field>
+<field name="calendarViewShown"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843610"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="candidatesTextStyleSpans"
  type="int"
  transient="false"
@@ -3265,6 +3276,17 @@
  visibility="public"
 >
 </field>
+<field name="customTokens"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843593"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="cycles"
  type="int"
  transient="false"
@@ -3309,6 +3331,17 @@
  visibility="public"
 >
 </field>
+<field name="dateTextAppearance"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843607"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="debuggable"
  type="int"
  transient="false"
@@ -4354,6 +4387,17 @@
  visibility="public"
 >
 </field>
+<field name="firstDayOfWeek"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843595"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="fitsSystemWindows"
  type="int"
  transient="false"
@@ -4398,6 +4442,17 @@
  visibility="public"
 >
 </field>
+<field name="focusedMonthDateColor"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843601"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="footerDividersEnabled"
  type="int"
  transient="false"
@@ -6433,6 +6488,17 @@
  visibility="public"
 >
 </field>
+<field name="maxDate"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843598"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="maxEms"
  type="int"
  transient="false"
@@ -6576,6 +6642,17 @@
  visibility="public"
 >
 </field>
+<field name="minDate"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843597"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="minEms"
  type="int"
  transient="false"
@@ -6719,6 +6796,17 @@
  visibility="public"
 >
 </field>
+<field name="nextFocusForward"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843594"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="nextFocusLeft"
  type="int"
  transient="false"
@@ -8391,6 +8479,28 @@
  visibility="public"
 >
 </field>
+<field name="selectedDateVerticalBar"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843605"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="selectedWeekBackgroundColor"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843600"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="selection"
  type="int"
  transient="false"
@@ -8556,6 +8666,28 @@
  visibility="public"
 >
 </field>
+<field name="showWeekNumber"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843596"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="shownWeekCount"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843599"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="shrinkColumns"
  type="int"
  transient="false"
@@ -8611,6 +8743,17 @@
  visibility="public"
 >
 </field>
+<field name="solidColor"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843608"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="sortOrder"
  type="int"
  transient="false"
@@ -8688,6 +8831,17 @@
  visibility="public"
 >
 </field>
+<field name="spinnersShown"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843609"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="splitMotionEvents"
  type="int"
  transient="false"
@@ -10250,6 +10404,17 @@
  visibility="public"
 >
 </field>
+<field name="unfocusedMonthDateColor"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843602"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="unselectedAlpha"
  type="int"
  transient="false"
@@ -10646,6 +10811,39 @@
  visibility="public"
 >
 </field>
+<field name="weekDayTextAppearance"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843606"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="weekNumberColor"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843603"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="weekSeparatorLineColor"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843604"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="weightSum"
  type="int"
  transient="false"
@@ -15531,6 +15729,17 @@
  visibility="public"
 >
 </field>
+<field name="Widget_CalendarView"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974065"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="Widget_CompoundButton"
  type="int"
  transient="false"
@@ -15608,6 +15817,17 @@
  visibility="public"
 >
 </field>
+<field name="Widget_EditText_NumberPickerInputText"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974057"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="Widget_ExpandableListView"
  type="int"
  transient="false"
@@ -15795,6 +16015,17 @@
  visibility="public"
 >
 </field>
+<field name="Widget_Holo_CalendarView"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974066"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="Widget_Holo_CompoundButton_CheckBox"
  type="int"
  transient="false"
@@ -15861,6 +16092,17 @@
  visibility="public"
 >
 </field>
+<field name="Widget_Holo_EditText_NumberPickerInputText"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974060"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="Widget_Holo_ExpandableListView"
  type="int"
  transient="false"
@@ -15905,6 +16147,28 @@
  visibility="public"
 >
 </field>
+<field name="Widget_Holo_ImageButton_NumberPickerDownButton"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974061"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="Widget_Holo_ImageButton_NumberPickerUpButton"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974059"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="Widget_Holo_Light"
  type="int"
  transient="false"
@@ -16026,6 +16290,17 @@
  visibility="public"
 >
 </field>
+<field name="Widget_Holo_Light_CalendarView"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974067"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="Widget_Holo_Light_CompoundButton_CheckBox"
  type="int"
  transient="false"
@@ -16092,6 +16367,17 @@
  visibility="public"
 >
 </field>
+<field name="Widget_Holo_Light_EditText_NumberPickerInputText"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974063"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="Widget_Holo_Light_ExpandableListView"
  type="int"
  transient="false"
@@ -16136,6 +16422,28 @@
  visibility="public"
 >
 </field>
+<field name="Widget_Holo_Light_ImageButton_NumberPickerDownButton"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974064"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="Widget_Holo_Light_ImageButton_NumberPickerUpButton"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974062"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="Widget_Holo_Light_ListPopupWindow"
  type="int"
  transient="false"
@@ -16664,6 +16972,28 @@
  visibility="public"
 >
 </field>
+<field name="Widget_ImageButton_NumberPickerDownButton"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974058"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="Widget_ImageButton_NumberPickerUpButton"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16974056"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="Widget_ImageWell"
  type="int"
  transient="false"
@@ -18308,6 +18638,28 @@
  visibility="public"
 >
 </field>
+<field name="KEY_CALLER_PID"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;callerPid&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="KEY_CALLER_UID"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;callerUid&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="KEY_ERROR_CODE"
  type="java.lang.String"
  transient="false"
@@ -18555,6 +18907,28 @@
 </parameter>
 <parameter name="prefId" type="int">
 </parameter>
+<parameter name="customTokens" type="boolean">
+</parameter>
+</constructor>
+<constructor name="AuthenticatorDescription"
+ type="android.accounts.AuthenticatorDescription"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="type" type="java.lang.String">
+</parameter>
+<parameter name="packageName" type="java.lang.String">
+</parameter>
+<parameter name="labelId" type="int">
+</parameter>
+<parameter name="iconId" type="int">
+</parameter>
+<parameter name="smallIconId" type="int">
+</parameter>
+<parameter name="prefId" type="int">
+</parameter>
 </constructor>
 <method name="describeContents"
  return="int"
@@ -18615,6 +18989,16 @@
  visibility="public"
 >
 </field>
+<field name="customTokens"
+ type="boolean"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="iconId"
  type="int"
  transient="false"
@@ -24231,6 +24615,17 @@
  visibility="public"
 >
 </method>
+<method name="getLargeMemoryClass"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getMemoryClass"
  return="int"
  abstract="false"
@@ -26655,6 +27050,17 @@
 <parameter name="dayOfMonth" type="int">
 </parameter>
 </constructor>
+<method name="getDatePicker"
+ return="android.widget.DatePicker"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="onClick"
  return="void"
  abstract="false"
@@ -29952,6 +30358,19 @@
 <parameter name="args" type="java.lang.String[]">
 </parameter>
 </method>
+<method name="enableDebugLogging"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="enabled" type="boolean">
+</parameter>
+</method>
 <method name="executePendingTransactions"
  return="boolean"
  abstract="true"
@@ -32206,6 +32625,19 @@
  visibility="public"
 >
 </constructor>
+<method name="destroyLoader"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="id" type="int">
+</parameter>
+</method>
 <method name="dump"
  return="void"
  abstract="true"
@@ -32225,6 +32657,19 @@
 <parameter name="args" type="java.lang.String[]">
 </parameter>
 </method>
+<method name="enableDebugLogging"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="enabled" type="boolean">
+</parameter>
+</method>
 <method name="getLoader"
  return="android.content.Loader&lt;D&gt;"
  abstract="true"
@@ -32274,12 +32719,12 @@
 </method>
 <method name="stopLoader"
  return="void"
- abstract="true"
+ abstract="false"
  native="false"
  synchronized="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="id" type="int">
@@ -32323,123 +32768,20 @@
 <parameter name="data" type="D">
 </parameter>
 </method>
+<method name="onLoaderReset"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="loader" type="android.content.Loader&lt;D&gt;">
+</parameter>
+</method>
 </interface>
-<class name="LoaderManagingFragment"
- extends="android.app.Fragment"
- abstract="true"
- static="false"
- final="false"
- deprecated="deprecated"
- visibility="public"
->
-<implements name="android.content.Loader.OnLoadCompleteListener">
-</implements>
-<constructor name="LoaderManagingFragment"
- type="android.app.LoaderManagingFragment"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</constructor>
-<method name="getLoader"
- return="android.content.Loader&lt;D&gt;"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="id" type="int">
-</parameter>
-</method>
-<method name="onCreateLoader"
- return="android.content.Loader&lt;D&gt;"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-<parameter name="id" type="int">
-</parameter>
-<parameter name="args" type="android.os.Bundle">
-</parameter>
-</method>
-<method name="onInitializeLoaders"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-</method>
-<method name="onLoadComplete"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="loader" type="android.content.Loader&lt;D&gt;">
-</parameter>
-<parameter name="data" type="D">
-</parameter>
-</method>
-<method name="onLoadFinished"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-<parameter name="loader" type="android.content.Loader&lt;D&gt;">
-</parameter>
-<parameter name="data" type="D">
-</parameter>
-</method>
-<method name="startLoading"
- return="android.content.Loader&lt;D&gt;"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="id" type="int">
-</parameter>
-<parameter name="args" type="android.os.Bundle">
-</parameter>
-</method>
-<method name="stopLoading"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="id" type="int">
-</parameter>
-</method>
-</class>
 <class name="LocalActivityManager"
  extends="java.lang.Object"
  abstract="false"
@@ -39229,6 +39571,23 @@
  visibility="public"
 >
 </method>
+<method name="listenUsingInsecureRfcommWithServiceRecord"
+ return="android.bluetooth.BluetoothServerSocket"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+<parameter name="uuid" type="java.util.UUID">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
 <method name="listenUsingRfcommWithServiceRecord"
  return="android.bluetooth.BluetoothServerSocket"
  abstract="false"
@@ -41568,6 +41927,21 @@
 >
 <implements name="android.os.Parcelable">
 </implements>
+<method name="createInsecureRfcommSocketToServiceRecord"
+ return="android.bluetooth.BluetoothSocket"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="uuid" type="java.util.UUID">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
 <method name="createRfcommSocketToServiceRecord"
  return="android.bluetooth.BluetoothSocket"
  abstract="false"
@@ -42899,17 +43273,6 @@
  visibility="public"
 >
 </method>
-<method name="forceLoad"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
 <method name="loadInBackground"
  return="D"
  abstract="true"
@@ -49433,17 +49796,6 @@
 <parameter name="cursor" type="android.database.Cursor">
 </parameter>
 </method>
-<method name="destroy"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
 <method name="getProjection"
  return="java.lang.String[]"
  abstract="false"
@@ -49603,28 +49955,6 @@
 <parameter name="uri" type="android.net.Uri">
 </parameter>
 </method>
-<method name="startLoading"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="stopLoading"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
 </class>
 <interface name="DialogInterface"
  abstract="true"
@@ -54719,7 +55049,7 @@
 </class>
 <class name="Loader"
  extends="java.lang.Object"
- abstract="true"
+ abstract="false"
  static="false"
  final="false"
  deprecated="not deprecated"
@@ -54735,6 +55065,19 @@
 <parameter name="context" type="android.content.Context">
 </parameter>
 </constructor>
+<method name="dataToString"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="data" type="D">
+</parameter>
+</method>
 <method name="deliverResult"
  return="void"
  abstract="false"
@@ -54748,9 +55091,9 @@
 <parameter name="data" type="D">
 </parameter>
 </method>
-<method name="destroy"
+<method name="dump"
  return="void"
- abstract="true"
+ abstract="false"
  native="false"
  synchronized="false"
  static="false"
@@ -54758,14 +55101,22 @@
  deprecated="not deprecated"
  visibility="public"
 >
+<parameter name="prefix" type="java.lang.String">
+</parameter>
+<parameter name="fd" type="java.io.FileDescriptor">
+</parameter>
+<parameter name="writer" type="java.io.PrintWriter">
+</parameter>
+<parameter name="args" type="java.lang.String[]">
+</parameter>
 </method>
 <method name="forceLoad"
  return="void"
- abstract="true"
+ abstract="false"
  native="false"
  synchronized="false"
  static="false"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -54792,6 +55143,28 @@
  visibility="public"
 >
 </method>
+<method name="isReset"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isStarted"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="onContentChanged"
  return="void"
  abstract="false"
@@ -54803,6 +55176,50 @@
  visibility="public"
 >
 </method>
+<method name="onForceLoad"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+</method>
+<method name="onReset"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+</method>
+<method name="onStartLoading"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+</method>
+<method name="onStopLoading"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+</method>
 <method name="registerListener"
  return="void"
  abstract="false"
@@ -54818,20 +55235,42 @@
 <parameter name="listener" type="android.content.Loader.OnLoadCompleteListener&lt;D&gt;">
 </parameter>
 </method>
-<method name="startLoading"
+<method name="reset"
  return="void"
- abstract="true"
+ abstract="false"
  native="false"
  synchronized="false"
  static="false"
- final="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="startLoading"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
 </method>
 <method name="stopLoading"
  return="void"
- abstract="true"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="takeContentChanged"
+ return="boolean"
+ abstract="false"
  native="false"
  synchronized="false"
  static="false"
@@ -103921,6 +104360,17 @@
  deprecated="not deprecated"
  visibility="public"
 >
+<field name="AAC"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="3"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="AMR_NB"
  type="int"
  transient="false"
@@ -103932,6 +104382,17 @@
  visibility="public"
 >
 </field>
+<field name="AMR_WB"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="DEFAULT"
  type="int"
  transient="false"
@@ -104099,6 +104560,28 @@
  deprecated="not deprecated"
  visibility="public"
 >
+<field name="AMR_NB"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="3"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="AMR_WB"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="4"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="DEFAULT"
  type="int"
  transient="false"
@@ -143214,7 +143697,7 @@
  synchronized="false"
  static="true"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="data" type="byte[]">
@@ -166318,6 +166801,92 @@
 >
 </field>
 </class>
+<class name="RecognizerResultsIntent"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<field name="ACTION_VOICE_SEARCH_RESULTS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.speech.action.VOICE_SEARCH_RESULTS&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_VOICE_SEARCH_RESULT_HTML"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.speech.extras.VOICE_SEARCH_RESULT_HTML&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.speech.extras.VOICE_SEARCH_RESULT_HTML_BASE_URLS&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.speech.extras.EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_VOICE_SEARCH_RESULT_STRINGS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.speech.extras.VOICE_SEARCH_RESULT_STRINGS&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_VOICE_SEARCH_RESULT_URLS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.speech.extras.VOICE_SEARCH_RESULT_URLS&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="URI_SCHEME_INLINE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;inline&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
 <class name="SpeechRecognizer"
  extends="java.lang.Object"
  abstract="false"
@@ -179210,6 +179779,28 @@
  visibility="public"
 >
 </field>
+<field name="TYPE_NUMBER_VARIATION_NORMAL"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="TYPE_NUMBER_VARIATION_PASSWORD"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="TYPE_TEXT_FLAG_AUTO_COMPLETE"
  type="int"
  transient="false"
@@ -184873,7 +185464,7 @@
 <package name="android.text.method"
 >
 <class name="ArrowKeyMovementMethod"
- extends="java.lang.Object"
+ extends="android.text.method.BaseMovementMethod"
  abstract="false"
  static="false"
  final="false"
@@ -184890,17 +185481,6 @@
  visibility="public"
 >
 </constructor>
-<method name="canSelectArbitrarily"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
 <method name="getInstance"
  return="android.text.method.MovementMethod"
  abstract="false"
@@ -184912,127 +185492,6 @@
  visibility="public"
 >
 </method>
-<method name="initialize"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="text" type="android.text.Spannable">
-</parameter>
-</method>
-<method name="onKeyDown"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-<parameter name="keyCode" type="int">
-</parameter>
-<parameter name="event" type="android.view.KeyEvent">
-</parameter>
-</method>
-<method name="onKeyOther"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="view" type="android.widget.TextView">
-</parameter>
-<parameter name="text" type="android.text.Spannable">
-</parameter>
-<parameter name="event" type="android.view.KeyEvent">
-</parameter>
-</method>
-<method name="onKeyUp"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-<parameter name="keyCode" type="int">
-</parameter>
-<parameter name="event" type="android.view.KeyEvent">
-</parameter>
-</method>
-<method name="onTakeFocus"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="view" type="android.widget.TextView">
-</parameter>
-<parameter name="text" type="android.text.Spannable">
-</parameter>
-<parameter name="dir" type="int">
-</parameter>
-</method>
-<method name="onTouchEvent"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-<parameter name="event" type="android.view.MotionEvent">
-</parameter>
-</method>
-<method name="onTrackballEvent"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="text" type="android.text.Spannable">
-</parameter>
-<parameter name="event" type="android.view.MotionEvent">
-</parameter>
-</method>
 </class>
 <class name="BaseKeyListener"
  extends="android.text.method.MetaKeyKeyListener"
@@ -185071,6 +185530,25 @@
 <parameter name="event" type="android.view.KeyEvent">
 </parameter>
 </method>
+<method name="forwardDelete"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="view" type="android.view.View">
+</parameter>
+<parameter name="content" type="android.text.Editable">
+</parameter>
+<parameter name="keyCode" type="int">
+</parameter>
+<parameter name="event" type="android.view.KeyEvent">
+</parameter>
+</method>
 <method name="onKeyOther"
  return="boolean"
  abstract="false"
@@ -185089,6 +185567,373 @@
 </parameter>
 </method>
 </class>
+<class name="BaseMovementMethod"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<implements name="android.text.method.MovementMethod">
+</implements>
+<constructor name="BaseMovementMethod"
+ type="android.text.method.BaseMovementMethod"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="bottom"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="canSelectArbitrarily"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="down"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="end"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="getMovementMetaState"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+<parameter name="event" type="android.view.KeyEvent">
+</parameter>
+</method>
+<method name="handleMovementKey"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+<parameter name="keyCode" type="int">
+</parameter>
+<parameter name="movementMetaState" type="int">
+</parameter>
+<parameter name="event" type="android.view.KeyEvent">
+</parameter>
+</method>
+<method name="home"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="initialize"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="text" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="left"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="lineEnd"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="lineStart"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="onKeyDown"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="text" type="android.text.Spannable">
+</parameter>
+<parameter name="keyCode" type="int">
+</parameter>
+<parameter name="event" type="android.view.KeyEvent">
+</parameter>
+</method>
+<method name="onKeyOther"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="text" type="android.text.Spannable">
+</parameter>
+<parameter name="event" type="android.view.KeyEvent">
+</parameter>
+</method>
+<method name="onKeyUp"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="text" type="android.text.Spannable">
+</parameter>
+<parameter name="keyCode" type="int">
+</parameter>
+<parameter name="event" type="android.view.KeyEvent">
+</parameter>
+</method>
+<method name="onTakeFocus"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="text" type="android.text.Spannable">
+</parameter>
+<parameter name="direction" type="int">
+</parameter>
+</method>
+<method name="onTouchEvent"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="text" type="android.text.Spannable">
+</parameter>
+<parameter name="event" type="android.view.MotionEvent">
+</parameter>
+</method>
+<method name="onTrackballEvent"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="text" type="android.text.Spannable">
+</parameter>
+<parameter name="event" type="android.view.MotionEvent">
+</parameter>
+</method>
+<method name="pageDown"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="pageUp"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="right"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="top"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+<method name="up"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="widget" type="android.widget.TextView">
+</parameter>
+<parameter name="buffer" type="android.text.Spannable">
+</parameter>
+</method>
+</class>
 <class name="CharacterPickerDialog"
  extends="android.app.Dialog"
  abstract="false"
@@ -186554,7 +187399,7 @@
 </method>
 </class>
 <class name="ScrollingMovementMethod"
- extends="java.lang.Object"
+ extends="android.text.method.BaseMovementMethod"
  abstract="false"
  static="false"
  final="false"
@@ -186571,32 +187416,6 @@
  visibility="public"
 >
 </constructor>
-<method name="canSelectArbitrarily"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="down"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-</method>
 <method name="getInstance"
  return="android.text.method.MovementMethod"
  abstract="false"
@@ -186608,172 +187427,6 @@
  visibility="public"
 >
 </method>
-<method name="initialize"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="text" type="android.text.Spannable">
-</parameter>
-</method>
-<method name="left"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-</method>
-<method name="onKeyDown"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-<parameter name="keyCode" type="int">
-</parameter>
-<parameter name="event" type="android.view.KeyEvent">
-</parameter>
-</method>
-<method name="onKeyOther"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="view" type="android.widget.TextView">
-</parameter>
-<parameter name="text" type="android.text.Spannable">
-</parameter>
-<parameter name="event" type="android.view.KeyEvent">
-</parameter>
-</method>
-<method name="onKeyUp"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-<parameter name="keyCode" type="int">
-</parameter>
-<parameter name="event" type="android.view.KeyEvent">
-</parameter>
-</method>
-<method name="onTakeFocus"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="text" type="android.text.Spannable">
-</parameter>
-<parameter name="dir" type="int">
-</parameter>
-</method>
-<method name="onTouchEvent"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-<parameter name="event" type="android.view.MotionEvent">
-</parameter>
-</method>
-<method name="onTrackballEvent"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="text" type="android.text.Spannable">
-</parameter>
-<parameter name="event" type="android.view.MotionEvent">
-</parameter>
-</method>
-<method name="right"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-</method>
-<method name="up"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-<parameter name="widget" type="android.widget.TextView">
-</parameter>
-<parameter name="buffer" type="android.text.Spannable">
-</parameter>
-</method>
 </class>
 <class name="SingleLineTransformationMethod"
  extends="android.text.method.ReplacementTransformationMethod"
@@ -206768,6 +207421,17 @@
  visibility="public"
 >
 </method>
+<method name="getNextFocusForwardId"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getNextFocusLeftId"
  return="int"
  abstract="false"
@@ -209181,6 +209845,19 @@
 <parameter name="nextFocusDownId" type="int">
 </parameter>
 </method>
+<method name="setNextFocusForwardId"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="nextFocusForwardId" type="int">
+</parameter>
+</method>
 <method name="setNextFocusLeftId"
  return="void"
  abstract="false"
@@ -222543,6 +223220,8 @@
 >
 <parameter name="imi" type="android.view.inputmethod.InputMethodInfo">
 </parameter>
+<parameter name="allowsImplicitlySelectedSubtypes" type="boolean">
+</parameter>
 </method>
 <method name="getInputMethodList"
  return="java.util.List&lt;android.view.inputmethod.InputMethodInfo&gt;"
@@ -223321,7 +224000,7 @@
  abstract="false"
  static="false"
  final="true"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <constructor name="CacheManager"
@@ -223339,7 +224018,7 @@
  synchronized="false"
  static="true"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 </method>
@@ -223361,7 +224040,7 @@
  synchronized="false"
  static="true"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="url" type="java.lang.String">
@@ -223376,7 +224055,7 @@
  synchronized="false"
  static="true"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 </method>
@@ -223387,7 +224066,7 @@
  synchronized="false"
  static="true"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="url" type="java.lang.String">
@@ -223412,7 +224091,7 @@
  abstract="false"
  static="true"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <constructor name="CacheManager.CacheResult"
@@ -233569,6 +234248,228 @@
 </parameter>
 </constructor>
 </class>
+<class name="CalendarView"
+ extends="android.widget.FrameLayout"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="CalendarView"
+ type="android.widget.CalendarView"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+</constructor>
+<constructor name="CalendarView"
+ type="android.widget.CalendarView"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="attrs" type="android.util.AttributeSet">
+</parameter>
+</constructor>
+<constructor name="CalendarView"
+ type="android.widget.CalendarView"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="attrs" type="android.util.AttributeSet">
+</parameter>
+<parameter name="defStyle" type="int">
+</parameter>
+</constructor>
+<method name="getDate"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getFirstDayOfWeek"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getMaxDate"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getMinDate"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getShowWeekNumber"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="setDate"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="date" type="long">
+</parameter>
+</method>
+<method name="setDate"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="date" type="long">
+</parameter>
+<parameter name="animate" type="boolean">
+</parameter>
+<parameter name="center" type="boolean">
+</parameter>
+</method>
+<method name="setFirstDayOfWeek"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="firstDayOfWeek" type="int">
+</parameter>
+</method>
+<method name="setMaxDate"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="maxDate" type="long">
+</parameter>
+</method>
+<method name="setMinDate"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="minDate" type="long">
+</parameter>
+</method>
+<method name="setOnDateChangeListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.widget.CalendarView.OnDateChangeListener">
+</parameter>
+</method>
+<method name="setShowWeekNumber"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="showWeekNumber" type="boolean">
+</parameter>
+</method>
+</class>
+<interface name="CalendarView.OnDateChangeListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onSelectedDayChange"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="view" type="android.widget.CalendarView">
+</parameter>
+<parameter name="year" type="int">
+</parameter>
+<parameter name="month" type="int">
+</parameter>
+<parameter name="dayOfMonth" type="int">
+</parameter>
+</method>
+</interface>
 <class name="CheckBox"
  extends="android.widget.CompoundButton"
  abstract="false"
@@ -234083,7 +234984,7 @@
  type="android.widget.CursorAdapter"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="context" type="android.content.Context">
@@ -234256,7 +235157,7 @@
  synchronized="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="protected"
 >
 <parameter name="context" type="android.content.Context">
@@ -234266,23 +235167,6 @@
 <parameter name="autoRequery" type="boolean">
 </parameter>
 </method>
-<method name="init"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="c" type="android.database.Cursor">
-</parameter>
-<parameter name="flags" type="int">
-</parameter>
-</method>
 <method name="newDropDownView"
  return="android.view.View"
  abstract="false"
@@ -234354,6 +235238,19 @@
 <parameter name="filterQueryProvider" type="android.widget.FilterQueryProvider">
 </parameter>
 </method>
+<method name="swapCursor"
+ return="android.database.Cursor"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="newCursor" type="android.database.Cursor">
+</parameter>
+</method>
 <field name="FLAG_AUTO_REQUERY"
  type="int"
  transient="false"
@@ -234361,7 +235258,7 @@
  value="1"
  static="true"
  final="true"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 </field>
@@ -234819,6 +235716,17 @@
 <parameter name="defStyle" type="int">
 </parameter>
 </constructor>
+<method name="getCalendarViewShown"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getDayOfMonth"
  return="int"
  abstract="false"
@@ -234830,6 +235738,28 @@
  visibility="public"
 >
 </method>
+<method name="getMaxDate"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getMinDate"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getMonth"
  return="int"
  abstract="false"
@@ -234841,6 +235771,17 @@
  visibility="public"
 >
 </method>
+<method name="getSpinnersShown"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getYear"
  return="int"
  abstract="false"
@@ -234871,6 +235812,58 @@
 <parameter name="onDateChangedListener" type="android.widget.DatePicker.OnDateChangedListener">
 </parameter>
 </method>
+<method name="setCalendarViewShown"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="shown" type="boolean">
+</parameter>
+</method>
+<method name="setMaxDate"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="maxDate" type="long">
+</parameter>
+</method>
+<method name="setMinDate"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="minDate" type="long">
+</parameter>
+</method>
+<method name="setSpinnersShown"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="shown" type="boolean">
+</parameter>
+</method>
 <method name="updateDate"
  return="void"
  abstract="false"
@@ -234916,172 +235909,6 @@
 </parameter>
 </method>
 </interface>
-<class name="DayPicker"
- extends="android.widget.FrameLayout"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<constructor name="DayPicker"
- type="android.widget.DayPicker"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-</constructor>
-<constructor name="DayPicker"
- type="android.widget.DayPicker"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="attrs" type="android.util.AttributeSet">
-</parameter>
-</constructor>
-<constructor name="DayPicker"
- type="android.widget.DayPicker"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="attrs" type="android.util.AttributeSet">
-</parameter>
-<parameter name="defStyle" type="int">
-</parameter>
-</constructor>
-<method name="getSelectedDay"
- return="java.util.Calendar"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="goTo"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="year" type="int">
-</parameter>
-<parameter name="month" type="int">
-</parameter>
-<parameter name="dayOfMonth" type="int">
-</parameter>
-<parameter name="animate" type="boolean">
-</parameter>
-<parameter name="setSelected" type="boolean">
-</parameter>
-<parameter name="forceScroll" type="boolean">
-</parameter>
-</method>
-<method name="goTo"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="date" type="java.util.Calendar">
-</parameter>
-<parameter name="animate" type="boolean">
-</parameter>
-<parameter name="setSelected" type="boolean">
-</parameter>
-<parameter name="forceScroll" type="boolean">
-</parameter>
-</method>
-<method name="setOnDateChangeListener"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="listener" type="android.widget.DayPicker.OnSelectedDayChangeListener">
-</parameter>
-</method>
-<method name="setRange"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="startRangeDate" type="java.util.Calendar">
-</parameter>
-<parameter name="endRangeDate" type="java.util.Calendar">
-</parameter>
-</method>
-<method name="setSelectedDay"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="selectedDay" type="java.util.Calendar">
-</parameter>
-</method>
-</class>
-<interface name="DayPicker.OnSelectedDayChangeListener"
- abstract="true"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<method name="onSelectedDayChange"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="view" type="android.widget.DayPicker">
-</parameter>
-<parameter name="year" type="int">
-</parameter>
-<parameter name="month" type="int">
-</parameter>
-<parameter name="dayOfMonth" type="int">
-</parameter>
-</method>
-</interface>
 <class name="DialerFilter"
  extends="android.widget.RelativeLayout"
  abstract="false"
@@ -240284,7 +241111,18 @@
 <parameter name="defStyle" type="int">
 </parameter>
 </constructor>
-<method name="getCurrent"
+<method name="getDisplayedValues"
+ return="java.lang.String[]"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getMaxValue"
  return="int"
  abstract="false"
  native="false"
@@ -240295,7 +241133,7 @@
  visibility="public"
 >
 </method>
-<method name="getRangeEnd"
+<method name="getMinValue"
  return="int"
  abstract="false"
  native="false"
@@ -240306,7 +241144,7 @@
  visibility="public"
 >
 </method>
-<method name="getRangeStart"
+<method name="getValue"
  return="int"
  abstract="false"
  native="false"
@@ -240317,7 +241155,18 @@
  visibility="public"
 >
 </method>
-<method name="setCurrent"
+<method name="getWrapSelectorWheel"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="setDisplayedValues"
  return="void"
  abstract="false"
  native="false"
@@ -240327,7 +241176,7 @@
  deprecated="not deprecated"
  visibility="public"
 >
-<parameter name="current" type="int">
+<parameter name="displayedValues" type="java.lang.String[]">
 </parameter>
 </method>
 <method name="setFormatter"
@@ -240343,7 +241192,7 @@
 <parameter name="formatter" type="android.widget.NumberPicker.Formatter">
 </parameter>
 </method>
-<method name="setOnChangeListener"
+<method name="setMaxValue"
  return="void"
  abstract="false"
  native="false"
@@ -240353,7 +241202,20 @@
  deprecated="not deprecated"
  visibility="public"
 >
-<parameter name="onChangeListener" type="android.widget.NumberPicker.OnChangeListener">
+<parameter name="maxValue" type="int">
+</parameter>
+</method>
+<method name="setMinValue"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="minValue" type="int">
 </parameter>
 </method>
 <method name="setOnLongPressUpdateInterval"
@@ -240382,7 +241244,7 @@
 <parameter name="onScrollListener" type="android.widget.NumberPicker.OnScrollListener">
 </parameter>
 </method>
-<method name="setRange"
+<method name="setOnValueChangedListener"
  return="void"
  abstract="false"
  native="false"
@@ -240392,12 +241254,10 @@
  deprecated="not deprecated"
  visibility="public"
 >
-<parameter name="start" type="int">
-</parameter>
-<parameter name="end" type="int">
+<parameter name="onValueChangedListener" type="android.widget.NumberPicker.OnValueChangedListener">
 </parameter>
 </method>
-<method name="setRange"
+<method name="setValue"
  return="void"
  abstract="false"
  native="false"
@@ -240407,30 +241267,7 @@
  deprecated="not deprecated"
  visibility="public"
 >
-<parameter name="start" type="int">
-</parameter>
-<parameter name="end" type="int">
-</parameter>
-<parameter name="displayedValues" type="java.lang.String[]">
-</parameter>
-</method>
-<method name="setRange"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="start" type="int">
-</parameter>
-<parameter name="end" type="int">
-</parameter>
-<parameter name="displayedValues" type="java.lang.String[]">
-</parameter>
-<parameter name="wrapSelectorWheel" type="boolean">
+<parameter name="value" type="int">
 </parameter>
 </method>
 <method name="setWrapSelectorWheel"
@@ -240446,16 +241283,6 @@
 <parameter name="wrapSelector" type="boolean">
 </parameter>
 </method>
-<field name="TWO_DIGIT_FORMATTER"
- type="android.widget.NumberPicker.Formatter"
- transient="false"
- volatile="false"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
 </class>
 <interface name="NumberPicker.Formatter"
  abstract="true"
@@ -240464,7 +241291,7 @@
  deprecated="not deprecated"
  visibility="public"
 >
-<method name="toString"
+<method name="format"
  return="java.lang.String"
  abstract="true"
  native="false"
@@ -240478,31 +241305,6 @@
 </parameter>
 </method>
 </interface>
-<interface name="NumberPicker.OnChangeListener"
- abstract="true"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<method name="onChange"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="picker" type="android.widget.NumberPicker">
-</parameter>
-<parameter name="oldVal" type="int">
-</parameter>
-<parameter name="newVal" type="int">
-</parameter>
-</method>
-</interface>
 <interface name="NumberPicker.OnScrollListener"
  abstract="true"
  static="true"
@@ -240559,6 +241361,31 @@
 >
 </field>
 </interface>
+<interface name="NumberPicker.OnValueChangedListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onValueChange"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="picker" type="android.widget.NumberPicker">
+</parameter>
+<parameter name="oldVal" type="int">
+</parameter>
+<parameter name="newVal" type="int">
+</parameter>
+</method>
+</interface>
 <class name="OverScroller"
  extends="java.lang.Object"
  abstract="false"
@@ -243872,7 +244699,7 @@
  type="android.widget.ResourceCursorAdapter"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="context" type="android.content.Context">
@@ -245304,6 +246131,24 @@
  type="android.widget.SimpleCursorAdapter"
  static="false"
  final="false"
+ deprecated="deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="layout" type="int">
+</parameter>
+<parameter name="c" type="android.database.Cursor">
+</parameter>
+<parameter name="from" type="java.lang.String[]">
+</parameter>
+<parameter name="to" type="int[]">
+</parameter>
+</constructor>
+<constructor name="SimpleCursorAdapter"
+ type="android.widget.SimpleCursorAdapter"
+ static="false"
+ final="false"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -245317,6 +246162,8 @@
 </parameter>
 <parameter name="to" type="int[]">
 </parameter>
+<parameter name="flags" type="int">
+</parameter>
 </constructor>
 <method name="bindView"
  return="void"
@@ -251263,7 +252110,7 @@
  deprecated="not deprecated"
  visibility="public"
 >
-<parameter name="t" type="T">
+<parameter name="arg0" type="T">
 </parameter>
 </method>
 </interface>
@@ -335167,7 +336014,7 @@
  native="false"
  synchronized="false"
  static="true"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -335235,7 +336082,7 @@
  native="false"
  synchronized="false"
  static="true"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -335259,7 +336106,7 @@
  native="false"
  synchronized="false"
  static="true"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -340902,7 +341749,7 @@
  native="false"
  synchronized="false"
  static="true"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -340913,7 +341760,7 @@
  native="false"
  synchronized="false"
  static="true"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -340924,7 +341771,7 @@
  native="false"
  synchronized="false"
  static="true"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -343294,7 +344141,7 @@
  native="false"
  synchronized="false"
  static="true"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -358368,7 +359215,7 @@
  native="false"
  synchronized="false"
  static="true"
- final="false"
+ final="true"
  deprecated="not deprecated"
  visibility="public"
 >
diff --git a/build/phone-hdpi-512-dalvik-heap.mk b/build/phone-hdpi-512-dalvik-heap.mk
new file mode 100644
index 0000000..afc45ee
--- /dev/null
+++ b/build/phone-hdpi-512-dalvik-heap.mk
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+# Provides overrides to configure the Dalvik heap for a standard high density
+# phone with around 512MB total RAM.
+
+PRODUCT_PROPERTY_OVERRIDES += \
+    dalvik.vm.heapstartsize=5m \
+    dalvik.vm.smallheapsize=32m \
+    dalvik.vm.heapsize=32m
diff --git a/build/phone-hdpi-dalvik-heap.mk b/build/phone-hdpi-dalvik-heap.mk
new file mode 100644
index 0000000..ee30b92
--- /dev/null
+++ b/build/phone-hdpi-dalvik-heap.mk
@@ -0,0 +1,22 @@
+#
+# 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.
+#
+
+# Provides overrides to configure the Dalvik heap for a standard high density phone.
+
+PRODUCT_PROPERTY_OVERRIDES += \
+    dalvik.vm.heapstartsize=5m \
+    dalvik.vm.smallheapsize=32m \
+    dalvik.vm.heapsize=32m
diff --git a/build/tablet-dalvik-heap.mk b/build/tablet-dalvik-heap.mk
new file mode 100644
index 0000000..9cb2f6b
--- /dev/null
+++ b/build/tablet-dalvik-heap.mk
@@ -0,0 +1,22 @@
+#
+# 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.
+#
+
+# Provides overrides to configure the Dalvik heap for a standard tablet device.
+
+PRODUCT_PROPERTY_OVERRIDES += \
+    dalvik.vm.heapstartsize=5m \
+    dalvik.vm.smallheapsize=48m \
+    dalvik.vm.heapsize=48m
diff --git a/cmds/stagefright/stream.cpp b/cmds/stagefright/stream.cpp
index ccae92eb..9246a00 100644
--- a/cmds/stagefright/stream.cpp
+++ b/cmds/stagefright/stream.cpp
@@ -40,7 +40,7 @@
 MyStreamSource::MyStreamSource(int fd)
     : mFd(fd),
       mFileSize(0),
-      mNextSeekTimeUs(ALooper::GetNowUs() + 5000000ll) {
+      mNextSeekTimeUs(-1) {  // ALooper::GetNowUs() + 5000000ll) {
     CHECK_GE(fd, 0);
 
     mFileSize = lseek64(fd, 0, SEEK_END);
diff --git a/core/java/android/accounts/AccountAuthenticatorCache.java b/core/java/android/accounts/AccountAuthenticatorCache.java
index 524d3f4..7214c50 100644
--- a/core/java/android/accounts/AccountAuthenticatorCache.java
+++ b/core/java/android/accounts/AccountAuthenticatorCache.java
@@ -38,7 +38,7 @@
  * @hide
  */
 /* package private */ class AccountAuthenticatorCache
-        extends RegisteredServicesCache<AuthenticatorDescription> 
+        extends RegisteredServicesCache<AuthenticatorDescription>
         implements IAccountAuthenticatorCache {
     private static final String TAG = "Account";
     private static final MySerializer sSerializer = new MySerializer();
@@ -64,11 +64,13 @@
                     com.android.internal.R.styleable.AccountAuthenticator_smallIcon, 0);
             final int prefId = sa.getResourceId(
                     com.android.internal.R.styleable.AccountAuthenticator_accountPreferences, 0);
+            final boolean customTokens = sa.getBoolean(
+                    com.android.internal.R.styleable.AccountAuthenticator_customTokens, false);
             if (TextUtils.isEmpty(accountType)) {
                 return null;
             }
-            return new AuthenticatorDescription(accountType, packageName, labelId, iconId, 
-                    smallIconId, prefId);
+            return new AuthenticatorDescription(accountType, packageName, labelId, iconId,
+                    smallIconId, prefId, customTokens);
         } finally {
             sa.recycle();
         }
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index fd3a0d0..6388dc5 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -188,6 +188,12 @@
     public static final String KEY_ERROR_CODE = "errorCode";
     public static final String KEY_ERROR_MESSAGE = "errorMessage";
     public static final String KEY_USERDATA = "userdata";
+    /**
+     * Authenticators using 'customTokens' option will also get the UID of the
+     * caller
+     */
+    public static final String KEY_CALLER_UID = "callerUid";
+    public static final String KEY_CALLER_PID = "callerPid";
 
     public static final String ACTION_AUTHENTICATOR_INTENT =
             "android.accounts.AccountAuthenticator";
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index a815b3a..72da2ce 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -82,8 +82,6 @@
         implements RegisteredServicesCacheListener<AuthenticatorDescription> {
     private static final String GOOGLE_ACCOUNT_TYPE = "com.google";
 
-    private static final String NO_BROADCAST_FLAG = "nobroadcast";
-
     private static final String TAG = "AccountManagerService";
 
     private static final int TIMEOUT_DELAY_MS = 1000 * 60;
@@ -375,14 +373,6 @@
         if (account == null) {
             return false;
         }
-        final boolean noBroadcast = account.type.equals(GOOGLE_ACCOUNT_TYPE)
-                && extras != null && extras.getBoolean(NO_BROADCAST_FLAG, false);
-        // Remove the 'nobroadcast' flag since we don't want it to persist in the db. It is instead
-        // used as a control signal to indicate whether or not this insertion should result in
-        // an accounts changed broadcast being sent.
-        if (extras != null) {
-            extras.remove(NO_BROADCAST_FLAG);
-        }
         db.beginTransaction();
         try {
             long numMatches = DatabaseUtils.longForQuery(db,
@@ -419,9 +409,7 @@
         } finally {
             db.endTransaction();
         }
-        if (!noBroadcast) {
-            sendAccountsChangedBroadcast();
-        }
+        sendAccountsChangedBroadcast();
         return true;
     }
 
@@ -776,10 +764,6 @@
         if (account == null) throw new IllegalArgumentException("account is null");
         checkAuthenticateAccountsPermission(account);
         long identityToken = clearCallingIdentity();
-        if (account.type.equals(GOOGLE_ACCOUNT_TYPE) && key.equals("broadcast")) {
-            sendAccountsChangedBroadcast();
-            return;
-        }
         try {
             writeUserdataIntoDatabase(account, key, value);
         } finally {
@@ -893,13 +877,29 @@
         if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null");
         checkBinderPermission(Manifest.permission.USE_CREDENTIALS);
         final int callerUid = Binder.getCallingUid();
-        final boolean permissionGranted = permissionIsGranted(account, authTokenType, callerUid);
+        final int callerPid = Binder.getCallingPid();
+
+        AccountAuthenticatorCache.ServiceInfo<AuthenticatorDescription> authenticatorInfo =
+            mAuthenticatorCache.getServiceInfo(
+                    AuthenticatorDescription.newKey(account.type));
+        final boolean customTokens =
+            authenticatorInfo != null && authenticatorInfo.type.customTokens;
+
+        // skip the check if customTokens
+        final boolean permissionGranted = customTokens ||
+            permissionIsGranted(account, authTokenType, callerUid);
+
+        if (customTokens) {
+            // let authenticator know the identity of the caller
+            loginOptions.putInt(AccountManager.KEY_CALLER_UID, callerUid);
+            loginOptions.putInt(AccountManager.KEY_CALLER_PID, callerPid);
+        }
 
         long identityToken = clearCallingIdentity();
         try {
             // if the caller has permission, do the peek. otherwise go the more expensive
             // route of starting a Session
-            if (permissionGranted) {
+            if (!customTokens && permissionGranted) {
                 String authToken = readAuthTokenFromCache(account, authTokenType);
                 if (authToken != null) {
                     Bundle result = new Bundle();
@@ -953,8 +953,10 @@
                                         "the type and name should not be empty");
                                 return;
                             }
-                            saveAuthTokenToDatabase(new Account(name, type),
-                                    authTokenType, authToken);
+                            if (!customTokens) {
+                                saveAuthTokenToDatabase(new Account(name, type),
+                                        authTokenType, authToken);
+                            }
                         }
 
                         Intent intent = result.getParcelable(AccountManager.KEY_INTENT);
diff --git a/core/java/android/accounts/AuthenticatorDescription.java b/core/java/android/accounts/AuthenticatorDescription.java
index c6515672..5d9abb0 100644
--- a/core/java/android/accounts/AuthenticatorDescription.java
+++ b/core/java/android/accounts/AuthenticatorDescription.java
@@ -44,9 +44,12 @@
     /** The package name that can be used to lookup the resources from above. */
     final public String packageName;
 
+    /** Authenticator handles its own token caching and permission screen */
+    final public boolean customTokens;
+
     /** A constructor for a full AuthenticatorDescription */
     public AuthenticatorDescription(String type, String packageName, int labelId, int iconId,
-            int smallIconId, int prefId) {
+            int smallIconId, int prefId, boolean customTokens) {
         if (type == null) throw new IllegalArgumentException("type cannot be null");
         if (packageName == null) throw new IllegalArgumentException("packageName cannot be null");
         this.type = type;
@@ -55,6 +58,12 @@
         this.iconId = iconId;
         this.smallIconId = smallIconId;
         this.accountPreferencesId = prefId;
+        this.customTokens = customTokens;
+    }
+
+    public AuthenticatorDescription(String type, String packageName, int labelId, int iconId,
+            int smallIconId, int prefId) {
+        this(type, packageName, labelId, iconId, smallIconId, prefId, false);
     }
 
     /**
@@ -74,6 +83,7 @@
         this.iconId = 0;
         this.smallIconId = 0;
         this.accountPreferencesId = 0;
+        this.customTokens = false;
     }
 
     private AuthenticatorDescription(Parcel source) {
@@ -83,6 +93,7 @@
         this.iconId = source.readInt();
         this.smallIconId = source.readInt();
         this.accountPreferencesId = source.readInt();
+        this.customTokens = source.readByte() == 1;
     }
 
     /** @inheritDoc */
@@ -115,6 +126,7 @@
         dest.writeInt(iconId);
         dest.writeInt(smallIconId);
         dest.writeInt(accountPreferencesId);
+        dest.writeByte((byte) (customTokens ? 1 : 0));
     }
 
     /** Used to create the object from a parcel. */
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index ebdc7fd..096a6eb 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -64,6 +64,28 @@
     static public int staticGetMemoryClass() {
         // Really brain dead right now -- just take this from the configured
         // vm heap size, and assume it is in megabytes and thus ends with "m".
+        String vmHeapSize = SystemProperties.get("dalvik.vm.smallheapsize", "16m");
+        return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
+    }
+    
+    /**
+     * Return the approximate per-application memory class of the current
+     * device when an application is running with a large heap.  This is the
+     * space available for memory-intensive applications; most applications
+     * should not need this amount of memory, and should instead stay with the
+     * {@link #getMemoryClass()} limit.  The returned value is in megabytes.
+     * This may be the same size as {@link #getMemoryClass()} on memory
+     * constrained devices, or it may be significantly larger on devices with
+     * a large amount of available RAM.
+     */
+    public int getLargeMemoryClass() {
+        return staticGetLargeMemoryClass();
+    }
+    
+    /** @hide */
+    static public int staticGetLargeMemoryClass() {
+        // Really brain dead right now -- just take this from the configured
+        // vm heap size, and assume it is in megabytes and thus ends with "m".
         String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
         return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
     }
diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java
index 5dc29a9..d9cafb6 100644
--- a/core/java/android/app/AlertDialog.java
+++ b/core/java/android/app/AlertDialog.java
@@ -24,7 +24,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Message;
-import android.util.Log;
 import android.util.TypedValue;
 import android.view.ContextThemeWrapper;
 import android.view.KeyEvent;
diff --git a/core/java/android/app/DatePickerDialog.java b/core/java/android/app/DatePickerDialog.java
index efe527f..8b70370 100644
--- a/core/java/android/app/DatePickerDialog.java
+++ b/core/java/android/app/DatePickerDialog.java
@@ -21,7 +21,6 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
-import android.os.Build;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -71,10 +70,7 @@
             int year,
             int monthOfYear,
             int dayOfMonth) {
-        this(context, context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB
-                        ? com.android.internal.R.style.Theme_Holo_Dialog_Alert
-                        : com.android.internal.R.style.Theme_Dialog_Alert,
-                callBack, year, monthOfYear, dayOfMonth);
+        this(context, 0, callBack, year, monthOfYear, dayOfMonth);
     }
 
     /**
@@ -121,6 +117,22 @@
         mDatePicker.init(year, month, day, null);
     }
 
+    /**
+     * Gets the {@link DatePicker} contained in this dialog.
+     *
+     * @return The calendar view.
+     */
+    public DatePicker getDatePicker() {
+        return mDatePicker;
+    }
+
+    /**
+     * Sets the current date.
+     *
+     * @param year The date year.
+     * @param monthOfYear The date month.
+     * @param dayOfMonth The date day of month.
+     */
     public void updateDate(int year, int monthOfYear, int dayOfMonth) {
         mDatePicker.updateDate(year, monthOfYear, dayOfMonth);
     }
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index a24375e..12f4a18 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -453,7 +453,19 @@
          * @return this object
          */
         public Request setDestinationInExternalPublicDir(String dirType, String subPath) {
-            setDestinationFromBase(Environment.getExternalStoragePublicDirectory(dirType), subPath);
+            File file = Environment.getExternalStoragePublicDirectory(dirType);
+            if (file.exists()) {
+                if (!file.isDirectory()) {
+                    throw new IllegalStateException(file.getAbsolutePath() +
+                            " already exists and is not a directory");
+                }
+            } else {
+                if (!file.mkdir()) {
+                    throw new IllegalStateException("Unable to create directory: "+
+                            file.getAbsolutePath());
+                }
+            }
+            setDestinationFromBase(file, subPath);
             return this;
         }
 
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index 348149e..a920814 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -27,6 +27,7 @@
 import android.os.Parcelable;
 import android.util.AndroidRuntimeException;
 import android.util.AttributeSet;
+import android.util.DebugUtils;
 import android.util.SparseArray;
 import android.view.ContextMenu;
 import android.view.LayoutInflater;
@@ -322,6 +323,15 @@
     
     int mState = INITIALIZING;
     
+    // Non-null if the fragment's view hierarchy is currently animating away,
+    // meaning we need to wait a bit on completely destroying it.  This is the
+    // animation that is running.
+    Animator mAnimatingAway;
+
+    // If mAnimatingAway != null, this is the state we should move to once the
+    // animation is done.
+    int mStateAfterAnimating;
+
     // When instantiated from saved state, this is the saved state.
     Bundle mSavedFragmentState;
     SparseArray<Parcelable> mSavedViewState;
@@ -526,17 +536,7 @@
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder(128);
-        String simpleName = getClass().getSimpleName();
-        if (simpleName == null || simpleName.isEmpty()) {
-            simpleName = getClass().getName();
-            int end = simpleName.lastIndexOf('.');
-            if (end > 0) {
-                simpleName = simpleName.substring(end+1);
-            }
-        }
-        sb.append(simpleName);
-        sb.append("{");
-        sb.append(Integer.toHexString(System.identityHashCode(this)));
+        DebugUtils.buildShortClassTag(this, sb);
         if (mIndex >= 0) {
             sb.append(" #");
             sb.append(mIndex);
@@ -1249,6 +1249,11 @@
         if (mView != null) {
             writer.print(prefix); writer.print("mView="); writer.println(mView);
         }
+        if (mAnimatingAway != null) {
+            writer.print(prefix); writer.print("mAnimatingAway="); writer.println(mAnimatingAway);
+            writer.print(prefix); writer.print("mStateAfterAnimating=");
+                    writer.println(mStateAfterAnimating);
+        }
         if (mLoaderManager != null) {
             writer.print(prefix); writer.println("Loader Manager:");
             mLoaderManager.dump(prefix + "  ", fd, writer, args);
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 488b673..3c98d67 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -26,6 +26,7 @@
 import android.os.Looper;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.util.DebugUtils;
 import android.util.Log;
 import android.util.SparseArray;
 import android.view.Menu;
@@ -37,6 +38,7 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Arrays;
 
 /**
  * Interface for interacting with {@link Fragment} objects inside of an
@@ -251,6 +253,15 @@
      * @param args Additional arguments to the dump request.
      */
     public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args);
+
+    /**
+     * Control whether the framework's internal fragment manager debugging
+     * logs are turned on.  If enabled, you will see output in logcat as
+     * the framework performs fragment operations.
+     */
+    public static void enableDebugLogging(boolean enabled) {
+        FragmentManagerImpl.DEBUG = enabled;
+    }
 }
 
 final class FragmentManagerState implements Parcelable {
@@ -293,7 +304,7 @@
  * Container for fragments associated with an activity.
  */
 final class FragmentManagerImpl extends FragmentManager {
-    static final boolean DEBUG = false;
+    static boolean DEBUG = true;
     static final String TAG = "FragmentManager";
     
     static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state";
@@ -321,6 +332,7 @@
     
     boolean mNeedMenuInvalidate;
     boolean mStateSaved;
+    boolean mDestroyed;
     String mNoTransactionsBecause;
     
     // Temporary vars for state save and restore.
@@ -451,24 +463,35 @@
     }
 
     @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(128);
+        sb.append("FragmentManager{");
+        sb.append(Integer.toHexString(System.identityHashCode(this)));
+        sb.append(" in ");
+        DebugUtils.buildShortClassTag(mActivity, sb);
+        sb.append("}}");
+        return sb.toString();
+    }
+
+    @Override
     public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-        if (mActive == null || mActive.size() <= 0) {
-            return;
-        }
-
-        writer.print(prefix); writer.print("Active Fragments in ");
-                writer.print(Integer.toHexString(System.identityHashCode(this)));
-                writer.println(":");
-
         String innerPrefix = prefix + "    ";
 
-        int N = mActive.size();
-        for (int i=0; i<N; i++) {
-            Fragment f = mActive.get(i);
-            if (f != null) {
-                writer.print(prefix); writer.print("  #"); writer.print(i);
-                        writer.print(": "); writer.println(f.toString());
-                f.dump(innerPrefix, fd, writer, args);
+        int N;
+        if (mActive != null) {
+            N = mActive.size();
+            if (N > 0) {
+                writer.print(prefix); writer.print("Active Fragments in ");
+                        writer.print(Integer.toHexString(System.identityHashCode(this)));
+                        writer.println(":");
+                for (int i=0; i<N; i++) {
+                    Fragment f = mActive.get(i);
+                    writer.print(prefix); writer.print("  #"); writer.print(i);
+                            writer.print(": "); writer.println(f);
+                    if (f != null) {
+                        f.dump(innerPrefix, fd, writer, args);
+                    }
+                }
             }
         }
 
@@ -484,6 +507,18 @@
             }
         }
 
+        if (mCreatedMenus != null) {
+            N = mCreatedMenus.size();
+            if (N > 0) {
+                writer.print(prefix); writer.println("Fragments Created Menus:");
+                for (int i=0; i<N; i++) {
+                    Fragment f = mCreatedMenus.get(i);
+                    writer.print(prefix); writer.print("  #"); writer.print(i);
+                            writer.print(": "); writer.println(f.toString());
+                }
+            }
+        }
+
         if (mBackStack != null) {
             N = mBackStack.size();
             if (N > 0) {
@@ -496,6 +531,54 @@
                 }
             }
         }
+
+        synchronized (this) {
+            if (mBackStackIndices != null) {
+                N = mBackStackIndices.size();
+                if (N > 0) {
+                    writer.print(prefix); writer.println("Back Stack Indices:");
+                    for (int i=0; i<N; i++) {
+                        BackStackRecord bs = mBackStackIndices.get(i);
+                        writer.print(prefix); writer.print("  #"); writer.print(i);
+                                writer.print(": "); writer.println(bs);
+                    }
+                }
+            }
+
+            if (mAvailBackStackIndices != null && mAvailBackStackIndices.size() > 0) {
+                writer.print(prefix); writer.print("mAvailBackStackIndices: ");
+                        writer.println(Arrays.toString(mAvailBackStackIndices.toArray()));
+            }
+        }
+
+        if (mPendingActions != null) {
+            N = mPendingActions.size();
+            if (N > 0) {
+                writer.print(prefix); writer.println("Pending Actions:");
+                for (int i=0; i<N; i++) {
+                    Runnable r = mPendingActions.get(i);
+                    writer.print(prefix); writer.print("  #"); writer.print(i);
+                            writer.print(": "); writer.println(r);
+                }
+            }
+        }
+
+        writer.print(prefix); writer.println("FragmentManager misc state:");
+        writer.print(prefix); writer.print("  mCurState="); writer.print(mCurState);
+                writer.print(" mStateSaved="); writer.print(mStateSaved);
+                writer.print(" mDestroyed="); writer.println(mDestroyed);
+        if (mNeedMenuInvalidate) {
+            writer.print(prefix); writer.print("  mNeedMenuInvalidate=");
+                    writer.println(mNeedMenuInvalidate);
+        }
+        if (mNoTransactionsBecause != null) {
+            writer.print(prefix); writer.print("  mNoTransactionsBecause=");
+                    writer.println(mNoTransactionsBecause);
+        }
+        if (mAvailIndices != null && mAvailIndices.size() > 0) {
+            writer.print(prefix); writer.print("  mAvailIndices: ");
+                    writer.println(Arrays.toString(mAvailIndices.toArray()));
+        }
     }
 
     Animator loadAnimator(Fragment fragment, int transit, boolean enter,
@@ -548,6 +631,14 @@
         }
         
         if (f.mState < newState) {
+            if (f.mAnimatingAway != null) {
+                // The fragment is currently being animated...  but!  Now we
+                // want to move our state back up.  Give up on waiting for the
+                // animation, move to whatever the final state should be once
+                // the animation is done, and then we can proceed from there.
+                f.mAnimatingAway = null;
+                moveToState(f, f.mStateAfterAnimating, 0, 0);
+            }
             switch (f.mState) {
                 case Fragment.INITIALIZING:
                     if (DEBUG) Log.v(TAG, "moveto CREATED: " + f);
@@ -695,18 +786,26 @@
                         }
                         if (f.mView != null && f.mContainer != null) {
                             Animator anim = null;
-                            if (mCurState > Fragment.INITIALIZING) {
+                            if (mCurState > Fragment.INITIALIZING && !mDestroyed) {
                                 anim = loadAnimator(f, transit, false,
                                         transitionStyle);
                             }
                             if (anim != null) {
                                 final ViewGroup container = f.mContainer;
                                 final View view = f.mView;
+                                final Fragment fragment = f;
                                 container.startViewTransition(view);
+                                f.mAnimatingAway = anim;
+                                f.mStateAfterAnimating = newState;
                                 anim.addListener(new AnimatorListenerAdapter() {
                                     @Override
                                     public void onAnimationEnd(Animator anim) {
                                         container.endViewTransition(view);
+                                        if (fragment.mAnimatingAway != null) {
+                                            fragment.mAnimatingAway = null;
+                                            moveToState(fragment, fragment.mStateAfterAnimating,
+                                                    0, 0);
+                                        }
                                     }
                                 });
                                 anim.setTarget(f.mView);
@@ -720,25 +819,46 @@
                     }
                 case Fragment.CREATED:
                     if (newState < Fragment.CREATED) {
-                        if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f);
-                        if (!f.mRetaining) {
-                            f.mCalled = false;
-                            f.onDestroy();
-                            if (!f.mCalled) {
-                                throw new SuperNotCalledException("Fragment " + f
-                                        + " did not call through to super.onDestroy()");
+                        if (mDestroyed) {
+                            if (f.mAnimatingAway != null) {
+                                // The fragment's containing activity is
+                                // being destroyed, but this fragment is
+                                // currently animating away.  Stop the
+                                // animation right now -- it is not needed,
+                                // and we can't wait any more on destroying
+                                // the fragment.
+                                Animator anim = f.mAnimatingAway;
+                                f.mAnimatingAway = null;
+                                anim.cancel();
                             }
                         }
-                        
-                        f.mCalled = false;
-                        f.onDetach();
-                        if (!f.mCalled) {
-                            throw new SuperNotCalledException("Fragment " + f
-                                    + " did not call through to super.onDetach()");
+                        if (f.mAnimatingAway != null) {
+                            // We are waiting for the fragment's view to finish
+                            // animating away.  Just make a note of the state
+                            // the fragment now should move to once the animation
+                            // is done.
+                            f.mStateAfterAnimating = newState;
+                        } else {
+                            if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f);
+                            if (!f.mRetaining) {
+                                f.mCalled = false;
+                                f.onDestroy();
+                                if (!f.mCalled) {
+                                    throw new SuperNotCalledException("Fragment " + f
+                                            + " did not call through to super.onDestroy()");
+                                }
+                            }
+
+                            f.mCalled = false;
+                            f.onDetach();
+                            if (!f.mCalled) {
+                                throw new SuperNotCalledException("Fragment " + f
+                                        + " did not call through to super.onDetach()");
+                            }
+                            f.mImmediateActivity = null;
+                            f.mActivity = null;
+                            f.mFragmentManager = null;
                         }
-                        f.mImmediateActivity = null;
-                        f.mActivity = null;
-                        f.mFragmentManager = null;
                     }
             }
         }
@@ -852,9 +972,19 @@
                         transitionStyle);
                 if (anim != null) {
                     anim.setTarget(fragment.mView);
+                    // Delay the actual hide operation until the animation finishes, otherwise
+                    // the fragment will just immediately disappear
+                    final Fragment finalFragment = fragment;
+                    anim.addListener(new AnimatorListenerAdapter() {
+                        @Override
+                        public void onAnimationEnd(Animator animation) {
+                            finalFragment.mView.setVisibility(View.GONE);
+                        }
+                    });
                     anim.start();
+                } else {
+                    fragment.mView.setVisibility(View.GONE);
                 }
-                fragment.mView.setVisibility(View.GONE);
             }
             if (fragment.mAdded && fragment.mHasMenu) {
                 mNeedMenuInvalidate = true;
@@ -1421,6 +1551,7 @@
     }
     
     public void dispatchDestroy() {
+        mDestroyed = true;
         moveToState(Fragment.INITIALIZING, false);
         mActivity = null;
     }
diff --git a/core/java/android/app/LoaderManager.java b/core/java/android/app/LoaderManager.java
index 0ab987a..5f8c098 100644
--- a/core/java/android/app/LoaderManager.java
+++ b/core/java/android/app/LoaderManager.java
@@ -18,15 +18,29 @@
 
 import android.content.Loader;
 import android.os.Bundle;
+import android.util.DebugUtils;
 import android.util.Log;
 import android.util.SparseArray;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
+import java.lang.reflect.Modifier;
 
 /**
  * Interface associated with an {@link Activity} or {@link Fragment} for managing
- * one or more {@link android.content.Loader} instances associated with it.
+ * one or more {@link android.content.Loader} instances associated with it.  This
+ * helps an application manage longer-running operations in conjunction with the
+ * Activity or Fragment lifecycle; the most common use of this is with a
+ * {@link android.content.CursorLoader}, however applications are free to write
+ * their own loaders for loading other types of data.
+ *
+ * <p>As an example, here is the full implementation of a {@link Fragment}
+ * that displays a {@link android.widget.ListView} containing the results of
+ * a query against the contacts content provider.  It uses a
+ * {@link android.content.CursorLoader} to manage the query on the provider.
+ *
+ * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentListCursorLoader.java
+ *      fragment_cursor}
  */
 public abstract class LoaderManager {
     /**
@@ -49,10 +63,48 @@
          * activity's state is saved.  See {@link FragmentManager#openTransaction()
          * FragmentManager.openTransaction()} for further discussion on this.
          * 
+         * <p>This function is guaranteed to be called prior to the release of
+         * the last data that was supplied for this Loader.  At this point
+         * you should remove all use of the old data (since it will be released
+         * soon), but should not do your own release of the data since its Loader
+         * owns it and will take care of that.  The Loader will take care of
+         * management of its data so you don't have to.  In particular:
+         *
+         * <ul>
+         * <li> <p>The Loader will monitor for changes to the data, and report
+         * them to you through new calls here.  You should not monitor the
+         * data yourself.  For example, if the data is a {@link android.database.Cursor}
+         * and you place it in a {@link android.widget.CursorAdapter}, use
+         * the {@link android.widget.CursorAdapter#CursorAdapter(android.content.Context,
+         * android.database.Cursor, int)} constructor <em>without</em> passing
+         * in either {@link android.widget.CursorAdapter#FLAG_AUTO_REQUERY}
+         * or {@link android.widget.CursorAdapter#FLAG_REGISTER_CONTENT_OBSERVER}
+         * (that is, use 0 for the flags argument).  This prevents the CursorAdapter
+         * from doing its own observing of the Cursor, which is not needed since
+         * when a change happens you will get a new Cursor throw another call
+         * here.
+         * <li> The Loader will release the data once it knows the application
+         * is no longer using it.  For example, if the data is
+         * a {@link android.database.Cursor} from a {@link android.content.CursorLoader},
+         * you should not call close() on it yourself.  If the Cursor is being placed in a
+         * {@link android.widget.CursorAdapter}, you should use the
+         * {@link android.widget.CursorAdapter#swapCursor(android.database.Cursor)}
+         * method so that the old Cursor is not closed.
+         * </ul>
+         *
          * @param loader The Loader that has finished.
          * @param data The data generated by the Loader.
          */
         public void onLoadFinished(Loader<D> loader, D data);
+
+        /**
+         * Called when a previously created loader is being reset, and thus
+         * making its data unavailable.  The application should at this point
+         * remove any references it has to the Loader's data.
+         *
+         * @param loader The Loader that is being reset.
+         */
+        public void onLoaderReset(Loader<D> loader);
     }
     
     /**
@@ -65,28 +117,54 @@
      * will be called as the loader state changes.  If at the point of call
      * the caller is in its started state, and the requested loader
      * already exists and has generated its data, then
-     * callback. {@link LoaderCallbacks#onLoadFinished} will
+     * callback {@link LoaderCallbacks#onLoadFinished} will
      * be called immediately (inside of this function), so you must be prepared
      * for this to happen.
+     *
+     * @param id A unique identifier for this loader.  Can be whatever you want.
+     * Identifiers are scoped to a particular LoaderManager instance.
+     * @param args Optional arguments to supply to the loader at construction.
+     * If a loader already exists (a new one does not need to be created), this
+     * parameter will be ignored and the last arguments continue to be used.
+     * @param callback Interface the LoaderManager will call to report about
+     * changes in the state of the loader.  Required.
      */
     public abstract <D> Loader<D> initLoader(int id, Bundle args,
             LoaderManager.LoaderCallbacks<D> callback);
 
     /**
-     * Creates a new loader in this manager, registers the callbacks to it,
+     * Starts a new or restarts an existing {@link android.content.Loader} in
+     * this manager, registers the callbacks to it,
      * and (if the activity/fragment is currently started) starts loading it.
      * If a loader with the same id has previously been
      * started it will automatically be destroyed when the new loader completes
      * its work. The callback will be delivered before the old loader
      * is destroyed.
+     *
+     * @param id A unique identifier for this loader.  Can be whatever you want.
+     * Identifiers are scoped to a particular LoaderManager instance.
+     * @param args Optional arguments to supply to the loader at construction.
+     * @param callback Interface the LoaderManager will call to report about
+     * changes in the state of the loader.  Required.
      */
     public abstract <D> Loader<D> restartLoader(int id, Bundle args,
             LoaderManager.LoaderCallbacks<D> callback);
 
     /**
-     * Stops and removes the loader with the given ID.
+     * Stops and removes the loader with the given ID.  If this loader
+     * had previously reported data to the client through
+     * {@link LoaderCallbacks#onLoadFinished(Loader, Object)}, a call
+     * will be made to {@link LoaderCallbacks#onLoaderReset(Loader)}.
      */
-    public abstract void stopLoader(int id);
+    public abstract void destroyLoader(int id);
+
+    /**
+     * @deprecated Renamed to {@link #destroyLoader}.
+     */
+    @Deprecated
+    public void stopLoader(int id) {
+        destroyLoader(id);
+    }
 
     /**
      * Return the Loader with the given id or null if no matching Loader
@@ -103,11 +181,20 @@
      * @param args Additional arguments to the dump request.
      */
     public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args);
+
+    /**
+     * Control whether the framework's internal loader manager debugging
+     * logs are turned on.  If enabled, you will see output in logcat as
+     * the framework performs loader operations.
+     */
+    public static void enableDebugLogging(boolean enabled) {
+        LoaderManagerImpl.DEBUG = enabled;
+    }
 }
 
 class LoaderManagerImpl extends LoaderManager {
-    static final String TAG = "LoaderManagerImpl";
-    static final boolean DEBUG = true;
+    static final String TAG = "LoaderManager";
+    static boolean DEBUG = true;
 
     // These are the currently active loaders.  A loader is here
     // from the time its load is started until it has been explicitly
@@ -131,6 +218,7 @@
         LoaderManager.LoaderCallbacks<Object> mCallbacks;
         Loader<Object> mLoader;
         Object mData;
+        Object mDeliveredData;
         boolean mStarted;
         boolean mRetaining;
         boolean mRetainingStarted;
@@ -157,17 +245,24 @@
                 return;
             }
 
+            mStarted = true;
+            
             if (DEBUG) Log.v(TAG, "  Starting: " + this);
             if (mLoader == null && mCallbacks != null) {
                mLoader = mCallbacks.onCreateLoader(mId, mArgs);
             }
             if (mLoader != null) {
+                if (mLoader.getClass().isMemberClass()
+                        && !Modifier.isStatic(mLoader.getClass().getModifiers())) {
+                    throw new IllegalArgumentException(
+                            "Object returned from onCreateLoader must not be a non-static inner member class: "
+                            + mLoader);
+                }
                 if (!mListenerRegistered) {
                     mLoader.registerListener(mId, this);
                     mListenerRegistered = true;
                 }
                 mLoader.startLoading();
-                mStarted = true;
             }
         }
         
@@ -191,13 +286,16 @@
                         stop();
                     }
                 }
-                if (mStarted && mData != null) {
-                    // This loader was retained, and now at the point of
-                    // finishing the retain we find we remain started, have
-                    // our data, and the owner has a new callback...  so
-                    // let's deliver the data now.
-                    callOnLoadFinished(mLoader, mData);
-                }
+            }
+
+            if (mStarted && mData != null) {
+                // This loader has retained its data, either completely across
+                // a configuration change or just whatever the last data set
+                // was after being restarted from a stop, and now at the point of
+                // finishing the retain we find we remain started, have
+                // our data, and the owner has a new callback...  so
+                // let's deliver the data now.
+                callOnLoadFinished(mLoader, mData);
             }
         }
         
@@ -211,36 +309,58 @@
                     mLoader.unregisterListener(this);
                     mLoader.stopLoading();
                 }
-                mData = null;
             }
         }
         
         void destroy() {
             if (DEBUG) Log.v(TAG, "  Destroying: " + this);
             mDestroyed = true;
+            boolean needReset = mDeliveredData != null;
+            mDeliveredData = null;
+            if (mCallbacks != null && mLoader != null && mData != null && needReset) {
+                if (DEBUG) Log.v(TAG, "  Reseting: " + this);
+                String lastBecause = null;
+                if (mActivity != null) {
+                    lastBecause = mActivity.mFragments.mNoTransactionsBecause;
+                    mActivity.mFragments.mNoTransactionsBecause = "onLoaderReset";
+                }
+                try {
+                    mCallbacks.onLoaderReset(mLoader);
+                } finally {
+                    if (mActivity != null) {
+                        mActivity.mFragments.mNoTransactionsBecause = lastBecause;
+                    }
+                }
+            }
             mCallbacks = null;
+            mData = null;
             if (mLoader != null) {
                 if (mListenerRegistered) {
                     mListenerRegistered = false;
                     mLoader.unregisterListener(this);
                 }
-                mLoader.destroy();
+                mLoader.reset();
             }
         }
         
         @Override public void onLoadComplete(Loader<Object> loader, Object data) {
-            if (DEBUG) Log.v(TAG, "onLoadComplete: " + this + " mDestroyed=" + mDestroyed);
+            if (DEBUG) Log.v(TAG, "onLoadComplete: " + this);
 
             if (mDestroyed) {
+                if (DEBUG) Log.v(TAG, "  Ignoring load complete -- destroyed");
                 return;
             }
             
             // Notify of the new data so the app can switch out the old data before
             // we try to destroy it.
-            mData = data;
-            callOnLoadFinished(loader, data);
+            if (mData != data) {
+                mData = data;
+                if (mStarted) {
+                    callOnLoadFinished(loader, data);
+                }
+            }
 
-            if (DEBUG) Log.v(TAG, "onLoadFinished returned: " + this);
+            //if (DEBUG) Log.v(TAG, "  onLoadFinished returned: " + this);
 
             // We have now given the application the new loader with its
             // loaded data, so it should have stopped using the previous
@@ -248,6 +368,7 @@
             // clean it up.
             LoaderInfo info = mInactiveLoaders.get(mId);
             if (info != null && info != this) {
+                info.mDeliveredData = null;
                 info.destroy();
                 mInactiveLoaders.remove(mId);
             }
@@ -261,12 +382,15 @@
                     mActivity.mFragments.mNoTransactionsBecause = "onLoadFinished";
                 }
                 try {
+                    if (DEBUG) Log.v(TAG, "  onLoadFinished in " + loader + ": "
+                            + loader.dataToString(data));
                     mCallbacks.onLoadFinished(loader, data);
                 } finally {
                     if (mActivity != null) {
                         mActivity.mFragments.mNoTransactionsBecause = lastBecause;
                     }
                 }
+                mDeliveredData = data;
             }
         }
         
@@ -277,21 +401,9 @@
             sb.append(Integer.toHexString(System.identityHashCode(this)));
             sb.append(" #");
             sb.append(mId);
-            if (mArgs != null) {
-                sb.append(" ");
-                sb.append(mArgs.toString());
-            }
-            sb.append("}");
-            return sb.toString();
-        }
-
-        public String toBasicString() {
-            StringBuilder sb = new StringBuilder(64);
-            sb.append("LoaderInfo{");
-            sb.append(Integer.toHexString(System.identityHashCode(this)));
-            sb.append(" #");
-            sb.append(mId);
-            sb.append("}");
+            sb.append(" : ");
+            DebugUtils.buildShortClassTag(mLoader, sb);
+            sb.append("}}");
             return sb.toString();
         }
 
@@ -300,11 +412,16 @@
                     writer.print(" mArgs="); writer.println(mArgs);
             writer.print(prefix); writer.print("mCallbacks="); writer.println(mCallbacks);
             writer.print(prefix); writer.print("mLoader="); writer.println(mLoader);
+            if (mLoader != null) {
+                mLoader.dump(prefix + "  ", fd, writer, args);
+            }
             writer.print(prefix); writer.print("mData="); writer.println(mData);
+            writer.print(prefix); writer.print("mDeliveredData="); writer.println(mDeliveredData);
             writer.print(prefix); writer.print("mStarted="); writer.print(mStarted);
                     writer.print(" mRetaining="); writer.print(mRetaining);
-                    writer.print(" mDestroyed="); writer.print(mDestroyed);
-                    writer.print(" mListenerRegistered="); writer.println(mListenerRegistered);
+                    writer.print(" mDestroyed="); writer.println(mDestroyed);
+            writer.print(prefix); writer.print("mListenerRegistered=");
+                    writer.println(mListenerRegistered);
         }
     }
     
@@ -336,12 +453,14 @@
     public <D> Loader<D> initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
         LoaderInfo info = mLoaders.get(id);
         
-        if (DEBUG) Log.v(TAG, "initLoader in " + this + ": cur=" + info);
+        if (DEBUG) Log.v(TAG, "initLoader in " + this + ": args=" + args);
 
         if (info == null) {
             // Loader doesn't already exist; create.
             info = createLoader(id, args,  (LoaderManager.LoaderCallbacks<Object>)callback);
+            if (DEBUG) Log.v(TAG, "  Created new loader " + info);
         } else {
+            if (DEBUG) Log.v(TAG, "  Re-using existing loader " + info);
             info.mCallbacks = (LoaderManager.LoaderCallbacks<Object>)callback;
         }
         
@@ -356,7 +475,7 @@
     @SuppressWarnings("unchecked")
     public <D> Loader<D> restartLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
         LoaderInfo info = mLoaders.get(id);
-        if (DEBUG) Log.v(TAG, "restartLoader in " + this + ": cur=" + info);
+        if (DEBUG) Log.v(TAG, "restartLoader in " + this + ": args=" + args);
         if (info != null) {
             LoaderInfo inactive = mInactiveLoaders.get(id);
             if (inactive != null) {
@@ -365,7 +484,8 @@
                     // called from within onLoadComplete, where we haven't
                     // yet destroyed the last inactive loader.  So just do
                     // that now.
-                    if (DEBUG) Log.v(TAG, "  Removing last inactive loader in " + this);
+                    if (DEBUG) Log.v(TAG, "  Removing last inactive loader: " + info);
+                    inactive.mDeliveredData = null;
                     inactive.destroy();
                     mInactiveLoaders.put(id, info);
                 } else {
@@ -373,13 +493,13 @@
                     // waiting for!  Now we have three active loaders... let's just
                     // drop the one in the middle, since we are still waiting for
                     // its result but that result is already out of date.
-                    if (DEBUG) Log.v(TAG, "  Removing intermediate loader in " + this);
+                    if (DEBUG) Log.v(TAG, "  Removing intermediate loader: " + info);
                     info.destroy();
                 }
             } else {
                 // Keep track of the previous instance of this loader so we can destroy
                 // it when the new one completes.
-                if (DEBUG) Log.v(TAG, "  Making inactive: " + info);
+                if (DEBUG) Log.v(TAG, "  Making last loader inactive: " + info);
                 mInactiveLoaders.put(id, info);
             }
         }
@@ -388,14 +508,20 @@
         return (Loader<D>)info.mLoader;
     }
     
-    public void stopLoader(int id) {
-        if (DEBUG) Log.v(TAG, "stopLoader in " + this + " of " + id);
+    public void destroyLoader(int id) {
+        if (DEBUG) Log.v(TAG, "destroyLoader in " + this + " of " + id);
         int idx = mLoaders.indexOfKey(id);
         if (idx >= 0) {
             LoaderInfo info = mLoaders.valueAt(idx);
             mLoaders.removeAt(idx);
             info.destroy();
         }
+        idx = mInactiveLoaders.indexOfKey(id);
+        if (idx >= 0) {
+            LoaderInfo info = mInactiveLoaders.valueAt(idx);
+            mInactiveLoaders.removeAt(idx);
+            info.destroy();
+        }
     }
 
     @SuppressWarnings("unchecked")
@@ -408,7 +534,7 @@
     }
  
     void doStart() {
-        if (DEBUG) Log.v(TAG, "Starting: " + this);
+        if (DEBUG) Log.v(TAG, "Starting in " + this);
         if (mStarted) {
             RuntimeException e = new RuntimeException("here");
             e.fillInStackTrace();
@@ -416,16 +542,17 @@
             return;
         }
         
+        mStarted = true;
+
         // Call out to sub classes so they can start their loaders
         // Let the existing loaders know that we want to be notified when a load is complete
         for (int i = mLoaders.size()-1; i >= 0; i--) {
             mLoaders.valueAt(i).start();
         }
-        mStarted = true;
     }
     
     void doStop() {
-        if (DEBUG) Log.v(TAG, "Stopping: " + this);
+        if (DEBUG) Log.v(TAG, "Stopping in " + this);
         if (!mStarted) {
             RuntimeException e = new RuntimeException("here");
             e.fillInStackTrace();
@@ -440,7 +567,7 @@
     }
     
     void doRetain() {
-        if (DEBUG) Log.v(TAG, "Retaining: " + this);
+        if (DEBUG) Log.v(TAG, "Retaining in " + this);
         if (!mStarted) {
             RuntimeException e = new RuntimeException("here");
             e.fillInStackTrace();
@@ -456,23 +583,25 @@
     }
     
     void finishRetain() {
-        if (DEBUG) Log.v(TAG, "Finished Retaining: " + this);
+        if (mRetaining) {
+            if (DEBUG) Log.v(TAG, "Finished Retaining in " + this);
 
-        mRetaining = false;
-        for (int i = mLoaders.size()-1; i >= 0; i--) {
-            mLoaders.valueAt(i).finishRetain();
+            mRetaining = false;
+            for (int i = mLoaders.size()-1; i >= 0; i--) {
+                mLoaders.valueAt(i).finishRetain();
+            }
         }
     }
     
     void doDestroy() {
         if (!mRetaining) {
-            if (DEBUG) Log.v(TAG, "Destroying Active: " + this);
+            if (DEBUG) Log.v(TAG, "Destroying Active in " + this);
             for (int i = mLoaders.size()-1; i >= 0; i--) {
                 mLoaders.valueAt(i).destroy();
             }
         }
         
-        if (DEBUG) Log.v(TAG, "Destroying Inactive: " + this);
+        if (DEBUG) Log.v(TAG, "Destroying Inactive in " + this);
         for (int i = mInactiveLoaders.size()-1; i >= 0; i--) {
             mInactiveLoaders.valueAt(i).destroy();
         }
@@ -480,6 +609,17 @@
     }
 
     @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(128);
+        sb.append("LoaderManager{");
+        sb.append(Integer.toHexString(System.identityHashCode(this)));
+        sb.append(" in ");
+        DebugUtils.buildShortClassTag(mActivity, sb);
+        sb.append("}}");
+        return sb.toString();
+    }
+
+    @Override
     public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
         if (mLoaders.size() > 0) {
             writer.print(prefix); writer.println("Active Loaders:");
@@ -487,7 +627,7 @@
             for (int i=0; i < mLoaders.size(); i++) {
                 LoaderInfo li = mLoaders.valueAt(i);
                 writer.print(prefix); writer.print("  #"); writer.print(mLoaders.keyAt(i));
-                        writer.print(": "); writer.println(li.toBasicString());
+                        writer.print(": "); writer.println(li.toString());
                 li.dump(innerPrefix, fd, writer, args);
             }
         }
@@ -497,7 +637,7 @@
             for (int i=0; i < mInactiveLoaders.size(); i++) {
                 LoaderInfo li = mInactiveLoaders.valueAt(i);
                 writer.print(prefix); writer.print("  #"); writer.print(mInactiveLoaders.keyAt(i));
-                        writer.print(": "); writer.println(li.toBasicString());
+                        writer.print(": "); writer.println(li.toString());
                 li.dump(innerPrefix, fd, writer, args);
             }
         }
diff --git a/core/java/android/app/LoaderManagingFragment.java b/core/java/android/app/LoaderManagingFragment.java
deleted file mode 100644
index f0f5856..0000000
--- a/core/java/android/app/LoaderManagingFragment.java
+++ /dev/null
@@ -1,207 +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.app;
-
-import android.content.Loader;
-import android.os.Bundle;
-
-import java.util.HashMap;
-
-/**
- * A Fragment that has utility methods for managing {@link Loader}s.
- *
- * @param <D> The type of data returned by the Loader. If you're using multiple Loaders with
- * different return types use Object and case the results.
- * 
- * @deprecated This was an old design, it will be removed before Honeycomb ships.
- */
-@Deprecated
-public abstract class LoaderManagingFragment<D> extends Fragment
-        implements Loader.OnLoadCompleteListener<D> {
-    private boolean mStarted = false;
-
-    static final class LoaderInfo<D> {
-        public Bundle args;
-        public Loader<D> loader;
-    }
-    private HashMap<Integer, LoaderInfo<D>> mLoaders;
-    private HashMap<Integer, LoaderInfo<D>> mInactiveLoaders;
-
-    /**
-     * Registers a loader with this activity, registers the callbacks on it, and starts it loading.
-     * If a loader with the same id has previously been started it will automatically be destroyed
-     * when the new loader completes it's work. The callback will be delivered before the old loader
-     * is destroyed.
-     */
-    public Loader<D> startLoading(int id, Bundle args) {
-        LoaderInfo<D> info = mLoaders.get(id);
-        if (info != null) {
-            // Keep track of the previous instance of this loader so we can destroy
-            // it when the new one completes.
-            mInactiveLoaders.put(id, info);
-        }
-        info = new LoaderInfo<D>();
-        info.args = args;
-        mLoaders.put(id, info);
-        Loader<D> loader = onCreateLoader(id, args);
-        info.loader = loader;
-        if (mStarted) {
-            // The activity will start all existing loaders in it's onStart(), so only start them
-            // here if we're past that point of the activitiy's life cycle
-            loader.registerListener(id, this);
-            loader.startLoading();
-        }
-        return loader;
-    }
-
-    protected abstract Loader<D> onCreateLoader(int id, Bundle args);
-    protected abstract void onInitializeLoaders();
-    protected abstract void onLoadFinished(Loader<D> loader, D data);
-
-    public final void onLoadComplete(Loader<D> loader, D data) {
-        // Notify of the new data so the app can switch out the old data before
-        // we try to destroy it.
-        onLoadFinished(loader, data);
-
-        // Look for an inactive loader and destroy it if found
-        int id = loader.getId();
-        LoaderInfo<D> info = mInactiveLoaders.get(id);
-        if (info != null) {
-            Loader<D> oldLoader = info.loader;
-            if (oldLoader != null) {
-                oldLoader.destroy();
-            }
-            mInactiveLoaders.remove(id);
-        }
-    }
-
-    @Override
-    public void onCreate(Bundle savedState) {
-        super.onCreate(savedState);
-
-        if (mLoaders == null) {
-            // Look for a passed along loader and create a new one if it's not there
-// TODO: uncomment once getLastNonConfigurationInstance method is available
-//            mLoaders = (HashMap<Integer, LoaderInfo>) getLastNonConfigurationInstance();
-            if (mLoaders == null) {
-                mLoaders = new HashMap<Integer, LoaderInfo<D>>();
-                onInitializeLoaders();
-            }
-        }
-        if (mInactiveLoaders == null) {
-            mInactiveLoaders = new HashMap<Integer, LoaderInfo<D>>();
-        }
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-
-        // Call out to sub classes so they can start their loaders
-        // Let the existing loaders know that we want to be notified when a load is complete
-        for (HashMap.Entry<Integer, LoaderInfo<D>> entry : mLoaders.entrySet()) {
-            LoaderInfo<D> info = entry.getValue();
-            Loader<D> loader = info.loader;
-            int id = entry.getKey();
-            if (loader == null) {
-               loader = onCreateLoader(id, info.args);
-               info.loader = loader;
-            }
-            loader.registerListener(id, this);
-            loader.startLoading();
-        }
-
-        mStarted = true;
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-
-        for (HashMap.Entry<Integer, LoaderInfo<D>> entry : mLoaders.entrySet()) {
-            LoaderInfo<D> info = entry.getValue();
-            Loader<D> loader = info.loader;
-            if (loader == null) {
-                continue;
-            }
-
-            // Let the loader know we're done with it
-            loader.unregisterListener(this);
-
-            // The loader isn't getting passed along to the next instance so ask it to stop loading
-            if (!getActivity().isChangingConfigurations()) {
-                loader.stopLoading();
-            }
-        }
-
-        mStarted = false;
-    }
-
-    /* TO DO: This needs to be turned into a retained fragment.
-    @Override
-    public Object onRetainNonConfigurationInstance() {
-        // Pass the loader along to the next guy
-        Object result = mLoaders;
-        mLoaders = null;
-        return result;
-    }
-    **/
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-
-        if (mLoaders != null) {
-            for (HashMap.Entry<Integer, LoaderInfo<D>> entry : mLoaders.entrySet()) {
-                LoaderInfo<D> info = entry.getValue();
-                Loader<D> loader = info.loader;
-                if (loader == null) {
-                    continue;
-                }
-                loader.destroy();
-            }
-        }
-    }
-
-    /**
-     * Stops and removes the loader with the given ID.
-     */
-    public void stopLoading(int id) {
-        if (mLoaders != null) {
-            LoaderInfo<D> info = mLoaders.remove(id);
-            if (info != null) {
-                Loader<D> loader = info.loader;
-                if (loader != null) {
-                    loader.unregisterListener(this);
-                    loader.destroy();
-                }
-            }
-        }
-    }
-
-    /**
-     * @return the Loader with the given id or null if no matching Loader
-     * is found.
-     */
-    public Loader<D> getLoader(int id) {
-        LoaderInfo<D> loaderInfo = mLoaders.get(id);
-        if (loaderInfo != null) {
-            return mLoaders.get(id).loader;
-        }
-        return null;
-    }
-}
diff --git a/core/java/android/app/LocalActivityManager.java b/core/java/android/app/LocalActivityManager.java
index 5da04f1..c958e1b 100644
--- a/core/java/android/app/LocalActivityManager.java
+++ b/core/java/android/app/LocalActivityManager.java
@@ -493,7 +493,7 @@
                 // We need to save the state now, if we don't currently
                 // already have it or the activity is currently resumed.
                 final Bundle childState = new Bundle();
-                r.activity.onSaveInstanceState(childState);
+                r.activity.performSaveInstanceState(childState);
                 r.instanceState = childState;
             }
             if (r.instanceState != null) {
diff --git a/core/java/android/app/TimePickerDialog.java b/core/java/android/app/TimePickerDialog.java
index 26af4eb..f9920c7 100644
--- a/core/java/android/app/TimePickerDialog.java
+++ b/core/java/android/app/TimePickerDialog.java
@@ -21,7 +21,6 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
-import android.os.Build;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -72,11 +71,7 @@
     public TimePickerDialog(Context context,
             OnTimeSetListener callBack,
             int hourOfDay, int minute, boolean is24HourView) {
-        this(context,
-                context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB
-                        ? com.android.internal.R.style.Theme_Holo_Dialog_Alert
-                        : com.android.internal.R.style.Theme_Dialog_Alert,
-                callBack, hourOfDay, minute, is24HourView);
+        this(context, 0, callBack, hourOfDay, minute, is24HourView);
     }
 
     /**
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 32df4e8..b2185ad 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -868,6 +868,42 @@
      */
     public BluetoothServerSocket listenUsingRfcommWithServiceRecord(String name, UUID uuid)
             throws IOException {
+        return createNewRfcommSocketAndRecord(name, uuid, true, true);
+    }
+
+    /**
+     * Create a listening, insecure RFCOMM Bluetooth socket with Service Record.
+     * <p>The link key will be unauthenticated i.e the communication is
+     * vulnerable to Man In the Middle attacks. For Bluetooth 2.1 devices,
+     * the link key will be encrypted, as encryption is mandartory.
+     * For legacy devices (pre Bluetooth 2.1 devices) the link key will not
+     * be encrypted. Use {@link #listenUsingRfcommWithServiceRecord}, if an
+     * encrypted and authenticated communication channel is desired.
+     * <p>Use {@link BluetoothServerSocket#accept} to retrieve incoming
+     * connections from a listening {@link BluetoothServerSocket}.
+     * <p>The system will assign an unused RFCOMM channel to listen on.
+     * <p>The system will also register a Service Discovery
+     * Protocol (SDP) record with the local SDP server containing the specified
+     * UUID, service name, and auto-assigned channel. Remote Bluetooth devices
+     * can use the same UUID to query our SDP server and discover which channel
+     * to connect to. This SDP record will be removed when this socket is
+     * closed, or if this application closes unexpectedly.
+     * <p>Use {@link BluetoothDevice#createRfcommSocketToServiceRecord} to
+     * connect to this socket from another device using the same {@link UUID}.
+     * <p>Requires {@link android.Manifest.permission#BLUETOOTH}
+     * @param name service name for SDP record
+     * @param uuid uuid for SDP record
+     * @return a listening RFCOMM BluetoothServerSocket
+     * @throws IOException on error, for example Bluetooth not available, or
+     *                     insufficient permissions, or channel in use.
+     */
+    public BluetoothServerSocket listenUsingInsecureRfcommWithServiceRecord(String name, UUID uuid)
+            throws IOException {
+        return createNewRfcommSocketAndRecord(name, uuid, false, false);
+    }
+
+    private BluetoothServerSocket createNewRfcommSocketAndRecord(String name, UUID uuid,
+            boolean auth, boolean encrypt) throws IOException {
         RfcommChannelPicker picker = new RfcommChannelPicker(uuid);
 
         BluetoothServerSocket socket;
@@ -881,7 +917,7 @@
             }
 
             socket = new BluetoothServerSocket(
-                    BluetoothSocket.TYPE_RFCOMM, true, true, channel);
+                    BluetoothSocket.TYPE_RFCOMM, auth, encrypt, channel);
             errno = socket.mSocket.bindListen();
             if (errno == 0) {
                 if (DBG) Log.d(TAG, "listening on RFCOMM channel " + channel);
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index ada3c24..e15d003 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -737,6 +737,39 @@
     }
 
     /**
+     * Create an RFCOMM {@link BluetoothSocket} socket ready to start an insecure
+     * outgoing connection to this remote device using SDP lookup of uuid.
+     * <p> The communication channel will not have an authenticated link key
+     * i.e it will be subject to man-in-the-middle attacks. For Bluetooth 2.1
+     * devices, the link key will be encrypted, as encryption is mandatory.
+     * For legacy devices (pre Bluetooth 2.1 devices) the link key will
+     * be not be encrypted. Use {@link #createRfcommSocketToServiceRecord} if an
+     * encrypted and authenticated communication channel is desired.
+     * <p>This is designed to be used with {@link
+     * BluetoothAdapter#listenUsingInsecureRfcommWithServiceRecord} for peer-peer
+     * Bluetooth applications.
+     * <p>Use {@link BluetoothSocket#connect} to initiate the outgoing
+     * connection. This will also perform an SDP lookup of the given uuid to
+     * determine which channel to connect to.
+     * <p>The remote device will be authenticated and communication on this
+     * socket will be encrypted.
+     * <p>Hint: If you are connecting to a Bluetooth serial board then try
+     * using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB.
+     * However if you are connecting to an Android peer then please generate
+     * your own unique UUID.
+     * <p>Requires {@link android.Manifest.permission#BLUETOOTH}
+     *
+     * @param uuid service record uuid to lookup RFCOMM channel
+     * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection
+     * @throws IOException on error, for example Bluetooth not available, or
+     *                     insufficient permissions
+     */
+    public BluetoothSocket createInsecureRfcommSocketToServiceRecord(UUID uuid) throws IOException {
+        return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, false, false, this, -1,
+                new ParcelUuid(uuid));
+    }
+
+    /**
      * Construct an insecure RFCOMM socket ready to start an outgoing
      * connection.
      * Call #connect on the returned #BluetoothSocket to begin the connection.
diff --git a/core/java/android/bluetooth/BluetoothPan.java b/core/java/android/bluetooth/BluetoothPan.java
index f55e96a..7dee25e 100644
--- a/core/java/android/bluetooth/BluetoothPan.java
+++ b/core/java/android/bluetooth/BluetoothPan.java
@@ -34,21 +34,31 @@
     private static final String TAG = "BluetoothPan";
     private static final boolean DBG = false;
 
+    //TODO: This needs to inherit from BluetoothProfile like other profiles.
+
     /** int extra for ACTION_PAN_STATE_CHANGED */
-    public static final String EXTRA_PAN_STATE =
-        "android.bluetooth.pan.extra.STATE";
+    public static final String EXTRA_PAN_STATE = "android.bluetooth.pan.extra.STATE";
+
     /** int extra for ACTION_PAN_STATE_CHANGED */
     public static final String EXTRA_PREVIOUS_PAN_STATE =
         "android.bluetooth.pan.extra.PREVIOUS_STATE";
 
-    /** Indicates the state of an PAN device has changed.
+    /** int extra for ACTION_PAN_STATE_CHANGED */
+    public static final String EXTRA_LOCAL_ROLE = "android.bluetooth.pan.extra.LOCAL_ROLE";
+
+    public static final int LOCAL_NAP_ROLE = 1;
+    public static final int LOCAL_PANU_ROLE = 2;
+
+    /**
+     * Indicates the state of an PAN device has changed.
      * This intent will always contain EXTRA_DEVICE_STATE,
-     * EXTRA_PREVIOUS_DEVICE_STATE and BluetoothDevice.EXTRA_DEVICE
+     * EXTRA_PREVIOUS_DEVICE_STATE, BluetoothDevice.EXTRA_DEVICE
+     * and EXTRA_LOCAL_ROLE.
      * extras.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PAN_STATE_CHANGED =
-        "android.bluetooth.pan.action.STATE_CHANGED";
+      "android.bluetooth.pan.action.STATE_CHANGED";
 
     public static final String NAP_ROLE = "nap";
     public static final String NAP_BRIDGE = "pan1";
@@ -130,40 +140,42 @@
         }
     }
 
-    /** Get the state of a PAN Device.
-    *
-    * This function returns an int representing the state of the PAN connection
-    *
-    *  @param device Remote BT device.
-    *  @return The current state of the PAN Device
-    *  @hide
-    */
-   public int getPanDeviceState(BluetoothDevice device) {
-       if (DBG) log("getPanDeviceState(" + device + ")");
+    /**
+     * Get the state of a PAN Device.
+     *
+     * This function returns an int representing the state of the PAN connection
+     *
+     *  @param device Remote BT device.
+     *  @return The current state of the PAN Device
+     *  @hide
+     */
+    public int getPanDeviceState(BluetoothDevice device) {
+        if (DBG) log("getPanDeviceState(" + device + ")");
+        try {
+            return mService.getPanDeviceState(device);
+        } catch (RemoteException e) {
+            Log.e(TAG, "", e);
+            return STATE_DISCONNECTED;
+        }
+    }
+
+    /**
+     * Returns a set of all the connected PAN Devices
+     *
+     * Does not include devices that are currently connecting or disconnecting
+     *
+     *  @return List of PAN devices or empty on Error
+     * @hide
+     */
+    public List<BluetoothDevice> getConnectedDevices() {
+       if (DBG) log("getConnectedDevices");
        try {
-           return mService.getPanDeviceState(device);
+           return mService.getConnectedPanDevices();
        } catch (RemoteException e) {
            Log.e(TAG, "", e);
-           return STATE_DISCONNECTED;
+           return new ArrayList<BluetoothDevice>();
        }
-   }
-
-   /** Returns a set of all the connected PAN Devices
-   *
-   * Does not include devices that are currently connecting or disconnecting
-   *
-   * @return List of PAN devices or empty on Error
-   * @hide
-   */
-   public List<BluetoothDevice> getConnectedDevices() {
-      if (DBG) log("getConnectedDevices");
-      try {
-          return mService.getConnectedPanDevices();
-      } catch (RemoteException e) {
-          Log.e(TAG, "", e);
-          return new ArrayList<BluetoothDevice>();
-      }
-   }
+    }
 
     private static void log(String msg) {
         Log.d(TAG, msg);
diff --git a/core/java/android/bluetooth/BluetoothTetheringDataTracker.java b/core/java/android/bluetooth/BluetoothTetheringDataTracker.java
new file mode 100644
index 0000000..7b083f1
--- /dev/null
+++ b/core/java/android/bluetooth/BluetoothTetheringDataTracker.java
@@ -0,0 +1,299 @@
+/*
+ * 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.bluetooth;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.DhcpInfo;
+import android.net.LinkAddress;
+import android.net.LinkCapabilities;
+import android.net.LinkProperties;
+import android.net.NetworkInfo;
+import android.net.NetworkInfo.DetailedState;
+import android.net.NetworkStateTracker;
+import android.net.NetworkUtils;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+import java.net.InetAddress;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * This class tracks the data connection associated with Bluetooth
+ * reverse tethering. This is a singleton class and an instance will be
+ * created by ConnectivityService. BluetoothService will call into this
+ * when a reverse tethered connection needs to be activated.
+ *
+ * @hide
+ */
+public class BluetoothTetheringDataTracker implements NetworkStateTracker {
+    private static final String NETWORKTYPE = "BLUETOOTH_TETHER";
+    private static final String TAG = "BluetoothTethering";
+
+    private AtomicBoolean mTeardownRequested = new AtomicBoolean(false);
+    private AtomicBoolean mPrivateDnsRouteSet = new AtomicBoolean(false);
+    private AtomicInteger mDefaultGatewayAddr = new AtomicInteger(0);
+    private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false);
+
+    private LinkProperties mLinkProperties;
+    private LinkCapabilities mLinkCapabilities;
+    private NetworkInfo mNetworkInfo;
+
+    private BluetoothPan mBluetoothPan;
+    private BluetoothDevice mDevice;
+    private static String mIface;
+
+    /* For sending events to connectivity service handler */
+    private Handler mCsHandler;
+    private Context mContext;
+    public static BluetoothTetheringDataTracker sInstance;
+
+    private BluetoothTetheringDataTracker() {
+        mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_BLUETOOTH, 0, NETWORKTYPE, "");
+        mLinkProperties = new LinkProperties();
+        mLinkCapabilities = new LinkCapabilities();
+
+        mNetworkInfo.setIsAvailable(false);
+        setTeardownRequested(false);
+    }
+
+    public static synchronized BluetoothTetheringDataTracker getInstance() {
+        if (sInstance == null) sInstance = new BluetoothTetheringDataTracker();
+        return sInstance;
+    }
+
+    public Object Clone() throws CloneNotSupportedException {
+        throw new CloneNotSupportedException();
+    }
+
+    public void setTeardownRequested(boolean isRequested) {
+        mTeardownRequested.set(isRequested);
+    }
+
+    public boolean isTeardownRequested() {
+        return mTeardownRequested.get();
+    }
+
+    /**
+     * Begin monitoring connectivity
+     */
+    public void startMonitoring(Context context, Handler target) {
+        mContext = context;
+        mCsHandler = target;
+        mBluetoothPan = new BluetoothPan(mContext);
+    }
+
+    /**
+     * Disable connectivity to a network
+     * TODO: do away with return value after making MobileDataStateTracker async
+     */
+    public boolean teardown() {
+        mTeardownRequested.set(true);
+        for (BluetoothDevice device: mBluetoothPan.getConnectedDevices()) {
+            mBluetoothPan.disconnect(device);
+        }
+        return true;
+    }
+
+    /**
+     * Re-enable connectivity to a network after a {@link #teardown()}.
+     */
+    public boolean reconnect() {
+        mTeardownRequested.set(false);
+        //Ignore
+        return true;
+    }
+
+    /**
+     * Turn the wireless radio off for a network.
+     * @param turnOn {@code true} to turn the radio on, {@code false}
+     */
+    public boolean setRadio(boolean turnOn) {
+        return true;
+    }
+
+    /**
+     * @return true - If are we currently tethered with another device.
+     */
+    public synchronized boolean isAvailable() {
+        return mNetworkInfo.isAvailable();
+    }
+
+    /**
+     * Tells the underlying networking system that the caller wants to
+     * begin using the named feature. The interpretation of {@code feature}
+     * is completely up to each networking implementation.
+     * @param feature the name of the feature to be used
+     * @param callingPid the process ID of the process that is issuing this request
+     * @param callingUid the user ID of the process that is issuing this request
+     * @return an integer value representing the outcome of the request.
+     * The interpretation of this value is specific to each networking
+     * implementation+feature combination, except that the value {@code -1}
+     * always indicates failure.
+     * TODO: needs to go away
+     */
+    public int startUsingNetworkFeature(String feature, int callingPid, int callingUid) {
+        return -1;
+    }
+
+    /**
+     * Tells the underlying networking system that the caller is finished
+     * using the named feature. The interpretation of {@code feature}
+     * is completely up to each networking implementation.
+     * @param feature the name of the feature that is no longer needed.
+     * @param callingPid the process ID of the process that is issuing this request
+     * @param callingUid the user ID of the process that is issuing this request
+     * @return an integer value representing the outcome of the request.
+     * The interpretation of this value is specific to each networking
+     * implementation+feature combination, except that the value {@code -1}
+     * always indicates failure.
+     * TODO: needs to go away
+     */
+    public int stopUsingNetworkFeature(String feature, int callingPid, int callingUid) {
+        return -1;
+    }
+
+    /**
+     * @param enabled
+     */
+    public void setDataEnable(boolean enabled) {
+        android.util.Log.d(TAG, "setDataEnabled: IGNORING enabled=" + enabled);
+    }
+
+    /**
+     * Check if private DNS route is set for the network
+     */
+    public boolean isPrivateDnsRouteSet() {
+        return mPrivateDnsRouteSet.get();
+    }
+
+    /**
+     * Set a flag indicating private DNS route is set
+     */
+    public void privateDnsRouteSet(boolean enabled) {
+        mPrivateDnsRouteSet.set(enabled);
+    }
+
+    /**
+     * Fetch NetworkInfo for the network
+     */
+    public synchronized NetworkInfo getNetworkInfo() {
+        return mNetworkInfo;
+    }
+
+    /**
+     * Fetch LinkProperties for the network
+     */
+    public synchronized LinkProperties getLinkProperties() {
+        return new LinkProperties(mLinkProperties);
+    }
+
+   /**
+     * A capability is an Integer/String pair, the capabilities
+     * are defined in the class LinkSocket#Key.
+     *
+     * @return a copy of this connections capabilities, may be empty but never null.
+     */
+    public LinkCapabilities getLinkCapabilities() {
+        return new LinkCapabilities(mLinkCapabilities);
+    }
+
+    /**
+     * Fetch default gateway address for the network
+     */
+    public int getDefaultGatewayAddr() {
+        return mDefaultGatewayAddr.get();
+    }
+
+    /**
+     * Check if default route is set
+     */
+    public boolean isDefaultRouteSet() {
+        return mDefaultRouteSet.get();
+    }
+
+    /**
+     * Set a flag indicating default route is set for the network
+     */
+    public void defaultRouteSet(boolean enabled) {
+        mDefaultRouteSet.set(enabled);
+    }
+
+    /**
+     * Return the system properties name associated with the tcp buffer sizes
+     * for this network.
+     */
+    public String getTcpBufferSizesPropName() {
+        return "net.tcp.buffersize.wifi";
+    }
+
+
+    public synchronized void startReverseTether(String iface, BluetoothDevice device) {
+        mIface = iface;
+        mDevice = device;
+        Thread dhcpThread = new Thread(new Runnable() {
+            public void run() {
+                //TODO(): Add callbacks for failure and success case.
+                //Currently this thread runs independently.
+                DhcpInfo dhcpInfo = new DhcpInfo();
+                if (!NetworkUtils.runDhcp(mIface, dhcpInfo)) {
+                    Log.e(TAG, "DHCP request error:" + NetworkUtils.getDhcpError());
+                    return;
+                }
+                mLinkProperties.addLinkAddress(new LinkAddress(
+                    NetworkUtils.intToInetAddress(dhcpInfo.ipAddress),
+                    NetworkUtils.intToInetAddress(dhcpInfo.netmask)));
+                mLinkProperties.setGateway(NetworkUtils.intToInetAddress(dhcpInfo.gateway));
+                InetAddress dns1Addr = NetworkUtils.intToInetAddress(dhcpInfo.dns1);
+                if (dns1Addr == null || dns1Addr.equals("0.0.0.0")) {
+                    mLinkProperties.addDns(dns1Addr);
+                }
+                InetAddress dns2Addr = NetworkUtils.intToInetAddress(dhcpInfo.dns2);
+                if (dns2Addr == null || dns2Addr.equals("0.0.0.0")) {
+                    mLinkProperties.addDns(dns2Addr);
+                }
+                mLinkProperties.setInterfaceName(mIface);
+
+                mNetworkInfo.setIsAvailable(true);
+                mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null);
+
+                Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo);
+                msg.sendToTarget();
+
+                msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
+                msg.sendToTarget();
+            }
+        });
+        dhcpThread.start();
+    }
+
+    public synchronized void stopReverseTether(String iface) {
+        NetworkUtils.stopDhcp(iface);
+
+        mLinkProperties.clear();
+        mNetworkInfo.setIsAvailable(false);
+        mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null);
+
+        Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo);
+        msg.sendToTarget();
+
+        msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
+        msg.sendToTarget();
+    }
+}
diff --git a/core/java/android/content/AsyncTaskLoader.java b/core/java/android/content/AsyncTaskLoader.java
index b19c072..d6bc959 100644
--- a/core/java/android/content/AsyncTaskLoader.java
+++ b/core/java/android/content/AsyncTaskLoader.java
@@ -38,7 +38,7 @@
         /* Runs on the UI thread */
         @Override
         protected void onPostExecute(D data) {
-            AsyncTaskLoader.this.dispatchOnLoadComplete(data);
+            AsyncTaskLoader.this.dispatchOnLoadComplete(this, data);
         }
 
         @Override
@@ -53,12 +53,9 @@
         super(context);
     }
 
-    /**
-     * Force an asynchronous load. Unlike {@link #startLoading()} this will ignore a previously
-     * loaded data set and load a new one.
-     */
     @Override
-    public void forceLoad() {
+    protected void onForceLoad() {
+        super.onForceLoad();
         cancelLoad();
         mTask = new LoadTask();
         mTask.execute((Void[]) null);
@@ -89,9 +86,13 @@
     public void onCancelled(D data) {
     }
 
-    void dispatchOnLoadComplete(D data) {
-        mTask = null;
-        deliverResult(data);
+    void dispatchOnLoadComplete(LoadTask task, D data) {
+        if (mTask != task) {
+            onCancelled(data);
+        } else {
+            mTask = null;
+            deliverResult(data);
+        }
     }
 
     /**
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index da1aac4..d034229 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -201,6 +201,7 @@
             } catch (RemoteException e) {
                 return null;
             } catch (java.lang.Exception e) {
+                Log.w(TAG, "Failed to get type for: " + url + " (" + e.getMessage() + ")");
                 return null;
             } finally {
                 releaseProvider(provider);
@@ -216,6 +217,9 @@
             return type;
         } catch (RemoteException e) {
             return null;
+        } catch (java.lang.Exception e) {
+            Log.w(TAG, "Failed to get type for: " + url + " (" + e.getMessage() + ")");
+            return null;
         }
     }
 
diff --git a/core/java/android/content/CursorLoader.java b/core/java/android/content/CursorLoader.java
index 7776874..8ab0973 100644
--- a/core/java/android/content/CursorLoader.java
+++ b/core/java/android/content/CursorLoader.java
@@ -20,19 +20,24 @@
 import android.database.Cursor;
 import android.net.Uri;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.Arrays;
+
 /**
  * A loader that queries the {@link ContentResolver} and returns a {@link Cursor}.
  */
 public class CursorLoader extends AsyncTaskLoader<Cursor> {
-    Cursor mCursor;
-    ForceLoadContentObserver mObserver;
-    boolean mStopped;
+    final ForceLoadContentObserver mObserver;
+
     Uri mUri;
     String[] mProjection;
     String mSelection;
     String[] mSelectionArgs;
     String mSortOrder;
 
+    Cursor mCursor;
+
     /* Runs on a worker thread */
     @Override
     public Cursor loadInBackground() {
@@ -57,7 +62,7 @@
     /* Runs on the UI thread */
     @Override
     public void deliverResult(Cursor cursor) {
-        if (mStopped) {
+        if (isReset()) {
             // An async query came in while the loader is stopped
             if (cursor != null) {
                 cursor.close();
@@ -66,9 +71,12 @@
         }
         Cursor oldCursor = mCursor;
         mCursor = cursor;
-        super.deliverResult(cursor);
 
-        if (oldCursor != null && !oldCursor.isClosed()) {
+        if (isStarted()) {
+            super.deliverResult(cursor);
+        }
+
+        if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {
             oldCursor.close();
         }
     }
@@ -92,12 +100,11 @@
      * Must be called from the UI thread
      */
     @Override
-    public void startLoading() {
-        mStopped = false;
-
+    protected void onStartLoading() {
         if (mCursor != null) {
             deliverResult(mCursor);
-        } else {
+        }
+        if (takeContentChanged() || mCursor == null) {
             forceLoad();
         }
     }
@@ -106,17 +113,9 @@
      * Must be called from the UI thread
      */
     @Override
-    public void stopLoading() {
-        if (mCursor != null && !mCursor.isClosed()) {
-            mCursor.close();
-        }
-        mCursor = null;
-
+    protected void onStopLoading() {
         // Attempt to cancel the current load task if possible.
         cancelLoad();
-
-        // Make sure that any outstanding loads clean themselves up properly
-        mStopped = true;
     }
 
     @Override
@@ -127,9 +126,16 @@
     }
 
     @Override
-    public void destroy() {
+    protected void onReset() {
+        super.onReset();
+        
         // Ensure the loader is stopped
-        stopLoading();
+        onStopLoading();
+
+        if (mCursor != null && !mCursor.isClosed()) {
+            mCursor.close();
+        }
+        mCursor = null;
     }
 
     public Uri getUri() {
@@ -171,4 +177,18 @@
     public void setSortOrder(String sortOrder) {
         mSortOrder = sortOrder;
     }
+
+    @Override
+    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        super.dump(prefix, fd, writer, args);
+        writer.print(prefix); writer.print("mUri="); writer.println(mUri);
+        writer.print(prefix); writer.print("mProjection=");
+                writer.println(Arrays.toString(mProjection));
+        writer.print(prefix); writer.print("mSelection="); writer.println(mSelection);
+        writer.print(prefix); writer.print("mSelectionArgs=");
+                writer.println(Arrays.toString(mSelectionArgs));
+        writer.print(prefix); writer.print("mSortOrder="); writer.println(mSortOrder);
+        writer.print(prefix); writer.print("mCursor="); writer.println(mCursor);
+        writer.print(prefix); writer.print("mContentChanged="); writer.println(mContentChanged);
+    }
 }
diff --git a/core/java/android/content/Loader.java b/core/java/android/content/Loader.java
index 234096a..ef81fe4 100644
--- a/core/java/android/content/Loader.java
+++ b/core/java/android/content/Loader.java
@@ -18,18 +18,28 @@
 
 import android.database.ContentObserver;
 import android.os.Handler;
+import android.util.DebugUtils;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
 
 /**
  * An abstract class that performs asynchronous loading of data. While Loaders are active
  * they should monitor the source of their data and deliver new results when the contents
  * change.
  *
+ * <p>Subclasses generally must implement at least {@link #onStartLoading()},
+ * {@link #onStopLoading()}, {@link #onForceLoad()}, and {@link #onReset()}.
+ *
  * @param <D> The result returned when the load is complete
  */
-public abstract class Loader<D> {
+public class Loader<D> {
     int mId;
     OnLoadCompleteListener<D> mListener;
     Context mContext;
+    boolean mStarted = false;
+    boolean mReset = true;
+    boolean mContentChanged = false;
 
     public final class ForceLoadContentObserver extends ContentObserver {
         public ForceLoadContentObserver() {
@@ -122,43 +132,186 @@
     }
 
     /**
+     * Return whether this load has been started.  That is, its {@link #startLoading()}
+     * has been called and no calls to {@link #stopLoading()} or
+     * {@link #reset()} have yet been made.
+     */
+    public boolean isStarted() {
+        return mStarted;
+    }
+
+    /**
+     * Return whether this load has been reset.  That is, either the loader
+     * has not yet been started for the first time, or its {@link #reset()}
+     * has been called.
+     */
+    public boolean isReset() {
+        return mReset;
+    }
+
+    /**
      * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks
      * will be called on the UI thread. If a previous load has been completed and is still valid
      * the result may be passed to the callbacks immediately. The loader will monitor the source of
      * the data set and may deliver future callbacks if the source changes. Calling
      * {@link #stopLoading} will stop the delivery of callbacks.
      *
-     * Must be called from the UI thread
+     * <p>This updates the Loader's internal state so that
+     * {@link #isStarted()} and {@link #isReset()} will return the correct
+     * values, and then calls the implementation's {@link #onStartLoading()}.
+     *
+     * <p>Must be called from the UI thread.
      */
-    public abstract void startLoading();
+    public final void startLoading() {
+        mStarted = true;
+        mReset = false;
+        onStartLoading();
+    }
+
+    /**
+     * Subclasses must implement this to take care of loading their data,
+     * as per {@link #startLoading()}.  This is not called by clients directly,
+     * but as a result of a call to {@link #startLoading()}.
+     */
+    protected void onStartLoading() {
+    }
 
     /**
      * Force an asynchronous load. Unlike {@link #startLoading()} this will ignore a previously
-     * loaded data set and load a new one.
+     * loaded data set and load a new one.  This simply calls through to the
+     * implementation's {@link #onForceLoad()}.  You generally should only call this
+     * when the loader is started -- that is, {@link #isStarted()} returns true.
+     *
+     * <p>Must be called from the UI thread.
      */
-    public abstract void forceLoad();
+    public final void forceLoad() {
+        onForceLoad();
+    }
 
     /**
-     * Stops delivery of updates until the next time {@link #startLoading()} is called
-     *
-     * Must be called from the UI thread
+     * Subclasses must implement this to take care of requests to {@link #forceLoad()}.
      */
-    public abstract void stopLoading();
+    protected void onForceLoad() {
+    }
 
     /**
-     * Destroys the loader and frees its resources, making it unusable.
+     * Stops delivery of updates until the next time {@link #startLoading()} is called.
+     * Implementations should <em>not</em> invalidate their data at this point --
+     * clients are still free to use the last data the loader reported.  They will,
+     * however, typically stop reporting new data if the data changes; they can
+     * still monitor for changes, but must not report them to the client until and
+     * if {@link #startLoading()} is later called.
      *
-     * Must be called from the UI thread
+     * <p>This updates the Loader's internal state so that
+     * {@link #isStarted()} will return the correct
+     * value, and then calls the implementation's {@link #onStopLoading()}.
+     *
+     * <p>Must be called from the UI thread.
      */
-    public abstract void destroy();
+    public final void stopLoading() {
+        mStarted = false;
+        onStopLoading();
+    }
 
     /**
-     * Called when {@link ForceLoadContentObserver} detects a change.  Calls {@link #forceLoad()}
-     * by default.
+     * Subclasses must implement this to take care of stopping their loader,
+     * as per {@link #stopLoading()}.  This is not called by clients directly,
+     * but as a result of a call to {@link #stopLoading()}.
+     */
+    protected void onStopLoading() {
+    }
+
+    /**
+     * Resets the state of the Loader.  The Loader should at this point free
+     * all of its resources, since it may never be called again; however, its
+     * {@link #startLoading()} may later be called at which point it must be
+     * able to start running again.
      *
-     * Must be called from the UI thread
+     * <p>This updates the Loader's internal state so that
+     * {@link #isStarted()} and {@link #isReset()} will return the correct
+     * values, and then calls the implementation's {@link #onReset()}.
+     *
+     * <p>Must be called from the UI thread.
+     */
+    public final void reset() {
+        onReset();
+        mReset = true;
+        mStarted = false;
+        mContentChanged = false;
+    }
+
+    /**
+     * Subclasses must implement this to take care of resetting their loader,
+     * as per {@link #reset()}.  This is not called by clients directly,
+     * but as a result of a call to {@link #reset()}.
+     */
+    protected void onReset() {
+    }
+
+    /**
+     * Take the current flag indicating whether the loader's content had
+     * changed while it was stopped.  If it had, true is returned and the
+     * flag is cleared.
+     */
+    public boolean takeContentChanged() {
+        boolean res = mContentChanged;
+        mContentChanged = false;
+        return res;
+    }
+    
+    /**
+     * Called when {@link ForceLoadContentObserver} detects a change.  The
+     * default implementation checks to see if the loader is currently started;
+     * if so, it simply calls {@link #forceLoad()}; otherwise, it sets a flag
+     * so that {@link #takeContentChanged()} returns true.
+     *
+     * <p>Must be called from the UI thread.
      */
     public void onContentChanged() {
-        forceLoad();
+        if (mStarted) {
+            forceLoad();
+        } else {
+            // This loader has been stopped, so we don't want to load
+            // new data right now...  but keep track of it changing to
+            // refresh later if we start again.
+            mContentChanged = true;
+        }
+    }
+
+    /**
+     * For debugging, converts an instance of the Loader's data class to
+     * a string that can be printed.  Must handle a null data.
+     */
+    public String dataToString(D data) {
+        StringBuilder sb = new StringBuilder(64);
+        DebugUtils.buildShortClassTag(data, sb);
+        sb.append("}");
+        return sb.toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(64);
+        DebugUtils.buildShortClassTag(this, sb);
+        sb.append(" id=");
+        sb.append(mId);
+        sb.append("}");
+        return sb.toString();
+    }
+
+    /**
+     * Print the Loader's state into the given stream.
+     *
+     * @param prefix Text to print at the front of each line.
+     * @param fd The raw file descriptor that the dump is being sent to.
+     * @param writer A PrintWriter to which the dump is to be set.
+     * @param args Additional arguments to the dump request.
+     */
+    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        writer.print(prefix); writer.print("mId="); writer.print(mId);
+                writer.print(" mListener="); writer.println(mListener);
+        writer.print(prefix); writer.print("mStarted="); writer.print(mStarted);
+                writer.print(" mContentChanged="); writer.print(mContentChanged);
+                writer.print(" mReset="); writer.println(mReset);
     }
 }
\ No newline at end of file
diff --git a/core/java/android/content/SyncActivityTooManyDeletes.java b/core/java/android/content/SyncActivityTooManyDeletes.java
new file mode 100644
index 0000000..350f35e
--- /dev/null
+++ b/core/java/android/content/SyncActivityTooManyDeletes.java
@@ -0,0 +1,133 @@
+/*
+ * 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 android.content;
+
+import com.android.internal.R;
+import android.accounts.Account;
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.LinearLayout;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+/**
+ * Presents multiple options for handling the case where a sync was aborted because there
+ * were too many pending deletes. One option is to force the delete, another is to rollback
+ * the deletes, the third is to do nothing.
+ * @hide
+ */
+public class SyncActivityTooManyDeletes extends Activity
+        implements AdapterView.OnItemClickListener {
+
+    private long mNumDeletes;
+    private Account mAccount;
+    private String mAuthority;
+    private String mProvider;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Bundle extras = getIntent().getExtras();
+        if (extras == null) {
+            finish();
+            return;
+        }
+
+        mNumDeletes = extras.getLong("numDeletes");
+        mAccount = (Account) extras.getParcelable("account");
+        mAuthority = extras.getString("authority");
+        mProvider = extras.getString("provider");
+
+        // the order of these must match up with the constants for position used in onItemClick
+        CharSequence[] options = new CharSequence[]{
+                getResources().getText(R.string.sync_really_delete),
+                getResources().getText(R.string.sync_undo_deletes),
+                getResources().getText(R.string.sync_do_nothing)
+        };
+
+        ListAdapter adapter = new ArrayAdapter<CharSequence>(this,
+                android.R.layout.simple_list_item_1,
+                android.R.id.text1,
+                options);
+
+        ListView listView = new ListView(this);
+        listView.setAdapter(adapter);
+        listView.setItemsCanFocus(true);
+        listView.setOnItemClickListener(this);
+
+        TextView textView = new TextView(this);
+        CharSequence tooManyDeletesDescFormat =
+                getResources().getText(R.string.sync_too_many_deletes_desc);
+        textView.setText(String.format(tooManyDeletesDescFormat.toString(),
+                mNumDeletes, mProvider, mAccount.name));
+
+        final LinearLayout ll = new LinearLayout(this);
+        ll.setOrientation(LinearLayout.VERTICAL);
+        final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0);
+        ll.addView(textView, lp);
+        ll.addView(listView, lp);
+
+        // TODO: consider displaying the icon of the account type
+//        AuthenticatorDescription[] descs = AccountManager.get(this).getAuthenticatorTypes();
+//        for (AuthenticatorDescription desc : descs) {
+//            if (desc.type.equals(mAccount.type)) {
+//                try {
+//                    final Context authContext = createPackageContext(desc.packageName, 0);
+//                    ImageView imageView = new ImageView(this);
+//                    imageView.setImageDrawable(authContext.getResources().getDrawable(desc.iconId));
+//                    ll.addView(imageView, lp);
+//                } catch (PackageManager.NameNotFoundException e) {
+//                }
+//                break;
+//            }
+//        }
+
+        setContentView(ll);
+    }
+
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        // the constants for position correspond to the items options array in onCreate()
+        if (position == 0) startSyncReallyDelete();
+        else if (position == 1) startSyncUndoDeletes();
+        finish();
+    }
+
+    private void startSyncReallyDelete() {
+        Bundle extras = new Bundle();
+        extras.putBoolean(ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS, true);
+        extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
+        extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
+        extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true);
+        ContentResolver.requestSync(mAccount, mAuthority, extras);
+    }
+
+    private void startSyncUndoDeletes() {
+        Bundle extras = new Bundle();
+        extras.putBoolean(ContentResolver.SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS, true);
+        extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
+        extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
+        extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true);
+        ContentResolver.requestSync(mAccount, mAuthority, extras);
+    }
+}
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 599429b..8b292c9 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -2157,9 +2157,7 @@
             }
             CharSequence authorityName = providerInfo.loadLabel(mContext.getPackageManager());
 
-            Intent clickIntent = new Intent();
-            clickIntent.setClassName("com.android.providers.subscribedfeeds",
-                    "com.android.settings.SyncActivityTooManyDeletes");
+            Intent clickIntent = new Intent(mContext, SyncActivityTooManyDeletes.class);
             clickIntent.putExtra("account", account);
             clickIntent.putExtra("authority", authority);
             clickIntent.putExtra("provider", authorityName.toString());
diff --git a/core/java/android/database/CursorWindow.java b/core/java/android/database/CursorWindow.java
index a026eca..9a8f2d2 100644
--- a/core/java/android/database/CursorWindow.java
+++ b/core/java/android/database/CursorWindow.java
@@ -16,6 +16,7 @@
 
 package android.database;
 
+import android.content.res.Resources;
 import android.database.sqlite.SQLiteClosable;
 import android.os.IBinder;
 import android.os.Parcel;
@@ -25,6 +26,13 @@
  * A buffer containing multiple cursor rows.
  */
 public class CursorWindow extends SQLiteClosable implements Parcelable {
+    /** The cursor window size. resource xml file specifies the value in kB.
+     * convert it to bytes here by multiplying with 1024.
+     */
+    private static final int sCursorWindowSize =
+        Resources.getSystem().getInteger(
+                com.android.internal.R.integer.config_cursorWindowSize) * 1024;
+
     /** The pointer to the native window class */
     @SuppressWarnings("unused")
     private int nWindow;
@@ -38,7 +46,7 @@
      */
     public CursorWindow(boolean localWindow) {
         mStartPos = 0;
-        native_init(localWindow);
+        native_init(sCursorWindowSize, localWindow);
     }
 
     /**
@@ -574,7 +582,7 @@
     private native IBinder native_getBinder();
 
     /** Does the native side initialization for an empty window */
-    private native void native_init(boolean localOnly);
+    private native void native_init(int cursorWindowSize, boolean localOnly);
 
     /** Does the native side initialization with an existing binder from another process */
     private native void native_init(IBinder nativeBinder);
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index 184988b..6f59dc9 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -18,6 +18,7 @@
 
 import android.app.AppGlobals;
 import android.content.ContentValues;
+import android.content.res.Resources;
 import android.database.Cursor;
 import android.database.DatabaseErrorHandler;
 import android.database.DatabaseUtils;
@@ -1963,6 +1964,15 @@
         // If the caller sets errorHandler = null, then use default errorhandler.
         mErrorHandler = (errorHandler == null) ? new DefaultDatabaseErrorHandler() : errorHandler;
         mConnectionNum = connectionNum;
+        /* sqlite soft heap limit http://www.sqlite.org/c3ref/soft_heap_limit64.html
+         * set it to 4 times the default cursor window size.
+         * TODO what is an appropriate value, considring the WAL feature which could burn
+         * a lot of memory with many connections to the database. needs testing to figure out
+         * optimal value for this.
+         */
+        int limit = Resources.getSystem().getInteger(
+                com.android.internal.R.integer.config_cursorWindowSize) * 1024 * 4;
+        native_setSqliteSoftHeapLimit(limit);
     }
 
     /**
@@ -2670,4 +2680,10 @@
      * @param statementId statement to be finzlied by sqlite
      */
     private final native void native_finalize(int statementId);
+
+    /**
+     * set sqlite soft heap limit
+     * http://www.sqlite.org/c3ref/soft_heap_limit64.html
+     */
+    private native void native_setSqliteSoftHeapLimit(int softHeapLimit);
 }
diff --git a/core/java/android/hardware/UsbManager.java b/core/java/android/hardware/UsbManager.java
index 1003bf9..6022b12 100644
--- a/core/java/android/hardware/UsbManager.java
+++ b/core/java/android/hardware/UsbManager.java
@@ -105,6 +105,14 @@
      */
     public static final String USB_FUNCTION_DISABLED = "disabled";
 
+    public static final int getDeviceId(String name) {
+        return native_get_device_id(name);
+    }
+
+    public static final String getDeviceName(int id) {
+        return native_get_device_name(id);
+    }
+
     private static File getFunctionEnableFile(String function) {
         return new File("/sys/class/usb_composite/" + function + "/enable");
     }
@@ -130,4 +138,7 @@
             return false;
         }
     }
+
+    private static native int native_get_device_id(String name);
+    private static native String native_get_device_name(int id);
 }
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 3d685cb..7e809f5 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -213,10 +213,16 @@
      */
     public static final int TYPE_WIMAX       = 6;
 
+    /**
+     * Bluetooth data connection. This is used for Bluetooth reverse tethering.
+     * @hide
+     */
+    public static final int TYPE_BLUETOOTH   = 7;
+
     /** {@hide} */
-    public static final int TYPE_DUMMY       = 7;
+    public static final int TYPE_DUMMY       = 8;
     /** {@hide} TODO: Need to adjust this for WiMAX. */
-    public static final int MAX_RADIO_TYPE   = TYPE_WIFI;
+    public static final int MAX_RADIO_TYPE   = TYPE_DUMMY;
     /** {@hide} TODO: Need to adjust this for WiMAX. */
     public static final int MAX_NETWORK_TYPE = TYPE_DUMMY;
 
diff --git a/core/java/android/net/Proxy.java b/core/java/android/net/Proxy.java
index 0ad80dd..f750122 100644
--- a/core/java/android/net/Proxy.java
+++ b/core/java/android/net/Proxy.java
@@ -65,7 +65,9 @@
      * that either the default connection or its proxy has changed.
      * The intent will have the following extra value:</p>
      * <ul>
-     *   <li><em>EXTRA_PROXY_INFO</em> - The ProxyProperties for the proxy
+     *   <li><em>EXTRA_PROXY_INFO</em> - The ProxyProperties for the proxy.  Non-null,
+     *                                   though if the proxy is undefined the host string
+     *                                   will be empty.
      * </ul>
      *
      * <p class="note">This is a protected intent that can only be sent by the system
diff --git a/core/java/android/net/http/RequestHandle.java b/core/java/android/net/http/RequestHandle.java
index 103fd94..2c48a04 100644
--- a/core/java/android/net/http/RequestHandle.java
+++ b/core/java/android/net/http/RequestHandle.java
@@ -308,7 +308,7 @@
         String A2 = mMethod  + ":" + mUrl;
 
         // because we do not preemptively send authorization headers, nc is always 1
-        String nc = "000001";
+        String nc = "00000001";
         String cnonce = computeCnonce();
         String digest = computeDigest(A1, A2, nonce, QOP, nc, cnonce);
 
diff --git a/core/java/android/nfc/technology/MifareClassic.java b/core/java/android/nfc/technology/MifareClassic.java
index d5f0a31..8a9ebf1 100644
--- a/core/java/android/nfc/technology/MifareClassic.java
+++ b/core/java/android/nfc/technology/MifareClassic.java
@@ -161,7 +161,9 @@
                 mSize = SIZE_4K;
                 break;
             default:
-                // Unknown, not MIFARE
+                // Unknown mifare
+                mType = TYPE_UNKNOWN;
+                mSize = SIZE_UNKNOWN;
                 break;
         }
     }
@@ -226,9 +228,10 @@
 
     // Methods that require connect()
     /**
-     * Authenticate for a given sector.
+     * Authenticate for a given block.
+     * Note that this will authenticate the entire sector the block belongs to.
      */
-    public boolean authenticateSector(int sector, byte[] key, boolean keyA) {
+    public boolean authenticateBlock(int block, byte[] key, boolean keyA) {
         checkConnected();
 
         byte[] cmd = new byte[12];
@@ -241,7 +244,7 @@
         }
 
         // Second byte is block address
-        cmd[1] = firstBlockInSector(sector);
+        cmd[1] = (byte) block;
 
         // Next 4 bytes are last 4 bytes of UID
         byte[] uid = getTag().getId();
@@ -261,6 +264,19 @@
     }
 
     /**
+     * Authenticate for a given sector.
+     */
+    public boolean authenticateSector(int sector, byte[] key, boolean keyA) {
+        checkConnected();
+
+        byte addr = (byte) ((firstBlockInSector(sector)) & 0xff);
+
+        // Note that authenticating a block of a sector, will authenticate
+        // the entire sector.
+        return authenticateBlock(addr, key, keyA);
+    }
+
+    /**
      * Sector indexing starts at 0.
      * Block indexing starts at 0, and resets in each sector.
      * @throws IOException
@@ -269,28 +285,69 @@
         checkConnected();
 
         byte addr = (byte) ((firstBlockInSector(sector) + block) & 0xff);
-        byte[] blockread_cmd = { 0x30, addr }; // phHal_eMifareRead
+        return readBlock(addr);
 
-        // TODO deal with authentication problems
+    }
+
+    /**
+     * Reads absolute block index.
+     * @throws IOException
+     */
+    public byte[] readBlock(int block) throws IOException {
+        checkConnected();
+
+        byte addr = (byte) block;
+        byte[] blockread_cmd = { 0x30, addr };
+
         return transceive(blockread_cmd);
     }
 
-//    public byte[] readSector(int sector);
-    //TODO: define an enumeration for access control settings
-//    public int readSectorAccessControl(int sector);
+    /**
+     * Writes absolute block index.
+     * @throws IOException
+     */
+    public void writeBlock(int block, byte[] data) throws IOException {
+        checkConnected();
+
+        byte addr = (byte) block;
+        byte[] blockwrite_cmd = new byte[data.length + 2];
+        blockwrite_cmd[0] = (byte) 0xA0; // MF write command
+        blockwrite_cmd[1] = addr;
+        System.arraycopy(data, 0, blockwrite_cmd, 2, data.length);
+
+        transceive(blockwrite_cmd);
+    }
 
     /**
+     * Writes relative block in sector.
      * @throws IOException
-     * @throws NotAuthenticatedException
      */
-/*
-    public void writeBlock(int block, byte[] data);
-    public void writeSector(int block, byte[] sector);
-    public void writeSectorAccessControl(int sector, int access);
-    public void increment(int block);
-    public void decrement(int block);
+    public void writeBlock(int sector, int block, byte[] data) throws IOException {
+        checkConnected();
 
-*/
+        byte addr = (byte) ((firstBlockInSector(sector) + block) & 0xff);
+
+        writeBlock(addr, data);
+    }
+
+    public void increment(int block) throws IOException {
+        checkConnected();
+
+        byte addr = (byte) block;
+        byte[] incr_cmd = { (byte) 0xC1, (byte) block };
+
+        transceive(incr_cmd);
+    }
+
+    public void decrement(int block) throws IOException {
+        checkConnected();
+
+        byte addr = (byte) block;
+        byte[] incr_cmd = { (byte) 0xC0, (byte) block };
+
+        transceive(incr_cmd);
+    }
+
     /**
      * Send data to a tag and receive the response.
      * <p>
diff --git a/core/java/android/nfc/technology/Ndef.java b/core/java/android/nfc/technology/Ndef.java
index c45c97d..53db0c5 100644
--- a/core/java/android/nfc/technology/Ndef.java
+++ b/core/java/android/nfc/technology/Ndef.java
@@ -140,6 +140,7 @@
             return null;
         }
     }
+
     /**
      * Overwrite the primary NDEF message
      * @throws IOException
@@ -148,17 +149,23 @@
         checkConnected();
 
         try {
-            int errorCode = mTagService.ndefWrite(mTag.getServiceHandle(), msg);
-            switch (errorCode) {
-                case ErrorCodes.SUCCESS:
-                    break;
-                case ErrorCodes.ERROR_IO:
-                    throw new IOException();
-                case ErrorCodes.ERROR_INVALID_PARAM:
-                    throw new FormatException();
-                default:
-                    // Should not happen
-                    throw new IOException();
+            int serviceHandle = mTag.getServiceHandle();
+            if (mTagService.isNdef(serviceHandle)) {
+                int errorCode = mTagService.ndefWrite(serviceHandle, msg);
+                switch (errorCode) {
+                    case ErrorCodes.SUCCESS:
+                        break;
+                    case ErrorCodes.ERROR_IO:
+                        throw new IOException();
+                    case ErrorCodes.ERROR_INVALID_PARAM:
+                        throw new FormatException();
+                    default:
+                        // Should not happen
+                        throw new IOException();
+                }
+            }
+            else {
+                throw new IOException("Tag is not ndef");
             }
         } catch (RemoteException e) {
             attemptDeadServiceRecovery(e);
diff --git a/core/java/android/nfc/technology/NdefFormatable.java b/core/java/android/nfc/technology/NdefFormatable.java
index 899b95f..222c558 100644
--- a/core/java/android/nfc/technology/NdefFormatable.java
+++ b/core/java/android/nfc/technology/NdefFormatable.java
@@ -45,16 +45,6 @@
     }
 
     /**
-     * Returns whether a tag can be formatted with {@link
-     * NdefFormatable#format(NdefMessage)}
-     */
-    public boolean canBeFormatted() throws IOException {
-        checkConnected();
-
-        throw new UnsupportedOperationException();
-    }
-
-    /**
      * Formats a tag as NDEF, if possible. You may supply a first
      * NdefMessage to be written on the tag.
      */
diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java
index f0309d6..9d5d742 100644
--- a/core/java/android/os/AsyncTask.java
+++ b/core/java/android/os/AsyncTask.java
@@ -281,7 +281,7 @@
     /**
      * Runs on the UI thread after {@link #doInBackground}. The
      * specified result is the value returned by {@link #doInBackground}
-     * or null if the task was cancelled or an exception occured.
+     * or null if the task was cancelled or an exception occurred.
      *
      * @param result The result of the operation computed by {@link #doInBackground}.
      *
diff --git a/core/java/android/os/IBinder.java b/core/java/android/os/IBinder.java
index 174f3b6..8ae8008 100644
--- a/core/java/android/os/IBinder.java
+++ b/core/java/android/os/IBinder.java
@@ -162,7 +162,7 @@
      * @param code The action to perform.  This should
      * be a number between {@link #FIRST_CALL_TRANSACTION} and
      * {@link #LAST_CALL_TRANSACTION}.
-     * @param data Marshalled data to send to the target.  Most not be null.
+     * @param data Marshalled data to send to the target.  Must not be null.
      * If you are not sending any data, you must create an empty Parcel
      * that is given here.
      * @param reply Marshalled data to be received from the target.  May be
diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java
index 5f6c4f0..b6c2ed6 100644
--- a/core/java/android/os/ParcelFileDescriptor.java
+++ b/core/java/android/os/ParcelFileDescriptor.java
@@ -153,6 +153,7 @@
     private static native int createPipeNative(FileDescriptor[] outFds);
 
     /**
+     * @deprecated Please use createPipe() or ContentProvider.openPipeHelper().
      * Gets a file descriptor for a read-only copy of the given data.
      *
      * @param data Data to copy.
@@ -161,6 +162,7 @@
      * @return A ParcelFileDescriptor.
      * @throws IOException if there is an error while creating the shared memory area.
      */
+    @Deprecated
     public static ParcelFileDescriptor fromData(byte[] data, String name) throws IOException {
         if (data == null) return null;
         MemoryFile file = new MemoryFile(name, data.length);
diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java
index 3b2e254..c04bb52 100644
--- a/core/java/android/server/BluetoothEventLoop.java
+++ b/core/java/android/server/BluetoothEventLoop.java
@@ -420,12 +420,16 @@
         if (name.equals("Connected")) {
             if (propValues[1].equals("false")) {
                 mBluetoothService.handlePanDeviceStateChange(device,
-                                          BluetoothInputDevice.STATE_DISCONNECTED);
+                                          BluetoothPan.STATE_DISCONNECTED,
+                                          BluetoothPan.LOCAL_PANU_ROLE);
             }
         } else if (name.equals("Interface")) {
             String iface = propValues[1];
-            mBluetoothService.handlePanDeviceStateChange(device, iface,
-                                            BluetoothInputDevice.STATE_CONNECTED);
+            if (!iface.equals("")) {
+                mBluetoothService.handlePanDeviceStateChange(device, iface,
+                                              BluetoothPan.STATE_CONNECTED,
+                                              BluetoothPan.LOCAL_PANU_ROLE);
+            }
         }
     }
 
@@ -751,18 +755,21 @@
             }
             int newState = connected? BluetoothPan.STATE_CONNECTED :
                 BluetoothPan.STATE_DISCONNECTED;
-            mBluetoothService.handlePanDeviceStateChange(device, newState);
+            mBluetoothService.handlePanDeviceStateChange(device, newState,
+                                                  BluetoothPan.LOCAL_PANU_ROLE);
         }
     }
 
     private void onNetworkDeviceDisconnected(String address) {
         BluetoothDevice device = mAdapter.getRemoteDevice(address);
-        mBluetoothService.handlePanDeviceStateChange(device, BluetoothPan.STATE_DISCONNECTED);
+        mBluetoothService.handlePanDeviceStateChange(device, BluetoothPan.STATE_DISCONNECTED,
+                                                      BluetoothPan.LOCAL_NAP_ROLE);
     }
 
     private void onNetworkDeviceConnected(String address, String iface, int destUuid) {
         BluetoothDevice device = mAdapter.getRemoteDevice(address);
-        mBluetoothService.handlePanDeviceStateChange(device, iface, BluetoothPan.STATE_CONNECTED);
+        mBluetoothService.handlePanDeviceStateChange(device, iface, BluetoothPan.STATE_CONNECTED,
+                                                      BluetoothPan.LOCAL_NAP_ROLE);
     }
 
     private void onRestartRequired() {
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
index d197341..9261ff6 100644
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -34,6 +34,7 @@
 import android.bluetooth.BluetoothProfile;
 import android.bluetooth.BluetoothProfileState;
 import android.bluetooth.BluetoothSocket;
+import android.bluetooth.BluetoothTetheringDataTracker;
 import android.bluetooth.BluetoothUuid;
 import android.bluetooth.IBluetooth;
 import android.bluetooth.IBluetoothCallback;
@@ -54,7 +55,6 @@
 import android.os.ParcelUuid;
 import android.os.RemoteException;
 import android.os.ServiceManager;
-import android.os.SystemService;
 import android.provider.Settings;
 import android.util.Log;
 import android.util.Pair;
@@ -79,11 +79,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 public class BluetoothService extends IBluetooth.Stub {
     private static final String TAG = "BluetoothService";
@@ -169,6 +167,8 @@
     private static String mDockAddress;
     private String mDockPin;
 
+    private String mIface;
+
     private int mAdapterConnectionState = BluetoothAdapter.STATE_DISCONNECTED;
 
     private static class RemoteService {
@@ -1513,12 +1513,14 @@
             return false;
         }
 
-        handlePanDeviceStateChange(device, BluetoothPan.STATE_CONNECTING);
-        if (connectPanDeviceNative(objectPath, "nap", "panu")) {
+        handlePanDeviceStateChange(device, BluetoothPan.STATE_CONNECTING,
+                                           BluetoothPan.LOCAL_PANU_ROLE);
+        if (connectPanDeviceNative(objectPath, "nap")) {
             log ("connecting to PAN");
             return true;
         } else {
-            handlePanDeviceStateChange(device, BluetoothPan.STATE_DISCONNECTED);
+            handlePanDeviceStateChange(device, BluetoothPan.STATE_DISCONNECTED,
+                                                BluetoothPan.LOCAL_PANU_ROLE);
             log ("could not connect to PAN");
             return false;
         }
@@ -1560,13 +1562,15 @@
         if (getPanDeviceState(device) != BluetoothPan.STATE_CONNECTED) {
             log (device + " already disconnected from PAN");
         }
-        handlePanDeviceStateChange(device, BluetoothPan.STATE_DISCONNECTING);
+        handlePanDeviceStateChange(device, BluetoothPan.STATE_DISCONNECTING,
+                                    BluetoothPan.LOCAL_PANU_ROLE);
         return disconnectPanDeviceNative(objectPath);
     }
 
     /*package*/ synchronized void handlePanDeviceStateChange(BluetoothDevice device,
                                                              String iface,
-                                                             int state) {
+                                                             int state,
+                                                             int role) {
         int prevState;
         String ifaceAddr = null;
 
@@ -1578,13 +1582,25 @@
         }
         if (prevState == state) return;
 
-        if (state == BluetoothPan.STATE_CONNECTED) {
-            ifaceAddr = enableTethering(iface);
-            if (ifaceAddr == null) Log.e(TAG, "Error seting up tether interface");
-        } else if (state == BluetoothPan.STATE_DISCONNECTED) {
-            if (ifaceAddr != null) {
-                mBluetoothIfaceAddresses.remove(ifaceAddr);
-                ifaceAddr = null;
+        if (role == BluetoothPan.LOCAL_NAP_ROLE) {
+            if (state == BluetoothPan.STATE_CONNECTED) {
+                ifaceAddr = enableTethering(iface);
+                if (ifaceAddr == null) Log.e(TAG, "Error seting up tether interface");
+            } else if (state == BluetoothPan.STATE_DISCONNECTED) {
+                if (ifaceAddr != null) {
+                    mBluetoothIfaceAddresses.remove(ifaceAddr);
+                    ifaceAddr = null;
+                }
+            }
+        } else {
+            // PANU Role = reverse Tether
+            if (state == BluetoothPan.STATE_CONNECTED) {
+                mIface = iface;
+                BluetoothTetheringDataTracker.getInstance().startReverseTether(iface, device);
+            } else if (state == BluetoothPan.STATE_DISCONNECTED &&
+                  (prevState == BluetoothPan.STATE_CONNECTED ||
+                  prevState == BluetoothPan.STATE_DISCONNECTING)) {
+                BluetoothTetheringDataTracker.getInstance().stopReverseTether(mIface);
             }
         }
 
@@ -1595,6 +1611,7 @@
         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
         intent.putExtra(BluetoothPan.EXTRA_PREVIOUS_PAN_STATE, prevState);
         intent.putExtra(BluetoothPan.EXTRA_PAN_STATE, state);
+        intent.putExtra(BluetoothPan.EXTRA_LOCAL_ROLE, role);
         mContext.sendBroadcast(intent, BLUETOOTH_PERM);
 
         if (DBG) log("Pan Device state : device: " + device + " State:" + prevState + "->" + state);
@@ -1602,8 +1619,8 @@
     }
 
     /*package*/ synchronized void handlePanDeviceStateChange(BluetoothDevice device,
-                                                             int state) {
-        handlePanDeviceStateChange(device, null, state);
+                                                             int state, int role) {
+        handlePanDeviceStateChange(device, null, state, role);
     }
 
     private String createNewTetheringAddressLocked() {
@@ -2885,7 +2902,7 @@
     private native boolean disconnectInputDeviceNative(String path);
 
     private native boolean setBluetoothTetheringNative(boolean value, String nap, String bridge);
-    private native boolean connectPanDeviceNative(String path, String srcRole, String dstRole);
+    private native boolean connectPanDeviceNative(String path, String dstRole);
     private native boolean disconnectPanDeviceNative(String path);
 
     private native int[] addReservedServiceRecordsNative(int[] uuuids);
diff --git a/core/java/android/speech/RecognizerResultsIntent.java b/core/java/android/speech/RecognizerResultsIntent.java
index b45e4b1..15ac57c 100644
--- a/core/java/android/speech/RecognizerResultsIntent.java
+++ b/core/java/android/speech/RecognizerResultsIntent.java
@@ -34,8 +34,6 @@
  * the search results. If that is not available, then the corresponding url for that result in
  * {@link #EXTRA_VOICE_SEARCH_RESULT_URLS} should be used. And if even that is not available,
  * then a search url should be constructed from the actual recognition result string.
- * 
- * @hide for making public in a later release
  */
 public class RecognizerResultsIntent {
     private RecognizerResultsIntent() {
@@ -58,8 +56,6 @@
      * and, possibly, the full html to display for that result at index N of
      * {@link #EXTRA_VOICE_SEARCH_RESULT_HTML}. If full html is provided, a base url (or
      * list of base urls) should be provided with {@link #EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS}.
-     * 
-     * @hide for making public in a later release
      */
     public static final String ACTION_VOICE_SEARCH_RESULTS =
             "android.speech.action.VOICE_SEARCH_RESULTS";
@@ -67,8 +63,6 @@
     /**
      * The key to an extra {@link ArrayList} of {@link String}s that contains the list of
      * recognition alternates from voice search, in order from highest to lowest confidence.
-     * 
-     * @hide for making public in a later release
      */
     public static final String EXTRA_VOICE_SEARCH_RESULT_STRINGS =
             "android.speech.extras.VOICE_SEARCH_RESULT_STRINGS";
@@ -81,8 +75,6 @@
      * search url, that entry in this ArrayList should be <code>null</code>, and the implementor of
      * {@link #ACTION_VOICE_SEARCH_RESULTS} should execute a search of its own choosing,
      * based on the recognition result string.
-     * 
-     * @hide for making public in a later release
      */
     public static final String EXTRA_VOICE_SEARCH_RESULT_URLS =
             "android.speech.extras.VOICE_SEARCH_RESULT_URLS";
@@ -102,8 +94,6 @@
      * uri or some other identifier. Anyone who reads this extra should confirm that a result is
      * in fact an "inline:" uri and back off to the urls or strings gracefully if it is not, thus
      * maintaining future backwards compatibility if this changes.
-     * 
-     * @hide not to be exposed immediately as the implementation details may change
      */
     public static final String EXTRA_VOICE_SEARCH_RESULT_HTML =
             "android.speech.extras.VOICE_SEARCH_RESULT_HTML";
@@ -116,8 +106,6 @@
      * A list of the same size as {@link #EXTRA_VOICE_SEARCH_RESULT_STRINGS} may be provided
      * to apply different base urls to each different html result in the
      * {@link #EXTRA_VOICE_SEARCH_RESULT_HTML} list.
-     * 
-     * @hide not to be exposed immediately as the implementation details may change
      */
     public static final String EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS =
             "android.speech.extras.VOICE_SEARCH_RESULT_HTML_BASE_URLS";
@@ -132,16 +120,14 @@
      * apply different HTTP headers to each different web result in the list. These headers will
      * only be used in the case that the url for a particular web result (from
      * {@link #EXTRA_VOICE_SEARCH_RESULT_URLS}) is loaded.
-     *
-     * @hide not to be exposed immediately as the implementation details may change
      */
     public static final String EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS =
             "android.speech.extras.EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS";
 
     /**
      * The scheme used currently for html content in {@link #EXTRA_VOICE_SEARCH_RESULT_HTML}.
-     * 
-     * @hide not to be exposed immediately as the implementation details may change
+     * Note that this should only be used in tandem with this particular extra; it should
+     * NOT be used for generic URIs such as those found in the data field of an Intent.
      */
     public static final String URI_SCHEME_INLINE = "inline";
 }
diff --git a/core/java/android/text/InputType.java b/core/java/android/text/InputType.java
index 7b8acd9..6d066d6 100644
--- a/core/java/android/text/InputType.java
+++ b/core/java/android/text/InputType.java
@@ -257,7 +257,10 @@
     /**
      * Class for numeric text.  This class supports the following flag:
      * {@link #TYPE_NUMBER_FLAG_SIGNED} and
-     * {@link #TYPE_NUMBER_FLAG_DECIMAL}.
+     * {@link #TYPE_NUMBER_FLAG_DECIMAL}.  It also supports the following
+     * variations: {@link #TYPE_NUMBER_VARIATION_NORMAL} and
+     * {@link #TYPE_NUMBER_VARIATION_PASSWORD}.  If you do not recognize
+     * the variation, normal should be assumed.
      */
     public static final int TYPE_CLASS_NUMBER = 0x00000002;
     
@@ -274,6 +277,29 @@
     public static final int TYPE_NUMBER_FLAG_DECIMAL = 0x00002000;
     
     // ----------------------------------------------------------------------
+
+    /**
+     * Default variation of {@link #TYPE_CLASS_NUMBER}: plain normal
+     * numeric text.  This was added in
+     * {@link android.os.Build.VERSION_CODES#HONEYCOMB}.  An IME must target
+     * this API version or later to see this input type; if it doesn't, a request
+     * for this type will be dropped when passed through
+     * {@link android.view.inputmethod.EditorInfo#makeCompatible(int)
+     * EditorInfo.makeCompatible(int)}.
+     */
+    public static final int TYPE_NUMBER_VARIATION_NORMAL = 0x00000000;
+
+    /**
+     * Variation of {@link #TYPE_CLASS_NUMBER}: entering a numeric password.
+     * This was added in {@link android.os.Build.VERSION_CODES#HONEYCOMB}.  An
+     * IME must target this API version or later to see this input type; if it
+     * doesn't, a request for this type will be dropped when passed
+     * through {@link android.view.inputmethod.EditorInfo#makeCompatible(int)
+     * EditorInfo.makeCompatible(int)}.
+     */
+    public static final int TYPE_NUMBER_VARIATION_PASSWORD = 0x00000010;
+
+    // ----------------------------------------------------------------------
     // ----------------------------------------------------------------------
     // ----------------------------------------------------------------------
     
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index 3dd1ecd..d8d63206 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -361,101 +361,103 @@
                             if (fitbottom > okbottom)
                                 okbottom = fitbottom;
                         }
-                    } else if (breakOnlyAtSpaces) {
-                        if (ok != here) {
-                            // Log.e("text", "output ok " + here + " to " +ok);
-
-                            while (ok < spanEnd && chs[ok - paraStart] == ' ') {
-                                ok++;
-                            }
-
-                            v = out(source,
-                                    here, ok,
-                                    okascent, okdescent, oktop, okbottom,
-                                    v,
-                                    spacingmult, spacingadd, chooseht,
-                                    choosehtv, fm, hasTabOrEmoji,
-                                    needMultiply, paraStart, chdirs, dir, easy,
-                                    ok == bufend, includepad, trackpad,
-                                    chs, widths, here - paraStart,
-                                    where, ellipsizedWidth, okwidth,
-                                    paint);
-
-                            here = ok;
-                        } else {
-                            // Act like it fit even though it didn't.
-
-                            fitwidth = w;
-                            fit = j + 1;
-
-                            if (fmtop < fittop)
-                                fittop = fmtop;
-                            if (fmascent < fitascent)
-                                fitascent = fmascent;
-                            if (fmdescent > fitdescent)
-                                fitdescent = fmdescent;
-                            if (fmbottom > fitbottom)
-                                fitbottom = fmbottom;
-                        }
                     } else {
-                        if (ok != here) {
-                            // Log.e("text", "output ok " + here + " to " +ok);
+                        if (breakOnlyAtSpaces) {
+                            if (ok != here) {
+                                // Log.e("text", "output ok " + here + " to " +ok);
 
-                            while (ok < spanEnd && chs[ok - paraStart] == ' ') {
-                                ok++;
+                                while (ok < spanEnd && chs[ok - paraStart] == ' ') {
+                                    ok++;
+                                }
+
+                                v = out(source,
+                                        here, ok,
+                                        okascent, okdescent, oktop, okbottom,
+                                        v,
+                                        spacingmult, spacingadd, chooseht,
+                                        choosehtv, fm, hasTabOrEmoji,
+                                        needMultiply, paraStart, chdirs, dir, easy,
+                                        ok == bufend, includepad, trackpad,
+                                        chs, widths, here - paraStart,
+                                        where, ellipsizedWidth, okwidth,
+                                        paint);
+
+                                here = ok;
+                            } else {
+                                // Act like it fit even though it didn't.
+
+                                fitwidth = w;
+                                fit = j + 1;
+
+                                if (fmtop < fittop)
+                                    fittop = fmtop;
+                                if (fmascent < fitascent)
+                                    fitascent = fmascent;
+                                if (fmdescent > fitdescent)
+                                    fitdescent = fmdescent;
+                                if (fmbottom > fitbottom)
+                                    fitbottom = fmbottom;
                             }
-
-                            v = out(source,
-                                    here, ok,
-                                    okascent, okdescent, oktop, okbottom,
-                                    v,
-                                    spacingmult, spacingadd, chooseht,
-                                    choosehtv, fm, hasTabOrEmoji,
-                                    needMultiply, paraStart, chdirs, dir, easy,
-                                    ok == bufend, includepad, trackpad,
-                                    chs, widths, here - paraStart,
-                                    where, ellipsizedWidth, okwidth,
-                                    paint);
-
-                            here = ok;
-                        } else if (fit != here) {
-                            // Log.e("text", "output fit " + here + " to " +fit);
-                            v = out(source,
-                                    here, fit,
-                                    fitascent, fitdescent,
-                                    fittop, fitbottom,
-                                    v,
-                                    spacingmult, spacingadd, chooseht,
-                                    choosehtv, fm, hasTabOrEmoji,
-                                    needMultiply, paraStart, chdirs, dir, easy,
-                                    fit == bufend, includepad, trackpad,
-                                    chs, widths, here - paraStart,
-                                    where, ellipsizedWidth, fitwidth,
-                                    paint);
-
-                            here = fit;
                         } else {
-                            // Log.e("text", "output one " + here + " to " +(here + 1));
-                            // XXX not sure why the existing fm wasn't ok.
-                            // measureText(paint, mWorkPaint,
-                            //             source, here, here + 1, fm, tab,
-                            //             null);
+                            if (ok != here) {
+                                // Log.e("text", "output ok " + here + " to " +ok);
 
-                            v = out(source,
-                                    here, here+1,
-                                    fm.ascent, fm.descent,
-                                    fm.top, fm.bottom,
-                                    v,
-                                    spacingmult, spacingadd, chooseht,
-                                    choosehtv, fm, hasTabOrEmoji,
-                                    needMultiply, paraStart, chdirs, dir, easy,
-                                    here + 1 == bufend, includepad,
-                                    trackpad,
-                                    chs, widths, here - paraStart,
-                                    where, ellipsizedWidth,
-                                    widths[here - paraStart], paint);
+                                while (ok < spanEnd && chs[ok - paraStart] == ' ') {
+                                    ok++;
+                                }
 
-                            here = here + 1;
+                                v = out(source,
+                                        here, ok,
+                                        okascent, okdescent, oktop, okbottom,
+                                        v,
+                                        spacingmult, spacingadd, chooseht,
+                                        choosehtv, fm, hasTabOrEmoji,
+                                        needMultiply, paraStart, chdirs, dir, easy,
+                                        ok == bufend, includepad, trackpad,
+                                        chs, widths, here - paraStart,
+                                        where, ellipsizedWidth, okwidth,
+                                        paint);
+
+                                here = ok;
+                            } else if (fit != here) {
+                                // Log.e("text", "output fit " + here + " to " +fit);
+                                v = out(source,
+                                        here, fit,
+                                        fitascent, fitdescent,
+                                        fittop, fitbottom,
+                                        v,
+                                        spacingmult, spacingadd, chooseht,
+                                        choosehtv, fm, hasTabOrEmoji,
+                                        needMultiply, paraStart, chdirs, dir, easy,
+                                        fit == bufend, includepad, trackpad,
+                                        chs, widths, here - paraStart,
+                                        where, ellipsizedWidth, fitwidth,
+                                        paint);
+
+                                here = fit;
+                            } else {
+                                // Log.e("text", "output one " + here + " to " +(here + 1));
+                                // XXX not sure why the existing fm wasn't ok.
+                                // measureText(paint, mWorkPaint,
+                                //             source, here, here + 1, fm, tab,
+                                //             null);
+
+                                v = out(source,
+                                        here, here+1,
+                                        fm.ascent, fm.descent,
+                                        fm.top, fm.bottom,
+                                        v,
+                                        spacingmult, spacingadd, chooseht,
+                                        choosehtv, fm, hasTabOrEmoji,
+                                        needMultiply, paraStart, chdirs, dir, easy,
+                                        here + 1 == bufend, includepad,
+                                        trackpad,
+                                        chs, widths, here - paraStart,
+                                        where, ellipsizedWidth,
+                                        widths[here - paraStart], paint);
+
+                                here = here + 1;
+                            }
                         }
 
                         if (here < spanStart) {
diff --git a/core/java/android/text/method/ArrowKeyMovementMethod.java b/core/java/android/text/method/ArrowKeyMovementMethod.java
index d724320..a61ff13 100644
--- a/core/java/android/text/method/ArrowKeyMovementMethod.java
+++ b/core/java/android/text/method/ArrowKeyMovementMethod.java
@@ -16,6 +16,7 @@
 
 package android.text.method;
 
+import android.graphics.Rect;
 import android.text.Layout;
 import android.text.Selection;
 import android.text.Spannable;
@@ -24,170 +25,185 @@
 import android.view.View;
 import android.widget.TextView;
 
-// XXX this doesn't extend MetaKeyKeyListener because the signatures
-// don't match.  Need to figure that out.  Meanwhile the meta keys
-// won't work in fields that don't take input.
-
-public class ArrowKeyMovementMethod implements MovementMethod {
-    private boolean isCap(Spannable buffer) {
+/**
+ * A movement method that provides cursor movement and selection.
+ * Supports displaying the context menu on DPad Center.
+ */
+public class ArrowKeyMovementMethod extends BaseMovementMethod implements MovementMethod {
+    private static boolean isSelecting(Spannable buffer) {
         return ((MetaKeyKeyListener.getMetaState(buffer, MetaKeyKeyListener.META_SHIFT_ON) == 1) ||
                 (MetaKeyKeyListener.getMetaState(buffer, MetaKeyKeyListener.META_SELECTING) != 0));
     }
 
-    private boolean isAlt(Spannable buffer) {
-        return MetaKeyKeyListener.getMetaState(buffer, MetaKeyKeyListener.META_ALT_ON) == 1;
+    private int getCurrentLineTop(Spannable buffer, Layout layout) {
+        return layout.getLineTop(layout.getLineForOffset(Selection.getSelectionEnd(buffer)));
     }
 
-    private boolean up(TextView widget, Spannable buffer) {
-        boolean cap = isCap(buffer);
-        boolean alt = isAlt(buffer);
-        Layout layout = widget.getLayout();
-
-        if (cap) {
-            if (alt) {
-                Selection.extendSelection(buffer, 0);
-                return true;
-            } else {
-                return Selection.extendUp(buffer, layout);
-            }
-        } else {
-            if (alt) {
-                Selection.setSelection(buffer, 0);
-                return true;
-            } else {
-                return Selection.moveUp(buffer, layout);
-            }
-        }
+    private int getPageHeight(TextView widget) {
+        // This calculation does not take into account the view transformations that
+        // may have been applied to the child or its containers.  In case of scaling or
+        // rotation, the calculated page height may be incorrect.
+        final Rect rect = new Rect();
+        return widget.getGlobalVisibleRect(rect) ? rect.height() : 0;
     }
 
-    private boolean down(TextView widget, Spannable buffer) {
-        boolean cap = isCap(buffer);
-        boolean alt = isAlt(buffer);
-        Layout layout = widget.getLayout();
-
-        if (cap) {
-            if (alt) {
-                Selection.extendSelection(buffer, buffer.length());
-                return true;
-            } else {
-                return Selection.extendDown(buffer, layout);
-            }
-        } else {
-            if (alt) {
-                Selection.setSelection(buffer, buffer.length());
-                return true;
-            } else {
-                return Selection.moveDown(buffer, layout);
-            }
-        }
-    }
-
-    private boolean left(TextView widget, Spannable buffer) {
-        boolean cap = isCap(buffer);
-        boolean alt = isAlt(buffer);
-        Layout layout = widget.getLayout();
-
-        if (cap) {
-            if (alt) {
-                return Selection.extendToLeftEdge(buffer, layout);
-            } else {
-                return Selection.extendLeft(buffer, layout);
-            }
-        } else {
-            if (alt) {
-                return Selection.moveToLeftEdge(buffer, layout);
-            } else {
-                return Selection.moveLeft(buffer, layout); 
-            }
-        }
-    }
-
-    private boolean right(TextView widget, Spannable buffer) {
-        boolean cap = isCap(buffer);
-        boolean alt = isAlt(buffer);
-        Layout layout = widget.getLayout();
-
-        if (cap) {
-            if (alt) {
-                return Selection.extendToRightEdge(buffer, layout);
-            } else {
-                return Selection.extendRight(buffer, layout);
-            }
-        } else {
-            if (alt) {
-                return Selection.moveToRightEdge(buffer, layout);
-            } else {
-                return Selection.moveRight(buffer, layout); 
-            }
-        }
-    }
-
-    public boolean onKeyDown(TextView widget, Spannable buffer, int keyCode, KeyEvent event) {
-        if (executeDown(widget, buffer, keyCode)) {
-            MetaKeyKeyListener.adjustMetaAfterKeypress(buffer);
-            MetaKeyKeyListener.resetLockedMeta(buffer);
-            return true;
-        }
-
-        return false;
-    }
-
-    private boolean executeDown(TextView widget, Spannable buffer, int keyCode) {
-        boolean handled = false;
-
+    @Override
+    protected boolean handleMovementKey(TextView widget, Spannable buffer, int keyCode,
+            int movementMetaState, KeyEvent event) {
         switch (keyCode) {
-        case KeyEvent.KEYCODE_DPAD_UP:
-            handled |= up(widget, buffer);
-            break;
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    if (event.getAction() == KeyEvent.ACTION_DOWN
+                            && event.getRepeatCount() == 0
+                            && MetaKeyKeyListener.getMetaState(buffer,
+                                        MetaKeyKeyListener.META_SELECTING) != 0) {
+                        return widget.showContextMenu();
+                    }
+                }
+                break;
+        }
+        return super.handleMovementKey(widget, buffer, keyCode, movementMetaState, event);
+    }
 
-        case KeyEvent.KEYCODE_DPAD_DOWN:
-            handled |= down(widget, buffer);
-            break;
+    @Override
+    protected boolean left(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        if (isSelecting(buffer)) {
+            return Selection.extendLeft(buffer, layout);
+        } else {
+            return Selection.moveLeft(buffer, layout);
+        }
+    }
 
-        case KeyEvent.KEYCODE_DPAD_LEFT:
-            handled |= left(widget, buffer);
-            break;
+    @Override
+    protected boolean right(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        if (isSelecting(buffer)) {
+            return Selection.extendRight(buffer, layout);
+        } else {
+            return Selection.moveRight(buffer, layout);
+        }
+    }
 
-        case KeyEvent.KEYCODE_DPAD_RIGHT:
-            handled |= right(widget, buffer);
-            break;
+    @Override
+    protected boolean up(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        if (isSelecting(buffer)) {
+            return Selection.extendUp(buffer, layout);
+        } else {
+            return Selection.moveUp(buffer, layout);
+        }
+    }
 
-        case KeyEvent.KEYCODE_DPAD_CENTER:
-            if ((MetaKeyKeyListener.getMetaState(buffer, MetaKeyKeyListener.META_SELECTING) != 0) &&
-                (widget.showContextMenu())) {
-                    handled = true;
+    @Override
+    protected boolean down(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        if (isSelecting(buffer)) {
+            return Selection.extendDown(buffer, layout);
+        } else {
+            return Selection.moveDown(buffer, layout);
+        }
+    }
+
+    @Override
+    protected boolean pageUp(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        final boolean selecting = isSelecting(buffer);
+        final int targetY = getCurrentLineTop(buffer, layout) - getPageHeight(widget);
+        boolean handled = false;
+        for (;;) {
+            final int previousSelectionEnd = Selection.getSelectionEnd(buffer);
+            if (selecting) {
+                Selection.extendUp(buffer, layout);
+            } else {
+                Selection.moveUp(buffer, layout);
+            }
+            if (Selection.getSelectionEnd(buffer) == previousSelectionEnd) {
+                break;
+            }
+            handled = true;
+            if (getCurrentLineTop(buffer, layout) <= targetY) {
+                break;
             }
         }
-
-        if (handled) {
-            MetaKeyKeyListener.adjustMetaAfterKeypress(buffer);
-            MetaKeyKeyListener.resetLockedMeta(buffer);
-        }
-
         return handled;
     }
 
-    public boolean onKeyUp(TextView widget, Spannable buffer, int keyCode, KeyEvent event) {
-        return false;
-    }
-
-    public boolean onKeyOther(TextView view, Spannable text, KeyEvent event) {
-        int code = event.getKeyCode();
-        if (code != KeyEvent.KEYCODE_UNKNOWN && event.getAction() == KeyEvent.ACTION_MULTIPLE) {
-            int repeat = event.getRepeatCount();
-            boolean handled = false;
-            while ((--repeat) > 0) {
-                handled |= executeDown(view, text, code);
+    @Override
+    protected boolean pageDown(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        final boolean selecting = isSelecting(buffer);
+        final int targetY = getCurrentLineTop(buffer, layout) + getPageHeight(widget);
+        boolean handled = false;
+        for (;;) {
+            final int previousSelectionEnd = Selection.getSelectionEnd(buffer);
+            if (selecting) {
+                Selection.extendDown(buffer, layout);
+            } else {
+                Selection.moveDown(buffer, layout);
             }
-            return handled;
+            if (Selection.getSelectionEnd(buffer) == previousSelectionEnd) {
+                break;
+            }
+            handled = true;
+            if (getCurrentLineTop(buffer, layout) >= targetY) {
+                break;
+            }
         }
-        return false;
+        return handled;
     }
 
-    public boolean onTrackballEvent(TextView widget, Spannable text, MotionEvent event) {
-        return false;
+    @Override
+    protected boolean top(TextView widget, Spannable buffer) {
+        if (isSelecting(buffer)) {
+            Selection.extendSelection(buffer, 0);
+        } else {
+            Selection.setSelection(buffer, 0);
+        }
+        return true;
     }
 
+    @Override
+    protected boolean bottom(TextView widget, Spannable buffer) {
+        if (isSelecting(buffer)) {
+            Selection.extendSelection(buffer, buffer.length());
+        } else {
+            Selection.setSelection(buffer, buffer.length());
+        }
+        return true;
+    }
+
+    @Override
+    protected boolean lineStart(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        if (isSelecting(buffer)) {
+            return Selection.extendToLeftEdge(buffer, layout);
+        } else {
+            return Selection.moveToLeftEdge(buffer, layout);
+        }
+    }
+
+    @Override
+    protected boolean lineEnd(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        if (isSelecting(buffer)) {
+            return Selection.extendToRightEdge(buffer, layout);
+        } else {
+            return Selection.moveToRightEdge(buffer, layout);
+        }
+    }
+
+    @Override
+    protected boolean home(TextView widget, Spannable buffer) {
+        return lineStart(widget, buffer);
+    }
+
+    @Override
+    protected boolean end(TextView widget, Spannable buffer) {
+        return lineEnd(widget, buffer);
+    }
+
+    @Override
     public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
         int initialScrollX = -1, initialScrollY = -1;
         final int action = event.getAction();
@@ -201,7 +217,7 @@
 
         if (widget.isFocused() && !widget.didTouchFocusSelect()) {
             if (action == MotionEvent.ACTION_DOWN) {
-              boolean cap = isCap(buffer);
+              boolean cap = isSelecting(buffer);
               if (cap) {
                   int offset = widget.getOffset((int) event.getX(), (int) event.getY());
                   
@@ -214,7 +230,7 @@
                   widget.getParent().requestDisallowInterceptTouchEvent(true);
               }
             } else if (action == MotionEvent.ACTION_MOVE) {
-                boolean cap = isCap(buffer);
+                boolean cap = isSelecting(buffer);
 
                 if (cap && handled) {
                     // Before selecting, make sure we've moved out of the "slop".
@@ -245,7 +261,7 @@
                 }
 
                 int offset = widget.getOffset((int) event.getX(), (int) event.getY());
-                if (isCap(buffer)) {
+                if (isSelecting(buffer)) {
                     buffer.removeSpan(LAST_TAP_DOWN);
                     Selection.extendSelection(buffer, offset);
                 } else {
@@ -262,14 +278,17 @@
         return handled;
     }
 
+    @Override
     public boolean canSelectArbitrarily() {
         return true;
     }
 
+    @Override
     public void initialize(TextView widget, Spannable text) {
         Selection.setSelection(text, 0);
     }
 
+    @Override
     public void onTakeFocus(TextView view, Spannable text, int dir) {
         if ((dir & (View.FOCUS_FORWARD | View.FOCUS_DOWN)) != 0) {
             if (view.getLayout() == null) {
diff --git a/core/java/android/text/method/BaseKeyListener.java b/core/java/android/text/method/BaseKeyListener.java
index 350c9a8..191c250 100644
--- a/core/java/android/text/method/BaseKeyListener.java
+++ b/core/java/android/text/method/BaseKeyListener.java
@@ -33,75 +33,116 @@
         implements KeyListener {
     /* package */ static final Object OLD_SEL_START = new NoCopySpan.Concrete();
 
+    private static final int MODIFIER_NONE = 0;
+    private static final int MODIFIER_ALT = 1;
+    private static final int MODIFIER_INVALID = 2;
+
+    private static int getModifier(Editable content, KeyEvent event) {
+        if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+            return MODIFIER_ALT;
+        }
+        if (!event.hasNoModifiers()) {
+            return MODIFIER_INVALID;
+        }
+        if (getMetaState(content, META_ALT_ON) == 1) {
+            return MODIFIER_ALT;
+        }
+        return MODIFIER_NONE;
+    }
+
     /**
-     * Performs the action that happens when you press the DEL key in
-     * a TextView.  If there is a selection, deletes the selection;
-     * otherwise, DEL alone deletes the character before the cursor,
-     * if any;
-     * ALT+DEL deletes everything on the line the cursor is on.
+     * Performs the action that happens when you press the {@link KeyEvent#KEYCODE_DEL} key in
+     * a {@link TextView}.  If there is a selection, deletes the selection; otherwise,
+     * deletes the character before the cursor, if any; ALT+DEL deletes everything on
+     * the line the cursor is on.
      *
      * @return true if anything was deleted; false otherwise.
      */
-    public boolean backspace(View view, Editable content, int keyCode,
-                             KeyEvent event) {
-        int selStart, selEnd;
-        boolean result = true;
-
-        {
-            int a = Selection.getSelectionStart(content);
-            int b = Selection.getSelectionEnd(content);
-
-            selStart = Math.min(a, b);
-            selEnd = Math.max(a, b);
+    public boolean backspace(View view, Editable content, int keyCode, KeyEvent event) {
+        int modifier = getModifier(content, event);
+        if (modifier == MODIFIER_INVALID) {
+            return false;
         }
 
-        if (selStart != selEnd) {
-            content.delete(selStart, selEnd);
-        } else if (altBackspace(view, content, keyCode, event)) {
-            result = true;
-        } else {
-            int to = TextUtils.getOffsetBefore(content, selEnd);
-
-            if (to != selEnd) {
-                content.delete(Math.min(to, selEnd), Math.max(to, selEnd));
-            }
-            else {
-                result = false;
-            }
+        if (deleteSelection(view, content)) {
+            return true;
         }
 
-        if (result)
-            adjustMetaAfterKeypress(content);
+        if (modifier == MODIFIER_ALT && deleteLine(view, content)) {
+            return true;
+        }
 
-        return result;
+        final int start = Selection.getSelectionEnd(content);
+        final int end = TextUtils.getOffsetBefore(content, start);
+        if (start != end) {
+            content.delete(Math.min(start, end), Math.max(start, end));
+            return true;
+        }
+
+        return false;
     }
 
-    private boolean altBackspace(View view, Editable content, int keyCode,
-                                 KeyEvent event) {
-        if (!event.isAltPressed() && getMetaState(content, META_ALT_ON) != 1) {
+    /**
+     * Performs the action that happens when you press the {@link KeyEvent#KEYCODE_FORWARD_DEL}
+     * key in a {@link TextView}.  If there is a selection, deletes the selection; otherwise,
+     * deletes the character before the cursor, if any; ALT+FORWARD_DEL deletes everything on
+     * the line the cursor is on.
+     *
+     * @return true if anything was deleted; false otherwise.
+     */
+    public boolean forwardDelete(View view, Editable content, int keyCode, KeyEvent event) {
+        int modifier = getModifier(content, event);
+        if (modifier == MODIFIER_INVALID) {
             return false;
         }
 
-        if (!(view instanceof TextView)) {
-            return false;
+        if (deleteSelection(view, content)) {
+            return true;
         }
 
-        Layout layout = ((TextView) view).getLayout();
-
-        if (layout == null) {
-            return false;
+        if (modifier == MODIFIER_ALT && deleteLine(view, content)) {
+            return true;
         }
 
-        int l = layout.getLineForOffset(Selection.getSelectionStart(content));
-        int start = layout.getLineStart(l);
-        int end = layout.getLineEnd(l);
-
-        if (end == start) {
-            return false;
+        final int start = Selection.getSelectionEnd(content);
+        final int end = TextUtils.getOffsetAfter(content, start);
+        if (start != end) {
+            content.delete(Math.min(start, end), Math.max(start, end));
+            return true;
         }
 
-        content.delete(start, end);
-        return true;
+        return false;
+    }
+
+    private boolean deleteSelection(View view, Editable content) {
+        int selectionStart = Selection.getSelectionStart(content);
+        int selectionEnd = Selection.getSelectionEnd(content);
+        if (selectionEnd < selectionStart) {
+            int temp = selectionEnd;
+            selectionEnd = selectionStart;
+            selectionStart = temp;
+        }
+        if (selectionStart != selectionEnd) {
+            content.delete(selectionStart, selectionEnd);
+            return true;
+        }
+        return false;
+    }
+
+    private boolean deleteLine(View view, Editable content) {
+        if (view instanceof TextView) {
+            final Layout layout = ((TextView) view).getLayout();
+            if (layout != null) {
+                final int line = layout.getLineForOffset(Selection.getSelectionStart(content));
+                final int start = layout.getLineStart(line);
+                final int end = layout.getLineEnd(line);
+                if (end != start) {
+                    content.delete(start, end);
+                    return true;
+                }
+            }
+        }
+        return false;
     }
 
     static int makeTextContentType(Capitalize caps, boolean autoText) {
@@ -122,17 +163,29 @@
         }
         return contentType;
     }
-    
+
     public boolean onKeyDown(View view, Editable content,
                              int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_DEL) {
-            backspace(view, content, keyCode, event);
-            return true;
+        boolean handled;
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_DEL:
+                handled = backspace(view, content, keyCode, event);
+                break;
+            case KeyEvent.KEYCODE_FORWARD_DEL:
+                handled = forwardDelete(view, content, keyCode, event);
+                break;
+            default:
+                handled = false;
+                break;
         }
-        
+
+        if (handled) {
+            adjustMetaAfterKeypress(content);
+        }
+
         return super.onKeyDown(view, content, keyCode, event);
     }
-    
+
     /**
      * Base implementation handles ACTION_MULTIPLE KEYCODE_UNKNOWN by inserting
      * the event's text into the content.
@@ -143,23 +196,21 @@
             // Not something we are interested in.
             return false;
         }
-        
-        int selStart, selEnd;
 
-        {
-            int a = Selection.getSelectionStart(content);
-            int b = Selection.getSelectionEnd(content);
-
-            selStart = Math.min(a, b);
-            selEnd = Math.max(a, b);
+        int selectionStart = Selection.getSelectionStart(content);
+        int selectionEnd = Selection.getSelectionEnd(content);
+        if (selectionEnd < selectionStart) {
+            int temp = selectionEnd;
+            selectionEnd = selectionStart;
+            selectionStart = temp;
         }
 
         CharSequence text = event.getCharacters();
         if (text == null) {
             return false;
         }
-        
-        content.replace(selStart, selEnd, text);
+
+        content.replace(selectionStart, selectionEnd, text);
         return true;
     }
 }
diff --git a/core/java/android/text/method/BaseMovementMethod.java b/core/java/android/text/method/BaseMovementMethod.java
new file mode 100644
index 0000000..2be18d67
--- /dev/null
+++ b/core/java/android/text/method/BaseMovementMethod.java
@@ -0,0 +1,345 @@
+/*
+ * 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.text.method;
+
+import android.text.Layout;
+import android.text.Spannable;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.widget.TextView;
+
+/**
+ * Base classes for movement methods.
+ */
+public class BaseMovementMethod implements MovementMethod {
+    @Override
+    public boolean canSelectArbitrarily() {
+        return false;
+    }
+
+    @Override
+    public void initialize(TextView widget, Spannable text) {
+    }
+
+    @Override
+    public boolean onKeyDown(TextView widget, Spannable text, int keyCode, KeyEvent event) {
+        final int movementMetaState = getMovementMetaState(text, event);
+        boolean handled = handleMovementKey(widget, text, keyCode, movementMetaState, event);
+        if (handled) {
+            MetaKeyKeyListener.adjustMetaAfterKeypress(text);
+            MetaKeyKeyListener.resetLockedMeta(text);
+        }
+        return handled;
+    }
+
+    @Override
+    public boolean onKeyOther(TextView widget, Spannable text, KeyEvent event) {
+        final int movementMetaState = getMovementMetaState(text, event);
+        final int keyCode = event.getKeyCode();
+        if (keyCode != KeyEvent.KEYCODE_UNKNOWN
+                && event.getAction() == KeyEvent.ACTION_MULTIPLE) {
+            final int repeat = event.getRepeatCount();
+            boolean handled = false;
+            for (int i = 0; i < repeat; i++) {
+                if (!handleMovementKey(widget, text, keyCode, movementMetaState, event)) {
+                    break;
+                }
+                handled = true;
+            }
+            if (handled) {
+                MetaKeyKeyListener.adjustMetaAfterKeypress(text);
+                MetaKeyKeyListener.resetLockedMeta(text);
+            }
+            return handled;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onKeyUp(TextView widget, Spannable text, int keyCode, KeyEvent event) {
+        return false;
+    }
+
+    @Override
+    public void onTakeFocus(TextView widget, Spannable text, int direction) {
+    }
+
+    @Override
+    public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
+        return false;
+    }
+
+    @Override
+    public boolean onTrackballEvent(TextView widget, Spannable text, MotionEvent event) {
+        return false;
+    }
+
+    /**
+     * Gets the meta state used for movement using the modifiers tracked by the text
+     * buffer as well as those present in the key event.
+     *
+     * The movement meta state excludes the state of locked modifiers or the SHIFT key
+     * since they are not used by movement actions (but they may be used for selection).
+     *
+     * @param buffer The text buffer.
+     * @param event The key event.
+     * @return The keyboard meta states used for movement.
+     */
+    protected int getMovementMetaState(Spannable buffer, KeyEvent event) {
+        // We ignore locked modifiers and SHIFT.
+        int metaState = (event.getMetaState() | MetaKeyKeyListener.getMetaState(buffer))
+                & ~(MetaKeyKeyListener.META_ALT_LOCKED | MetaKeyKeyListener.META_SYM_LOCKED);
+        return KeyEvent.normalizeMetaState(metaState) & ~KeyEvent.META_SHIFT_MASK;
+    }
+
+    /**
+     * Performs a movement key action.
+     * The default implementation decodes the key down and invokes movement actions
+     * such as {@link #down} and {@link #up}.
+     * {@link #onKeyDown(TextView, Spannable, int, KeyEvent)} calls this method once
+     * to handle an {@link KeyEvent#ACTION_DOWN}.
+     * {@link #onKeyOther(TextView, Spannable, KeyEvent)} calls this method repeatedly
+     * to handle each repetition of an {@link KeyEvent#ACTION_MULTIPLE}.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @param event The key event.
+     * @param keyCode The key code.
+     * @param movementMetaState The keyboard meta states used for movement.
+     * @param event The key event.
+     * @return True if the event was handled.
+     */
+    protected boolean handleMovementKey(TextView widget, Spannable buffer,
+            int keyCode, int movementMetaState, KeyEvent event) {
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_DPAD_LEFT:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    return left(widget, buffer);
+                } else if (KeyEvent.metaStateHasModifiers(movementMetaState,
+                        KeyEvent.META_ALT_ON)) {
+                    return lineStart(widget, buffer);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_DPAD_RIGHT:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    return right(widget, buffer);
+                } else if (KeyEvent.metaStateHasModifiers(movementMetaState,
+                        KeyEvent.META_ALT_ON)) {
+                    return lineEnd(widget, buffer);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_DPAD_UP:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    return up(widget, buffer);
+                } else if (KeyEvent.metaStateHasModifiers(movementMetaState,
+                        KeyEvent.META_ALT_ON)) {
+                    return top(widget, buffer);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_DPAD_DOWN:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    return down(widget, buffer);
+                } else if (KeyEvent.metaStateHasModifiers(movementMetaState,
+                        KeyEvent.META_ALT_ON)) {
+                    return bottom(widget, buffer);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_PAGE_UP:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    return pageUp(widget, buffer);
+                } else if (KeyEvent.metaStateHasModifiers(movementMetaState,
+                        KeyEvent.META_ALT_ON)) {
+                    return top(widget, buffer);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_PAGE_DOWN:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    return pageDown(widget, buffer);
+                } else if (KeyEvent.metaStateHasModifiers(movementMetaState,
+                        KeyEvent.META_ALT_ON)) {
+                    return bottom(widget, buffer);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_MOVE_HOME:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    return home(widget, buffer);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_MOVE_END:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    return end(widget, buffer);
+                }
+                break;
+        }
+        return false;
+    }
+
+    /**
+     * Performs a left movement action.
+     * Moves the cursor or scrolls left by one character.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean left(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs a right movement action.
+     * Moves the cursor or scrolls right by one character.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean right(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs an up movement action.
+     * Moves the cursor or scrolls up by one line.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean up(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs a down movement action.
+     * Moves the cursor or scrolls down by one line.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean down(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs a page-up movement action.
+     * Moves the cursor or scrolls up by one page.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean pageUp(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs a page-down movement action.
+     * Moves the cursor or scrolls down by one page.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean pageDown(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs a top movement action.
+     * Moves the cursor or scrolls to the top of the buffer.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean top(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs a bottom movement action.
+     * Moves the cursor or scrolls to the bottom of the buffer.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean bottom(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs a line-start movement action.
+     * Moves the cursor or scrolls to the start of the line.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean lineStart(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs an line-end movement action.
+     * Moves the cursor or scrolls to the end of the line.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean lineEnd(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs a home movement action.
+     * Moves the cursor or scrolls to the start of the line or to the top of the
+     * document depending on whether the insertion point is being moved or
+     * the document is being scrolled.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean home(TextView widget, Spannable buffer) {
+        return false;
+    }
+
+    /**
+     * Performs an end movement action.
+     * Moves the cursor or scrolls to the start of the line or to the top of the
+     * document depending on whether the insertion point is being moved or
+     * the document is being scrolled.
+     *
+     * @param widget The text view.
+     * @param buffer The text buffer.
+     * @return True if the event was handled.
+     */
+    protected boolean end(TextView widget, Spannable buffer) {
+        return false;
+    }
+}
diff --git a/core/java/android/text/method/LinkMovementMethod.java b/core/java/android/text/method/LinkMovementMethod.java
index 22e9cc6..80c8169 100644
--- a/core/java/android/text/method/LinkMovementMethod.java
+++ b/core/java/android/text/method/LinkMovementMethod.java
@@ -16,8 +16,6 @@
 
 package android.text.method;
 
-import android.content.Intent;
-import android.net.Uri;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.text.*;
@@ -25,28 +23,30 @@
 import android.view.View;
 import android.widget.TextView;
 
-public class
-LinkMovementMethod
-extends ScrollingMovementMethod
-{
+/**
+ * A movement method that traverses links in the text buffer and scrolls if necessary.
+ * Supports clicking on links with DPad Center or Enter.
+ */
+public class LinkMovementMethod extends ScrollingMovementMethod {
     private static final int CLICK = 1;
     private static final int UP = 2;
     private static final int DOWN = 3;
 
     @Override
-    public boolean onKeyDown(TextView widget, Spannable buffer,
-                             int keyCode, KeyEvent event) {
+    protected boolean handleMovementKey(TextView widget, Spannable buffer, int keyCode,
+            int movementMetaState, KeyEvent event) {
         switch (keyCode) {
-        case KeyEvent.KEYCODE_DPAD_CENTER:
-        case KeyEvent.KEYCODE_ENTER:
-            if (event.getRepeatCount() == 0) {
-                if (action(CLICK, widget, buffer)) {
-                    return true;
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+            case KeyEvent.KEYCODE_ENTER:
+                if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
+                    if (event.getAction() == KeyEvent.ACTION_DOWN
+                            && event.getRepeatCount() == 0) {
+                        return action(CLICK, widget, buffer);
+                    }
                 }
-            }
+                break;
         }
-
-        return super.onKeyDown(widget, buffer, keyCode, event);
+        return super.handleMovementKey(widget, buffer, keyCode, movementMetaState, event);
     }
 
     @Override
@@ -86,8 +86,6 @@
     }
 
     private boolean action(int what, TextView widget, Spannable buffer) {
-        boolean handled = false;
-
         Layout layout = widget.getLayout();
 
         int padding = widget.getTotalPaddingTop() +
@@ -184,11 +182,6 @@
         return false;
     }
 
-    public boolean onKeyUp(TextView widget, Spannable buffer,
-                           int keyCode, KeyEvent event) {
-        return false;
-    }
-
     @Override
     public boolean onTouchEvent(TextView widget, Spannable buffer,
                                 MotionEvent event) {
@@ -229,11 +222,13 @@
         return super.onTouchEvent(widget, buffer, event);
     }
 
+    @Override
     public void initialize(TextView widget, Spannable text) {
         Selection.removeSelection(text);
         text.removeSpan(FROM_BELOW);
     }
 
+    @Override
     public void onTakeFocus(TextView view, Spannable text, int dir) {
         Selection.removeSelection(text);
 
diff --git a/core/java/android/text/method/MovementMethod.java b/core/java/android/text/method/MovementMethod.java
index 29f67a1..9167676 100644
--- a/core/java/android/text/method/MovementMethod.java
+++ b/core/java/android/text/method/MovementMethod.java
@@ -21,24 +21,32 @@
 import android.view.MotionEvent;
 import android.text.*;
 
-public interface MovementMethod
-{
+/**
+ * Provides cursor positioning, scrolling and text selection functionality in a {@link TextView}.
+ * <p>
+ * The {@link TextView} delegates handling of key events, trackball motions and touches to
+ * the movement method for purposes of content navigation.  The framework automatically
+ * selects an appropriate movement method based on the content of the {@link TextView}.
+ * </p><p>
+ * This interface is intended for use by the framework; it should not be implemented
+ * directly by applications.
+ * </p>
+ */
+public interface MovementMethod {
     public void initialize(TextView widget, Spannable text);
     public boolean onKeyDown(TextView widget, Spannable text, int keyCode, KeyEvent event);
     public boolean onKeyUp(TextView widget, Spannable text, int keyCode, KeyEvent event);
-    
+
     /**
      * If the key listener wants to other kinds of key events, return true,
      * otherwise return false and the caller (i.e. the widget host)
      * will handle the key.
      */
     public boolean onKeyOther(TextView view, Spannable text, KeyEvent event);
-    
+
     public void onTakeFocus(TextView widget, Spannable text, int direction);
-    public boolean onTrackballEvent(TextView widget, Spannable text,
-                                    MotionEvent event);
-    public boolean onTouchEvent(TextView widget, Spannable text,
-                                MotionEvent event);
+    public boolean onTrackballEvent(TextView widget, Spannable text, MotionEvent event);
+    public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event);
 
     /**
      * Returns true if this movement method allows arbitrary selection
diff --git a/core/java/android/text/method/QwertyKeyListener.java b/core/java/android/text/method/QwertyKeyListener.java
index 09388c0..4c82b81 100644
--- a/core/java/android/text/method/QwertyKeyListener.java
+++ b/core/java/android/text/method/QwertyKeyListener.java
@@ -295,7 +295,9 @@
             }
 
             return true;
-        } else if (keyCode == KeyEvent.KEYCODE_DEL && selStart == selEnd) {
+        } else if (keyCode == KeyEvent.KEYCODE_DEL
+                && (event.hasNoModifiers() || event.hasModifiers(KeyEvent.META_ALT_ON))
+                && selStart == selEnd) {
             // special backspace case for undoing autotext
 
             int consider = 1;
diff --git a/core/java/android/text/method/ScrollingMovementMethod.java b/core/java/android/text/method/ScrollingMovementMethod.java
index 563ceed..194ecc1 100644
--- a/core/java/android/text/method/ScrollingMovementMethod.java
+++ b/core/java/android/text/method/ScrollingMovementMethod.java
@@ -16,201 +16,216 @@
 
 package android.text.method;
 
-import android.util.Log;
-import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.text.*;
 import android.widget.TextView;
 import android.view.View;
 
-public class
-ScrollingMovementMethod
-implements MovementMethod
-{
-    /**
-     * Scrolls the text to the left if possible.
-     */
-    protected boolean left(TextView widget, Spannable buffer) {
-        Layout layout = widget.getLayout();
-        
-        int scrolly = widget.getScrollY();
-        int scr = widget.getScrollX();
-        int em = Math.round(layout.getPaint().getFontSpacing());
+/**
+ * A movement method that interprets movement keys by scrolling the text buffer.
+ */
+public class ScrollingMovementMethod extends BaseMovementMethod implements MovementMethod {
+    private int getTopLine(TextView widget) {
+        return widget.getLayout().getLineForVertical(widget.getScrollY());
+    }
 
-        int padding = widget.getTotalPaddingTop() +
-                      widget.getTotalPaddingBottom();
-        int top = layout.getLineForVertical(scrolly);
-        int bottom = layout.getLineForVertical(scrolly + widget.getHeight() -
-                                               padding);
+    private int getBottomLine(TextView widget) {
+        return widget.getLayout().getLineForVertical(widget.getScrollY() + getInnerHeight(widget));
+    }
+
+    private int getInnerWidth(TextView widget) {
+        return widget.getWidth() - widget.getTotalPaddingLeft() - widget.getTotalPaddingRight();
+    }
+
+    private int getInnerHeight(TextView widget) {
+        return widget.getHeight() - widget.getTotalPaddingTop() - widget.getTotalPaddingBottom();
+    }
+
+    private int getCharacterWidth(TextView widget) {
+        return (int) Math.ceil(widget.getPaint().getFontSpacing());
+    }
+
+    private int getScrollBoundsLeft(TextView widget) {
+        final Layout layout = widget.getLayout();
+        final int topLine = getTopLine(widget);
+        final int bottomLine = getBottomLine(widget);
+        if (topLine > bottomLine) {
+            return 0;
+        }
         int left = Integer.MAX_VALUE;
-
-        for (int i = top; i <= bottom; i++) {
-            left = (int) Math.min(left, layout.getLineLeft(i));
+        for (int line = topLine; line <= bottomLine; line++) {
+            final int lineLeft = (int) Math.floor(layout.getLineLeft(line));
+            if (lineLeft < left) {
+                left = lineLeft;
+            }
         }
+        return left;
+    }
 
-        if (scr > left) {
-            int s = Math.max(scr - em, left);
-            widget.scrollTo(s, widget.getScrollY());
+    private int getScrollBoundsRight(TextView widget) {
+        final Layout layout = widget.getLayout();
+        final int topLine = getTopLine(widget);
+        final int bottomLine = getBottomLine(widget);
+        if (topLine > bottomLine) {
+            return 0;
+        }
+        int right = Integer.MIN_VALUE;
+        for (int line = topLine; line <= bottomLine; line++) {
+            final int lineRight = (int) Math.ceil(layout.getLineRight(line));
+            if (lineRight > right) {
+                right = lineRight;
+            }
+        }
+        return right;
+    }
+
+    @Override
+    protected boolean left(TextView widget, Spannable buffer) {
+        final int minScrollX = getScrollBoundsLeft(widget);
+        int scrollX = widget.getScrollX();
+        if (scrollX > minScrollX) {
+            scrollX = Math.max(scrollX - getCharacterWidth(widget), minScrollX);
+            widget.scrollTo(scrollX, widget.getScrollY());
             return true;
         }
-
         return false;
     }
 
-    /**
-     * Scrolls the text to the right if possible.
-     */
+    @Override
     protected boolean right(TextView widget, Spannable buffer) {
-        Layout layout = widget.getLayout();
-
-        int scrolly = widget.getScrollY();
-        int scr = widget.getScrollX();
-        int em = Math.round(layout.getPaint().getFontSpacing());
-
-        int padding = widget.getTotalPaddingTop() +
-                      widget.getTotalPaddingBottom();
-        int top = layout.getLineForVertical(scrolly);
-        int bottom = layout.getLineForVertical(scrolly + widget.getHeight() -
-                                               padding);
-        int right = 0;
-
-        for (int i = top; i <= bottom; i++) {
-            right = (int) Math.max(right, layout.getLineRight(i));
-        }
-
-        padding = widget.getTotalPaddingLeft() + widget.getTotalPaddingRight();
-        if (scr < right - (widget.getWidth() - padding)) {
-            int s = Math.min(scr + em, right - (widget.getWidth() - padding));
-            widget.scrollTo(s, widget.getScrollY());
+        final int maxScrollX = getScrollBoundsRight(widget) - getInnerWidth(widget);
+        int scrollX = widget.getScrollX();
+        if (scrollX < maxScrollX) {
+            scrollX = Math.min(scrollX + getCharacterWidth(widget), maxScrollX);
+            widget.scrollTo(scrollX, widget.getScrollY());
             return true;
         }
-
         return false;
     }
 
-    /**
-     * Scrolls the text up if possible.
-     */
+    @Override
     protected boolean up(TextView widget, Spannable buffer) {
-        Layout layout = widget.getLayout();
-
-        int areatop = widget.getScrollY();
-        int line = layout.getLineForVertical(areatop);
-        int linetop = layout.getLineTop(line);
-
-        // If the top line is partially visible, bring it all the way
-        // into view; otherwise, bring the previous line into view.
-        if (areatop == linetop)
-            line--;
-
-        if (line >= 0) {
-            Touch.scrollTo(widget, layout,
-                           widget.getScrollX(), layout.getLineTop(line));
+        final Layout layout = widget.getLayout();
+        final int top = widget.getScrollY();
+        int topLine = layout.getLineForVertical(top);
+        if (layout.getLineTop(topLine) == top) {
+            // If the top line is partially visible, bring it all the way
+            // into view; otherwise, bring the previous line into view.
+            topLine -= 1;
+        }
+        if (topLine >= 0) {
+            Touch.scrollTo(widget, layout, widget.getScrollX(), layout.getLineTop(topLine));
             return true;
         }
-
         return false;
     }
 
-    /**
-     * Scrolls the text down if possible.
-     */
+    @Override
     protected boolean down(TextView widget, Spannable buffer) {
-        Layout layout = widget.getLayout();
-
-        int padding = widget.getTotalPaddingTop() +
-                      widget.getTotalPaddingBottom();
-
-        int areabot = widget.getScrollY() + widget.getHeight() - padding;
-        int line = layout.getLineForVertical(areabot);
-
-        if (layout.getLineTop(line+1) < areabot + 1) {
+        final Layout layout = widget.getLayout();
+        final int innerHeight = getInnerHeight(widget);
+        final int bottom = widget.getScrollY() + innerHeight;
+        int bottomLine = layout.getLineForVertical(bottom);
+        if (layout.getLineTop(bottomLine + 1) < bottom + 1) {
             // Less than a pixel of this line is out of view,
             // so we must have tried to make it entirely in view
             // and now want the next line to be in view instead.
-
-            line++;
+            bottomLine += 1;
         }
-
-        if (line <= layout.getLineCount() - 1) {
-            widget.scrollTo(widget.getScrollX(), layout.getLineTop(line+1) -
-                            (widget.getHeight() - padding));
-            Touch.scrollTo(widget, layout,
-                                widget.getScrollX(), widget.getScrollY());
+        if (bottomLine <= layout.getLineCount() - 1) {
+            Touch.scrollTo(widget, layout, widget.getScrollX(),
+                    layout.getLineTop(bottomLine + 1) - innerHeight);
             return true;
         }
-
         return false;
     }
 
-    public boolean onKeyDown(TextView widget, Spannable buffer, int keyCode, KeyEvent event) {
-        return executeDown(widget, buffer, keyCode);
-    }
-
-    private boolean executeDown(TextView widget, Spannable buffer, int keyCode) {
-        boolean handled = false;
-
-        switch (keyCode) {
-        case KeyEvent.KEYCODE_DPAD_LEFT:
-            handled |= left(widget, buffer);
-            break;
-
-        case KeyEvent.KEYCODE_DPAD_RIGHT:
-            handled |= right(widget, buffer);
-            break;
-
-        case KeyEvent.KEYCODE_DPAD_UP:
-            handled |= up(widget, buffer);
-            break;
-
-        case KeyEvent.KEYCODE_DPAD_DOWN:
-            handled |= down(widget, buffer);
-            break;
-        }
-
-        return handled;
-    }
-
-    public boolean onKeyUp(TextView widget, Spannable buffer, int keyCode, KeyEvent event) {
-        return false;
-    }
-
-    public boolean onKeyOther(TextView view, Spannable text, KeyEvent event) {
-        int code = event.getKeyCode();
-        if (code != KeyEvent.KEYCODE_UNKNOWN
-                && event.getAction() == KeyEvent.ACTION_MULTIPLE) {
-            int repeat = event.getRepeatCount();
-            boolean first = true;
-            boolean handled = false;
-            while ((--repeat) > 0) {
-                if (first && executeDown(view, text, code)) {
-                    handled = true;
-                    MetaKeyKeyListener.adjustMetaAfterKeypress(text);
-                    MetaKeyKeyListener.resetLockedMeta(text);
-                }
-                first = false;
-            }
-            return handled;
+    @Override
+    protected boolean pageUp(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        final int top = widget.getScrollY() - getInnerHeight(widget);
+        int topLine = layout.getLineForVertical(top);
+        if (topLine >= 0) {
+            Touch.scrollTo(widget, layout, widget.getScrollX(), layout.getLineTop(topLine));
+            return true;
         }
         return false;
     }
-    
-    public boolean onTrackballEvent(TextView widget, Spannable text,
-            MotionEvent event) {
+
+    @Override
+    protected boolean pageDown(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        final int innerHeight = getInnerHeight(widget);
+        final int bottom = widget.getScrollY() + innerHeight + innerHeight;
+        int bottomLine = layout.getLineForVertical(bottom);
+        if (bottomLine <= layout.getLineCount() - 1) {
+            Touch.scrollTo(widget, layout, widget.getScrollX(),
+                    layout.getLineTop(bottomLine + 1) - innerHeight);
+            return true;
+        }
         return false;
     }
-    
-    public boolean onTouchEvent(TextView widget, Spannable buffer,
-                                 MotionEvent event) {
+
+    @Override
+    protected boolean top(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        if (getTopLine(widget) >= 0) {
+            Touch.scrollTo(widget, layout, widget.getScrollX(), layout.getLineTop(0));
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    protected boolean bottom(TextView widget, Spannable buffer) {
+        final Layout layout = widget.getLayout();
+        final int lineCount = layout.getLineCount();
+        if (getBottomLine(widget) <= lineCount - 1) {
+            Touch.scrollTo(widget, layout, widget.getScrollX(),
+                    layout.getLineTop(lineCount) - getInnerHeight(widget));
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    protected boolean lineStart(TextView widget, Spannable buffer) {
+        final int minScrollX = getScrollBoundsLeft(widget);
+        int scrollX = widget.getScrollX();
+        if (scrollX > minScrollX) {
+            widget.scrollTo(minScrollX, widget.getScrollY());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    protected boolean lineEnd(TextView widget, Spannable buffer) {
+        final int maxScrollX = getScrollBoundsRight(widget) - getInnerWidth(widget);
+        int scrollX = widget.getScrollX();
+        if (scrollX < maxScrollX) {
+            widget.scrollTo(maxScrollX, widget.getScrollY());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    protected boolean home(TextView widget, Spannable buffer) {
+        return top(widget, buffer);
+    }
+
+    @Override
+    protected boolean end(TextView widget, Spannable buffer) {
+        return bottom(widget, buffer);
+    }
+
+    @Override
+    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
         return Touch.onTouchEvent(widget, buffer, event);
     }
 
-    public void initialize(TextView widget, Spannable text) { }
-
-    public boolean canSelectArbitrarily() {
-        return false;
-    }
-
+    @Override
     public void onTakeFocus(TextView widget, Spannable text, int dir) {
         Layout layout = widget.getLayout();
 
diff --git a/core/java/android/util/DebugUtils.java b/core/java/android/util/DebugUtils.java
index 56f389c..65fc35c 100644
--- a/core/java/android/util/DebugUtils.java
+++ b/core/java/android/util/DebugUtils.java
@@ -101,4 +101,23 @@
         return match;
     }
 
+    /** @hide */
+    public static void buildShortClassTag(Object cls, StringBuilder out) {
+        if (cls == null) {
+            out.append("null");
+        } else {
+            String simpleName = cls.getClass().getSimpleName();
+            if (simpleName == null || simpleName.isEmpty()) {
+                simpleName = cls.getClass().getName();
+                int end = simpleName.lastIndexOf('.');
+                if (end > 0) {
+                    simpleName = simpleName.substring(end+1);
+                }
+            }
+            out.append(simpleName);
+            out.append('{');
+            out.append(Integer.toHexString(System.identityHashCode(cls)));
+        }
+    }
+
 }
diff --git a/core/java/android/util/Finalizers.java b/core/java/android/util/Finalizers.java
deleted file mode 100644
index 671f2d4..0000000
--- a/core/java/android/util/Finalizers.java
+++ /dev/null
@@ -1,127 +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.util;
-
-import java.lang.ref.PhantomReference;
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
-
-/**
- * This class can be used to implement reliable finalizers.
- * 
- * @hide
- */
-public final class Finalizers {
-    private static final String LOG_TAG = "Finalizers";
-    
-    private static final Object[] sLock = new Object[0];
-    private static boolean sInit;
-    private static Reclaimer sReclaimer;
-
-    /**
-     * Subclass of PhantomReference used to reclaim resources.
-     */
-    public static abstract class ReclaimableReference<T> extends PhantomReference<T> {
-        public ReclaimableReference(T r, ReferenceQueue<Object> q) {
-            super(r, q);
-        }
-        
-        public abstract void reclaim();
-    }
-
-    /**
-     * Returns the queue used to reclaim ReclaimableReferences.
-     * 
-     * @return A reference queue or null before initialization
-     */
-    public static ReferenceQueue<Object> getQueue() {
-        synchronized (sLock) {
-            if (!sInit) {
-                return null;
-            }
-            if (!sReclaimer.isRunning()) {
-                sReclaimer = new Reclaimer(sReclaimer.mQueue);
-                sReclaimer.start();
-            }
-            return sReclaimer.mQueue;
-        }
-    }
-
-    /**
-     * Invoked by Zygote. Don't touch!
-     */
-    public static void init() {
-        synchronized (sLock) {
-            if (!sInit && sReclaimer == null) {
-                sReclaimer = new Reclaimer();
-                sReclaimer.start();
-                sInit = true;
-            }
-        }
-    }
-    
-    private static class Reclaimer extends Thread {
-        ReferenceQueue<Object> mQueue;
-
-        private volatile boolean mRunning = false;
-
-        Reclaimer() {
-            this(new ReferenceQueue<Object>());
-        }
-
-        Reclaimer(ReferenceQueue<Object> queue) {
-            super("Reclaimer");
-            setDaemon(true);
-            mQueue = queue;            
-        }
-
-        @Override
-        public void start() {
-            mRunning = true;
-            super.start();
-        }
-
-        boolean isRunning() {
-            return mRunning;
-        }
-
-        @SuppressWarnings({"InfiniteLoopStatement"})
-        @Override
-        public void run() {
-            try {
-                while (true) {
-                    try {
-                        cleanUp(mQueue.remove());
-                    } catch (InterruptedException e) {
-                        // Ignore
-                    }
-                }
-            } catch (Exception e) {
-                Log.e(LOG_TAG, "Reclaimer thread exiting: ", e);
-            } finally {
-                mRunning = false;
-            }
-        }
-
-        private void cleanUp(Reference<?> reference) {
-            do {
-                reference.clear();
-                ((ReclaimableReference<?>) reference).reclaim();
-            } while ((reference = mQueue.poll()) != null);
-        }
-    }
-}
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 34d7935..b74806486 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -136,6 +136,11 @@
         outMetrics.ydpi         = mDpiY;
     }
 
+    /**
+     * @hide Helper for our fake display size hack.
+     */
+    native public static int unmapDisplaySize(int newSize);
+    
     /*
      * We use a class initializer to allow the native code to cache some
      * field offsets.
diff --git a/core/java/android/view/FocusFinder.java b/core/java/android/view/FocusFinder.java
index 8ad9a62..d9bf918 100644
--- a/core/java/android/view/FocusFinder.java
+++ b/core/java/android/view/FocusFinder.java
@@ -19,6 +19,8 @@
 import android.graphics.Rect;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 
 /**
  * The algorithm used for finding the next focusable view in a given direction
@@ -44,6 +46,7 @@
     Rect mFocusedRect = new Rect();
     Rect mOtherRect = new Rect();
     Rect mBestCandidateRect = new Rect();
+    SequentialFocusComparator mSequentialFocusComparator = new SequentialFocusComparator();
 
     // enforce thread local access
     private FocusFinder() {}
@@ -76,6 +79,7 @@
             switch (direction) {
                 case View.FOCUS_RIGHT:
                 case View.FOCUS_DOWN:
+                case View.FOCUS_FORWARD:
                     final int rootTop = root.getScrollY();
                     final int rootLeft = root.getScrollX();
                     mFocusedRect.set(rootLeft, rootTop, rootLeft, rootTop);
@@ -83,6 +87,7 @@
 
                 case View.FOCUS_LEFT:
                 case View.FOCUS_UP:
+                case View.FOCUS_BACKWARD:
                     final int rootBottom = root.getScrollY() + root.getHeight();
                     final int rootRight = root.getScrollX() + root.getWidth();
                     mFocusedRect.set(rootRight, rootBottom,
@@ -107,6 +112,48 @@
 
     private View findNextFocus(ViewGroup root, View focused, Rect focusedRect, int direction) {
         ArrayList<View> focusables = root.getFocusables(direction);
+        if (focusables.isEmpty()) {
+            // The focus cannot change.
+            return null;
+        }
+
+        if (direction == View.FOCUS_FORWARD || direction == View.FOCUS_BACKWARD) {
+            if (focused != null && !focusables.contains(focused)) {
+                // Add the currently focused view to the list to have it sorted
+                // along with the other views.
+                focusables.add(focused);
+            }
+
+            try {
+                // Note: This sort is stable.
+                mSequentialFocusComparator.setRoot(root);
+                Collections.sort(focusables, mSequentialFocusComparator);
+            } finally {
+                mSequentialFocusComparator.recycle();
+            }
+
+            final int count = focusables.size();
+            switch (direction) {
+                case View.FOCUS_FORWARD:
+                    if (focused != null) {
+                        int position = focusables.lastIndexOf(focused);
+                        if (position >= 0 && position + 1 < count) {
+                            return focusables.get(position + 1);
+                        }
+                    }
+                    return focusables.get(0);
+
+                case View.FOCUS_BACKWARD:
+                    if (focused != null) {
+                        int position = focusables.indexOf(focused);
+                        if (position > 0) {
+                            return focusables.get(position - 1);
+                        }
+                    }
+                    return focusables.get(count - 1);
+            }
+            return null;
+        }
 
         // initialize the best candidate to something impossible
         // (so the first plausible view will become the best choice)
@@ -477,4 +524,59 @@
         throw new IllegalArgumentException("direction must be one of "
                 + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
     }
+
+    /**
+     * Sorts views according to their visual layout and geometry for default tab order.
+     * This is used for sequential focus traversal.
+     */
+    private static final class SequentialFocusComparator implements Comparator<View> {
+        private final Rect mFirstRect = new Rect();
+        private final Rect mSecondRect = new Rect();
+        private ViewGroup mRoot;
+
+        public void recycle() {
+            mRoot = null;
+        }
+
+        public void setRoot(ViewGroup root) {
+            mRoot = root;
+        }
+
+        public int compare(View first, View second) {
+            if (first == second) {
+                return 0;
+            }
+
+            getRect(first, mFirstRect);
+            getRect(second, mSecondRect);
+
+            if (mFirstRect.top < mSecondRect.top) {
+                return -1;
+            } else if (mFirstRect.top > mSecondRect.top) {
+                return 1;
+            } else if (mFirstRect.left < mSecondRect.left) {
+                return -1;
+            } else if (mFirstRect.left > mSecondRect.left) {
+                return 1;
+            } else if (mFirstRect.bottom < mSecondRect.bottom) {
+                return -1;
+            } else if (mFirstRect.bottom > mSecondRect.bottom) {
+                return 1;
+            } else if (mFirstRect.right < mSecondRect.right) {
+                return -1;
+            } else if (mFirstRect.right > mSecondRect.right) {
+                return 1;
+            } else {
+                // The view are distinct but completely coincident so we consider
+                // them equal for our purposes.  Since the sort is stable, this
+                // means that the views will retain their layout order relative to one another.
+                return 0;
+            }
+        }
+
+        private void getRect(View view, Rect rect) {
+            view.getDrawingRect(rect);
+            mRoot.offsetDescendantRectToMyCoords(view, rect);
+        }
+    }
 }
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 773d734..f0bb40d 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -34,11 +34,6 @@
 import android.text.SpannableString;
 import android.text.SpannedString;
 import android.text.TextUtils;
-import android.util.Finalizers;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
 
 /**
  * An implementation of Canvas on top of OpenGL ES 2.0.
@@ -46,7 +41,11 @@
 class GLES20Canvas extends HardwareCanvas {
     private final boolean mOpaque;
     private int mRenderer;
-    
+
+    // The native renderer will be destroyed when this object dies.
+    // DO NOT overwrite this reference once it is set.
+    private CanvasFinalizer mFinalizer;
+
     private int mWidth;
     private int mHeight;
     
@@ -78,7 +77,7 @@
         this(false, translucent);
     }
     
-    GLES20Canvas(boolean record, boolean translucent) {
+    protected GLES20Canvas(boolean record, boolean translucent) {
         mOpaque = !translucent;
 
         if (record) {
@@ -90,7 +89,7 @@
         if (mRenderer == 0) {
             throw new IllegalStateException("Could not create GLES20Canvas renderer");
         } else {
-            new CanvasFinalizer(this);
+            mFinalizer = new CanvasFinalizer(mRenderer);
         }
     }
 
@@ -99,22 +98,16 @@
 
     private static native void nDestroyRenderer(int renderer);
 
-    private static class CanvasFinalizer extends Finalizers.ReclaimableReference<GLES20Canvas> {
-        private static final Set<CanvasFinalizer> sFinalizers = Collections.synchronizedSet(
-                new HashSet<CanvasFinalizer>());
+    private static class CanvasFinalizer {
+        final int mRenderer;
 
-        private int mRenderer;
-
-        CanvasFinalizer(GLES20Canvas canvas) {
-            super(canvas, Finalizers.getQueue());
-            mRenderer = canvas.mRenderer;
-            sFinalizers.add(this);
+        CanvasFinalizer(int renderer) {
+            mRenderer = renderer;
         }
 
         @Override
-        public void reclaim() {
+        protected void finalize() throws Throwable {
             nDestroyRenderer(mRenderer);
-            sFinalizers.remove(this);
         }
     }
 
diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java
index 11e6d30..adf08ea 100644
--- a/core/java/android/view/GLES20DisplayList.java
+++ b/core/java/android/view/GLES20DisplayList.java
@@ -16,12 +16,6 @@
 
 package android.view;
 
-import android.util.Finalizers;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
 /**
  * An implementation of display list for OpenGL ES 2.0.
  */
@@ -33,13 +27,18 @@
 
     int mNativeDisplayList;
 
+    // The native display list will be destroyed when this object dies.
+    // DO NOT overwrite this reference once it is set.
+    @SuppressWarnings("unused")
+    private DisplayListFinalizer mFinalizer;
+
     @Override
     HardwareCanvas start() {
         if (mStarted) {
             throw new IllegalStateException("Recording has already started");
         }
 
-        mCanvas = new GLES20Canvas(true, true);
+        mCanvas = new GLES20RecordingCanvas(true);
         mStarted = true;
         mRecorded = false;
 
@@ -53,7 +52,7 @@
             mRecorded = true;
 
             mNativeDisplayList = mCanvas.getDisplayList();
-            new DisplayListFinalizer(this);
+            mFinalizer = new DisplayListFinalizer(mNativeDisplayList);
         }
     }
 
@@ -62,22 +61,16 @@
         return !mStarted && mRecorded;
     }
 
-    private static class DisplayListFinalizer extends Finalizers.ReclaimableReference<DisplayList> {
-        private static final Set<DisplayListFinalizer> sFinalizers = Collections.synchronizedSet(
-                new HashSet<DisplayListFinalizer>());
+    private static class DisplayListFinalizer {
+        int mNativeDisplayList;
 
-        private int mNativeDisplayList;
-
-        DisplayListFinalizer(GLES20DisplayList displayList) {
-            super(displayList, Finalizers.getQueue());
-            mNativeDisplayList = displayList.mNativeDisplayList;
-            sFinalizers.add(this);
+        DisplayListFinalizer(int nativeDisplayList) {
+            mNativeDisplayList = nativeDisplayList;
         }
 
         @Override
-        public void reclaim() {
+        protected void finalize() throws Throwable {
             GLES20Canvas.destroyDisplayList(mNativeDisplayList);
-            sFinalizers.remove(this);
         }
     }
 }
diff --git a/core/java/android/view/GLES20RecordingCanvas.java b/core/java/android/view/GLES20RecordingCanvas.java
new file mode 100644
index 0000000..bd14286
--- /dev/null
+++ b/core/java/android/view/GLES20RecordingCanvas.java
@@ -0,0 +1,273 @@
+/*
+ * 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.view;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Shader;
+
+import java.util.HashSet;
+
+/**
+ * An implementation of a GL canvas that records drawing operations.
+ * This is intended for use with a DisplayList. This class keeps a list of all the Paint and
+ * Bitmap objects that it draws, preventing the backing memory of Bitmaps from being freed while
+ * the DisplayList is still holding a native reference to the memory.
+ */
+class GLES20RecordingCanvas extends GLES20Canvas {
+    // These lists ensure that any Bitmaps recorded by a DisplayList are kept alive as long
+    // as the DisplayList is alive.
+    private HashSet<Bitmap> mBitmaps = new HashSet<Bitmap>();
+
+    GLES20RecordingCanvas(boolean translucent) {
+        super(true, translucent);
+    }
+
+    private void recordShaderBitmap(Paint paint) {
+        if (paint != null) {
+            final Shader shader = paint.getShader();
+            if (shader instanceof BitmapShader) {
+                mBitmaps.add(((BitmapShader) shader).mBitmap);
+            }
+        }
+    }
+
+    @Override
+    public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,
+            Paint paint) {
+        super.drawArc(oval, startAngle, sweepAngle, useCenter, paint);
+    }
+
+    @Override
+    public void drawPatch(Bitmap bitmap, byte[] chunks, RectF dst, Paint paint) {
+        super.drawPatch(bitmap, chunks, dst, paint);
+        mBitmaps.add(bitmap);
+        // Shaders in the Paint are ignored when drawing a Bitmap
+    }
+
+    @Override
+    public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) {
+        super.drawBitmap(bitmap, left, top, paint);
+        mBitmaps.add(bitmap);
+        // Shaders in the Paint are ignored when drawing a Bitmap
+    }
+
+    @Override
+    public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) {
+        super.drawBitmap(bitmap, matrix, paint);
+        mBitmaps.add(bitmap);
+        // Shaders in the Paint are ignored when drawing a Bitmap
+    }
+
+    @Override
+    public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) {
+        super.drawBitmap(bitmap, src, dst, paint);
+        mBitmaps.add(bitmap);
+        // Shaders in the Paint are ignored when drawing a Bitmap
+    }
+
+    @Override
+    public void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) {
+        super.drawBitmap(bitmap, src, dst, paint);
+        mBitmaps.add(bitmap);
+        // Shaders in the Paint are ignored when drawing a Bitmap
+    }
+
+    @Override
+    public void drawBitmap(int[] colors, int offset, int stride, float x, float y, int width,
+            int height, boolean hasAlpha, Paint paint) {
+        super.drawBitmap(colors, offset, stride, x, y, width, height, hasAlpha, paint);
+        // Shaders in the Paint are ignored when drawing a Bitmap
+    }
+
+    @Override
+    public void drawBitmap(int[] colors, int offset, int stride, int x, int y, int width,
+            int height, boolean hasAlpha, Paint paint) {
+        super.drawBitmap(colors, offset, stride, x, y, width, height, hasAlpha, paint);
+        // Shaders in the Paint are ignored when drawing a Bitmap
+    }
+
+    @Override
+    public void drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts,
+            int vertOffset, int[] colors, int colorOffset, Paint paint) {
+        super.drawBitmapMesh(bitmap, meshWidth, meshHeight, verts, vertOffset, colors, colorOffset,
+                paint);
+        mBitmaps.add(bitmap);
+        // Shaders in the Paint are ignored when drawing a Bitmap
+    }
+
+    @Override
+    public void drawCircle(float cx, float cy, float radius, Paint paint) {
+        super.drawCircle(cx, cy, radius, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {
+        super.drawLine(startX, startY, stopX, stopY, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawLines(float[] pts, int offset, int count, Paint paint) {
+        super.drawLines(pts, offset, count, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawLines(float[] pts, Paint paint) {
+        super.drawLines(pts, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawOval(RectF oval, Paint paint) {
+        super.drawOval(oval, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawPaint(Paint paint) {
+        super.drawPaint(paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawPath(Path path, Paint paint) {
+        super.drawPath(path, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawPoint(float x, float y, Paint paint) {
+        super.drawPoint(x, y, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawPoints(float[] pts, int offset, int count, Paint paint) {
+        super.drawPoints(pts, offset, count, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawPoints(float[] pts, Paint paint) {
+        super.drawPoints(pts, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawPosText(char[] text, int index, int count, float[] pos, Paint paint) {
+        super.drawPosText(text, index, count, pos, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawPosText(String text, float[] pos, Paint paint) {
+        super.drawPosText(text, pos, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawRect(float left, float top, float right, float bottom, Paint paint) {
+        super.drawRect(left, top, right, bottom, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawRect(Rect r, Paint paint) {
+        super.drawRect(r, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawRect(RectF r, Paint paint) {
+        super.drawRect(r, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {
+        super.drawRoundRect(rect, rx, ry, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawText(char[] text, int index, int count, float x, float y, Paint paint) {
+        super.drawText(text, index, count, x, y, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawText(CharSequence text, int start, int end, float x, float y, Paint paint) {
+        super.drawText(text, start, end, x, y, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawText(String text, int start, int end, float x, float y, Paint paint) {
+        super.drawText(text, start, end, x, y, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawText(String text, float x, float y, Paint paint) {
+        super.drawText(text, x, y, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset,
+            float vOffset, Paint paint) {
+        super.drawTextOnPath(text, index, count, path, hOffset, vOffset, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) {
+        super.drawTextOnPath(text, path, hOffset, vOffset, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount,
+            float x, float y, int dir, Paint paint) {
+        super.drawTextRun(text, index, count, contextIndex, contextCount, x, y, dir, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawTextRun(CharSequence text, int start, int end, int contextStart,
+            int contextEnd, float x, float y, int dir, Paint paint) {
+        super.drawTextRun(text, start, end, contextStart, contextEnd, x, y, dir, paint);
+        recordShaderBitmap(paint);
+    }
+
+    @Override
+    public void drawVertices(VertexMode mode, int vertexCount, float[] verts, int vertOffset,
+            float[] texs, int texOffset, int[] colors, int colorOffset, short[] indices,
+            int indexOffset, int indexCount, Paint paint) {
+        super.drawVertices(mode, vertexCount, verts, vertOffset, texs, texOffset, colors,
+                colorOffset, indices, indexOffset, indexCount, paint);
+        recordShaderBitmap(paint);
+    }
+}
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index 97d7ad5..3a3d1d8 100755
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -990,6 +990,22 @@
      */
     public static final int META_SCROLL_LOCK_ON = 0x400000;
 
+    /** {@hide} */
+    public static final int META_SHIFT_MASK = META_SHIFT_ON
+            | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON;
+
+    /** {@hide} */
+    public static final int META_ALT_MASK = META_ALT_ON
+            | META_ALT_LEFT_ON | META_ALT_RIGHT_ON;
+
+    /** {@hide} */
+    public static final int META_CTRL_MASK = META_CTRL_ON
+            | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON;
+
+    /** {@hide} */
+    public static final int META_META_MASK = META_ALT_ON
+            | META_META_LEFT_ON | META_META_RIGHT_ON;
+
     /**
      * This mask is set if the device woke because of this key event.
      */
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index b8d72a6..e203355 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -24,7 +24,7 @@
 import android.util.Log;
 
 /**
- * Handle on to a raw buffer that is being managed by the screen compositor.
+ * Handle onto a raw buffer that is being managed by the screen compositor.
  */
 public class Surface implements Parcelable {
     private static final String LOG_TAG = "Surface";
@@ -41,7 +41,7 @@
     @Deprecated
     public static final int HARDWARE            = 0x00000010;
 
-    /** Implies "HARDWARE", the surface is to be used by the GPU
+    /** Implies "HARDWARE", the surface is to be used by the GPU;
      * additionally the backbuffer is never preserved for these
      * surfaces. 
      * @deprecated this is ignored, this value is set automatically when needed.
@@ -81,9 +81,9 @@
     
     /**
      * Creates a surface without a rendering buffer. Instead, the content
-     * of the surface must be pushed by an external entity. This is type
+     * of the surface must be pushed by an external entity. This type
      * of surface can be used for efficient camera preview or movie
-     * play back.
+     * playback.
      *
      * @deprecated not support by the system anymore
      */
@@ -99,7 +99,7 @@
      */
     public static final int OPAQUE              = 0x00000400;
     
-    /** Creates a normal surface. This is the default */
+    /** Creates a normal surface. This is the default. */
     public static final int FX_SURFACE_NORMAL   = 0x00000000;
     
     /** Creates a Blur surface. Everything behind this surface is blurred
@@ -111,7 +111,7 @@
     public static final int FX_SURFACE_BLUR     = 0x00010000;
     
     /** Creates a Dim surface. Everything behind this surface is dimmed
-     * by the amount specified in setAlpha(). 
+     * by the amount specified in {@link #setAlpha}.
      * It is an error to lock a Dim surface, since it doesn't have
      * a backing store.
      */
@@ -122,14 +122,14 @@
 
     /* flags used with setFlags() (keep in sync with ISurfaceComposer.h) */
     
-    /** Hide the surface. Equivalent to calling hide() */
+    /** Hide the surface. Equivalent to calling hide(). */
     public static final int SURFACE_HIDDEN    = 0x01;
     
-    /** Freeze the surface. Equivalent to calling freeze() */ 
+    /** Freeze the surface. Equivalent to calling freeze(). */
     public static final int SURFACE_FROZEN     = 0x02;
 
     /**
-     * @deprecated use {@link #SURFACE_FROZEN} instead.
+     * @deprecated Use {@link #SURFACE_FROZEN} instead.
      */
     @Deprecated
     public static final int SURACE_FROZEN     = 0x02;
@@ -241,7 +241,7 @@
      *  like obtained from getMatrix. This is a hack to handle the case that an application
      *  uses getMatrix to keep the original matrix, set matrix of its own, then set the original
      *  matrix back. There is no perfect solution that works for all cases, and there are a lot of
-     *  cases that this model dose not work, but we hope this works for many apps.
+     *  cases that this model does not work, but we hope this works for many apps.
      * </ul>
      */
     private class CompatibleCanvas extends Canvas {
@@ -284,7 +284,7 @@
     }
 
     /**
-     * Sets the display metrics used to provide canva's width/height in compatibility mode.
+     * Sets the display metrics used to provide canvas's width/height in compatibility mode.
      */
     void setCompatibleDisplayMetrics(DisplayMetrics metrics, Translator translator) {
         mCompatibleDisplayMetrics = metrics;
diff --git a/core/java/android/view/SurfaceHolder.java b/core/java/android/view/SurfaceHolder.java
index 1b242b3..2a16725 100644
--- a/core/java/android/view/SurfaceHolder.java
+++ b/core/java/android/view/SurfaceHolder.java
@@ -25,9 +25,10 @@
  * monitor changes to the surface.  This interface is typically available
  * through the {@link SurfaceView} class.
  * 
- * <p>When using this interface from a thread different than the one running
+ * <p>When using this interface from a thread other than the one running
  * its {@link SurfaceView}, you will want to carefully read the
- * {@link #lockCanvas} and {@link Callback#surfaceCreated Callback.surfaceCreated}.
+ * methods
+ * {@link #lockCanvas} and {@link Callback#surfaceCreated Callback.surfaceCreated()}.
  */
 public interface SurfaceHolder {
 
@@ -46,7 +47,7 @@
 
     /**
      * Exception that is thrown from {@link #lockCanvas} when called on a Surface
-     * whose is SURFACE_TYPE_PUSH_BUFFERS.
+     * whose type is SURFACE_TYPE_PUSH_BUFFERS.
      */
     public static class BadSurfaceTypeException extends RuntimeException {
         public BadSurfaceTypeException() {
@@ -62,7 +63,7 @@
      * changes to the surface.  When used with a {@link SurfaceView}, the
      * Surface being held is only available between calls to
      * {@link #surfaceCreated(SurfaceHolder)} and
-     * {@link #surfaceDestroyed(SurfaceHolder).  The Callback is set with
+     * {@link #surfaceDestroyed(SurfaceHolder)}.  The Callback is set with
      * {@link SurfaceHolder#addCallback SurfaceHolder.addCallback} method.
      */
     public interface Callback {
@@ -110,7 +111,7 @@
         /**
          * Called when the application needs to redraw the content of its
          * surface, after it is resized or for some other reason.  By not
-         * returning here until the redraw is complete, you can ensure that
+         * returning from here until the redraw is complete, you can ensure that
          * the user will not see your surface in a bad state (at its new
          * size before it has been correctly drawn that way).  This will
          * typically be preceeded by a call to {@link #surfaceChanged}.
@@ -122,7 +123,7 @@
 
     /**
      * Add a Callback interface for this holder.  There can several Callback
-     * interfaces associated to a holder.
+     * interfaces associated with a holder.
      * 
      * @param callback The new Callback interface.
      */
@@ -187,7 +188,7 @@
      * surface is displayed.  The default is false, allowing it to turn off.
      * This is safe to call from any thread.
      * 
-     * @param screenOn Supply to true to force the screen to stay on, false
+     * @param screenOn Set to true to force the screen to stay on, false
      * to allow it to turn off.
      */
     public void setKeepScreenOn(boolean screenOn);
@@ -195,14 +196,14 @@
     /**
      * Start editing the pixels in the surface.  The returned Canvas can be used
      * to draw into the surface's bitmap.  A null is returned if the surface has
-     * not been created or otherwise can not be edited.  You will usually need
+     * not been created or otherwise cannot be edited.  You will usually need
      * to implement {@link Callback#surfaceCreated Callback.surfaceCreated}
      * to find out when the Surface is available for use.
      * 
      * <p>The content of the Surface is never preserved between unlockCanvas() and
      * lockCanvas(), for this reason, every pixel within the Surface area
      * must be written. The only exception to this rule is when a dirty
-     * rectangle is specified, in which case, non dirty pixels will be
+     * rectangle is specified, in which case, non-dirty pixels will be
      * preserved.
      * 
      * <p>If you call this repeatedly when the Surface is not ready (before
@@ -213,7 +214,7 @@
      * <p>If null is not returned, this function internally holds a lock until
      * the corresponding {@link #unlockCanvasAndPost} call, preventing
      * {@link SurfaceView} from creating, destroying, or modifying the surface
-     * while it is being drawn.  This can be more convenience than accessing
+     * while it is being drawn.  This can be more convenient than accessing
      * the Surface directly, as you do not need to do special synchronization
      * with a drawing thread in {@link Callback#surfaceDestroyed
      * Callback.surfaceDestroyed}.
@@ -224,7 +225,7 @@
 
     
     /**
-     * Just like {@link #lockCanvas()} but allows to specify a dirty rectangle.
+     * Just like {@link #lockCanvas()} but allows specification of a dirty rectangle.
      * Every
      * pixel within that rectangle must be written; however pixels outside
      * the dirty rectangle will be preserved by the next call to lockCanvas().
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 7021604..6451d47 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -65,7 +65,7 @@
  * Surface is created and destroyed as the window is shown and hidden.
  * 
  * <p>One of the purposes of this class is to provide a surface in which a
- * secondary thread can render in to the screen.  If you are going to use it
+ * secondary thread can render into the screen.  If you are going to use it
  * this way, you need to be aware of some threading semantics:
  * 
  * <ul>
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d27e99d..b3e0f18 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -64,6 +64,7 @@
 import android.view.inputmethod.InputMethodManager;
 import android.widget.ScrollBarDrawable;
 import com.android.internal.R;
+import com.android.internal.util.Predicate;
 import com.android.internal.view.menu.MenuBuilder;
 
 import java.lang.ref.WeakReference;
@@ -2066,6 +2067,12 @@
      */
     private int mNextFocusDownId = View.NO_ID;
 
+    /**
+     * When this view has focus and the next focus is {@link #FOCUS_FORWARD},
+     * the user may specify which view to go to next.
+     */
+    int mNextFocusForwardId = View.NO_ID;
+
     private CheckForLongPress mPendingCheckForLongPress;
     private CheckForTap mPendingCheckForTap = null;
     private PerformClick mPerformClick;
@@ -2424,6 +2431,9 @@
                 case R.styleable.View_nextFocusDown:
                     mNextFocusDownId = a.getResourceId(attr, View.NO_ID);
                     break;
+                case R.styleable.View_nextFocusForward:
+                    mNextFocusForwardId = a.getResourceId(attr, View.NO_ID);
+                    break;
                 case R.styleable.View_minWidth:
                     mMinWidth = a.getDimensionPixelSize(attr, 0);
                     break;
@@ -3112,9 +3122,9 @@
      * @param gainFocus True if the View has focus; false otherwise.
      * @param direction The direction focus has moved when requestFocus()
      *                  is called to give this view focus. Values are
-     *                  {@link #FOCUS_UP}, {@link #FOCUS_DOWN}, {@link #FOCUS_LEFT} or
-     *                  {@link #FOCUS_RIGHT}. It may not always apply, in which
-     *                  case use the default.
+     *                  {@link #FOCUS_UP}, {@link #FOCUS_DOWN}, {@link #FOCUS_LEFT},
+     *                  {@link #FOCUS_RIGHT}, {@link #FOCUS_FORWARD}, or {@link #FOCUS_BACKWARD}.
+     *                  It may not always apply, in which case use the default.
      * @param previouslyFocusedRect The rectangle, in this view's coordinate
      *        system, of the previously focused view.  If applicable, this will be
      *        passed in as finer grained information about where the focus is coming
@@ -3359,7 +3369,8 @@
     }
 
     /**
-     * @return The user specified next focus ID.
+     * Gets the id of the view to use when the next focus is {@link #FOCUS_LEFT}.
+     * @return The next focus ID, or {@link #NO_ID} if the framework should decide automatically.
      *
      * @attr ref android.R.styleable#View_nextFocusLeft
      */
@@ -3368,9 +3379,9 @@
     }
 
     /**
-     * Set the id of the view to use for the next focus
-     *
-     * @param nextFocusLeftId
+     * Sets the id of the view to use when the next focus is {@link #FOCUS_LEFT}.
+     * @param nextFocusLeftId The next focus ID, or {@link #NO_ID} if the framework should
+     * decide automatically.
      *
      * @attr ref android.R.styleable#View_nextFocusLeft
      */
@@ -3379,7 +3390,8 @@
     }
 
     /**
-     * @return The user specified next focus ID.
+     * Gets the id of the view to use when the next focus is {@link #FOCUS_RIGHT}.
+     * @return The next focus ID, or {@link #NO_ID} if the framework should decide automatically.
      *
      * @attr ref android.R.styleable#View_nextFocusRight
      */
@@ -3388,9 +3400,9 @@
     }
 
     /**
-     * Set the id of the view to use for the next focus
-     *
-     * @param nextFocusRightId
+     * Sets the id of the view to use when the next focus is {@link #FOCUS_RIGHT}.
+     * @param nextFocusRightId The next focus ID, or {@link #NO_ID} if the framework should
+     * decide automatically.
      *
      * @attr ref android.R.styleable#View_nextFocusRight
      */
@@ -3399,7 +3411,8 @@
     }
 
     /**
-     * @return The user specified next focus ID.
+     * Gets the id of the view to use when the next focus is {@link #FOCUS_UP}.
+     * @return The next focus ID, or {@link #NO_ID} if the framework should decide automatically.
      *
      * @attr ref android.R.styleable#View_nextFocusUp
      */
@@ -3408,9 +3421,9 @@
     }
 
     /**
-     * Set the id of the view to use for the next focus
-     *
-     * @param nextFocusUpId
+     * Sets the id of the view to use when the next focus is {@link #FOCUS_UP}.
+     * @param nextFocusUpId The next focus ID, or {@link #NO_ID} if the framework should
+     * decide automatically.
      *
      * @attr ref android.R.styleable#View_nextFocusUp
      */
@@ -3419,7 +3432,8 @@
     }
 
     /**
-     * @return The user specified next focus ID.
+     * Gets the id of the view to use when the next focus is {@link #FOCUS_DOWN}.
+     * @return The next focus ID, or {@link #NO_ID} if the framework should decide automatically.
      *
      * @attr ref android.R.styleable#View_nextFocusDown
      */
@@ -3428,9 +3442,9 @@
     }
 
     /**
-     * Set the id of the view to use for the next focus
-     *
-     * @param nextFocusDownId
+     * Sets the id of the view to use when the next focus is {@link #FOCUS_DOWN}.
+     * @param nextFocusDownId The next focus ID, or {@link #NO_ID} if the framework should
+     * decide automatically.
      *
      * @attr ref android.R.styleable#View_nextFocusDown
      */
@@ -3439,6 +3453,27 @@
     }
 
     /**
+     * Gets the id of the view to use when the next focus is {@link #FOCUS_FORWARD}.
+     * @return The next focus ID, or {@link #NO_ID} if the framework should decide automatically.
+     *
+     * @attr ref android.R.styleable#View_nextFocusForward
+     */
+    public int getNextFocusForwardId() {
+        return mNextFocusForwardId;
+    }
+
+    /**
+     * Sets the id of the view to use when the next focus is {@link #FOCUS_FORWARD}.
+     * @param nextFocusForwardId The next focus ID, or {@link #NO_ID} if the framework should
+     * decide automatically.
+     *
+     * @attr ref android.R.styleable#View_nextFocusForward
+     */
+    public void setNextFocusForwardId(int nextFocusForwardId) {
+        mNextFocusForwardId = nextFocusForwardId;
+    }
+
+    /**
      * Returns the visibility of this view and all of its ancestors
      *
      * @return True if this view and all of its ancestors are {@link #VISIBLE}
@@ -3949,10 +3984,10 @@
 
     /**
      * If a user manually specified the next view id for a particular direction,
-     * use the root to look up the view.  Once a view is found, it is cached
-     * for future lookups.
+     * use the root to look up the view.
      * @param root The root view of the hierarchy containing this view.
-     * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT
+     * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT, FOCUS_FORWARD,
+     * or FOCUS_BACKWARD.
      * @return The user specified next view, or null if there is none.
      */
     View findUserSetNextFocus(View root, int direction) {
@@ -3969,6 +4004,18 @@
             case FOCUS_DOWN:
                 if (mNextFocusDownId == View.NO_ID) return null;
                 return findViewShouldExist(root, mNextFocusDownId);
+            case FOCUS_FORWARD:
+                if (mNextFocusForwardId == View.NO_ID) return null;
+                return findViewShouldExist(root, mNextFocusForwardId);
+            case FOCUS_BACKWARD: {
+                final int id = mID;
+                return root.findViewByPredicate(new Predicate<View>() {
+                    @Override
+                    public boolean apply(View t) {
+                        return t.mNextFocusForwardId == id;
+                    }
+                });
+            }
         }
         return null;
     }
@@ -4627,8 +4674,8 @@
     }
 
     /**
-     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
-     * KeyEvent.Callback.onKeyMultiple()}: perform press of the view
+     * Default implementation of {@link KeyEvent.Callback#onKeyDown(int, KeyEvent)
+     * KeyEvent.Callback.onKeyDown()}: perform press of the view
      * when {@link KeyEvent#KEYCODE_DPAD_CENTER} or {@link KeyEvent#KEYCODE_ENTER}
      * is released, if the view is enabled and clickable.
      *
@@ -4671,8 +4718,8 @@
     }
 
     /**
-     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
-     * KeyEvent.Callback.onKeyMultiple()}: perform clicking of the view
+     * Default implementation of {@link KeyEvent.Callback#onKeyUp(int, KeyEvent)
+     * KeyEvent.Callback.onKeyUp()}: perform clicking of the view
      * when {@link KeyEvent#KEYCODE_DPAD_CENTER} or
      * {@link KeyEvent#KEYCODE_ENTER} is released.
      *
@@ -5398,7 +5445,7 @@
 
             // Figure out if we need to update the pivot point
             if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
-                if ((mRight - mLeft) != mPrevWidth && (mBottom - mTop) != mPrevHeight) {
+                if ((mRight - mLeft) != mPrevWidth || (mBottom - mTop) != mPrevHeight) {
                     mPrevWidth = mRight - mLeft;
                     mPrevHeight = mBottom - mTop;
                     mPivotX = (float) mPrevWidth / 2f;
@@ -5780,9 +5827,14 @@
             onSizeChanged(width, mBottom - mTop, width, oldHeight);
 
             if (!mMatrixIsIdentity) {
+                if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
+                    // A change in dimension means an auto-centered pivot point changes, too
+                    mMatrixDirty = true;
+                }
                 mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
                 invalidate();
             }
+            mBackgroundSizeChanged = true;
         }
     }
 
@@ -5832,9 +5884,14 @@
             onSizeChanged(width, mBottom - mTop, width, oldHeight);
 
             if (!mMatrixIsIdentity) {
+                if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
+                    // A change in dimension means an auto-centered pivot point changes, too
+                    mMatrixDirty = true;
+                }
                 mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
                 invalidate();
             }
+            mBackgroundSizeChanged = true;
         }
     }
 
@@ -5887,10 +5944,14 @@
             onSizeChanged(mRight - mLeft, height, oldWidth, height);
 
             if (!mMatrixIsIdentity) {
+                if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
+                    // A change in dimension means an auto-centered pivot point changes, too
+                    mMatrixDirty = true;
+                }
                 mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
                 invalidate();
             }
-
+            mBackgroundSizeChanged = true;
         }
     }
 
@@ -5940,9 +6001,14 @@
             onSizeChanged(mRight - mLeft, height, oldWidth, height);
 
             if (!mMatrixIsIdentity) {
+                if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
+                    // A change in dimension means an auto-centered pivot point changes, too
+                    mMatrixDirty = true;
+                }
                 mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
                 invalidate();
             }
+            mBackgroundSizeChanged = true;
         }
     }
 
@@ -7383,6 +7449,7 @@
             initialAwakenScrollBars();
             mPrivateFlags &= ~AWAKEN_SCROLL_BARS_ON_ATTACH;
         }
+        jumpDrawablesToCurrentState();
     }
 
     /**
@@ -8206,8 +8273,9 @@
     /**
      * Manually render this view (and all of its children) to the given Canvas.
      * The view must have already done a full layout before this function is
-     * called.  When implementing a view, do not override this method; instead,
-     * you should implement {@link #onDraw}.
+     * called.  When implementing a view, implement {@link #onDraw} instead of
+     * overriding this method. If you do need to override this method, call
+     * the superclass version.
      *
      * @param canvas The Canvas to which the View is rendered.
      */
@@ -8639,6 +8707,10 @@
             int newHeight = bottom - top;
 
             if (newWidth != oldWidth || newHeight != oldHeight) {
+                if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
+                    // A change in dimension means an auto-centered pivot point changes, too
+                    mMatrixDirty = true;
+                }
                 onSizeChanged(newWidth, newHeight, oldWidth, oldHeight);
             }
 
@@ -8646,7 +8718,7 @@
                 // If we are visible, force the DRAWN bit to on so that
                 // this invalidate will go through (at least to our parent).
                 // This is because someone may have invalidated this view
-                // before this call to setFrame came in, therby clearing
+                // before this call to setFrame came in, thereby clearing
                 // the DRAWN bit.
                 mPrivateFlags |= DRAWN;
                 invalidate();
@@ -9358,6 +9430,18 @@
     }
 
     /**
+     * {@hide}
+     * @param predicate The predicate to evaluate.
+     * @return The first view that matches the predicate or null.
+     */
+    protected View findViewByPredicateTraversal(Predicate<View> predicate) {
+        if (predicate.apply(this)) {
+            return this;
+        }
+        return null;
+    }
+
+    /**
      * Look for a child view with the given id.  If this view has the given
      * id, return this view.
      *
@@ -9386,6 +9470,18 @@
     }
 
     /**
+     * {@hide}
+     * Look for a child view that matches the specified predicate.
+     * If this view matches the predicate, return this view.
+     *
+     * @param predicate The predicate to evaluate.
+     * @return The first view that matches the predicate or null.
+     */
+    public final View findViewByPredicate(Predicate<View> predicate) {
+        return findViewByPredicateTraversal(predicate);
+    }
+
+    /**
      * Sets the identifier for this view. The identifier does not have to be
      * unique in this view's hierarchy. The identifier should be a positive
      * number.
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index a9aa8f9..58fadb9 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -18,6 +18,7 @@
 
 import android.animation.LayoutTransition;
 import com.android.internal.R;
+import com.android.internal.util.Predicate;
 
 import android.content.Context;
 import android.content.res.Configuration;
@@ -30,6 +31,7 @@
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.Region;
+import android.os.Build;
 import android.os.Parcelable;
 import android.os.SystemClock;
 import android.util.AttributeSet;
@@ -349,6 +351,10 @@
         mGroupFlags |= FLAG_ANIMATION_CACHE;
         mGroupFlags |= FLAG_ALWAYS_DRAWN_WITH_CACHE;
 
+        if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB) {
+            mGroupFlags |= FLAG_SPLIT_MOTION_EVENTS;
+        }
+
         setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS);
 
         mChildren = new View[ARRAY_INITIAL_CAPACITY];
@@ -1567,7 +1573,8 @@
 
     /**
      * Enable or disable the splitting of MotionEvents to multiple children during touch event
-     * dispatch. This behavior is disabled by default.
+     * dispatch. This behavior is enabled by default for applications that target an
+     * SDK version of {@link Build.VERSION_CODES#HONEYCOMB} or newer.
      *
      * <p>When this option is enabled MotionEvents may be split and dispatched to different child
      * views depending on where each pointer initially went down. This allows for user interactions
@@ -1590,6 +1597,7 @@
     }
 
     /**
+     * Returns true if MotionEvents dispatched to this ViewGroup can be split to multiple children.
      * @return true if MotionEvents dispatched to this ViewGroup can be split to multiple children.
      */
     public boolean isMotionEventSplittingEnabled() {
@@ -2516,6 +2524,33 @@
     }
 
     /**
+     * {@hide}
+     */
+    @Override
+    protected View findViewByPredicateTraversal(Predicate<View> predicate) {
+        if (predicate.apply(this)) {
+            return this;
+        }
+
+        final View[] where = mChildren;
+        final int len = mChildrenCount;
+
+        for (int i = 0; i < len; i++) {
+            View v = where[i];
+
+            if ((v.mPrivateFlags & IS_ROOT_NAMESPACE) == 0) {
+                v = v.findViewByPredicate(predicate);
+
+                if (v != null) {
+                    return v;
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
      * Adds a child view. If no layout parameters are already set on the child, the
      * default parameters for this ViewGroup are set on the child.
      *
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index 95949b9..5d81702 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -2415,81 +2415,78 @@
     }
 
     /**
-     * @param keyCode The key code
-     * @return True if the key is directional.
+     * Returns true if the key is used for keyboard navigation.
+     * @param keyEvent The key event.
+     * @return True if the key is used for keyboard navigation.
      */
-    static boolean isDirectional(int keyCode) {
-        switch (keyCode) {
+    private static boolean isNavigationKey(KeyEvent keyEvent) {
+        switch (keyEvent.getKeyCode()) {
         case KeyEvent.KEYCODE_DPAD_LEFT:
         case KeyEvent.KEYCODE_DPAD_RIGHT:
         case KeyEvent.KEYCODE_DPAD_UP:
         case KeyEvent.KEYCODE_DPAD_DOWN:
+        case KeyEvent.KEYCODE_DPAD_CENTER:
+        case KeyEvent.KEYCODE_PAGE_UP:
+        case KeyEvent.KEYCODE_PAGE_DOWN:
+        case KeyEvent.KEYCODE_MOVE_HOME:
+        case KeyEvent.KEYCODE_MOVE_END:
+        case KeyEvent.KEYCODE_TAB:
+        case KeyEvent.KEYCODE_SPACE:
+        case KeyEvent.KEYCODE_ENTER:
             return true;
         }
         return false;
     }
 
     /**
-     * Returns true if this key is a keyboard key.
+     * Returns true if the key is used for typing.
      * @param keyEvent The key event.
-     * @return whether this key is a keyboard key.
+     * @return True if the key is used for typing.
      */
-    private static boolean isKeyboardKey(KeyEvent keyEvent) {
-      final int convertedKey = keyEvent.getUnicodeChar();
-        return convertedKey > 0;
+    private static boolean isTypingKey(KeyEvent keyEvent) {
+        return keyEvent.getUnicodeChar() > 0;
     }
 
-
-
     /**
-     * See if the key event means we should leave touch mode (and leave touch
-     * mode if so).
+     * See if the key event means we should leave touch mode (and leave touch mode if so).
      * @param event The key event.
      * @return Whether this key event should be consumed (meaning the act of
      *   leaving touch mode alone is considered the event).
      */
     private boolean checkForLeavingTouchModeAndConsume(KeyEvent event) {
-        final int action = event.getAction();
-        if (action != KeyEvent.ACTION_DOWN && action != KeyEvent.ACTION_MULTIPLE) {
-            return false;
-        }
-        if ((event.getFlags()&KeyEvent.FLAG_KEEP_TOUCH_MODE) != 0) {
-            return false;
-        }
-
-        // only relevant if we are in touch mode
+        // Only relevant in touch mode.
         if (!mAttachInfo.mInTouchMode) {
             return false;
         }
 
-        // if something like an edit text has focus and the user is typing,
-        // leave touch mode
-        //
-        // note: the condition of not being a keyboard key is kind of a hacky
-        // approximation of whether we think the focused view will want the
-        // key; if we knew for sure whether the focused view would consume
-        // the event, that would be better.
-        if (isKeyboardKey(event) && mView != null && mView.hasFocus()) {
-            mFocusedView = mView.findFocus();
-            if ((mFocusedView instanceof ViewGroup)
-                    && ((ViewGroup) mFocusedView).getDescendantFocusability() ==
-                    ViewGroup.FOCUS_AFTER_DESCENDANTS) {
-                // something has focus, but is holding it weakly as a container
-                return false;
-            }
-            if (ensureTouchMode(false)) {
-                throw new IllegalStateException("should not have changed focus "
-                        + "when leaving touch mode while a view has focus.");
-            }
+        // Only consider leaving touch mode on DOWN or MULTIPLE actions, never on UP.
+        final int action = event.getAction();
+        if (action != KeyEvent.ACTION_DOWN && action != KeyEvent.ACTION_MULTIPLE) {
             return false;
         }
 
-        if (isDirectional(event.getKeyCode())) {
-            // no view has focus, so we leave touch mode (and find something
-            // to give focus to).  the event is consumed if we were able to
-            // find something to give focus to.
+        // Don't leave touch mode if the IME told us not to.
+        if ((event.getFlags() & KeyEvent.FLAG_KEEP_TOUCH_MODE) != 0) {
+            return false;
+        }
+
+        // If the key can be used for keyboard navigation then leave touch mode
+        // and select a focused view if needed (in ensureTouchMode).
+        // When a new focused view is selected, we consume the navigation key because
+        // navigation doesn't make much sense unless a view already has focus so
+        // the key's purpose is to set focus.
+        if (isNavigationKey(event)) {
             return ensureTouchMode(false);
         }
+
+        // If the key can be used for typing then leave touch mode
+        // and select a focused view if needed (in ensureTouchMode).
+        // Always allow the view to process the typing key.
+        if (isTypingKey(event)) {
+            ensureTouchMode(false);
+            return false;
+        }
+
         return false;
     }
 
@@ -2629,6 +2626,16 @@
             return;
         }
 
+        // If the Control modifier is held, try to interpret the key as a shortcut.
+        if (event.getAction() == KeyEvent.ACTION_UP
+                && event.isCtrlPressed()
+                && !KeyEvent.isModifierKey(event.getKeyCode())) {
+            if (mView.dispatchKeyShortcutEvent(event)) {
+                finishKeyEvent(event, sendDone, true);
+                return;
+            }
+        }
+
         // Apply the fallback event policy.
         if (mFallbackEventHandler.dispatchKeyEvent(event)) {
             finishKeyEvent(event, sendDone, true);
@@ -2640,16 +2647,31 @@
             int direction = 0;
             switch (event.getKeyCode()) {
             case KeyEvent.KEYCODE_DPAD_LEFT:
-                direction = View.FOCUS_LEFT;
+                if (event.hasNoModifiers()) {
+                    direction = View.FOCUS_LEFT;
+                }
                 break;
             case KeyEvent.KEYCODE_DPAD_RIGHT:
-                direction = View.FOCUS_RIGHT;
+                if (event.hasNoModifiers()) {
+                    direction = View.FOCUS_RIGHT;
+                }
                 break;
             case KeyEvent.KEYCODE_DPAD_UP:
-                direction = View.FOCUS_UP;
+                if (event.hasNoModifiers()) {
+                    direction = View.FOCUS_UP;
+                }
                 break;
             case KeyEvent.KEYCODE_DPAD_DOWN:
-                direction = View.FOCUS_DOWN;
+                if (event.hasNoModifiers()) {
+                    direction = View.FOCUS_DOWN;
+                }
+                break;
+            case KeyEvent.KEYCODE_TAB:
+                if (event.hasNoModifiers()) {
+                    direction = View.FOCUS_FORWARD;
+                } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+                    direction = View.FOCUS_BACKWARD;
+                }
                 break;
             }
 
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 5385cd9..8446a8f 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -576,14 +576,16 @@
 
     /**
      * Set the width and height layout parameters of the window.  The default
-     * for both of these is MATCH_PARENT; you can change them to WRAP_CONTENT to
-     * make a window that is not full-screen.
+     * for both of these is MATCH_PARENT; you can change them to WRAP_CONTENT
+     * or an absolute value to make a window that is not full-screen.
      *
      * @param width The desired layout width of the window.
      * @param height The desired layout height of the window.
+     *
+     * @see ViewGroup.LayoutParams#height
+     * @see ViewGroup.LayoutParams#width
      */
-    public void setLayout(int width, int height)
-    {
+    public void setLayout(int width, int height) {
         final WindowManager.LayoutParams attrs = getAttributes();
         attrs.width = width;
         attrs.height = height;
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index e8792ff..c435c43 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -381,6 +381,11 @@
          */
         public static final int TYPE_STATUS_BAR_SUB_PANEL = FIRST_SYSTEM_WINDOW+17;
 
+        /**
+         * Window type: (mouse) pointer
+         * @hide
+         */
+        public static final int TYPE_POINTER = FIRST_SYSTEM_WINDOW+18;
 
         /**
          * End of types of system windows.
diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java
index 300e5d6..ac378fc 100644
--- a/core/java/android/view/inputmethod/EditorInfo.java
+++ b/core/java/android/view/inputmethod/EditorInfo.java
@@ -275,7 +275,9 @@
      * that was developed against the given target API version.  This can
      * impact the following input types:
      * {@link InputType#TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS},
-     * {@link InputType#TYPE_TEXT_VARIATION_WEB_PASSWORD}.
+     * {@link InputType#TYPE_TEXT_VARIATION_WEB_PASSWORD},
+     * {@link InputType#TYPE_NUMBER_VARIATION_NORMAL},
+     * {@link InputType#TYPE_NUMBER_VARIATION_PASSWORD}.
      *
      * <p>This is called by the framework for input method implementations;
      * you should not generally need to call it yourself.
@@ -288,11 +290,16 @@
             switch (inputType&(TYPE_MASK_CLASS|TYPE_MASK_VARIATION)) {
                 case TYPE_CLASS_TEXT|TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS:
                     inputType = TYPE_CLASS_TEXT|TYPE_TEXT_VARIATION_EMAIL_ADDRESS
-                            | (inputType&(~TYPE_MASK_FLAGS));
+                            | (inputType&TYPE_MASK_FLAGS);
                     break;
                 case TYPE_CLASS_TEXT|TYPE_TEXT_VARIATION_WEB_PASSWORD:
                     inputType = TYPE_CLASS_TEXT|TYPE_TEXT_VARIATION_PASSWORD
-                            | (inputType&(~TYPE_MASK_FLAGS));
+                            | (inputType&TYPE_MASK_FLAGS);
+                    break;
+                case TYPE_CLASS_NUMBER|TYPE_NUMBER_VARIATION_NORMAL:
+                case TYPE_CLASS_NUMBER|TYPE_NUMBER_VARIATION_PASSWORD:
+                    inputType = TYPE_CLASS_NUMBER
+                            | (inputType&TYPE_MASK_FLAGS);
                     break;
             }
         }
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 867bb83..d310237 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -506,9 +506,10 @@
         }
     }
 
-    public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi) {
+    public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi,
+            boolean allowsImplicitlySelectedSubtypes) {
         try {
-            return mService.getEnabledInputMethodSubtypeList(imi);
+            return mService.getEnabledInputMethodSubtypeList(imi, allowsImplicitlySelectedSubtypes);
         } catch (RemoteException e) {
             throw new RuntimeException(e);
         }
diff --git a/core/java/android/webkit/CacheManager.java b/core/java/android/webkit/CacheManager.java
index 821bcc6..99be64b 100644
--- a/core/java/android/webkit/CacheManager.java
+++ b/core/java/android/webkit/CacheManager.java
@@ -44,7 +44,10 @@
  * this component and if they can not be resolved by the cache, the HTTP headers
  * are attached, as appropriate, to the request for revalidation of content. The
  * class also manages the cache size.
+ *
+ * @deprecated Access to the HTTP cache will be removed in a future release.
  */
+@Deprecated
 public final class CacheManager {
 
     private static final String LOGTAG = "cache";
@@ -85,7 +88,10 @@
      * This class represents a resource retrieved from the HTTP cache.
      * Instances of this class can be obtained by invoking the
      * CacheManager.getCacheFile() method.
+     *
+     * @deprecated Access to the HTTP cache will be removed in a future release.
      */
+    @Deprecated
     public static class CacheResult {
         // these fields are saved to the database
         int httpStatusCode;
@@ -167,6 +173,13 @@
         public void setEncoding(String encoding) {
             this.encoding = encoding;
         }
+
+        /**
+         * @hide
+         */
+        public void setContentLength(long contentLength) {
+            this.contentLength = contentLength;
+        }
     }
 
     /**
@@ -213,9 +226,12 @@
     /**
      * get the base directory of the cache. With localPath of the CacheResult,
      * it identifies the cache file.
-     * 
+     *
      * @return File The base directory of the cache.
+     *
+     * @deprecated Access to the HTTP cache will be removed in a future release.
      */
+    @Deprecated
     public static File getCacheFileBaseDir() {
         return mBaseDir;
     }
@@ -237,9 +253,12 @@
 
     /**
      * get the state of the current cache, enabled or disabled
-     * 
+     *
      * @return return if it is disabled
+     *
+     * @deprecated Access to the HTTP cache will be removed in a future release.
      */
+    @Deprecated
     public static boolean cacheDisabled() {
         return mDisabled;
     }
@@ -307,8 +326,11 @@
      * HEADER_KEY_IFNONEMATCH or HEADER_KEY_IFMODIFIEDSINCE will be set in the
      * cached headers.
      * 
-     * @return the CacheResult for a given url
+     * @return the CacheResult for a given url.
+     *
+     * @deprecated Access to the HTTP cache will be removed in a future release.
      */
+    @Deprecated
     public static CacheResult getCacheFile(String url,
             Map<String, String> headers) {
         return getCacheFile(url, 0, headers);
@@ -383,7 +405,10 @@
      * @return CacheResult for a given url
      * @hide - hide createCacheFile since it has a parameter of type headers, which is
      * in a hidden package.
+     *
+     * @deprecated Access to the HTTP cache will be removed in a future release.
      */
+    @Deprecated
     public static CacheResult createCacheFile(String url, int statusCode,
             Headers headers, String mimeType, boolean forceCache) {
         return createCacheFile(url, statusCode, headers, mimeType, 0,
@@ -448,7 +473,10 @@
     /**
      * Save the info of a cache file for a given url to the CacheMap so that it
      * can be reused later
+     *
+     * @deprecated Access to the HTTP cache will be removed in a future release.
      */
+    @Deprecated
     public static void saveCacheFile(String url, CacheResult cacheRet) {
         saveCacheFile(url, 0, cacheRet);
     }
diff --git a/core/java/android/webkit/JWebCoreJavaBridge.java b/core/java/android/webkit/JWebCoreJavaBridge.java
index 908526f..976e786 100644
--- a/core/java/android/webkit/JWebCoreJavaBridge.java
+++ b/core/java/android/webkit/JWebCoreJavaBridge.java
@@ -307,4 +307,5 @@
     public native void addPackageNames(Set<String> packageNames);
     public native void addPackageName(String packageName);
     public native void removePackageName(String packageName);
+    public native void updateProxy(String newProxy);
 }
diff --git a/core/java/android/webkit/JniUtil.java b/core/java/android/webkit/JniUtil.java
index ca3515c5..704d4da 100644
--- a/core/java/android/webkit/JniUtil.java
+++ b/core/java/android/webkit/JniUtil.java
@@ -39,7 +39,7 @@
         if (initialized)
             return;
 
-        sContext = context;
+        sContext = context.getApplicationContext();
         initialized = true;
     }
 
diff --git a/core/java/android/webkit/SelectActionModeCallback.java b/core/java/android/webkit/SelectActionModeCallback.java
index 54c9d9a..86a67c7 100644
--- a/core/java/android/webkit/SelectActionModeCallback.java
+++ b/core/java/android/webkit/SelectActionModeCallback.java
@@ -34,7 +34,11 @@
     }
 
     void finish() {
-        mActionMode.finish();
+        // It is possible that onCreateActionMode was never called, in the case
+        // where there is no ActionBar, for example.
+        if (mActionMode != null) {
+            mActionMode.finish();
+        }
     }
 
     // ActionMode.Callback implementation
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index bb18270..cf447db 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -238,7 +238,8 @@
             }
         }
 
-        if ((mSingle && KeyEvent.KEYCODE_ENTER == keyCode)) {
+        if (mSingle && (KeyEvent.KEYCODE_ENTER == keyCode
+                    || KeyEvent.KEYCODE_NUMPAD_ENTER == keyCode)) {
             if (isPopupShowing()) {
                 return super.dispatchKeyEvent(event);
             }
@@ -296,7 +297,8 @@
             // so do not pass down to javascript, and instead
             // return true.  If it is an arrow key or a delete key, we can go
             // ahead and pass it down.
-            if (KeyEvent.KEYCODE_ENTER == keyCode) {
+            if (KeyEvent.KEYCODE_ENTER == keyCode
+                        || KeyEvent.KEYCODE_NUMPAD_ENTER == keyCode) {
                 // For multi-line text boxes, newlines will
                 // trigger onTextChanged for key down (which will send both
                 // key up and key down) but not key up.
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 7195f98..0a165e8 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -48,6 +48,8 @@
 import android.graphics.Region;
 import android.graphics.Shader;
 import android.graphics.drawable.Drawable;
+import android.net.Proxy;
+import android.net.ProxyProperties;
 import android.net.Uri;
 import android.net.http.SslCertificate;
 import android.os.AsyncTask;
@@ -981,6 +983,7 @@
          */
         init();
         setupPackageListener(context);
+        setupProxyListener(context);
         updateMultiTouchSupport(context);
 
         if (privateBrowsing) {
@@ -990,11 +993,58 @@
         mAutoFillData = new WebViewCore.AutoFillData();
     }
 
+    private static class ProxyReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(Proxy.PROXY_CHANGE_ACTION)) {
+                handleProxyBroadcast(intent);
+            }
+        }
+    }
+
     /*
-     * The intent receiver that monitors for changes to relevant packages (e.g.,
-     * sGoogleApps) and notifies WebViewCore of their existence.
+     * A variable to track if there is a receiver added for PROXY_CHANGE_ACTION
      */
-    private static BroadcastReceiver sPackageInstallationReceiver = null;
+    private static boolean sProxyReceiverAdded;
+
+    private static synchronized void setupProxyListener(Context context) {
+        if (sProxyReceiverAdded) {
+            return;
+        }
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Proxy.PROXY_CHANGE_ACTION);
+        Intent currentProxy = context.getApplicationContext().registerReceiver(
+                new ProxyReceiver(), filter);
+        sProxyReceiverAdded = true;
+        if (currentProxy != null) {
+            handleProxyBroadcast(currentProxy);
+        }
+    }
+
+    private static void handleProxyBroadcast(Intent intent) {
+        ProxyProperties proxyProperties = (ProxyProperties)intent.getExtra(Proxy.EXTRA_PROXY_INFO);
+        if (proxyProperties == null || proxyProperties.getHost() == null) {
+            WebViewCore.sendStaticMessage(EventHub.PROXY_CHANGED, "");
+            return;
+        }
+
+        String host = proxyProperties.getHost();
+        int port = proxyProperties.getPort();
+        if (port != 0)
+            host += ": " + port;
+
+        // TODO: Handle exclusion list
+        // The plan is to make an AndroidProxyResolver, and handle the blacklist
+        // there
+        String exclusionList = proxyProperties.getExclusionList();
+        WebViewCore.sendStaticMessage(EventHub.PROXY_CHANGED, host);
+    }
+
+    /*
+     * A variable to track if there is a receiver added for ACTION_PACKAGE_ADDED
+     * or ACTION_PACKAGE_REMOVED.
+     */
+    private static boolean sPackageInstallationReceiverAdded = false;
 
     /*
      * A set of Google packages we monitor for the
@@ -1007,6 +1057,32 @@
         sGoogleApps.add("com.google.android.youtube");
     }
 
+    private static class PackageListener extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            final String action = intent.getAction();
+            final String packageName = intent.getData().getSchemeSpecificPart();
+            final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
+            if (Intent.ACTION_PACKAGE_REMOVED.equals(action) && replacing) {
+                // if it is replacing, refreshPlugins() when adding
+                return;
+            }
+
+            if (sGoogleApps.contains(packageName)) {
+                if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
+                    WebViewCore.sendStaticMessage(EventHub.ADD_PACKAGE_NAME, packageName);
+                } else {
+                    WebViewCore.sendStaticMessage(EventHub.REMOVE_PACKAGE_NAME, packageName);
+                }
+            }
+
+            PluginManager pm = PluginManager.getInstance(context);
+            if (pm.containsPluginPermissionAndSignatures(packageName)) {
+                pm.refreshPlugins(Intent.ACTION_PACKAGE_ADDED.equals(action));
+            }
+        }
+    }
+
     private void setupPackageListener(Context context) {
 
         /*
@@ -1018,41 +1094,16 @@
 
             // if the receiver already exists then we do not need to register it
             // again
-            if (sPackageInstallationReceiver != null) {
+            if (sPackageInstallationReceiverAdded) {
                 return;
             }
 
             IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
             filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
             filter.addDataScheme("package");
-            sPackageInstallationReceiver = new BroadcastReceiver() {
-
-                @Override
-                public void onReceive(Context context, Intent intent) {
-                    final String action = intent.getAction();
-                    final String packageName = intent.getData().getSchemeSpecificPart();
-                    final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
-                    if (Intent.ACTION_PACKAGE_REMOVED.equals(action) && replacing) {
-                        // if it is replacing, refreshPlugins() when adding
-                        return;
-                    }
-
-                    if (sGoogleApps.contains(packageName) && mWebViewCore != null) {
-                        if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
-                            mWebViewCore.sendMessage(EventHub.ADD_PACKAGE_NAME, packageName);
-                        } else {
-                            mWebViewCore.sendMessage(EventHub.REMOVE_PACKAGE_NAME, packageName);
-                        }
-                    }
-
-                    PluginManager pm = PluginManager.getInstance(context);
-                    if (pm.containsPluginPermissionAndSignatures(packageName)) {
-                        pm.refreshPlugins(Intent.ACTION_PACKAGE_ADDED.equals(action));
-                    }
-                }
-            };
-
-            context.getApplicationContext().registerReceiver(sPackageInstallationReceiver, filter);
+            BroadcastReceiver packageListener = new PackageListener();
+            context.getApplicationContext().registerReceiver(packageListener, filter);
+            sPackageInstallationReceiverAdded = true;
         }
 
         // check if any of the monitored apps are already installed
@@ -3790,7 +3841,9 @@
     public boolean selectText() {
         int x = viewToContentX((int) mLastTouchX + mScrollX);
         int y = viewToContentY((int) mLastTouchY + mScrollY);
-        setUpSelect();
+        if (!setUpSelect()) {
+            return false;
+        }
         if (mNativeClass != 0 && nativeWordSelection(x, y)) {
             nativeSetExtendSelection();
             mDrawSelectionPointer = false;
@@ -4418,13 +4471,25 @@
         return false;
     }
 
+    private boolean isEnterActionKey(int keyCode) {
+        return keyCode == KeyEvent.KEYCODE_DPAD_CENTER
+                || keyCode == KeyEvent.KEYCODE_ENTER
+                || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER;
+    }
+
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (DebugFlags.WEB_VIEW) {
             Log.v(LOGTAG, "keyDown at " + System.currentTimeMillis()
+                    + "keyCode=" + keyCode
                     + ", " + event + ", unicode=" + event.getUnicodeChar());
         }
 
+        // don't implement accelerator keys here; defer to host application
+        if (event.isCtrlPressed()) {
+            return false;
+        }
+
         if (mNativeClass == 0) {
             return false;
         }
@@ -4490,7 +4555,7 @@
             return false;
         }
 
-        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
+        if (isEnterActionKey(keyCode)) {
             switchOutDrawHistory();
             if (event.getRepeatCount() == 0) {
                 if (mSelectingText) {
@@ -4619,7 +4684,7 @@
             return false;
         }
 
-        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
+        if (isEnterActionKey(keyCode)) {
             // remove the long press message first
             mPrivateHandler.removeMessages(LONG_PRESS_CENTER);
             mGotCenterDown = false;
@@ -4675,10 +4740,15 @@
         return false;
     }
 
-    private void setUpSelect() {
-        if (0 == mNativeClass) return; // client isn't initialized
-        if (inFullScreenMode()) return;
-        if (mSelectingText) return;
+    /*
+     * Enter selecting text mode.  Returns true if the WebView is now in
+     * selecting text mode (including if it was already in that mode, and this
+     * method did nothing).
+     */
+    private boolean setUpSelect() {
+        if (0 == mNativeClass) return false; // client isn't initialized
+        if (inFullScreenMode()) return false;
+        if (mSelectingText) return true;
         mExtendSelection = false;
         mSelectingText = mDrawSelectionPointer = true;
         // don't let the picture change during text selection
@@ -4698,7 +4768,13 @@
         nativeHideCursor();
         mSelectCallback = new SelectActionModeCallback();
         mSelectCallback.setWebView(this);
-        startActionMode(mSelectCallback);
+        if (startActionMode(mSelectCallback) == null) {
+            // There is no ActionMode, so do not allow the user to modify a
+            // selection.
+            selectionDone();
+            return false;
+        }
+        return true;
     }
 
     /**
@@ -4715,7 +4791,9 @@
     void selectAll() {
         if (0 == mNativeClass) return; // client isn't initialized
         if (inFullScreenMode()) return;
-        if (!mSelectingText) setUpSelect();
+        if (!mSelectingText && !setUpSelect()) {
+            return;
+        }
         nativeSelectAll();
         mDrawSelectionPointer = false;
         mExtendSelection = true;
@@ -5398,8 +5476,10 @@
                     } else {
                         // TODO: allow scrollable overflow div to autoscroll
                     }
-                    nativeExtendSelection(contentX, contentY);
-                    invalidate();
+                    if (deltaX != 0 || deltaY != 0) {
+                        nativeExtendSelection(contentX, contentY);
+                        invalidate();
+                    }
                     break;
                 }
 
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index b8c8913..45927f9 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -668,6 +668,30 @@
                                 Process.setThreadPriority(
                                         Process.THREAD_PRIORITY_DEFAULT);
                                 break;
+
+                            case EventHub.ADD_PACKAGE_NAME:
+                                if (BrowserFrame.sJavaBridge == null) {
+                                    throw new IllegalStateException(
+                                            "No WebView has been created in this process!");
+                                }
+                                BrowserFrame.sJavaBridge.addPackageName((String) msg.obj);
+                                break;
+
+                            case EventHub.REMOVE_PACKAGE_NAME:
+                                if (BrowserFrame.sJavaBridge == null) {
+                                    throw new IllegalStateException(
+                                            "No WebView has been created in this process!");
+                                }
+                                BrowserFrame.sJavaBridge.removePackageName((String) msg.obj);
+                                break;
+
+                            case EventHub.PROXY_CHANGED:
+                                if (BrowserFrame.sJavaBridge == null) {
+                                    throw new IllegalStateException(
+                                            "No WebView has been created in this process!");
+                                }
+                                BrowserFrame.sJavaBridge.updateProxy((String) msg.obj);
+                                break;
                         }
                     }
                 };
@@ -967,6 +991,8 @@
 
         static final int AUTOFILL_FORM = 192;
 
+        static final int PROXY_CHANGED = 193;
+
         // private message ids
         private static final int DESTROY =     200;
 
@@ -1488,24 +1514,6 @@
                                     (Set<String>) msg.obj);
                             break;
 
-                        case ADD_PACKAGE_NAME:
-                            if (BrowserFrame.sJavaBridge == null) {
-                                throw new IllegalStateException("No WebView " +
-                                        "has been created in this process!");
-                            }
-                            BrowserFrame.sJavaBridge.addPackageName(
-                                    (String) msg.obj);
-                            break;
-
-                        case REMOVE_PACKAGE_NAME:
-                            if (BrowserFrame.sJavaBridge == null) {
-                                throw new IllegalStateException("No WebView " +
-                                        "has been created in this process!");
-                            }
-                            BrowserFrame.sJavaBridge.removePackageName(
-                                    (String) msg.obj);
-                            break;
-
                         case GET_TOUCH_HIGHLIGHT_RECTS:
                             TouchHighlightData d = (TouchHighlightData) msg.obj;
                             ArrayList<Rect> rects = nativeGetTouchHighlightRects
@@ -1991,6 +1999,13 @@
                 .obtainMessage(WebCoreThread.RESUME_PRIORITY));
     }
 
+    static void sendStaticMessage(int messageType, Object argument) {
+        if (sWebCoreHandler == null)
+            return;
+
+        sWebCoreHandler.sendMessage(sWebCoreHandler.obtainMessage(messageType, argument));
+    }
+
     static void pauseUpdatePicture(WebViewCore core) {
         // Note: there is one possible failure mode. If pauseUpdatePicture() is
         // called from UI thread while WEBKIT_DRAW is just pulled out of the
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 6309cac..6d3f227 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -512,6 +512,11 @@
     private AbsListView.PerformClick mPerformClick;
 
     /**
+     * Delayed action for touch mode.
+     */
+    private Runnable mTouchModeReset;
+
+    /**
      * This view is in transcript mode -- it shows the bottom of the list when the data
      * changes
      */
@@ -1475,8 +1480,16 @@
             ss.position = getSelectedItemPosition();
             ss.firstId = INVALID_POSITION;
         } else {
-            if (haveChildren) {
-                // Remember the position of the first child
+            if (haveChildren && mFirstPosition > 0) {
+                // Remember the position of the first child.
+                // We only do this if we are not currently at the top of
+                // the list, for two reasons:
+                // (1) The list may be in the process of becoming empty, in
+                // which case mItemCount may not be 0, but if we try to
+                // ask for any information about position 0 we will crash.
+                // (2) Being "at the top" seems like a special case, anyway,
+                // and the user wouldn't expect to end up somewhere else when
+                // they revisit the list even if its content has changed.
                 View v = getChildAt(0);
                 ss.viewTop = v.getTop();
                 int firstPos = mFirstPosition;
@@ -2314,6 +2327,27 @@
             mFlingStrictSpan.finish();
             mFlingStrictSpan = null;
         }
+
+        if (mFlingRunnable != null) {
+            removeCallbacks(mFlingRunnable);
+        }
+
+        if (mPositionScroller != null) {
+            removeCallbacks(mPositionScroller);
+        }
+
+        if (mClearScrollingCache != null) {
+            removeCallbacks(mClearScrollingCache);
+        }
+
+        if (mPerformClick != null) {
+            removeCallbacks(mPerformClick);
+        }
+
+        if (mTouchModeReset != null) {
+            removeCallbacks(mTouchModeReset);
+            mTouchModeReset = null;
+        }
     }
 
     @Override
@@ -3012,7 +3046,11 @@
                                     ((TransitionDrawable) d).resetTransition();
                                 }
                             }
-                            postDelayed(new Runnable() {
+                            if (mTouchModeReset != null) {
+                                removeCallbacks(mTouchModeReset);
+                            }
+                            mTouchModeReset = new Runnable() {
+                                @Override
                                 public void run() {
                                     mTouchMode = TOUCH_MODE_REST;
                                     child.setPressed(false);
@@ -3021,7 +3059,9 @@
                                         post(performClick);
                                     }
                                 }
-                            }, ViewConfiguration.getPressedStateDuration());
+                            };
+                            postDelayed(mTouchModeReset,
+                                    ViewConfiguration.getPressedStateDuration());
                         } else {
                             mTouchMode = TOUCH_MODE_REST;
                             updateSelectorState();
@@ -4382,6 +4422,18 @@
         requestLayout();
         invalidate();
     }
+    
+    /**
+     * If there is a selection returns true.
+     * Otherwise resurrects the selection and returns false.
+     */
+    boolean ensureSelectionOnMovementKey() {
+        if (mSelectedPosition < 0) {
+            resurrectSelection();
+            return false;
+        }
+        return true;
+    }
 
     /**
      * Makes the item at the supplied position selected.
@@ -4718,9 +4770,17 @@
             dX = dest.left + dest.width() / 2;
             dY = dest.bottom;
             break;
+        case View.FOCUS_FORWARD:
+        case View.FOCUS_BACKWARD:
+            sX = source.right + source.width() / 2;
+            sY = source.top + source.height() / 2;
+            dX = dest.left + dest.width() / 2;
+            dY = dest.top + dest.height() / 2;
+            break;
         default:
             throw new IllegalArgumentException("direction must be one of "
-                    + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+                    + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT, "
+                    + "FOCUS_FORWARD, FOCUS_BACKWARD}.");
         }
         int deltaX = dX - sX;
         int deltaY = dY - sY;
@@ -5184,6 +5244,8 @@
     public void onRemoteAdapterConnected() {
         if (mRemoteAdapter != mAdapter) {
             setAdapter(mRemoteAdapter);
+        } else if (mRemoteAdapter != null) {
+            mRemoteAdapter.superNotifyDataSetChanged();
         }
     }
 
@@ -5191,10 +5253,11 @@
      * Called back when the adapter disconnects from the RemoteViewsService.
      */
     public void onRemoteAdapterDisconnected() {
-        if (mRemoteAdapter == mAdapter) {
-            mRemoteAdapter = null;
-            setAdapter(null);
-        }
+        // If the remote adapter disconnects, we keep it around
+        // since the currently displayed items are still cached.
+        // Further, we want the service to eventually reconnect
+        // when necessary, as triggered by this view requesting
+        // items from the Adapter.
     }
 
     /**
diff --git a/core/java/android/widget/AdapterViewAnimator.java b/core/java/android/widget/AdapterViewAnimator.java
index 162b030..ec8e93c 100644
--- a/core/java/android/widget/AdapterViewAnimator.java
+++ b/core/java/android/widget/AdapterViewAnimator.java
@@ -964,6 +964,8 @@
     public void onRemoteAdapterConnected() {
         if (mRemoteViewsAdapter != mAdapter) {
             setAdapter(mRemoteViewsAdapter);
+        } else if (mRemoteViewsAdapter != null) {
+            mRemoteViewsAdapter.superNotifyDataSetChanged();
         }
     }
 
@@ -971,10 +973,11 @@
      * Called back when the adapter disconnects from the RemoteViewsService.
      */
     public void onRemoteAdapterDisconnected() {
-        if (mRemoteViewsAdapter != mAdapter) {
-            mRemoteViewsAdapter = null;
-            setAdapter(mRemoteViewsAdapter);
-        }
+        // If the remote adapter disconnects, we keep it around
+        // since the currently displayed items are still cached.
+        // Further, we want the service to eventually reconnect
+        // when necessary, as triggered by this view requesting
+        // items from the Adapter.
     }
 
     public void advance() {
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index e07befa..ee037cd 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -630,7 +630,10 @@
             // from the drop down as its content
             case KeyEvent.KEYCODE_ENTER:
             case KeyEvent.KEYCODE_DPAD_CENTER:
-                performCompletion();
+            case KeyEvent.KEYCODE_TAB:
+                if (event.hasNoModifiers()) {
+                    performCompletion();
+                }
                 return true;
             }
         }
@@ -646,7 +649,9 @@
         if (!isPopupShowing()) {
             switch(keyCode) {
             case KeyEvent.KEYCODE_DPAD_DOWN:
-                performValidation();
+                if (event.hasNoModifiers()) {
+                    performValidation();
+                }
             }
         }
 
diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java
new file mode 100644
index 0000000..7ef61a8
--- /dev/null
+++ b/core/java/android/widget/CalendarView.java
@@ -0,0 +1,1398 @@
+/*
+ * 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.widget;
+
+import com.android.internal.R;
+
+import android.annotation.Widget;
+import android.app.Service;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.database.DataSetObserver;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.Paint.Style;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
+import android.text.format.DateUtils;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.GestureDetector;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsListView.OnScrollListener;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import libcore.icu.LocaleData;
+
+/**
+ * This class is a calendar widget for displaying and selecting dates. The range
+ * of dates supported by this calendar is configurable. A user can select a date
+ * by taping on it and can scroll and fling the calendar to a desired date.
+ *
+ * @attr ref android.R.styleable#CalendarView_showWeekNumber
+ * @attr ref android.R.styleable#CalendarView_firstDayOfWeek
+ * @attr ref android.R.styleable#CalendarView_minDate
+ * @attr ref android.R.styleable#CalendarView_maxDate
+ * @attr ref android.R.styleable#CalendarView_shownWeekCount
+ * @attr ref android.R.styleable#CalendarView_selectedWeekBackgroundColor
+ * @attr ref android.R.styleable#CalendarView_focusedMonthDateColor
+ * @attr ref android.R.styleable#CalendarView_unfocusedMonthDateColor
+ * @attr ref android.R.styleable#CalendarView_weekNumberColor
+ * @attr ref android.R.styleable#CalendarView_weekSeparatorLineColor
+ * @attr ref android.R.styleable#CalendarView_selectedDateVerticalBar
+ * @attr ref android.R.styleable#CalendarView_weekDayTextAppearance
+ * @attr ref android.R.styleable#CalendarView_dateTextAppearance
+ */
+@Widget
+public class CalendarView extends FrameLayout {
+
+    /**
+     * Tag for logging.
+     */
+    private static final String LOG_TAG = CalendarView.class.getSimpleName();
+
+    /**
+     * Default value whether to show week number.
+     */
+    private static final boolean DEFAULT_SHOW_WEEK_NUMBER = true;
+
+    /**
+     * The number of milliseconds in a day.e
+     */
+    private static final long MILLIS_IN_DAY = 86400000L;
+
+    /**
+     * The number of day in a week.
+     */
+    private static final int DAYS_PER_WEEK = 7;
+
+    /**
+     * The number of milliseconds in a week.
+     */
+    private static final long MILLIS_IN_WEEK = DAYS_PER_WEEK * MILLIS_IN_DAY;
+
+    /**
+     * Affects when the month selection will change while scrolling upe
+     */
+    private static final int SCROLL_HYST_WEEKS = 2;
+
+    /**
+     * How long the GoTo fling animation should last.
+     */
+    private static final int GOTO_SCROLL_DURATION = 1000;
+
+    /**
+     * The duration of the adjustment upon a user scroll in milliseconds.
+     */
+    private static final int ADJUSTMENT_SCROLL_DURATION = 500;
+
+    /**
+     * How long to wait after receiving an onScrollStateChanged notification
+     * before acting on it.
+     */
+    private static final int SCROLL_CHANGE_DELAY = 40;
+
+    /**
+     * String for formatting the month name in the title text view.
+     */
+    private static final String FORMAT_MONTH_NAME = "MMMM, yyyy";
+
+    /**
+     * String for parsing dates.
+     */
+    private static final String DATE_FORMAT = "MM/dd/yyyy";
+
+    /**
+     * The default minimal date.
+     */
+    private static final String DEFAULT_MIN_DATE = "01/01/1900";
+
+    /**
+     * The default maximal date.
+     */
+    private static final String DEFAULT_MAX_DATE = "01/01/2100";
+
+    private static final int DEFAULT_SHOWN_WEEK_COUNT = 6;
+
+    private static final int DEFAULT_DATE_TEXT_SIZE = 14;
+
+    private static final int UNSCALED_SELECTED_DATE_VERTICAL_BAR_WIDTH = 6;
+
+    private static final int UNSCALED_WEEK_MIN_VISIBLE_HEIGHT = 12;
+
+    private static final int UNSCALED_LIST_SCROLL_TOP_OFFSET = 2;
+
+    private static final int UNSCALED_BOTTOM_BUFFER = 20;
+
+    private static final int UNSCALED_WEEK_SEPARATOR_LINE_WIDTH = 1;
+
+    private static final int DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID = -1;
+
+    private final int mWeekSeperatorLineWidth;
+
+    private final int mDateTextSize;
+
+    private final Drawable mSelectedDateVerticalBar;
+
+    private final int mSelectedDateVerticalBarWidth;
+
+    private final int mSelectedWeekBackgroundColor;
+
+    private final int mFocusedMonthDateColor;
+
+    private final int mUnfocusedMonthDateColor;
+
+    private final int mWeekSeparatorLineColor;
+
+    private final int mWeekNumberColor;
+
+    /**
+     * The top offset of the weeks list.
+     */
+    private int mListScrollTopOffset = 2;
+
+    /**
+     * The visible height of a week view.
+     */
+    private int mWeekMinVisibleHeight = 12;
+
+    /**
+     * The visible height of a week view.
+     */
+    private int mBottomBuffer = 20;
+
+    /**
+     * The number of shown weeks.
+     */
+    private int mShownWeekCount;
+
+    /**
+     * Flag whether to show the week number.
+     */
+    private boolean mShowWeekNumber;
+
+    /**
+     * The number of day per week to be shown.
+     */
+    private int mDaysPerWeek = 7;
+
+    /**
+     * The friction of the week list while flinging.
+     */
+    private float mFriction = .05f;
+
+    /**
+     * Scale for adjusting velocity of the week list while flinging.
+     */
+    private float mVelocityScale = 0.333f;
+
+    /**
+     * The adapter for the weeks list.
+     */
+    private WeeksAdapter mAdapter;
+
+    /**
+     * The weeks list.
+     */
+    private ListView mListView;
+
+    /**
+     * The name of the month to display.
+     */
+    private TextView mMonthName;
+
+    /**
+     * The header with week day names.
+     */
+    private ViewGroup mDayNamesHeader;
+
+    /**
+     * Cached labels for the week names header.
+     */
+    private String[] mDayLabels;
+
+    /**
+     * Temporary instance to avoid multiple instantiations.
+     */
+    private Calendar mTempDate = Calendar.getInstance();
+
+    /**
+     * The first day of the week.
+     */
+    private int mFirstDayOfWeek;
+
+    /**
+     * The first day of the focused month.
+     */
+    private Calendar mFirstDayOfMonth = Calendar.getInstance();
+
+    /**
+     * Which month should be displayed/highlighted [0-11].
+     */
+    private int mCurrentMonthDisplayed;
+
+    /**
+     * Used for tracking during a scroll.
+     */
+    private long mPreviousScrollPosition;
+
+    /**
+     * Used for tracking which direction the view is scrolling.
+     */
+    private boolean mIsScrollingUp = false;
+
+    /**
+     * The previous scroll state of the weeks ListView.
+     */
+    private int mPreviousScrollState = OnScrollListener.SCROLL_STATE_IDLE;
+
+    /**
+     * The current scroll state of the weeks ListView.
+     */
+    private int mCurrentScrollState = OnScrollListener.SCROLL_STATE_IDLE;
+
+    /**
+     * Listener for changes in the selected day.
+     */
+    private OnDateChangeListener mOnDateChangeListener;
+
+    /**
+     * Command for adjusting the position after a scroll/fling.
+     */
+    private ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable();
+
+    /**
+     * The start date of the range supported by this picker.
+     */
+    private Calendar mMinDate = Calendar.getInstance();
+
+    /**
+     * The end date of the range supported by this picker.
+     */
+    private Calendar mMaxDate = Calendar.getInstance();
+
+    /**
+     * Date format for parsing dates.
+     */
+    private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT);
+
+    /**
+     * The callback used to indicate the user changes the date.
+     */
+    public interface OnDateChangeListener {
+
+        /**
+         * Called upon change of the selected day.
+         *
+         * @param view The view associated with this listener.
+         * @param year The year that was set.
+         * @param month The month that was set [0-11].
+         * @param dayOfMonth The day of the month that was set.
+         */
+        public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth);
+    }
+
+    public CalendarView(Context context) {
+        this(context, null);
+    }
+
+    public CalendarView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CalendarView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, 0);
+
+        TypedValue calendarViewStyle = new TypedValue();
+        context.getTheme().resolveAttribute(R.attr.calendarViewStyle, calendarViewStyle, true);
+        TypedArray attributesArray = context.obtainStyledAttributes(calendarViewStyle.resourceId,
+                R.styleable.CalendarView);
+        mShowWeekNumber = attributesArray.getBoolean(R.styleable.CalendarView_showWeekNumber,
+                DEFAULT_SHOW_WEEK_NUMBER);
+        mFirstDayOfWeek = attributesArray.getInt(R.styleable.CalendarView_firstDayOfWeek,
+                LocaleData.get(Locale.getDefault()).firstDayOfWeek);
+        String minDate = attributesArray.getString(R.styleable.CalendarView_minDate);
+        if (TextUtils.isEmpty(minDate) || !parseDate(minDate, mMinDate)) {
+            parseDate(DEFAULT_MIN_DATE, mMinDate);
+        }
+        String maxDate = attributesArray.getString(R.styleable.CalendarView_maxDate);
+        if (TextUtils.isEmpty(maxDate) || !parseDate(maxDate, mMaxDate)) {
+            parseDate(DEFAULT_MAX_DATE, mMaxDate);
+        }
+        mShownWeekCount = attributesArray.getInt(R.styleable.CalendarView_shownWeekCount,
+                DEFAULT_SHOWN_WEEK_COUNT);
+        mSelectedWeekBackgroundColor = attributesArray.getColor(
+                R.styleable.CalendarView_selectedWeekBackgroundColor, 0);
+        mFocusedMonthDateColor = attributesArray.getColor(
+                R.styleable.CalendarView_focusedMonthDateColor, 0);
+        mUnfocusedMonthDateColor = attributesArray.getColor(
+                R.styleable.CalendarView_unfocusedMonthDateColor, 0);
+        mWeekSeparatorLineColor = attributesArray.getColor(
+                R.styleable.CalendarView_weekSeparatorLineColor, 0);
+        mWeekNumberColor = attributesArray.getColor(R.styleable.CalendarView_weekNumberColor, 0);
+        mSelectedDateVerticalBar = attributesArray.getDrawable(
+                R.styleable.CalendarView_selectedDateVerticalBar);
+
+        int dateTextAppearanceResId= attributesArray.getResourceId(
+                R.styleable.CalendarView_dateTextAppearance, R.style.TextAppearance_Small);
+        TypedArray dateTextAppearance = context.obtainStyledAttributes(dateTextAppearanceResId,
+                com.android.internal.R.styleable.TextAppearance);
+        mDateTextSize = dateTextAppearance.getDimensionPixelSize(
+                R.styleable.TextAppearance_textSize, DEFAULT_DATE_TEXT_SIZE);
+
+        int weekDayTextAppearanceResId = attributesArray.getResourceId(
+                R.styleable.CalendarView_weekDayTextAppearance,
+                DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
+        attributesArray.recycle();
+
+        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
+        mWeekMinVisibleHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                UNSCALED_WEEK_MIN_VISIBLE_HEIGHT, displayMetrics);
+        mListScrollTopOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                UNSCALED_LIST_SCROLL_TOP_OFFSET, displayMetrics);
+        mBottomBuffer = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                UNSCALED_BOTTOM_BUFFER, displayMetrics);
+        mSelectedDateVerticalBarWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                UNSCALED_SELECTED_DATE_VERTICAL_BAR_WIDTH, displayMetrics);
+        mWeekSeperatorLineWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                UNSCALED_WEEK_SEPARATOR_LINE_WIDTH, displayMetrics);
+
+        LayoutInflater layoutInflater = (LayoutInflater) mContext
+                .getSystemService(Service.LAYOUT_INFLATER_SERVICE);
+        View content = layoutInflater.inflate(R.layout.calendar_view, null, false);
+        addView(content);
+
+        mListView = (ListView) findViewById(R.id.list);
+        mDayNamesHeader = (ViewGroup) content.findViewById(com.android.internal.R.id.day_names);
+        mMonthName = (TextView) content.findViewById(com.android.internal.R.id.month_name);
+
+        setUpHeader(weekDayTextAppearanceResId);
+        setUpListView();
+        setUpAdapter();
+
+        // go to today now
+        mTempDate.setTimeInMillis(System.currentTimeMillis());
+        goTo(mTempDate, false, true, true);
+        invalidate();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        mListView.setEnabled(enabled);
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return mListView.isEnabled();
+    }
+
+    /**
+     * Gets the minimal date supported by this {@link CalendarView} in milliseconds
+     * since January 1, 1970 00:00:00 in {@link TimeZone#getDefault()} time
+     * zone.
+     * <p>
+     * Note: The default minimal date is 01/01/1900.
+     * <p>
+     *
+     * @return The minimal supported date.
+     */
+    public long getMinDate() {
+        return mMinDate.getTimeInMillis();
+    }
+
+    /**
+     * Sets the minimal date supported by this {@link CalendarView} in milliseconds
+     * since January 1, 1970 00:00:00 in {@link TimeZone#getDefault()} time
+     * zone.
+     *
+     * @param minDate The minimal supported date.
+     */
+    public void setMinDate(long minDate) {
+        mTempDate.setTimeInMillis(minDate);
+        if (isSameDate(mTempDate, mMinDate)) {
+            return;
+        }
+        mMinDate.setTimeInMillis(minDate);
+        // reinitialize the adapter since its range depends on min date
+        mAdapter.init();
+        Calendar date = mAdapter.mSelectedDate;
+        if (date.before(mMinDate)) {
+            setDate(mMinDate.getTimeInMillis());
+        } else {
+            // we go to the current date to force the ListView to query its
+            // adapter for the shown views since we have changed the adapter
+            // range and the base from which the later calculates item indices
+            // note that calling setDate will not work since the date is the same
+            goTo(date, false, true, false);
+        }
+    }
+
+    /**
+     * Gets the maximal date supported by this {@link CalendarView} in milliseconds
+     * since January 1, 1970 00:00:00 in {@link TimeZone#getDefault()} time
+     * zone.
+     * <p>
+     * Note: The default maximal date is 01/01/2100.
+     * <p>
+     *
+     * @return The maximal supported date.
+     */
+    public long getMaxDate() {
+        return mMaxDate.getTimeInMillis();
+    }
+
+    /**
+     * Sets the maximal date supported by this {@link CalendarView} in milliseconds
+     * since January 1, 1970 00:00:00 in {@link TimeZone#getDefault()} time
+     * zone.
+     *
+     * @param maxDate The maximal supported date.
+     */
+    public void setMaxDate(long maxDate) {
+        mTempDate.setTimeInMillis(maxDate);
+        if (isSameDate(mTempDate, mMaxDate)) {
+            return;
+        }
+        mMaxDate.setTimeInMillis(maxDate);
+        // reinitialize the adapter since its range depends on max date
+        mAdapter.init();
+        Calendar date = mAdapter.mSelectedDate;
+        if (date.after(mMaxDate)) {
+            setDate(mMaxDate.getTimeInMillis());
+        } else {
+            // we go to the current date to force the ListView to query its
+            // adapter for the shown views since we have changed the adapter
+            // range and the base from which the later calculates item indices
+            // note that calling setDate will not work since the date is the same
+            goTo(date, false, true, false);
+        }
+    }
+
+    /**
+     * Sets whether to show the week number.
+     *
+     * @param showWeekNumber True to show the week number.
+     */
+    public void setShowWeekNumber(boolean showWeekNumber) {
+        if (mShowWeekNumber == showWeekNumber) {
+            return;
+        }
+        mShowWeekNumber = showWeekNumber;
+        mAdapter.notifyDataSetChanged();
+        setUpHeader(DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
+    }
+
+    /**
+     * Gets whether to show the week number.
+     *
+     * @return True if showing the week number.
+     */
+    public boolean getShowWeekNumber() {
+        return mShowWeekNumber;
+    }
+
+    /**
+     * Gets the first day of week.
+     *
+     * @return The first day of the week conforming to the {@link CalendarView}
+     *         APIs.
+     * @see Calendar#MONDAY
+     * @see Calendar#TUESDAY
+     * @see Calendar#WEDNESDAY
+     * @see Calendar#THURSDAY
+     * @see Calendar#FRIDAY
+     * @see Calendar#SATURDAY
+     * @see Calendar#SUNDAY
+     */
+    public int getFirstDayOfWeek() {
+        return mFirstDayOfWeek;
+    }
+
+    /**
+     * Sets the first day of week.
+     *
+     * @param firstDayOfWeek The first day of the week conforming to the
+     *            {@link CalendarView} APIs.
+     * @see Calendar#MONDAY
+     * @see Calendar#TUESDAY
+     * @see Calendar#WEDNESDAY
+     * @see Calendar#THURSDAY
+     * @see Calendar#FRIDAY
+     * @see Calendar#SATURDAY
+     * @see Calendar#SUNDAY
+     */
+    public void setFirstDayOfWeek(int firstDayOfWeek) {
+        if (mFirstDayOfWeek == firstDayOfWeek) {
+            return;
+        }
+        mFirstDayOfWeek = firstDayOfWeek;
+        mAdapter.init();
+        mAdapter.notifyDataSetChanged();
+        setUpHeader(DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
+    }
+
+    /**
+     * Sets the listener to be notified upon selected date change.
+     *
+     * @param listener The listener to be notified.
+     */
+    public void setOnDateChangeListener(OnDateChangeListener listener) {
+        mOnDateChangeListener = listener;
+    }
+
+    /**
+     * Gets the selected date in milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     *
+     * @return The selected date.
+     */
+    public long getDate() {
+        return mAdapter.mSelectedDate.getTimeInMillis();
+    }
+
+    /**
+     * Sets the selected date in milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     *
+     * @param date The selected date.
+     *
+     * @throws IllegalArgumentException of the provided date is before the
+     *        minimal or after the maximal date.
+     *
+     * @see #setDate(long, boolean, boolean)
+     * @see #setMinDate(long)
+     * @see #setMaxDate(long)
+     */
+    public void setDate(long date) {
+        setDate(date, false, false);
+    }
+
+    /**
+     * Sets the selected date in milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     *
+     * @param date The date.
+     * @param animate Whether to animate the scroll to the current date.
+     * @param center Whether to center the current date even if it is already visible.
+     *
+     * @throws IllegalArgumentException of the provided date is before the
+     *        minimal or after the maximal date.
+     *
+     * @see #setMinDate(long)
+     * @see #setMaxDate(long)
+     */
+    public void setDate(long date, boolean animate, boolean center) {
+        mTempDate.setTimeInMillis(date);
+        if (isSameDate(mTempDate, mAdapter.mSelectedDate)) {
+            return;
+        }
+        goTo(mTempDate, animate, true, center);
+    }
+
+    /**
+     * @return True if the <code>firstDate</code> is the same as the <code>
+     * secondDate</code>.
+     */
+    private boolean isSameDate(Calendar firstDate, Calendar secondDate) {
+        return (firstDate.get(Calendar.DAY_OF_YEAR) == secondDate.get(Calendar.DAY_OF_YEAR)
+                && firstDate.get(Calendar.YEAR) == secondDate.get(Calendar.YEAR));
+    }
+
+    /**
+     * Creates a new adapter if necessary and sets up its parameters.
+     */
+    private void setUpAdapter() {
+        if (mAdapter == null) {
+            mAdapter = new WeeksAdapter(getContext());
+            mAdapter.registerDataSetObserver(new DataSetObserver() {
+                @Override
+                public void onChanged() {
+                    if (mOnDateChangeListener != null) {
+                        Calendar selectedDay = mAdapter.getSelectedDay();
+                        mOnDateChangeListener.onSelectedDayChange(CalendarView.this,
+                                selectedDay.get(Calendar.YEAR),
+                                selectedDay.get(Calendar.MONTH),
+                                selectedDay.get(Calendar.DAY_OF_MONTH));
+                    }
+                }
+            });
+            mListView.setAdapter(mAdapter);
+        }
+
+        // refresh the view with the new parameters
+        mAdapter.notifyDataSetChanged();
+    }
+
+    /**
+     * Sets up the strings to be used by the header.
+     */
+    private void setUpHeader(int weekDayTextAppearanceResId) {
+        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);
+        }
+
+        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);
+            if (weekDayTextAppearanceResId > -1) {
+                label.setTextAppearance(mContext, weekDayTextAppearanceResId);
+            }
+            if (i < mDaysPerWeek + 1) {
+                label.setText(mDayLabels[i - 1]);
+                label.setVisibility(View.VISIBLE);
+            } else {
+                label.setVisibility(View.GONE);
+            }
+        }
+        mDayNamesHeader.invalidate();
+    }
+
+    /**
+     * Sets all the required fields for the list view.
+     */
+    private void setUpListView() {
+        // Configure the listview
+        mListView.setDivider(null);
+        mListView.setItemsCanFocus(true);
+        mListView.setVerticalScrollBarEnabled(false);
+        mListView.setOnScrollListener(new OnScrollListener() {
+            public void onScrollStateChanged(AbsListView view, int scrollState) {
+                CalendarView.this.onScrollStateChanged(view, scrollState);
+            }
+
+            public void onScroll(
+                    AbsListView view, int firstVisibleItem, int visibleItemCount,
+                    int totalItemCount) {
+                CalendarView.this.onScroll(view, firstVisibleItem, visibleItemCount,
+                        totalItemCount);
+            }
+        });
+        // Make the scrolling behavior nicer
+        mListView.setFriction(mFriction);
+        mListView.setVelocityScale(mVelocityScale);
+    }
+
+    /**
+     * This moves to the specified time in the view. If the time is not already
+     * in range it will move the list so that the first of the month containing
+     * the time is at the top of the view. If the new time is already in view
+     * the list will not be scrolled unless forceScroll is true. This time may
+     * optionally be highlighted as selected as well.
+     *
+     * @param date The time to move to.
+     * @param animate Whether to scroll to the given time or just redraw at the
+     *            new location.
+     * @param setSelected Whether to set the given time as selected.
+     * @param forceScroll Whether to recenter even if the time is already
+     *            visible.
+     *
+     * @throws IllegalArgumentException of the provided date is before the
+     *        range start of after the range end.
+     */
+    private void goTo(Calendar date, boolean animate, boolean setSelected, boolean forceScroll) {
+        if (date.before(mMinDate) || date.after(mMaxDate)) {
+            throw new IllegalArgumentException("Time not between " + mMinDate.getTime()
+                    + " and " + mMaxDate.getTime());
+        }
+        // Find the first and last entirely visible weeks
+        int firstFullyVisiblePosition = mListView.getFirstVisiblePosition();
+        View firstChild = mListView.getChildAt(0);
+        if (firstChild != null && firstChild.getTop() < 0) {
+            firstFullyVisiblePosition++;
+        }
+        int lastFullyVisiblePosition = firstFullyVisiblePosition + mShownWeekCount - 1;
+        if (firstChild != null && firstChild.getTop() > mBottomBuffer) {
+            lastFullyVisiblePosition--;
+        }
+        if (setSelected) {
+            mAdapter.setSelectedDay(date);
+        }
+        // Get the week we're going to
+        int position = getWeeksSinceMinDate(date);
+
+        // Check if the selected day is now outside of our visible range
+        // and if so scroll to the month that contains it
+        if (position < firstFullyVisiblePosition || position > lastFullyVisiblePosition
+                || forceScroll) {
+            mFirstDayOfMonth.setTimeInMillis(date.getTimeInMillis());
+            mFirstDayOfMonth.set(Calendar.DAY_OF_MONTH, 1);
+
+            setMonthDisplayed(mFirstDayOfMonth);
+            position = getWeeksSinceMinDate(mFirstDayOfMonth);
+
+            mPreviousScrollState = OnScrollListener.SCROLL_STATE_FLING;
+            if (animate) {
+                mListView.smoothScrollToPositionFromTop(position, mListScrollTopOffset,
+                        GOTO_SCROLL_DURATION);
+            } else {
+                mListView.setSelectionFromTop(position, mListScrollTopOffset);
+                // Perform any after scroll operations that are needed
+                onScrollStateChanged(mListView, OnScrollListener.SCROLL_STATE_IDLE);
+            }
+        } else if (setSelected) {
+            // Otherwise just set the selection
+            setMonthDisplayed(date);
+        }
+    }
+
+    /**
+     * Parses the given <code>date</code> and in case of success sets
+     * the result to the <code>outDate</code>.
+     *
+     * @return True if the date was parsed.
+     */
+    private boolean parseDate(String date, Calendar outDate) {
+        try {
+            outDate.setTime(mDateFormat.parse(date));
+            return true;
+        } catch (ParseException e) {
+            Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT);
+            return false;
+        }
+    }
+
+    /**
+     * Called when a <code>view</code> transitions to a new <code>scrollState
+     * </code>.
+     */
+    private void onScrollStateChanged(AbsListView view, int scrollState) {
+        mScrollStateChangedRunnable.doScrollStateChange(view, scrollState);
+    }
+
+    /**
+     * Updates the title and selected month if the <code>view</code> has moved to a new
+     * month.
+     */
+    private void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
+            int totalItemCount) {
+        WeekView child = (WeekView) view.getChildAt(0);
+        if (child == null) {
+            return;
+        }
+
+        // Figure out where we are
+        long currScroll = view.getFirstVisiblePosition() * child.getHeight() - child.getBottom();
+
+        // If we have moved since our last call update the direction
+        if (currScroll < mPreviousScrollPosition) {
+            mIsScrollingUp = true;
+        } else if (currScroll > mPreviousScrollPosition) {
+            mIsScrollingUp = false;
+        } else {
+            return;
+        }
+
+        // Use some hysteresis for checking which month to highlight. This
+        // causes the month to transition when two full weeks of a month are
+        // visible when scrolling up, and when the first day in a month reaches
+        // the top of the screen when scrolling down.
+        int offset = child.getBottom() < mWeekMinVisibleHeight ? 1 : 0;
+        if (mIsScrollingUp) {
+            child = (WeekView) view.getChildAt(SCROLL_HYST_WEEKS + offset);
+        } else if (offset != 0) {
+            child = (WeekView) view.getChildAt(offset);
+        }
+
+        // Find out which month we're moving into
+        int month;
+        if (mIsScrollingUp) {
+            month = child.getMonthOfFirstWeekDay();
+        } else {
+            month = child.getMonthOfLastWeekDay();
+        }
+
+        // And how it relates to our current highlighted month
+        int monthDiff;
+        if (mCurrentMonthDisplayed == 11 && month == 0) {
+            monthDiff = 1;
+        } else if (mCurrentMonthDisplayed == 0 && month == 11) {
+            monthDiff = -1;
+        } else {
+            monthDiff = month - mCurrentMonthDisplayed;
+        }
+
+        // Only switch months if we're scrolling away from the currently
+        // selected month
+        if ((!mIsScrollingUp && monthDiff > 0) || (mIsScrollingUp && monthDiff < 0)) {
+            Calendar firstDay = child.getFirstDay();
+            if (mIsScrollingUp) {
+                firstDay.add(Calendar.DAY_OF_MONTH, -DAYS_PER_WEEK);
+            } else {
+                firstDay.add(Calendar.DAY_OF_MONTH, DAYS_PER_WEEK);
+            }
+            setMonthDisplayed(firstDay);
+        }
+        mPreviousScrollPosition = currScroll;
+        mPreviousScrollState = mCurrentScrollState;
+    }
+
+    /**
+     * Sets the month displayed at the top of this view based on time. Override
+     * to add custom events when the title is changed.
+     *
+     * @param calendar A day in the new focus month.
+     */
+    private void setMonthDisplayed(Calendar calendar) {
+        mMonthName.setText(DateFormat.format(FORMAT_MONTH_NAME, calendar));
+        mMonthName.invalidate();
+        mCurrentMonthDisplayed = calendar.get(Calendar.MONTH);
+        mAdapter.setFocusMonth(mCurrentMonthDisplayed);
+        // TODO Send Accessibility Event
+    }
+
+    /**
+     * @return Returns the number of weeks between the current <code>date</code>
+     *         and the <code>mMinDate</code>.
+     */
+    private int getWeeksSinceMinDate(Calendar date) {
+        if (date.before(mMinDate)) {
+            throw new IllegalArgumentException("fromDate: " + mMinDate.getTime()
+                    + " does not precede toDate: " + date.getTime());
+        }
+        int fromDateDayOfWeek = mMinDate.get(Calendar.DAY_OF_WEEK);
+        long diff = (fromDateDayOfWeek - mFirstDayOfWeek) * MILLIS_IN_DAY;
+        long refDay = mMinDate.getTimeInMillis() - diff;
+        return (int) ((date.getTimeInMillis() - refDay) / MILLIS_IN_WEEK);
+    }
+
+    /**
+     * Command responsible for acting upon scroll state changes.
+     */
+    private class ScrollStateRunnable implements Runnable {
+        private AbsListView mView;
+
+        private int mNewState;
+
+        /**
+         * Sets up the runnable with a short delay in case the scroll state
+         * immediately changes again.
+         *
+         * @param view The list view that changed state
+         * @param scrollState The new state it changed to
+         */
+        public void doScrollStateChange(AbsListView view, int scrollState) {
+            mView = view;
+            mNewState = scrollState;
+            removeCallbacks(this);
+            postDelayed(this, SCROLL_CHANGE_DELAY);
+        }
+
+        public void run() {
+            mCurrentScrollState = mNewState;
+            // Fix the position after a scroll or a fling ends
+            if (mNewState == OnScrollListener.SCROLL_STATE_IDLE
+                    && mPreviousScrollState != OnScrollListener.SCROLL_STATE_IDLE) {
+                View child = mView.getChildAt(0);
+                if (child == null) {
+                    // The view is no longer visible, just return
+                    return;
+                }
+                int dist = child.getBottom() - mListScrollTopOffset;
+                if (dist > mListScrollTopOffset) {
+                    if (mIsScrollingUp) {
+                        mView.smoothScrollBy(dist - child.getHeight(), ADJUSTMENT_SCROLL_DURATION);
+                    } else {
+                        mView.smoothScrollBy(dist, ADJUSTMENT_SCROLL_DURATION);
+                    }
+                }
+            }
+            mPreviousScrollState = mNewState;
+        }
+    }
+
+    /**
+     * <p>
+     * This is a specialized adapter for creating a list of weeks with
+     * selectable days. It can be configured to display the week number, start
+     * the week on a given day, show a reduced number of days, or display an
+     * arbitrary number of weeks at a time.
+     * </p>
+     */
+    private class WeeksAdapter extends BaseAdapter implements OnTouchListener {
+
+        private int mSelectedWeek;
+
+        private GestureDetector mGestureDetector;
+
+        private int mFocusedMonth;
+
+        private final Calendar mSelectedDate = Calendar.getInstance();
+
+        private int mTotalWeekCount;
+
+        public WeeksAdapter(Context context) {
+            mContext = context;
+            mGestureDetector = new GestureDetector(mContext, new CalendarGestureListener());
+            init();
+        }
+
+        /**
+         * Set up the gesture detector and selected time
+         */
+        private void init() {
+            mSelectedWeek = getWeeksSinceMinDate(mSelectedDate);
+            mTotalWeekCount = getWeeksSinceMinDate(mMaxDate);
+            if (mMinDate.get(Calendar.DAY_OF_WEEK) != mFirstDayOfWeek
+                || mMaxDate.get(Calendar.DAY_OF_WEEK) != mFirstDayOfWeek) {
+                mTotalWeekCount++;
+            }
+        }
+
+        /**
+         * Updates the selected day and related parameters.
+         *
+         * @param selectedDay The time to highlight
+         */
+        public void setSelectedDay(Calendar selectedDay) {
+            if (selectedDay.get(Calendar.DAY_OF_YEAR) == mSelectedDate.get(Calendar.DAY_OF_YEAR)
+                    && selectedDay.get(Calendar.YEAR) == mSelectedDate.get(Calendar.YEAR)) {
+                return;
+            }
+            mSelectedDate.setTimeInMillis(selectedDay.getTimeInMillis());
+            mSelectedWeek = getWeeksSinceMinDate(mSelectedDate);
+            mFocusedMonth = mSelectedDate.get(Calendar.MONTH);
+            notifyDataSetChanged();
+        }
+
+        /**
+         * @return The selected day of month.
+         */
+        public Calendar getSelectedDay() {
+            return mSelectedDate;
+        }
+
+        @Override
+        public int getCount() {
+            return mTotalWeekCount;
+        }
+
+        @Override
+        public Object getItem(int position) {
+            return null;
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            WeekView weekView = null;
+            if (convertView != null) {
+                weekView = (WeekView) convertView;
+            } else {
+                weekView = new WeekView(mContext);
+                android.widget.AbsListView.LayoutParams params =
+                    new android.widget.AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT,
+                            LayoutParams.WRAP_CONTENT);
+                weekView.setLayoutParams(params);
+                weekView.setClickable(true);
+                weekView.setOnTouchListener(this);
+            }
+
+            int selectedWeekDay = (mSelectedWeek == position) ? mSelectedDate.get(
+                    Calendar.DAY_OF_WEEK) : -1;
+            weekView.init(position, selectedWeekDay, mFocusedMonth);
+
+            return weekView;
+        }
+
+        /**
+         * Changes which month is in focus and updates the view.
+         *
+         * @param month The month to show as in focus [0-11]
+         */
+        public void setFocusMonth(int month) {
+            if (mFocusedMonth == month) {
+                return;
+            }
+            mFocusedMonth = month;
+            notifyDataSetChanged();
+        }
+
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            if (mListView.isEnabled() && mGestureDetector.onTouchEvent(event)) {
+                WeekView weekView = (WeekView) v;
+                weekView.getDayFromLocation(event.getX(), mTempDate);
+                // it is possible that the touched day is outside the valid range
+                // we draw whole weeks but range end can fall not on the week end
+                if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) {
+                    return true;
+                }
+                onDateTapped(mTempDate);
+                return true;
+            }
+            return false;
+        }
+
+        /**
+         * Maintains the same hour/min/sec but moves the day to the tapped day.
+         *
+         * @param day The day that was tapped
+         */
+        private void onDateTapped(Calendar day) {
+            setSelectedDay(day);
+            setMonthDisplayed(day);
+        }
+
+        /**
+         * This is here so we can identify single tap events and set the
+         * selected day correctly
+         */
+        class CalendarGestureListener extends GestureDetector.SimpleOnGestureListener {
+            @Override
+            public boolean onSingleTapUp(MotionEvent e) {
+                return true;
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * This is a dynamic view for drawing a single week. It can be configured to
+     * display the week number, start the week on a given day, or show a reduced
+     * number of days. It is intended for use as a single view within a
+     * ListView. See {@link WeeksAdapter} for usage.
+     * </p>
+     */
+    private class WeekView extends View {
+
+        private final Rect mTempRect = new Rect();
+
+        private final Paint mDrawPaint = new Paint();
+
+        private final Paint mMonthNumDrawPaint = new Paint();
+
+        // Cache the number strings so we don't have to recompute them each time
+        private String[] mDayNumbers;
+
+        // Quick lookup for checking which days are in the focus month
+        private boolean[] mFocusDay;
+
+        // The first day displayed by this item
+        private Calendar mFirstDay;
+
+        // The month of the first day in this week
+        private int mMonthOfFirstWeekDay = -1;
+
+        // The month of the last day in this week
+        private int mLastWeekDayMonth = -1;
+
+        // The position of this week, equivalent to weeks since the week of Jan
+        // 1st, 1900
+        private int mWeek = -1;
+
+        // Quick reference to the width of this view, matches parent
+        private int mWidth;
+
+        // The height this view should draw at in pixels, set by height param
+        private int mHeight;
+
+        // If this view contains the selected day
+        private boolean mHasSelectedDay = false;
+
+        // Which day is selected [0-6] or -1 if no day is selected
+        private int mSelectedDay = -1;
+
+        // The number of days + a spot for week number if it is displayed
+        private int mNumCells;
+
+        // The left edge of the selected day
+        private int mSelectedLeft = -1;
+
+        // The right edge of the selected day
+        private int mSelectedRight = -1;
+
+        public WeekView(Context context) {
+            super(context);
+
+            mHeight = (mListView.getHeight() - mListView.getPaddingTop() - mListView
+                    .getPaddingBottom()) / mShownWeekCount;
+
+            // Sets up any standard paints that will be used
+            setPaintProperties();
+        }
+
+        /**
+         * Initializes this week view.
+         *
+         * @param weekNumber The number of the week this view represents. The
+         *            week number is a zero based index of the weeks since
+         *            {@link CalendarView#getMinDate()}.
+         * @param selectedWeekDay The selected day of the week from 0 to 6, -1 if no
+         *            selected day.
+         * @param focusedMonth The month that is currently in focus i.e.
+         *            highlighted.
+         */
+        public void init(int weekNumber, int selectedWeekDay, int focusedMonth) {
+            mSelectedDay = selectedWeekDay;
+            mHasSelectedDay = mSelectedDay != -1;
+            mNumCells = mShowWeekNumber ? mDaysPerWeek + 1 : mDaysPerWeek;
+            mWeek = weekNumber;
+            mTempDate.setTimeInMillis(mMinDate.getTimeInMillis());
+            mTempDate.add(Calendar.WEEK_OF_YEAR, mWeek);
+            mTempDate.setFirstDayOfWeek(mFirstDayOfWeek);
+
+            // Allocate space for caching the day numbers and focus values
+            mDayNumbers = new String[mNumCells];
+            mFocusDay = new boolean[mNumCells];
+
+            // If we're showing the week number calculate it based on Monday
+            int i = 0;
+            if (mShowWeekNumber) {
+                mDayNumbers[0] = Integer.toString(mTempDate.get(Calendar.WEEK_OF_YEAR));
+                i++;
+            }
+
+            // Now adjust our starting day based on the start day of the week
+            int diff = mFirstDayOfWeek - mTempDate.get(Calendar.DAY_OF_WEEK);
+            mTempDate.add(Calendar.DAY_OF_MONTH, diff);
+
+            mFirstDay = (Calendar) mTempDate.clone();
+            mMonthOfFirstWeekDay = mTempDate.get(Calendar.MONTH);
+
+            for (; i < mNumCells; i++) {
+                mFocusDay[i] = (mTempDate.get(Calendar.MONTH) == focusedMonth);
+                // do not draw dates outside the valid range to avoid user confusion
+                if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) {
+                    mDayNumbers[i] = "";
+                } else {
+                    mDayNumbers[i] = Integer.toString(mTempDate.get(Calendar.DAY_OF_MONTH));
+                }
+                mTempDate.add(Calendar.DAY_OF_MONTH, 1);
+            }
+            // We do one extra add at the end of the loop, if that pushed us to
+            // new month undo it
+            if (mTempDate.get(Calendar.DAY_OF_MONTH) == 1) {
+                mTempDate.add(Calendar.DAY_OF_MONTH, -1);
+            }
+            mLastWeekDayMonth = mTempDate.get(Calendar.MONTH);
+
+            updateSelectionPositions();
+        }
+
+        /**
+         * Sets up the text and style properties for painting.
+         */
+        private void setPaintProperties() {
+            mDrawPaint.setFakeBoldText(false);
+            mDrawPaint.setAntiAlias(true);
+            mDrawPaint.setTextSize(mDateTextSize);
+            mDrawPaint.setStyle(Style.FILL);
+
+            mMonthNumDrawPaint.setFakeBoldText(true);
+            mMonthNumDrawPaint.setAntiAlias(true);
+            mMonthNumDrawPaint.setTextSize(mDateTextSize);
+            mMonthNumDrawPaint.setColor(mFocusedMonthDateColor);
+            mMonthNumDrawPaint.setStyle(Style.FILL);
+            mMonthNumDrawPaint.setTextAlign(Align.CENTER);
+        }
+
+        /**
+         * Returns the month of the first day in this week.
+         *
+         * @return The month the first day of this view is in.
+         */
+        public int getMonthOfFirstWeekDay() {
+            return mMonthOfFirstWeekDay;
+        }
+
+        /**
+         * Returns the month of the last day in this week
+         *
+         * @return The month the last day of this view is in
+         */
+        public int getMonthOfLastWeekDay() {
+            return mLastWeekDayMonth;
+        }
+
+        /**
+         * Returns the first day in this view.
+         *
+         * @return The first day in the view.
+         */
+        public Calendar getFirstDay() {
+            return mFirstDay;
+        }
+
+        /**
+         * Calculates the day that the given x position is in, accounting for
+         * week number. Returns a Time referencing that day or null if
+         *
+         * @param x The x position of the touch eventy
+         */
+        public void getDayFromLocation(float x, Calendar outCalendar) {
+            int dayStart = mShowWeekNumber ? mWidth / mNumCells : 0;
+            if (x < dayStart || x > mWidth) {
+                outCalendar.clear();
+                return;
+            }
+            // Selection is (x - start) / (pixels/day) == (x -s) * day / pixels
+            int dayPosition = (int) ((x - dayStart) * mDaysPerWeek
+                    / (mWidth - dayStart));
+            outCalendar.setTimeInMillis(mFirstDay.getTimeInMillis());
+            outCalendar.add(Calendar.DAY_OF_MONTH, dayPosition);
+        }
+
+        @Override
+        protected void onDraw(Canvas canvas) {
+            drawBackground(canvas);
+            drawWeekNumbers(canvas);
+            drawWeekSeparators(canvas);
+            drawSelectedDateVerticalBars(canvas);
+        }
+
+        /**
+         * This draws the selection highlight if a day is selected in this week.
+         *
+         * @param canvas The canvas to draw on
+         */
+        private void drawBackground(Canvas canvas) {
+            if (!mHasSelectedDay) {
+                return;
+            }
+            mDrawPaint.setColor(mSelectedWeekBackgroundColor);
+
+            mTempRect.top = mWeekSeperatorLineWidth;
+            mTempRect.bottom = mHeight;
+            mTempRect.left = mShowWeekNumber ? mWidth / mNumCells : 0;
+            mTempRect.right = mSelectedLeft - 2;
+            canvas.drawRect(mTempRect, mDrawPaint);
+
+            mTempRect.left = mSelectedRight + 3;
+            mTempRect.right = mWidth;
+            canvas.drawRect(mTempRect, mDrawPaint);
+        }
+
+        /**
+         * Draws the week and month day numbers for this week.
+         *
+         * @param canvas The canvas to draw on
+         */
+        private void drawWeekNumbers(Canvas canvas) {
+            float textHeight = mDrawPaint.getTextSize();
+            int y = (int) ((mHeight + textHeight) / 2) - mWeekSeperatorLineWidth;
+            int nDays = mNumCells;
+
+            mDrawPaint.setTextAlign(Align.CENTER);
+            int i = 0;
+            int divisor = 2 * nDays;
+            if (mShowWeekNumber) {
+                mDrawPaint.setColor(mWeekNumberColor);
+                int x = mWidth / divisor;
+                canvas.drawText(mDayNumbers[0], x, y, mDrawPaint);
+                i++;
+            }
+            for (; i < nDays; i++) {
+                mMonthNumDrawPaint.setColor(mFocusDay[i] ? mFocusedMonthDateColor
+                        : mUnfocusedMonthDateColor);
+                int x = (2 * i + 1) * mWidth / divisor;
+                canvas.drawText(mDayNumbers[i], x, y, mMonthNumDrawPaint);
+            }
+        }
+
+        /**
+         * Draws a horizontal line for separating the weeks.
+         *
+         * @param canvas The canvas to draw on.
+         */
+        private void drawWeekSeparators(Canvas canvas) {
+            // If it is the topmost fully visible child do not draw separator line
+            int firstFullyVisiblePosition = mListView.getFirstVisiblePosition();
+            if (mListView.getChildAt(0).getTop() < 0) {
+                firstFullyVisiblePosition++;
+            }
+            if (firstFullyVisiblePosition == mWeek) {
+                return;
+            }
+            mDrawPaint.setColor(mWeekSeparatorLineColor);
+            mDrawPaint.setStrokeWidth(mWeekSeperatorLineWidth);
+            float x = mShowWeekNumber ? mWidth / mNumCells : 0;
+            canvas.drawLine(x, 0, mWidth, 0, mDrawPaint);
+        }
+
+        /**
+         * Draws the selected date bars if this week has a selected day.
+         *
+         * @param canvas The canvas to draw on
+         */
+        private void drawSelectedDateVerticalBars(Canvas canvas) {
+            if (!mHasSelectedDay) {
+                return;
+            }
+            mSelectedDateVerticalBar.setBounds(mSelectedLeft - mSelectedDateVerticalBarWidth / 2,
+                    mWeekSeperatorLineWidth,
+                    mSelectedLeft + mSelectedDateVerticalBarWidth / 2, mHeight);
+            mSelectedDateVerticalBar.draw(canvas);
+            mSelectedDateVerticalBar.setBounds(mSelectedRight - mSelectedDateVerticalBarWidth / 2,
+                    mWeekSeperatorLineWidth,
+                    mSelectedRight + mSelectedDateVerticalBarWidth / 2, mHeight);
+            mSelectedDateVerticalBar.draw(canvas);
+        }
+
+        @Override
+        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+            mWidth = w;
+            updateSelectionPositions();
+        }
+
+        /**
+         * This calculates the positions for the selected day lines.
+         */
+        private void updateSelectionPositions() {
+            if (mHasSelectedDay) {
+                int selectedPosition = mSelectedDay - mFirstDayOfWeek;
+                if (selectedPosition < 0) {
+                    selectedPosition += 7;
+                }
+                if (mShowWeekNumber) {
+                    selectedPosition++;
+                }
+                mSelectedLeft = selectedPosition * mWidth / mNumCells;
+                mSelectedRight = (selectedPosition + 1) * mWidth / mNumCells;
+            }
+        }
+
+        @Override
+        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+            setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mHeight);
+        }
+    }
+}
diff --git a/core/java/android/widget/CursorAdapter.java b/core/java/android/widget/CursorAdapter.java
index 4cf8785..516162a 100644
--- a/core/java/android/widget/CursorAdapter.java
+++ b/core/java/android/widget/CursorAdapter.java
@@ -67,7 +67,7 @@
      * This field should be made private, so it is hidden from the SDK.
      * {@hide}
      */
-    protected DataSetObserver mDataSetObserver = new MyDataSetObserver();
+    protected DataSetObserver mDataSetObserver;
     /**
      * This field should be made private, so it is hidden from the SDK.
      * {@hide}
@@ -81,54 +81,81 @@
 
     /**
      * If set the adapter will call requery() on the cursor whenever a content change
-     * notification is delivered. Implies {@link #FLAG_REGISTER_CONTENT_OBSERVER}
+     * notification is delivered. Implies {@link #FLAG_REGISTER_CONTENT_OBSERVER}.
+     *
+     * @deprecated This option is discouraged, as it results in Cursor queries
+     * being performed on the application's UI thread and thus can cause poor
+     * responsiveness or even Application Not Responding errors.  As an alternative,
+     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
      */
+    @Deprecated
     public static final int FLAG_AUTO_REQUERY = 0x01;
 
     /**
      * If set the adapter will register a content observer on the cursor and will call
-     * {@link #onContentChanged()} when a notification comes in.
+     * {@link #onContentChanged()} when a notification comes in.  Be careful when
+     * using this flag: you will need to unset the current Cursor from the adapter
+     * to avoid leaks due to its registered observers.  This flag is not needed
+     * when using a CursorAdapter with a
+     * {@link android.content.CursorLoader}.
      */
     public static final int FLAG_REGISTER_CONTENT_OBSERVER = 0x02;
 
     /**
-     * Constructor. The adapter will call requery() on the cursor whenever
-     * it changes so that the most recent data is always displayed.
+     * Constructor that always enables auto-requery.
+     *
+     * @deprecated This option is discouraged, as it results in Cursor queries
+     * being performed on the application's UI thread and thus can cause poor
+     * responsiveness or even Application Not Responding errors.  As an alternative,
+     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
      *
      * @param c The cursor from which to get the data.
      * @param context The context
      */
+    @Deprecated
     public CursorAdapter(Context context, Cursor c) {
         init(context, c, FLAG_AUTO_REQUERY);
     }
 
     /**
-     * Constructor
+     * Constructor that allows control over auto-requery.  It is recommended
+     * you not use this, but instead {@link #CursorAdapter(Context, Cursor, int)}.
+     * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER}
+     * will always be set.
+     *
      * @param c The cursor from which to get the data.
      * @param context The context
      * @param autoRequery If true the adapter will call requery() on the
      *                    cursor whenever it changes so the most recent
-     *                    data is always displayed.
+     *                    data is always displayed.  Using true here is discouraged.
      */
     public CursorAdapter(Context context, Cursor c, boolean autoRequery) {
         init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER);
     }
 
     /**
-     * Constructor
+     * Recommended constructor.
+     *
      * @param c The cursor from which to get the data.
      * @param context The context
-     * @param flags flags used to determine the behavior of the adapter
+     * @param flags Flags used to determine the behavior of the adapter; may
+     * be any combination of {@link #FLAG_AUTO_REQUERY} and
+     * {@link #FLAG_REGISTER_CONTENT_OBSERVER}.
      */
     public CursorAdapter(Context context, Cursor c, int flags) {
         init(context, c, flags);
     }
 
+    /**
+     * @deprecated Don't use this, use the normal constructor.  This will
+     * be removed in the future.
+     */
+    @Deprecated
     protected void init(Context context, Cursor c, boolean autoRequery) {
         init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER);
     }
 
-    protected void init(Context context, Cursor c, int flags) {
+    void init(Context context, Cursor c, int flags) {
         if ((flags & FLAG_AUTO_REQUERY) == FLAG_AUTO_REQUERY) {
             flags |= FLAG_REGISTER_CONTENT_OBSERVER;
             mAutoRequery = true;
@@ -142,13 +169,15 @@
         mRowIDColumn = cursorPresent ? c.getColumnIndexOrThrow("_id") : -1;
         if ((flags & FLAG_REGISTER_CONTENT_OBSERVER) == FLAG_REGISTER_CONTENT_OBSERVER) {
             mChangeObserver = new ChangeObserver();
+            mDataSetObserver = new MyDataSetObserver();
         } else {
             mChangeObserver = null;
+            mDataSetObserver = null;
         }
 
         if (cursorPresent) {
             if (mChangeObserver != null) c.registerContentObserver(mChangeObserver);
-            c.registerDataSetObserver(mDataSetObserver);
+            if (mDataSetObserver != null) c.registerDataSetObserver(mDataSetObserver);
         }
     }
 
@@ -275,22 +304,39 @@
      * Change the underlying cursor to a new cursor. If there is an existing cursor it will be
      * closed.
      * 
-     * @param cursor the new cursor to be used
+     * @param cursor The new cursor to be used
      */
     public void changeCursor(Cursor cursor) {
-        if (cursor == mCursor) {
-            return;
+        Cursor old = swapCursor(cursor);
+        if (old != null) {
+            old.close();
         }
-        if (mCursor != null) {
-            if (mChangeObserver != null) mCursor.unregisterContentObserver(mChangeObserver);
-            mCursor.unregisterDataSetObserver(mDataSetObserver);
-            mCursor.close();
+    }
+
+    /**
+     * Swap in a new Cursor, returning the old Cursor.  Unlike
+     * {@link #changeCursor(Cursor)}, the returned old Cursor is <em>not</em>
+     * closed.
+     *
+     * @param newCursor The new cursor to be used.
+     * @return Returns the previously set Cursor, or null if there wasa not one.
+     * If the given new Cursor is the same instance is the previously set
+     * Cursor, null is also returned.
+     */
+    public Cursor swapCursor(Cursor newCursor) {
+        if (newCursor == mCursor) {
+            return null;
         }
-        mCursor = cursor;
-        if (cursor != null) {
-            if (mChangeObserver != null) cursor.registerContentObserver(mChangeObserver);
-            cursor.registerDataSetObserver(mDataSetObserver);
-            mRowIDColumn = cursor.getColumnIndexOrThrow("_id");
+        Cursor oldCursor = mCursor;
+        if (oldCursor != null) {
+            if (mChangeObserver != null) oldCursor.unregisterContentObserver(mChangeObserver);
+            if (mDataSetObserver != null) oldCursor.unregisterDataSetObserver(mDataSetObserver);
+        }
+        mCursor = newCursor;
+        if (newCursor != null) {
+            if (mChangeObserver != null) newCursor.registerContentObserver(mChangeObserver);
+            if (mDataSetObserver != null) newCursor.registerDataSetObserver(mDataSetObserver);
+            mRowIDColumn = newCursor.getColumnIndexOrThrow("_id");
             mDataValid = true;
             // notify the observers about the new cursor
             notifyDataSetChanged();
@@ -300,6 +346,7 @@
             // notify the observers about the lack of a data set
             notifyDataSetInvalidated();
         }
+        return oldCursor;
     }
 
     /**
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index e98c0bd..493b881 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -23,56 +23,96 @@
 import android.content.res.TypedArray;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.text.TextUtils;
 import android.text.format.DateFormat;
 import android.text.format.DateUtils;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.util.SparseArray;
 import android.view.LayoutInflater;
-import android.widget.NumberPicker.OnChangeListener;
+import android.widget.NumberPicker.OnValueChangedListener;
 
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Locale;
+import java.util.TimeZone;
 
 /**
- * A view for selecting a month / year / day based on a calendar like layout.
+ * This class is a widget for selecting a date. The date can be selected by a
+ * year, month, and day spinners or a {@link CalendarView}. The set of spinners
+ * and the calendar view are automatically synchronized. The client can
+ * customize whether only the spinners, or only the calendar view, or both to be
+ * displayed. Also the minimal and maximal date from which dates to be selected
+ * can be customized.
  * <p>
  * See the <a href="{@docRoot}
  * resources/tutorials/views/hello-datepicker.html">Date Picker tutorial</a>.
  * </p>
+ * <p>
  * For a dialog using this view, see {@link android.app.DatePickerDialog}.
+ * </p>
+ *
+ * @attr ref android.R.styleable#DatePicker_startYear
+ * @attr ref android.R.styleable#DatePicker_endYear
+ * @attr ref android.R.styleable#DatePicker_maxDate
+ * @attr ref android.R.styleable#DatePicker_minDate
+ * @attr ref android.R.styleable#DatePicker_spinnersShown
+ * @attr ref android.R.styleable#DatePicker_calendarViewShown
  */
 @Widget
 public class DatePicker extends FrameLayout {
 
+    private static final String LOG_TAG = DatePicker.class.getSimpleName();
+
+    private static final String DATE_FORMAT = "MM/dd/yyyy";
+
     private static final int DEFAULT_START_YEAR = 1900;
 
     private static final int DEFAULT_END_YEAR = 2100;
 
-    private final NumberPicker mDayPicker;
+    private static final boolean DEFAULT_CALENDAR_VIEW_SHOWN = true;
 
-    private final NumberPicker mMonthPicker;
+    private static final boolean DEFAULT_SPINNERS_SHOWN = true;
 
-    private final NumberPicker mYearPicker;
+    private final NumberPicker mDaySpinner;
 
-    private final DayPicker mMiniMonthDayPicker;
+    private final LinearLayout mSpinners;
+
+    private final NumberPicker mMonthSpinner;
+
+    private final NumberPicker mYearSpinner;
+
+    private final CalendarView mCalendarView;
 
     private OnDateChangedListener mOnDateChangedListener;
 
     private Locale mMonthLocale;
 
-    private final Calendar mTempCalendar = Calendar.getInstance();
+    private final Calendar mTempDate = Calendar.getInstance();
 
-    private final int mNumberOfMonths = mTempCalendar.getActualMaximum(Calendar.MONTH) + 1;
+    private final int mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1;
 
     private final String[] mShortMonths = new String[mNumberOfMonths];
 
+    private final java.text.DateFormat mDateFormat = new SimpleDateFormat(DATE_FORMAT);
+
+    private final Calendar mMinDate = Calendar.getInstance();
+
+    private final Calendar mMaxDate = Calendar.getInstance();
+
+    private final Calendar mCurrentDate = Calendar.getInstance();
+
+    private boolean mIsEnabled;
+
     /**
-     * The callback used to indicate the user changes the date.
+     * The callback used to indicate the user changes\d the date.
      */
     public interface OnDateChangedListener {
 
         /**
+         * Called upon a date change.
+         *
          * @param view The view associated with this listener.
          * @param year The year that was set.
          * @param monthOfYear The month that was set (0-11) for compatibility
@@ -93,74 +133,227 @@
     public DatePicker(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
 
+        TypedArray attributesArray = context.obtainStyledAttributes(attrs, R.styleable.DatePicker);
+        boolean spinnersShown = attributesArray.getBoolean(R.styleable.DatePicker_spinnersShown,
+                DEFAULT_SPINNERS_SHOWN);
+        boolean calendarViewShown = attributesArray.getBoolean(
+                R.styleable.DatePicker_calendarViewShown, DEFAULT_CALENDAR_VIEW_SHOWN);
+        int startYear = attributesArray
+                .getInt(R.styleable.DatePicker_startYear, DEFAULT_START_YEAR);
+        int endYear = attributesArray.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR);
+        String minDate = attributesArray.getString(R.styleable.DatePicker_minDate);
+        String maxDate = attributesArray.getString(R.styleable.DatePicker_maxDate);
+        attributesArray.recycle();
+
         LayoutInflater inflater = (LayoutInflater) context
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         inflater.inflate(R.layout.date_picker, this, true);
 
-        OnChangeListener onChangeListener = new OnChangeListener() {
-            public void onChange(NumberPicker picker, int oldVal, int newVal) {
-                updateDateUnchecked(mYearPicker.getCurrent(), mMonthPicker.getCurrent(),
-                        mDayPicker.getCurrent());
+        OnValueChangedListener onChangeListener = new OnValueChangedListener() {
+            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+                updateDate(mYearSpinner.getValue(), mMonthSpinner.getValue(), mDaySpinner
+                        .getValue());
             }
         };
 
-        // day
-        mDayPicker = (NumberPicker) findViewById(R.id.day);
-        mDayPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
-        mDayPicker.setOnLongPressUpdateInterval(100);
-        mDayPicker.setOnChangeListener(onChangeListener);
+        mSpinners = (LinearLayout) findViewById(R.id.pickers);
 
-        // month
-        mMonthPicker = (NumberPicker) findViewById(R.id.month);
-        mMonthPicker.setRange(0, mNumberOfMonths - 1, getShortMonths());
-        mMonthPicker.setOnLongPressUpdateInterval(200);
-        mMonthPicker.setOnChangeListener(onChangeListener);
-
-        // year
-        mYearPicker = (NumberPicker) findViewById(R.id.year);
-        mYearPicker.setOnLongPressUpdateInterval(100);
-        mYearPicker.setOnChangeListener(onChangeListener);
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePicker);
-        int mStartYear = a.getInt(R.styleable.DatePicker_startYear, DEFAULT_START_YEAR);
-        int mEndYear = a.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR);
-        mYearPicker.setRange(mStartYear, mEndYear);
-        a.recycle();
-
-        // mini-month day-picker
-        mMiniMonthDayPicker = (DayPicker) findViewById(R.id.mini_month_day_picker);
-        mTempCalendar.clear();
-        mTempCalendar.set(mStartYear, 0, 1);
-        Calendar endRangeDate = (Calendar) mTempCalendar.clone();
-        endRangeDate.set(mEndYear, 11, 31);
-        mMiniMonthDayPicker.setRange(mTempCalendar, endRangeDate);
-        mMiniMonthDayPicker.setOnDateChangeListener(new DayPicker.OnSelectedDayChangeListener() {
-            public void onSelectedDayChange(DayPicker view, int year, int month, int monthDay) {
-                updateDateUnchecked(year, month, monthDay);
+        // calendar view day-picker
+        mCalendarView = (CalendarView) findViewById(R.id.calendar_view);
+        mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
+            public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) {
+                updateDate(year, month, monthDay);
             }
         });
-        
-        // initialize to current date
-        mTempCalendar.setTimeInMillis(System.currentTimeMillis());
-        init(mTempCalendar.get(Calendar.YEAR), mTempCalendar.get(Calendar.MONTH),
-                mTempCalendar.get(Calendar.DAY_OF_MONTH), null);
 
-        // re-order the number pickers to match the current date format
-        reorderPickers();
+        // day
+        mDaySpinner = (NumberPicker) findViewById(R.id.day);
+        mDaySpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
+        mDaySpinner.setOnLongPressUpdateInterval(100);
+        mDaySpinner.setOnValueChangedListener(onChangeListener);
+
+        // month
+        mMonthSpinner = (NumberPicker) findViewById(R.id.month);
+        mMonthSpinner.setMinValue(0);
+        mMonthSpinner.setMaxValue(mNumberOfMonths - 1);
+        mMonthSpinner.setDisplayedValues(getShortMonths());
+        mMonthSpinner.setOnLongPressUpdateInterval(200);
+        mMonthSpinner.setOnValueChangedListener(onChangeListener);
+
+        // year
+        mYearSpinner = (NumberPicker) findViewById(R.id.year);
+        mYearSpinner.setOnLongPressUpdateInterval(100);
+        mYearSpinner.setOnValueChangedListener(onChangeListener);
+
+        // show only what the user required but make sure we
+        // show something and the spinners have higher priority
+        if (!spinnersShown && !calendarViewShown) {
+            setSpinnersShown(true);
+        } else {
+            setSpinnersShown(spinnersShown);
+            setCalendarViewShown(calendarViewShown);
+
+            // set the min date giving priority of the minDate over startYear
+            mTempDate.clear();
+            if (!TextUtils.isEmpty(minDate)) {
+                if (!parseDate(minDate, mTempDate)) {
+                    mTempDate.set(startYear, 0, 1);
+                }
+            } else {
+                mTempDate.set(startYear, 0, 1);
+            }
+            mMinDate.clear();
+            setMinDate(mTempDate.getTimeInMillis());
+
+            // set the max date giving priority of the minDate over startYear
+            mTempDate.clear();
+            if (!TextUtils.isEmpty(maxDate)) {
+                if (!parseDate(maxDate, mTempDate)) {
+                    mTempDate.set(endYear, 11, 31);
+                }
+            } else {
+                mTempDate.set(endYear, 11, 31);
+            }
+            mMaxDate.clear();
+            setMaxDate(mTempDate.getTimeInMillis());
+
+            // initialize to current date
+            mCurrentDate.setTimeInMillis(System.currentTimeMillis());
+            init(mCurrentDate.get(Calendar.YEAR), mCurrentDate.get(Calendar.MONTH), mCurrentDate
+                    .get(Calendar.DAY_OF_MONTH), null);
+        }
+
+        // re-order the number spinners to match the current date format
+        reorderSpinners();
+    }
+
+    /**
+     * Gets the minimal date supported by this {@link DatePicker} in
+     * milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     * <p>
+     * Note: The default minimal date is 01/01/1900.
+     * <p>
+     *
+     * @return The minimal supported date.
+     */
+    public long getMinDate() {
+        return mCalendarView.getMinDate();
+    }
+
+    /**
+     * Sets the minimal date supported by this {@link NumberPicker} in
+     * milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     *
+     * @param minDate The minimal supported date.
+     */
+    public void setMinDate(long minDate) {
+        mTempDate.setTimeInMillis(minDate);
+        if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR)
+                && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR)) {
+            return;
+        }
+        mMinDate.setTimeInMillis(minDate);
+        mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR));
+        mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR));
+        mCalendarView.setMinDate(minDate);
+        updateSpinners(mYearSpinner.getValue(), mMonthSpinner.getValue(), mDaySpinner.getValue());
+    }
+
+    /**
+     * Gets the maximal date supported by this {@link DatePicker} in
+     * milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     * <p>
+     * Note: The default maximal date is 12/31/2100.
+     * <p>
+     *
+     * @return The maximal supported date.
+     */
+    public long getMaxDate() {
+        return mCalendarView.getMaxDate();
+    }
+
+    /**
+     * Sets the maximal date supported by this {@link DatePicker} in
+     * milliseconds since January 1, 1970 00:00:00 in
+     * {@link TimeZone#getDefault()} time zone.
+     *
+     * @param maxDate The maximal supported date.
+     */
+    public void setMaxDate(long maxDate) {
+        mTempDate.setTimeInMillis(maxDate);
+        if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR)
+                && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) {
+            return;
+        }
+        mMaxDate.setTimeInMillis(maxDate);
+        mYearSpinner.setMinValue(mMinDate.get(Calendar.YEAR));
+        mYearSpinner.setMaxValue(mMaxDate.get(Calendar.YEAR));
+        mCalendarView.setMaxDate(maxDate);
+        updateSpinners(mYearSpinner.getValue(), mMonthSpinner.getValue(), mDaySpinner.getValue());
     }
 
     @Override
     public void setEnabled(boolean enabled) {
+        if (mIsEnabled == enabled) {
+            return;
+        }
         super.setEnabled(enabled);
-        mDayPicker.setEnabled(enabled);
-        mMonthPicker.setEnabled(enabled);
-        mYearPicker.setEnabled(enabled);
-        mMiniMonthDayPicker.setEnabled(enabled);
+        mDaySpinner.setEnabled(enabled);
+        mMonthSpinner.setEnabled(enabled);
+        mYearSpinner.setEnabled(enabled);
+        mCalendarView.setEnabled(enabled);
+        mIsEnabled = enabled;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return mIsEnabled;
     }
 
     /**
-     * Reorders the pickers according to the date format in the current locale.
+     * Gets whether the {@link CalendarView} is shown.
+     *
+     * @return True if the calendar view is shown.
      */
-    private void reorderPickers() {
+    public boolean getCalendarViewShown() {
+        return mCalendarView.isShown();
+    }
+
+    /**
+     * Sets whether the {@link CalendarView} is shown.
+     *
+     * @param shown True if the calendar view is to be shown.
+     */
+    public void setCalendarViewShown(boolean shown) {
+        mCalendarView.setVisibility(shown ? VISIBLE : GONE);
+    }
+
+    /**
+     * Gets whether the spinners are shown.
+     *
+     * @return True if the spinners are shown.
+     */
+    public boolean getSpinnersShown() {
+        return mSpinners.isShown();
+    }
+
+    /**
+     * Sets whether the spinners are shown.
+     *
+     * @param shown True if the spinners are to be shown.
+     */
+    public void setSpinnersShown(boolean shown) {
+        mSpinners.setVisibility(shown ? VISIBLE : GONE);
+    }
+
+    /**
+     * Reorders the spinners according to the date format in the current
+     * {@link Locale}.
+     */
+    private void reorderSpinners() {
         java.text.DateFormat format;
         String order;
 
@@ -185,10 +378,10 @@
         }
 
         /*
-         * Remove the 3 pickers from their parent and then add them back in the
+         * Remove the 3 spinners from their parent and then add them back in the
          * required order.
          */
-        LinearLayout parent = (LinearLayout) findViewById(R.id.pickers);
+        LinearLayout parent = mSpinners;
         parent.removeAllViews();
 
         boolean quoted = false;
@@ -203,13 +396,13 @@
 
             if (!quoted) {
                 if (c == DateFormat.DATE && !didDay) {
-                    parent.addView(mDayPicker);
+                    parent.addView(mDaySpinner);
                     didDay = true;
                 } else if ((c == DateFormat.MONTH || c == 'L') && !didMonth) {
-                    parent.addView(mMonthPicker);
+                    parent.addView(mMonthSpinner);
                     didMonth = true;
                 } else if (c == DateFormat.YEAR && !didYear) {
-                    parent.addView(mYearPicker);
+                    parent.addView(mYearSpinner);
                     didYear = true;
                 }
             }
@@ -217,13 +410,13 @@
 
         // Shouldn't happen, but just in case.
         if (!didMonth) {
-            parent.addView(mMonthPicker);
+            parent.addView(mMonthSpinner);
         }
         if (!didDay) {
-            parent.addView(mDayPicker);
+            parent.addView(mDaySpinner);
         }
         if (!didYear) {
-            parent.addView(mYearPicker);
+            parent.addView(mYearSpinner);
         }
     }
 
@@ -235,10 +428,12 @@
      * @param dayOfMonth The day of the month.
      */
     public void updateDate(int year, int month, int dayOfMonth) {
-        if (mYearPicker.getCurrent() != year
-                || mDayPicker.getCurrent() != dayOfMonth
-                || mMonthPicker.getCurrent() != month) {
-            updateDateUnchecked(year, month, dayOfMonth);
+        if (mCurrentDate.get(Calendar.YEAR) != year
+                || mCurrentDate.get(Calendar.MONTH) != dayOfMonth
+                || mCurrentDate.get(Calendar.DAY_OF_MONTH) != month) {
+            updateSpinners(year, month, dayOfMonth);
+            updateCalendarView();
+            notifyDateChanged();
         }
     }
 
@@ -251,20 +446,20 @@
     @Override
     protected Parcelable onSaveInstanceState() {
         Parcelable superState = super.onSaveInstanceState();
-        return new SavedState(superState, mYearPicker.getCurrent(), mMonthPicker.getCurrent(),
-                mDayPicker.getCurrent());
+        return new SavedState(superState, mYearSpinner.getValue(), mMonthSpinner.getValue(),
+                mDaySpinner.getValue());
     }
 
     @Override
     protected void onRestoreInstanceState(Parcelable state) {
         SavedState ss = (SavedState) state;
         super.onRestoreInstanceState(ss.getSuperState());
-        updatePickers(ss.mYear, ss.mMonth, ss.mDay);
+        updateSpinners(ss.mYear, ss.mMonth, ss.mDay);
     }
 
     /**
      * Initialize the state. If the provided values designate an inconsistent
-     * date the values are normalized before updating the pickers.
+     * date the values are normalized before updating the spinners.
      *
      * @param year The initial year.
      * @param monthOfYear The initial month <strong>starting from zero</strong>.
@@ -279,16 +474,19 @@
     }
 
     /**
-     * Updates the current date.
+     * Parses the given <code>date</code> and in case of success sets the result
+     * to the <code>outDate</code>.
      *
-     * @param year The year.
-     * @param month The month which is <strong>starting from zero</strong>.
-     * @param dayOfMonth The day of the month.
+     * @return True if the date was parsed.
      */
-    private void updateDateUnchecked(int year, int month, int dayOfMonth) {
-        updatePickers(year, month, dayOfMonth);
-        updateMiniMonth();
-        notifyDateChanged();
+    private boolean parseDate(String date, Calendar outDate) {
+        try {
+            outDate.setTime(mDateFormat.parse(date));
+            return true;
+        } catch (ParseException e) {
+            Log.w(LOG_TAG, "Date: " + date + " not in format: " + DATE_FORMAT);
+            return false;
+        }
     }
 
     /**
@@ -309,33 +507,80 @@
     }
 
     /**
-     * Updates the pickers with the given <code>year</code>, <code>month</code>,
-     * and <code>dayOfMonth</code>. If the provided values designate an inconsistent
-     * date the values are normalized before updating the pickers.
+     * Updates the spinners with the given <code>year</code>, <code>month</code>
+     * , and <code>dayOfMonth</code>. If the provided values designate an
+     * inconsistent date the values are normalized before updating the spinners.
      */
-    private void updatePickers(int year, int month, int dayOfMonth) {
-        // larger fields are not updated and the day is adjusted without wrapping
-        mTempCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
-        mTempCalendar.roll(Calendar.MONTH, month - mTempCalendar.get(Calendar.MONTH));
-        mTempCalendar.roll(Calendar.YEAR, year - mTempCalendar.get(Calendar.YEAR));
+    private void updateSpinners(int year, int month, int dayOfMonth) {
+        mCurrentDate.set(Calendar.YEAR, year);
+        int deltaMonths = getDelataMonth(month);
+        mCurrentDate.add(Calendar.MONTH, deltaMonths);
+        int deltaDays = getDelataDayOfMonth(dayOfMonth);
+        mCurrentDate.add(Calendar.DAY_OF_MONTH, deltaDays);
 
-        mYearPicker.setCurrent(mTempCalendar.get(Calendar.YEAR));
-        mMonthPicker.setCurrent(mTempCalendar.get(Calendar.MONTH));
-        mDayPicker.setRange(1, mTempCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
-        mDayPicker.setCurrent(mTempCalendar.get(Calendar.DAY_OF_MONTH));
+        if (mCurrentDate.before(mMinDate)) {
+            mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
+        } else if (mCurrentDate.after(mMaxDate)) {
+            mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
+        }
+
+        mYearSpinner.setValue(mCurrentDate.get(Calendar.YEAR));
+        mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH));
+        mDaySpinner.setMinValue(1);
+        mDaySpinner.setMaxValue(mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH));
+        mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH));
     }
 
     /**
-     * Updates the mini-month with the given year, month, and day selected by the
-     * number pickers.
+     * @return The delta days of moth from the current date and the given
+     *         <code>dayOfMonth</code>.
      */
-    private void updateMiniMonth() {
-        Calendar selectedDay = mMiniMonthDayPicker.getSelectedDay();
-        if (selectedDay.get(Calendar.YEAR) != mYearPicker.getCurrent()
-                || selectedDay.get(Calendar.MONTH) != mMonthPicker.getCurrent()
-                || selectedDay.get(Calendar.DAY_OF_MONTH) != mDayPicker.getCurrent()) {
-            mMiniMonthDayPicker.goTo(mYearPicker.getCurrent(), mMonthPicker.getCurrent(),
-                    mDayPicker.getCurrent(), false, true, false);
+    private int getDelataDayOfMonth(int dayOfMonth) {
+        int prevDayOfMonth = mCurrentDate.get(Calendar.DAY_OF_MONTH);
+        if (prevDayOfMonth == dayOfMonth) {
+            return 0;
+        }
+        int maxDayOfMonth = mCurrentDate.getActualMaximum(Calendar.DAY_OF_MONTH);
+        if (dayOfMonth == 1 && prevDayOfMonth == maxDayOfMonth) {
+            return 1;
+        }
+        if (dayOfMonth == maxDayOfMonth && prevDayOfMonth == 1) {
+            return -1;
+        }
+        return dayOfMonth - prevDayOfMonth;
+    }
+
+    /**
+     * @return The delta months from the current date and the given
+     *         <code>month</code>.
+     */
+    private int getDelataMonth(int month) {
+        int prevMonth = mCurrentDate.get(Calendar.MONTH);
+        if (prevMonth == month) {
+            return 0;
+        }
+        if (month == 0 && prevMonth == 11) {
+            return 1;
+        }
+        if (month == 11 && prevMonth == 0) {
+            return -1;
+        }
+        return month - prevMonth;
+    }
+
+    /**
+     * Updates the calendar view with the given year, month, and day selected by
+     * the number spinners.
+     */
+    private void updateCalendarView() {
+        mTempDate.setTimeInMillis(mCalendarView.getDate());
+        if (mTempDate.get(Calendar.YEAR) != mYearSpinner.getValue()
+                || mTempDate.get(Calendar.MONTH) != mMonthSpinner.getValue()
+                || mTempDate.get(Calendar.DAY_OF_MONTH) != mDaySpinner.getValue()) {
+            mTempDate.clear();
+            mTempDate.set(mYearSpinner.getValue(), mMonthSpinner.getValue(),
+                    mDaySpinner.getValue());
+            mCalendarView.setDate(mTempDate.getTimeInMillis(), false, false);
         }
     }
 
@@ -343,21 +588,21 @@
      * @return The selected year.
      */
     public int getYear() {
-        return mYearPicker.getCurrent();
+        return mYearSpinner.getValue();
     }
 
     /**
      * @return The selected month.
      */
     public int getMonth() {
-        return mMonthPicker.getCurrent();
+        return mMonthSpinner.getValue();
     }
 
     /**
      * @return The selected day of month.
      */
     public int getDayOfMonth() {
-        return mDayPicker.getCurrent();
+        return mDaySpinner.getValue();
     }
 
     /**
@@ -365,8 +610,8 @@
      */
     private void notifyDateChanged() {
         if (mOnDateChangedListener != null) {
-            mOnDateChangedListener.onDateChanged(DatePicker.this, mYearPicker.getCurrent(),
-                    mMonthPicker.getCurrent(), mDayPicker.getCurrent());
+            mOnDateChangedListener.onDateChanged(DatePicker.this, mYearSpinner.getValue(),
+                    mMonthSpinner.getValue(), mDaySpinner.getValue());
         }
     }
 
diff --git a/core/java/android/widget/DayPicker.java b/core/java/android/widget/DayPicker.java
deleted file mode 100644
index cdf51f7..0000000
--- a/core/java/android/widget/DayPicker.java
+++ /dev/null
@@ -1,1498 +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.widget;
-
-import com.android.internal.R;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.database.DataSetObserver;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.Paint.Style;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.text.format.DateFormat;
-import android.text.format.DateUtils;
-import android.text.format.Time;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.GestureDetector;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AbsListView.OnScrollListener;
-
-import java.security.InvalidParameterException;
-import java.util.Calendar;
-import java.util.HashMap;
-import java.util.Locale;
-
-import libcore.icu.LocaleData;
-
-/**
- * Displays a day picker in the form of a calendar. The calendar
- * is represented as a list where each row depicts a week. Each week is
- * composed of items that are selectable days.
- */
-public class DayPicker extends FrameLayout {
-
-    /**
-     * The number of milliseconds in a day.
-     *
-     * @hide
-     */
-    protected static final long MILLIS_IN_DAY = 86400000L;
-
-    /**
-     * The number of day in a week.
-     *
-     * @hide
-     */
-    protected static final int DAYS_PER_WEEK = 7;
-
-    /**
-     * The number of milliseconds in a week.
-     *
-     * @hide
-     */
-    protected static final long MILLIS_IN_WEEK = DAYS_PER_WEEK * MILLIS_IN_DAY;
-
-    /**
-     * Affects when the month selection will change while scrolling up
-     *
-     * @hide
-     */ 
-    protected static final int SCROLL_HYST_WEEKS = 2;
-
-    /**
-     * How long the GoTo fling animation should last.
-     *
-     * @hide
-     */
-    protected static final int GOTO_SCROLL_DURATION = 1000;
-
-    /**
-     * The duration of the adjustment upon a user scroll in milliseconds.
-     *
-     * @hide
-     */
-    protected static final int ADJUSTMENT_SCROLL_DURATION = 500;
-
-    /**
-     * How long to wait after receiving an onScrollStateChanged notification
-     * before acting on it.
-     *
-     * @hide
-     */
-    protected static final int SCROLL_CHANGE_DELAY = 40;
-
-    /**
-     * The scale used to compensate for different screen density.
-     *
-     * @hide
-     */
-    protected static float sScale;
-
-    /**
-     * The top offset of the weeks list.
-     *
-     * @hide
-     */
-    protected static int mListTopOffset = 2;
-
-    /**
-     * The visible height of a week view.
-     *
-     * @hide
-     */
-    protected int mWeekMinVisibleHeight = 12;
-
-
-    /**
-     * The visible height of a week view.
-     *
-     * @hide
-     */
-    protected int mBottomBuffer = 20;
-
-    /**
-     * The number of shown weeks.
-     *
-     * @hide
-     */
-    protected int mShownWeekCount = 6;
-
-    /**
-     * Flag whether to show the week number.
-     *
-     * @hide
-     */
-    protected boolean mShowWeekNumber = true;
-
-    /**
-     * The number of day per week to be shown
-     *
-     * @hide
-     */
-    protected int mDaysPerWeek = 7;
-
-    /**
-     * The friction of the week list while flinging.
-     *
-     * @hide
-     */
-    protected float mFriction = .05f;
-
-    /**
-     * Scale for adjusting velocity of the week list while flinging.
-     *
-     * @hide
-     */
-    protected float mVelocityScale = 0.333f;
-
-    /**
-     * The adapter for the weeks list.
-     *
-     * @hide
-     */
-    protected WeeksAdapter mAdapter;
-
-    /**
-     * The weeks list.
-     *
-     * @hide
-     */
-    protected ListView mListView;
-
-    /**
-     * The name of the month to display.
-     *
-     * @hide
-     */
-    protected TextView mMonthName;
-
-    /**
-     * The header with week day names.
-     *
-     * @hide
-     */
-    protected ViewGroup mDayNamesHeader;
-
-    /**
-     * Cached labels for the week names header.
-     *
-     * @hide
-     */
-    protected String[] mDayLabels;
-
-    /**
-     * Temporary instance to avoid multiple instantiations.
-     *
-     * @hide
-     */
-    protected Calendar mTempCalendar = Calendar.getInstance();
-
-    /**
-     * The first day of the week based on the current locale.
-     *
-     * @hide
-     */
-    protected int mFirstDayOfWeek = LocaleData.get(Locale.getDefault()).firstDayOfWeek;
-
-    /**
-     * The first day of the focused month.
-     *
-     * @hide
-     */
-    protected Calendar mFirstDayOfMonth = Calendar.getInstance();
-
-    /**
-     * Which month should be displayed/highlighted [0-11]
-     *
-     * @hide
-     */
-    protected int mCurrentMonthDisplayed;
-
-    /**
-     * Used for tracking during a scroll.
-     *
-     * @hide
-     */
-    protected long mPreviousScrollPosition;
-
-    /**
-     * Used for tracking which direction the view is scrolling.
-     *
-     * @hide
-     */
-    protected boolean mIsScrollingUp = false;
-
-    /**
-     * The previous scroll state of the weeks ListView.
-     *
-     * @hide
-     */
-    protected int mPreviousScrollState = OnScrollListener.SCROLL_STATE_IDLE;
-
-    /**
-     * The current scroll state of the weeks ListView.
-     *
-     * @hide
-     */
-    protected int mCurrentScrollState = OnScrollListener.SCROLL_STATE_IDLE;
-
-    /**
-     * Listener for changes in the selected day.
-     *
-     * @hide
-     */
-    protected OnSelectedDayChangeListener mOnChangeListener;
-
-    /**
-     * Command for adjusting the position after a scroll/fling.
-     *
-     * @hide
-     */
-    protected ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable();
-
-    /**
-     * The start date of the range supported by this picker.
-     *
-     * @hide
-     */
-    protected Calendar mRangeStartDate = Calendar.getInstance();
-
-    /**
-     * The end date of the range supported by this picker.
-     *
-     * @hide
-     */
-    protected Calendar mRangeEndDate = Calendar.getInstance();
-
-    /**
-     * String for formatting the month name in the title text view.
-     *
-     * @hide
-     */
-    protected String mMonthNameFormatSrting = "MMMM, yyyy";
-
-    /**
-     * The callback used to indicate the user changes the date.
-     */
-    public interface OnSelectedDayChangeListener {
-
-        /**
-         * Called upon change of the selected day.
-         *
-         * @param view The view associated with this listener.
-         * @param year The year that was set.
-         * @param month The month that was set [0-11].
-         * @param dayOfMonth The day of the month that was set.
-         */
-        public void onSelectedDayChange(DayPicker view, int year, int month, int dayOfMonth);
-    }
-
-    public DayPicker(Context context) {
-        this(context, null);
-    }
-
-    public DayPicker(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public DayPicker(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, 0);
-
-        LayoutInflater layoutInflater = (LayoutInflater) mContext
-                .getSystemService(Service.LAYOUT_INFLATER_SERVICE);
-        View content = layoutInflater.inflate(R.layout.day_picker, null, false);
-        addView(content);
-
-        mListView = (ListView) findViewById(R.id.list);
-        mDayNamesHeader = (ViewGroup) content.findViewById(com.android.internal.R.id.day_names);
-        mMonthName = (TextView) content.findViewById(com.android.internal.R.id.month_name);
-
-        // Adjust sizes for screen density
-        if (sScale == 0) {
-            sScale = mContext.getResources().getDisplayMetrics().density;
-            if (sScale != 1) {
-                mWeekMinVisibleHeight *= sScale;
-                mBottomBuffer *= sScale;
-                mListTopOffset *= sScale;
-            }
-        }
-
-        // set default range
-        mRangeStartDate.clear();
-        mRangeStartDate.set(1900, 0, 1);
-        mRangeEndDate.clear();
-        mRangeEndDate.set(2100, 0, 1);
-
-        setUpHeader();
-        updateHeader();
-        setUpListView();
-        setUpAdapter();
-
-        // go to today now
-        mTempCalendar.setTimeInMillis(System.currentTimeMillis());
-        goTo(mTempCalendar, false, true, true);
-        invalidate();
-    }
-
-    /**
-     * Sets the range supported by this day picker. This is the picker will not
-     * support dates before <code>startRangeDate</code> and <code>endRangeDate
-     * </code>.
-     *
-     * @param startRangeDate The start date.
-     * @param endRangeDate The end date.
-     */
-    public void setRange(Calendar startRangeDate, Calendar endRangeDate) {
-        boolean doSetupAdapter = false;
-        if (mRangeStartDate.get(Calendar.DAY_OF_YEAR) != startRangeDate.get(Calendar.DAY_OF_YEAR)
-                || mRangeStartDate.get(Calendar.YEAR) != startRangeDate.get(Calendar.YEAR)) {
-            mRangeStartDate.setTimeInMillis(startRangeDate.getTimeInMillis());
-            mRangeStartDate.setTimeZone(startRangeDate.getTimeZone());
-            doSetupAdapter = true;
-        }
-        if (mRangeEndDate.get(Calendar.DAY_OF_YEAR) != endRangeDate.get(Calendar.DAY_OF_YEAR)
-                || mRangeEndDate.get(Calendar.YEAR) != endRangeDate.get(Calendar.YEAR)) {
-            mRangeEndDate.setTimeInMillis(endRangeDate.getTimeInMillis());
-            mRangeEndDate.setTimeZone(endRangeDate.getTimeZone());
-            doSetupAdapter = true;
-            
-        }
-        if (doSetupAdapter) {
-            setUpAdapter();
-        }
-    }
-
-    /**
-     * Sets the listener to be notified upon day selection changes.
-     *
-     * @param listener The listener to be called back.
-     */
-    public void setOnDateChangeListener(OnSelectedDayChangeListener listener) {
-        mOnChangeListener = listener;
-    }
-
-    /**
-     * Gets the selected day.
-     *
-     * @return The selected day.
-     */
-    public Calendar getSelectedDay() {
-        return (Calendar) mAdapter.mSelectedDay.clone();
-    }
-
-    /**
-     * Sets the selected day. This is equivalent to a call to
-     * {@link #goTo(Calendar, boolean, boolean, boolean)} with
-     * the arguments <code>selectedDay</code>, <code>false</code>,
-     * <code>true</code>, <code>false</code> respectively.
-     *
-     * @param selectedDay The selected day.
-     */
-    public void setSelectedDay(Calendar selectedDay) {
-        goTo(selectedDay, false, true, false);
-    }
-
-    /**
-     * Creates a new adapter if necessary and sets up its parameters. Override
-     * this method to provide a custom adapter.
-     *
-     * @hide
-     */
-    protected void setUpAdapter() {
-        if (mAdapter == null) {
-            mAdapter = new WeeksAdapter(getContext());
-            mAdapter.registerDataSetObserver(new DataSetObserver() {
-                @Override
-                public void onChanged() {
-                    if (mOnChangeListener != null) {
-                        Calendar selectedDay = mAdapter.getSelectedDay();
-                        mOnChangeListener.onSelectedDayChange(DayPicker.this,
-                                selectedDay.get(Calendar.YEAR),
-                                selectedDay.get(Calendar.MONTH),
-                                selectedDay.get(Calendar.DAY_OF_MONTH));
-                    }
-                }
-            });
-            mListView.setAdapter(mAdapter);
-        }
-
-        // refresh the view with the new parameters
-        mAdapter.notifyDataSetChanged();
-    }
-
-    /**
-     * Sets up the strings to be used by the header. Override this method to use
-     * different strings or modify the view params.
-     *
-     * @hide
-     */
-    protected void setUpHeader() {
-        mDayLabels = new String[mDaysPerWeek];
-        for (int i = mFirstDayOfWeek, count = mFirstDayOfWeek + mDaysPerWeek; i < count; i++) {
-            int calendarDay = (i < mDaysPerWeek) ? i : 1; // Calendar.MONDAY is
-            // 1
-            mDayLabels[i - mFirstDayOfWeek] = DateUtils.getDayOfWeekString(calendarDay,
-                    DateUtils.LENGTH_SHORTEST);
-        }
-    }
-
-    /**
-     * Sets all the required fields for the list view. Override this method to
-     * set a different list view behavior.
-     *
-     * @hide
-     */
-    protected void setUpListView() {
-        // Configure the listview
-        mListView.setDivider(null);
-        mListView.setItemsCanFocus(true);
-        mListView.setVerticalScrollBarEnabled(false);
-        mListView.setOnScrollListener(new OnScrollListener() {
-            public void onScrollStateChanged(AbsListView view, int scrollState) {
-                DayPicker.this.onScrollStateChanged(view, scrollState);
-            }
-
-            public void onScroll(
-                    AbsListView view, int firstVisibleItem, int visibleItemCount,
-                    int totalItemCount) {
-                DayPicker.this.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
-            }
-        });
-        // Make the scrolling behavior nicer
-        mListView.setFriction(mFriction);
-        mListView.setVelocityScale(mVelocityScale);
-    }
-
-    /**
-     * Fixes the day names header to provide correct spacing and updates the
-     * label text. Override this to set up a custom header.
-     *
-     * @hide
-     */
-    protected void updateHeader() {
-        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);
-            if (i < mDaysPerWeek + 1) {
-                label.setText(mDayLabels[i - 1]);
-                label.setVisibility(View.VISIBLE);
-            } else {
-                label.setVisibility(View.GONE);
-            }
-        }
-        mDayNamesHeader.invalidate();
-    }
-
-    /**
-     * This moves to the specified time in the view. If the time is not already
-     * in range it will move the list so that the first of the month containing
-     * the time is at the top of the view. If the new time is already in view
-     * the list will not be scrolled unless forceScroll is true. This time may
-     * optionally be highlighted as selected as well.
-     *
-     * @param year The year to move to.
-     * @param month The month to move to <strong>starting from zero<strong>.
-     * @param dayOfMonth The month day to move to.
-     * @param animate Whether to scroll to the given time or just redraw at the
-     *            new location.
-     * @param setSelected Whether to set the given time as selected
-     * @param forceScroll Whether to recenter even if the time is already
-     *            visible.
-     *
-     * @throws IllegalArgumentException of the provided date is before the
-     *        range start of after the range end.
-     *
-     * @see #setRange(Calendar, Calendar)
-     */
-    public void goTo(int year, int month, int dayOfMonth, boolean animate, boolean setSelected,
-            boolean forceScroll) {
-        mTempCalendar.clear();
-        mTempCalendar.set(year, month, dayOfMonth);
-        goTo(mTempCalendar, animate, setSelected, forceScroll);
-    }
-
-    /**
-     * This moves to the specified time in the view. If the time is not already
-     * in range it will move the list so that the first of the month containing
-     * the time is at the top of the view. If the new time is already in view
-     * the list will not be scrolled unless forceScroll is true. This time may
-     * optionally be highlighted as selected as well.
-     *
-     * @param date The time to move to.
-     * @param animate Whether to scroll to the given time or just redraw at the
-     *            new location.
-     * @param setSelected Whether to set the given time as selected.
-     * @param forceScroll Whether to recenter even if the time is already
-     *            visible.
-     *
-     * @throws IllegalArgumentException of the provided date is before the
-     *        range start of after the range end.
-     *
-     * @see #setRange(Calendar, Calendar)
-     */
-    public void goTo(Calendar date, boolean animate, boolean setSelected, boolean forceScroll) {
-        if (date.before(mRangeStartDate) || date.after(mRangeEndDate)) { 
-            throw new IllegalArgumentException("Time not between " + mRangeStartDate.getTime()
-                    + " and " + mRangeEndDate.getTime());
-        }
-        // Find the first and last entirely visible weeks
-        int firstFullyVisiblePosition = mListView.getFirstVisiblePosition();
-        View firstChild = mListView.getChildAt(0);
-        if (firstChild != null && firstChild.getTop() < 0) {
-            firstFullyVisiblePosition++;
-        }
-        int lastFullyVisiblePosition = firstFullyVisiblePosition + mShownWeekCount - 1;
-        if (firstChild != null && firstChild.getTop() > mBottomBuffer) {
-            lastFullyVisiblePosition--;
-        }
-        if (setSelected) {
-            mAdapter.setSelectedDay(date);
-        }
-        // Get the week we're going to
-        int position = getWeeksDelta(date);
-
-        // Check if the selected day is now outside of our visible range
-        // and if so scroll to the month that contains it
-        if (position < firstFullyVisiblePosition || position > lastFullyVisiblePosition
-                || forceScroll) {
-            mFirstDayOfMonth.setTimeInMillis(date.getTimeInMillis());
-            mFirstDayOfMonth.setTimeZone(date.getTimeZone());
-            mFirstDayOfMonth.set(Calendar.DAY_OF_MONTH, 1);
-
-            setMonthDisplayed(mFirstDayOfMonth);
-            position = getWeeksDelta(mFirstDayOfMonth);
-
-            mPreviousScrollState = OnScrollListener.SCROLL_STATE_FLING;
-            if (animate) {
-                mListView.smoothScrollToPositionFromTop(position, mListTopOffset,
-                        GOTO_SCROLL_DURATION);
-            } else {
-                mListView.setSelectionFromTop(position, mListTopOffset);
-                // Perform any after scroll operations that are needed
-                onScrollStateChanged(mListView, OnScrollListener.SCROLL_STATE_IDLE);
-            }
-        } else if (setSelected) {
-            // Otherwise just set the selection
-            setMonthDisplayed(date);
-        }
-    }
-
-    /**
-     * Called when a <code>view</code> transitions to a new <code>scrollState
-     * </code>.
-     *
-     * @hide
-     */
-    protected void onScrollStateChanged(AbsListView view, int scrollState) {
-        mScrollStateChangedRunnable.doScrollStateChange(view, scrollState);
-    }
-
-    /**
-     * Updates the title and selected month if the <code>view</code> has moved to a new
-     * month.
-     *
-     * @hide
-     */
-    protected void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
-            int totalItemCount) {
-        WeekView child = (WeekView) view.getChildAt(0);
-        if (child == null) {
-            return;
-        }
-
-        // Figure out where we are
-        int offset = child.getBottom() < mWeekMinVisibleHeight ? 1 : 0;
-        long currScroll = view.getFirstVisiblePosition() * child.getHeight() - child.getBottom();
-
-        // If we have moved since our last call update the direction
-        if (currScroll < mPreviousScrollPosition) {
-            mIsScrollingUp = true;
-        } else if (currScroll > mPreviousScrollPosition) {
-            mIsScrollingUp = false;
-        } else {
-            return;
-        }
-
-        // Use some hysteresis for checking which month to highlight. This
-        // causes the month to transition when two full weeks of a month are
-        // visible when scrolling up, and when the first day in a month reaches
-        // the top of the screen when scrolling down.
-        if (mIsScrollingUp) {
-            child = (WeekView) view.getChildAt(SCROLL_HYST_WEEKS + offset);
-        } else if (offset != 0) {
-            child = (WeekView) view.getChildAt(offset);
-        }
-
-        // Find out which month we're moving into
-        int month;
-        if (mIsScrollingUp) {
-            month = child.getMonthOfFirstWeekDay();
-        } else {
-            month = child.getMonthOfLastWeekDay();
-        }
-
-        // And how it relates to our current highlighted month
-        int monthDiff;
-        if (mCurrentMonthDisplayed == 11 && month == 0) {
-            monthDiff = 1;
-        } else if (mCurrentMonthDisplayed == 0 && month == 11) {
-            monthDiff = -1;
-        } else {
-            monthDiff = month - mCurrentMonthDisplayed;
-        }
-
-        // Only switch months if we're scrolling away from the currently
-        // selected month
-        if ((!mIsScrollingUp && monthDiff > 0) || (mIsScrollingUp && monthDiff < 0)) {
-            Calendar firstDay = child.getFirstDay();
-            if (mIsScrollingUp) {
-                firstDay.add(Calendar.DAY_OF_MONTH, -DAYS_PER_WEEK);
-            } else {
-                firstDay.add(Calendar.DAY_OF_MONTH, DAYS_PER_WEEK);
-            }
-            setMonthDisplayed(firstDay);
-        }
-        mPreviousScrollPosition = currScroll;
-        mPreviousScrollState = mCurrentScrollState;
-    }
-
-    /**
-     * Sets the month displayed at the top of this view based on time. Override
-     * to add custom events when the title is changed.
-     *
-     * @param calendar A day in the new focus month.
-     *
-     * @hide
-     */
-    protected void setMonthDisplayed(Calendar calendar) {
-        mMonthName.setText(DateFormat.format(mMonthNameFormatSrting, calendar));
-        mMonthName.invalidate();
-        mCurrentMonthDisplayed = calendar.get(Calendar.MONTH);
-        mAdapter.setFocusMonth(mCurrentMonthDisplayed);
-        // TODO Send Accessibility Event
-    }
-
-    /**
-     * @return Returns the number of weeks between the current week day of the
-     *         <code>fromDate</code> and the first day of week of
-     *         <code>toDate</code>.
-     *
-     * @hide
-     */
-    protected int getWeeksDelta(Calendar toDate) {
-        if (toDate.before(mRangeStartDate)) {
-            throw new IllegalArgumentException("fromDate: " + mRangeStartDate.getTime()
-                    + " does not precede toDate: " + toDate.getTime());
-        }
-        int fromDateDayOfWeek = mRangeStartDate.get(Calendar.DAY_OF_WEEK);
-        long diff = (fromDateDayOfWeek - toDate.getFirstDayOfWeek()) * MILLIS_IN_DAY;
-        if (diff < 0) {
-            diff = diff + MILLIS_IN_WEEK;
-        }
-        long refDay = mRangeStartDate.getTimeInMillis() - diff;
-        return (int) ((toDate.getTimeInMillis() - refDay) / MILLIS_IN_WEEK);
-    }
-
-    /**
-     * Command responsible for acting upon scroll state changes.
-     *
-     * @hide
-     */
-    protected class ScrollStateRunnable implements Runnable {
-        private AbsListView mView;
-
-        private int mNewState;
-
-        /**
-         * Sets up the runnable with a short delay in case the scroll state
-         * immediately changes again.
-         *
-         * @param view The list view that changed state
-         * @param scrollState The new state it changed to
-         */
-        public void doScrollStateChange(AbsListView view, int scrollState) {
-            removeCallbacks(this);
-            mView = view;
-            mNewState = scrollState;
-            removeCallbacks(this);
-            postDelayed(this, SCROLL_CHANGE_DELAY);
-        }
-
-        public void run() {
-            mCurrentScrollState = mNewState;
-            // Fix the position after a scroll or a fling ends
-            if (mNewState == OnScrollListener.SCROLL_STATE_IDLE
-                    && mPreviousScrollState != OnScrollListener.SCROLL_STATE_IDLE) {
-                mPreviousScrollState = mNewState;
-                View child = mView.getChildAt(0);
-                if (child == null) {
-                    // The view is no longer visible, just return
-                    return;
-                }
-                int dist = child.getBottom() - mListTopOffset;
-                if (dist > mListTopOffset) {
-                    if (mIsScrollingUp) {
-                        mView.smoothScrollBy(dist - child.getHeight(), ADJUSTMENT_SCROLL_DURATION);
-                    } else {
-                        mView.smoothScrollBy(dist, ADJUSTMENT_SCROLL_DURATION);
-                    }
-                }
-            } else {
-                mPreviousScrollState = mNewState;
-            }
-        }
-    }
-
-    /**
-     * <p>
-     * This is a specialized adapter for creating a list of weeks with
-     * selectable days. It can be configured to display the week number, start
-     * the week on a given day, show a reduced number of days, or display an
-     * arbitrary number of weeks at a time.
-     * </p>
-     *
-     * @hide
-     */
-    public class WeeksAdapter extends BaseAdapter implements OnTouchListener {
-
-        /**
-         * The default maximum year supported by the Date Time Picker.
-         */
-        public static final int DEFAULT_MAX_CALENDAR_YEAR = 2100;
-
-        /**
-         * The default minimum year supported by the Date Time Picker.
-         */
-        public static final int DEFAULT_MIN_CALENDAR_YEAR = 1900;
-
-        /**
-         * The number of weeks to display at a time.
-         */
-        public static final String WEEK_PARAMS_NUM_WEEKS = "num_weeks";
-
-        /**
-         * Which month should be in focus currently.
-         */
-        public static final String WEEK_PARAMS_FOCUS_MONTH = "focus_month";
-
-        /**
-         * Whether the week number should be shown. Non-zero to show them.
-         */
-        public static final String WEEK_PARAMS_SHOW_WEEK = "week_numbers";
-
-        /**
-         * Which day the week should start on. {@link Time#SUNDAY} through
-         * {@link Time#SATURDAY}.
-         */
-        public static final String WEEK_PARAMS_WEEK_START = "week_start";
-
-        /**
-         * The year of the highlighted day.
-         */
-        public static final String WEEK_PARAMS_YEAR = "selected_year";
-
-        /**
-         * The month of the highlighted day.
-         */
-        public static final String WEEK_PARAMS_MONTH = "selected_month";
-
-        /**
-         * The year of the highlighted day.
-         */
-        public static final String WEEK_PARAMS_DAY_OF_MONTH = "selected_day_of_month";
-
-        /**
-         * The start date of the supported interval.
-         */
-        public static final String WEEK_PARAMS_START_DATE_RANGE_MILLIS = "start_date_gange_millis";
-
-        /**
-         * The end date of the supported interval.
-         */
-        public static final String WEEK_PARAMS_END_DATE_RANGE_MILLIS = "end_date_gange_millis";
-
-        /**
-         * How many days of the week to display [1-7].
-         */
-        public static final String WEEK_PARAMS_DAYS_PER_WEEK = "days_per_week";
-
-        protected int WEEK_7_OVERHANG_HEIGHT = 7;
-
-        protected int mSelectedWeek;
-
-        protected GestureDetector mGestureDetector;
-
-        protected int mFocusMonth = 0;
-
-        private final Calendar mSelectedDay = Calendar.getInstance();
-
-        private int mTotalWeekCount = -1;
-
-        public WeeksAdapter(Context context) {
-            mContext = context;
-
-            if (sScale == 0) {
-                sScale = context.getResources().getDisplayMetrics().density;
-                if (sScale != 1) {
-                    WEEK_7_OVERHANG_HEIGHT *= sScale;
-                }
-            }
-            init();
-        }
-
-        /**
-         * Set up the gesture detector and selected time
-         */
-        protected void init() {
-            mGestureDetector = new GestureDetector(mContext, new CalendarGestureListener());
-            mSelectedWeek = getWeeksDelta(mSelectedDay);
-            mTotalWeekCount = getWeeksDelta(mRangeEndDate);
-        }
-
-        /**
-         * Updates the selected day and related parameters.
-         * 
-         * @param selectedDay The time to highlight
-         */
-        public void setSelectedDay(Calendar selectedDay) {
-            if (selectedDay.get(Calendar.DAY_OF_YEAR) == mSelectedDay.get(Calendar.DAY_OF_YEAR)
-                    && selectedDay.get(Calendar.YEAR) == mSelectedDay.get(Calendar.YEAR)) {
-                return;
-            }
-            mSelectedDay.setTimeInMillis(selectedDay.getTimeInMillis());
-            mSelectedDay.setTimeZone(selectedDay.getTimeZone());
-            mSelectedWeek = getWeeksDelta(mSelectedDay);
-            mFocusMonth = mSelectedDay.get(Calendar.MONTH);
-            notifyDataSetChanged();
-            invalidate();  // Test
-        }
-
-        /**
-         * @return The selected day of month.
-         */
-        public Calendar getSelectedDay() {
-            return mSelectedDay;
-        }
-
-        /**
-         * updates any config options that may have changed and refreshes the
-         * view
-         */
-        public void refresh() {
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public int getCount() {
-            return mTotalWeekCount;
-        }
-
-        @Override
-        public Object getItem(int position) {
-            return null;
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @SuppressWarnings("unchecked")
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            WeekView v;
-            HashMap<String, Object> drawingParams = null;
-            if (convertView != null) {
-                v = (WeekView) convertView;
-                // We store the drawing parameters in the view so it can be
-                // recycled
-                drawingParams = (HashMap<String, Object>) v.getTag();
-            } else {
-                v = getNewView();
-                // Set up the new view
-                android.widget.AbsListView.LayoutParams params =
-                    new android.widget.AbsListView.LayoutParams(
-                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
-                v.setLayoutParams(params);
-                v.setClickable(true);
-                v.setOnTouchListener(this);
-
-                drawingParams = new HashMap<String, Object>();
-            }
-
-            // pass in all the view parameters
-            putDrawingParementer(drawingParams, WeekView.VIEW_PARAMS_SHOW_WK_NUM,
-                    mShowWeekNumber ? 1 : 0);
-            putDrawingParementer(drawingParams, WeekView.VIEW_PARAMS_WEEK_START, mFirstDayOfWeek);
-            putDrawingParementer(drawingParams, WeekView.VIEW_PARAMS_NUM_DAYS, mDaysPerWeek);
-            putDrawingParementer(drawingParams, WeekView.VIEW_PARAMS_WEEK, position);
-            putDrawingParementer(drawingParams, WeekView.VIEW_PARAMS_FOCUS_MONTH, mFocusMonth);
-            putDrawingParementer(drawingParams, WeekView.VIEW_PARAMS_SELECTED_DAY,
-                    (mSelectedWeek == position) ? mSelectedDay.get(Calendar.DAY_OF_WEEK) : -1);
-            v.setWeekParams(drawingParams);
-
-            return v;
-        }
-
-        /**
-         * Puts the given <code>value</code> for the drawing
-         * <code>parameter</code> in the <code>drawingParams</code>.
-         */
-        private void putDrawingParementer(HashMap<String, Object> drawingParams, String parameter,
-                int value) {
-            int[] valueArray = (int[]) drawingParams.get(parameter);
-            if (valueArray == null) {
-                valueArray = new int[1];
-                drawingParams.put(parameter, valueArray);
-            }
-            valueArray[0] = value;
-        }
-
-        /**
-         * Creates a new WeekView and returns it. Override this to customize the
-         * view creation.
-         *
-         * @return A new WeekView
-         */
-        protected WeekView getNewView() {
-            return new WeekView(mContext);
-        }
-
-        /**
-         * Changes which month is in focus and updates the view.
-         *
-         * @param month The month to show as in focus [0-11]
-         */
-        public void setFocusMonth(int month) {
-            if (mFocusMonth == month) {
-                return;
-            }
-            mFocusMonth = month;
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public boolean onTouch(View v, MotionEvent event) {
-            if (mGestureDetector.onTouchEvent(event)) {
-                WeekView weekView = (WeekView) v;
-                weekView.getDayFromLocation(event.getX(), mTempCalendar);
-                if (mTempCalendar.get(Calendar.YEAR) != 0) {
-                    onDayTapped(mTempCalendar);
-                }
-                return true;
-            }
-            return false;
-        }
-
-        /**
-         * Maintains the same hour/min/sec but moves the day to the tapped day.
-         * 
-         * @param day The day that was tapped
-         */
-        protected void onDayTapped(Calendar day) {
-            setSelectedDay(day);
-        }
-
-        /**
-         * This is here so we can identify single tap events and set the
-         * selected day correctly
-         */
-        protected class CalendarGestureListener extends GestureDetector.SimpleOnGestureListener {
-            @Override
-            public boolean onSingleTapUp(MotionEvent e) {
-                return true;
-            }
-        }
-    }
-
-    /**
-     * <p>
-     * This is a dynamic view for drawing a single week. It can be configured to
-     * display the week number, start the week on a given day, or show a reduced
-     * number of days. It is intended for use as a single view within a
-     * ListView. See {@link WeeksAdapter} for usage.
-     * </p>
-     *
-     * @hide
-     */
-    public class WeekView extends View {
-
-        /*
-         * These params can be passed into the view to control how it appears.
-         * {@link #VIEW_PARAMS_WEEK} is the only required field, though the
-         * default values are unlikely to fit most layouts correctly.
-         */
-
-        /**
-         * This sets the height of this week in pixels
-         */
-        public static final String VIEW_PARAMS_HEIGHT = "height";
-
-        /**
-         * This specifies the position (or weeks since the epoch) of this week.
-         */
-        public static final String VIEW_PARAMS_WEEK = "week";
-
-        /**
-         * This sets one of the days in this view as selected
-         * {@link Time#SUNDAY} through {@link Time#SATURDAY}.
-         */
-        public static final String VIEW_PARAMS_SELECTED_DAY = "selected_day";
-
-        /**
-         * Which day the week should start on. {@link Time#SUNDAY} through
-         * {@link Time#SATURDAY}.
-         */
-        public static final String VIEW_PARAMS_WEEK_START = "week_start";
-
-        /**
-         * How many days to display at a time. Days will be displayed starting
-         * with {@link #mFirstDay}.
-         */
-        public static final String VIEW_PARAMS_NUM_DAYS = "num_days";
-
-        /**
-         * Which month is currently in focus, as defined by {@link Time#month}
-         * [0-11].
-         */
-        public static final String VIEW_PARAMS_FOCUS_MONTH = "focus_month";
-
-        /**
-         * If this month should display week numbers. false if 0, true
-         * otherwise.
-         */
-        public static final String VIEW_PARAMS_SHOW_WK_NUM = "show_wk_num";
-
-        protected static final int DEFAULT_SHOW_WK_NUM = 0;
-
-        protected final int mWeekSeperatorWidth;
-
-        protected final int mNumberTextSize;
-
-        protected final int mWeekDayPadding;
-
-        protected final Rect mTempRect = new Rect();
-
-        protected final Paint mDrawPaint = new Paint();
-
-        protected final Paint mMonthNumDrawPaint = new Paint();
-
-        protected final Drawable mSelectedDayLine;
-
-        protected final int mSelectedDayLineWidth;
-
-        protected final int mSelectionBackgroundColor;
-
-        protected final int mFocusedMonthDateColor;
-
-        protected final int mOtherMonthDateColor;
-
-        protected final int mGridLinesColor;
-
-        protected final int mWeekNumberColor;
-
-        protected final int mFirstDayOfweek;
-
-        // Cache the number strings so we don't have to recompute them each time
-        protected String[] mDayNumbers;
-
-        // Quick lookup for checking which days are in the focus month
-        protected boolean[] mFocusDay;
-
-        // The first day displayed by this item
-        protected Calendar mFirstDay;
-
-        // The month of the first day in this week
-        protected int mMonthOfFirstWeekDay = -1;
-
-        // The month of the last day in this week
-        protected int mLastWeekDayMonth = -1;
-
-        // The position of this week, equivalent to weeks since the week of Jan
-        // 1st, 1900
-        protected int mWeek = -1;
-
-        // Quick reference to the width of this view, matches parent
-        protected int mWidth;
-
-        // The height this view should draw at in pixels, set by height param
-        protected int mHeight;
-
-        // If this view contains the selected day
-        protected boolean mHasSelectedDay = false;
-
-        // Which day is selected [0-6] or -1 if no day is selected
-        protected int mSelectedDay = -1;
-
-        // How many days to display
-        protected int mWeekDayCount;
-
-        // The number of days + a spot for week number if it is displayed
-        protected int mNumCells;
-
-        // The left edge of the selected day
-        protected int mSelectedLeft = -1;
-
-        // The right edge of the selected day
-        protected int mSelectedRight = -1;
-
-        public WeekView(Context context) {
-            super(context);
-
-            TypedValue outTypedValue = new TypedValue();
-            context.getTheme().resolveAttribute(R.attr.dayPickerWeekViewStyle, outTypedValue, true);
-            TypedArray attributesArray = context.obtainStyledAttributes(outTypedValue.resourceId,
-                    R.styleable.DayPickerWeekView);
-            mHeight = attributesArray.getDimensionPixelSize(R.styleable.DayPickerWeekView_height,
-                    26);
-            mNumberTextSize = attributesArray.getDimensionPixelSize(
-                    R.styleable.DayPickerWeekView_textSize, 14);
-            mFirstDayOfweek = attributesArray.getInt(R.styleable.DayPickerWeekView_weekStartDay,
-                    Calendar.SUNDAY);
-            mNumCells = mWeekDayCount = attributesArray.getInt(
-                    R.styleable.DayPickerWeekView_weekDayCount, 7);
-            mShowWeekNumber = attributesArray.getBoolean(R.styleable.DayPickerWeekView_weekDayCount,
-                    true);
-            mWeekSeperatorWidth = attributesArray.getDimensionPixelSize(
-                    R.styleable.DayPickerWeekView_weekSeperatorWidth, 1);
-            mWeekDayPadding = attributesArray.getDimensionPixelSize(
-                    R.styleable.DayPickerWeekView_weekDayPadding, 0);
-            mSelectionBackgroundColor = attributesArray.getColor(
-                    R.styleable.DayPickerWeekView_selectionBackgroundColor, 0);
-            mFocusedMonthDateColor = attributesArray.getColor(
-                    R.styleable.DayPickerWeekView_focusedMonthDateColor, 0);
-            mOtherMonthDateColor = attributesArray.getColor(
-                    R.styleable.DayPickerWeekView_otherMonthDateColor, 0);
-            mGridLinesColor = attributesArray.getColor(
-                    R.styleable.DayPickerWeekView_gridLinesColor, 0);
-            mWeekNumberColor = attributesArray.getColor(
-                    R.styleable.DayPickerWeekView_weekNumberColor, 0);
-            mSelectedDayLine = attributesArray
-                    .getDrawable(R.styleable.DayPickerWeekView_selectedDayLine);
-            mSelectedDayLineWidth = attributesArray.getDimensionPixelSize(
-                    R.styleable.DayPickerWeekView_selectedDayLineWidth, 6);
-            attributesArray.recycle();
-
-            // Sets up any standard paints that will be used
-            setPaintProperties();
-        }
-
-        /**
-         * Sets all the parameters for displaying this week. The only required
-         * parameter is the week number. Other parameters have a default value
-         * and will only update if a new value is included, except for focus
-         * month, which will always default to no focus month if no value is
-         * passed in. See {@link #VIEW_PARAMS_HEIGHT} for more info on
-         * parameters.
-         *
-         * @param params A map of the new parameters, see
-         *            {@link #VIEW_PARAMS_HEIGHT}
-         */
-        public void setWeekParams(HashMap<String, Object> params) {
-            if (!params.containsKey(VIEW_PARAMS_WEEK)) {
-                throw new InvalidParameterException(
-                        "You must specify the week number for this view");
-            }
-            setTag(params);
-            // We keep the current value for any params not present
-            if (params.containsKey(VIEW_PARAMS_HEIGHT)) {
-                mHeight = ((int[]) params.get(VIEW_PARAMS_HEIGHT))[0];
-            }
-            if (params.containsKey(VIEW_PARAMS_SELECTED_DAY)) {
-                mSelectedDay = ((int[]) params.get(VIEW_PARAMS_SELECTED_DAY))[0];
-            }
-            mHasSelectedDay = mSelectedDay != -1;
-            if (params.containsKey(VIEW_PARAMS_NUM_DAYS)) {
-                mWeekDayCount = ((int[]) params.get(VIEW_PARAMS_NUM_DAYS))[0];
-            }
-            if (params.containsKey(VIEW_PARAMS_SHOW_WK_NUM)) {
-                if (((int[]) params.get(VIEW_PARAMS_SHOW_WK_NUM))[0] != 0) {
-                    mNumCells = mWeekDayCount + 1;
-                    mShowWeekNumber = true;
-                } else {
-                    mShowWeekNumber = false;
-                }
-            } else {
-                mNumCells = mShowWeekNumber ? mWeekDayCount + 1 : mWeekDayCount;
-            }
-            mWeek = ((int[]) params.get(VIEW_PARAMS_WEEK))[0];
-            mTempCalendar.clear();
-            mTempCalendar.set(1900, 0, 1);
-            mTempCalendar.add(Calendar.WEEK_OF_YEAR, mWeek);
-            if (params.containsKey(VIEW_PARAMS_WEEK_START)) {
-                mTempCalendar.setFirstDayOfWeek(((int[]) params.get(VIEW_PARAMS_WEEK_START))[0]);
-            } else {
-                mTempCalendar.setFirstDayOfWeek(Calendar.SUNDAY);
-            }
-
-            // Allocate space for caching the day numbers and focus values
-            mDayNumbers = new String[mNumCells];
-            mFocusDay = new boolean[mNumCells];
-
-            // If we're showing the week number calculate it based on Monday
-            int i = 0;
-            if (mShowWeekNumber) {
-                mDayNumbers[0] = Integer.toString(mTempCalendar.get(Calendar.WEEK_OF_YEAR));
-                i++;
-            }
-
-            // Now adjust our starting day based on the start day of the week
-            int diff = mTempCalendar.getFirstDayOfWeek() - mTempCalendar.get(Calendar.DAY_OF_WEEK);
-            mTempCalendar.add(Calendar.DAY_OF_MONTH, diff);
-
-            mFirstDay = (Calendar) mTempCalendar.clone();
-
-            mMonthOfFirstWeekDay = mTempCalendar.get(Calendar.MONTH);
-
-            int focusMonth = params.containsKey(VIEW_PARAMS_FOCUS_MONTH) ? ((int[]) params
-                    .get(VIEW_PARAMS_FOCUS_MONTH))[0] : -1;
-
-            for (; i < mNumCells; i++) {
-                mFocusDay[i] = (mTempCalendar.get(Calendar.MONTH) == focusMonth);
-                mDayNumbers[i] = Integer.toString(mTempCalendar.get(Calendar.DAY_OF_MONTH));
-                mTempCalendar.add(Calendar.DAY_OF_MONTH, 1);
-            }
-            // We do one extra add at the end of the loop, if that pushed us to
-            // new month undo it
-            if (mTempCalendar.get(Calendar.DAY_OF_MONTH) == 1) {
-                mTempCalendar.add(Calendar.DAY_OF_MONTH, -1);
-            }
-            mLastWeekDayMonth = mTempCalendar.get(Calendar.MONTH);
-
-            updateSelectionPositions();
-        }
-
-        /**
-         * Sets up the text and style properties for painting. Override this if
-         * you want to use a different paint.
-         */
-        protected void setPaintProperties() {
-            mDrawPaint.setFakeBoldText(false);
-            mDrawPaint.setAntiAlias(true);
-            mDrawPaint.setTextSize(mNumberTextSize);
-            mDrawPaint.setStyle(Style.FILL);
-
-            mMonthNumDrawPaint.setFakeBoldText(true);
-            mMonthNumDrawPaint.setAntiAlias(true);
-            mMonthNumDrawPaint.setTextSize(mNumberTextSize);
-            mMonthNumDrawPaint.setColor(mFocusedMonthDateColor);
-            mMonthNumDrawPaint.setStyle(Style.FILL);
-            mMonthNumDrawPaint.setTextAlign(Align.CENTER);
-        }
-
-        /**
-         * Returns the month of the first day in this week.
-         *
-         * @return The month the first day of this view is in.
-         */
-        public int getMonthOfFirstWeekDay() {
-            return mMonthOfFirstWeekDay;
-        }
-
-        /**
-         * Returns the month of the last day in this week
-         *
-         * @return The month the last day of this view is in
-         */
-        public int getMonthOfLastWeekDay() {
-            return mLastWeekDayMonth;
-        }
-
-        /**
-         * Returns the first day in this view.
-         *
-         * @return The first day in the view.
-         */
-        public Calendar getFirstDay() {
-            return mFirstDay;
-        }
-
-        /**
-         * Returns the number of days this view will display.
-         */
-        public int getNumDays() {
-            return mWeekDayCount;
-        }
-
-        /**
-         * Calculates the day that the given x position is in, accounting for
-         * week number. Returns a Time referencing that day or null if
-         *
-         * @param x The x position of the touch eventy
-         */
-        public void getDayFromLocation(float x, Calendar outCalendar) {
-            int dayStart = mShowWeekNumber ? (mWidth - mWeekDayPadding * 2) / mNumCells
-                    + mWeekDayPadding : mWeekDayPadding;
-            if (x < dayStart || x > mWidth - mWeekDayPadding) {
-                outCalendar.set(0, 0, 0, 0, 0, 0);
-                return;
-            }
-            // Selection is (x - start) / (pixels/day) == (x -s) * day / pixels
-            int dayPosition = (int) ((x - dayStart) * mWeekDayCount
-                    / (mWidth - dayStart - mWeekDayPadding));
-            outCalendar.setTimeZone(mFirstDay.getTimeZone());
-            outCalendar.setTimeInMillis(mFirstDay.getTimeInMillis());
-            outCalendar.add(Calendar.DAY_OF_MONTH, dayPosition);
-        }
-
-        @Override
-        protected void onDraw(Canvas canvas) {
-            drawBackground(canvas);
-            drawWeekNums(canvas);
-            drawDaySeparators(canvas);
-            drawSelectedDayLines(canvas);
-        }
-
-        /**
-         * This draws the selection highlight if a day is selected in this week.
-         * Override this method if you wish to have a different background
-         * drawn.
-         *
-         * @param canvas The canvas to draw on
-         */
-        protected void drawBackground(Canvas canvas) {
-            if (!mHasSelectedDay) {
-                return;
-            }
-            mDrawPaint.setColor(mSelectionBackgroundColor);
-
-            mTempRect.top = mWeekSeperatorWidth;
-            mTempRect.bottom = mHeight;
-            mTempRect.left = mShowWeekNumber ? mWeekDayPadding + (mWidth - mWeekDayPadding * 2)
-                    / mNumCells : mWeekDayPadding;
-            mTempRect.right = mSelectedLeft - 2;
-            canvas.drawRect(mTempRect, mDrawPaint);
-
-            mTempRect.left = mSelectedRight + 3;
-            mTempRect.right = mWidth - mWeekDayPadding;
-            canvas.drawRect(mTempRect, mDrawPaint);
-        }
-
-        /**
-         * Draws the week and month day numbers for this week. Override this
-         * method if you need different placement.
-         *
-         * @param canvas The canvas to draw on
-         */
-        protected void drawWeekNums(Canvas canvas) {
-            float textHeight = mDrawPaint.getTextSize();
-            int y = (int) ((mHeight + textHeight) / 2) - mWeekSeperatorWidth;
-            int nDays = mNumCells;
-
-            mDrawPaint.setTextAlign(Align.CENTER);
-            int i = 0;
-            int divisor = 2 * nDays;
-            if (mShowWeekNumber) {
-                mDrawPaint.setColor(mWeekNumberColor);
-                int x = (mWidth - mWeekDayPadding * 2) / divisor + mWeekDayPadding;
-                canvas.drawText(mDayNumbers[0], x, y, mDrawPaint);
-                i++;
-            }
-            for (; i < nDays; i++) {
-                mMonthNumDrawPaint.setColor(mFocusDay[i] ? mFocusedMonthDateColor
-                        : mOtherMonthDateColor);
-                int x = (2 * i + 1) * (mWidth - mWeekDayPadding * 2) / divisor + mWeekDayPadding;
-                canvas.drawText(mDayNumbers[i], x, y, mMonthNumDrawPaint);
-            }
-        }
-
-        /**
-         * Draws a horizontal line for separating the weeks. Override this
-         * method if you want custom separators.
-         *
-         * @param canvas The canvas to draw on.
-         */
-        protected void drawDaySeparators(Canvas canvas) {
-            // If it is the topmost fully visible child do not draw separator line
-            int firstFullyVisiblePosition = mListView.getFirstVisiblePosition();
-            if (mListView.getChildAt(0).getTop() < 0) {
-                firstFullyVisiblePosition++;
-            }
-            if (firstFullyVisiblePosition == mWeek) {
-                return;
-            }
-            mDrawPaint.setColor(mGridLinesColor);
-            mDrawPaint.setStrokeWidth(mWeekSeperatorWidth);
-            float x = mShowWeekNumber ? mWeekDayPadding + (mWidth - mWeekDayPadding * 2) / mNumCells
-                    : mWeekDayPadding;
-            canvas.drawLine(x, 0, mWidth - mWeekDayPadding, 0, mDrawPaint);
-        }
-
-        /**
-         * Draws the selected day lines if this week has a selected day.
-         *
-         * @param canvas The canvas to draw on
-         */
-        protected void drawSelectedDayLines(Canvas canvas) {
-            if (!mHasSelectedDay) {
-                return;
-            }
-            mSelectedDayLine.setBounds(mSelectedLeft - mSelectedDayLineWidth / 2,
-                    mWeekSeperatorWidth,
-                    mSelectedLeft + mSelectedDayLineWidth / 2, mHeight);
-            mSelectedDayLine.draw(canvas);
-            mSelectedDayLine.setBounds(mSelectedRight - mSelectedDayLineWidth / 2,
-                    mWeekSeperatorWidth,
-                    mSelectedRight + mSelectedDayLineWidth / 2, mHeight);
-            mSelectedDayLine.draw(canvas);
-        }
-
-        @Override
-        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-            mWidth = w;
-            updateSelectionPositions();
-        }
-
-        /**
-         * This calculates the positions for the selected day lines.
-         */
-        protected void updateSelectionPositions() {
-            if (mHasSelectedDay) {
-                int selectedPosition = mSelectedDay - mTempCalendar.getFirstDayOfWeek();
-                if (selectedPosition < 0) {
-                    selectedPosition += 7;
-                }
-                if (mShowWeekNumber) {
-                    selectedPosition++;
-                }
-                mSelectedLeft = selectedPosition * (mWidth - mWeekDayPadding * 2) / mNumCells
-                        + mWeekDayPadding;
-                mSelectedRight = (selectedPosition + 1) * (mWidth - mWeekDayPadding * 2) / mNumCells
-                        + mWeekDayPadding;
-            }
-        }
-
-        @Override
-        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-            setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mHeight);
-        }
-    }
-}
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index df01da7..c7addcc 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -1483,61 +1483,95 @@
         int action = event.getAction();
 
         if (action != KeyEvent.ACTION_UP) {
-            if (mSelectedPosition < 0) {
-                switch (keyCode) {
-                    case KeyEvent.KEYCODE_DPAD_UP:
-                    case KeyEvent.KEYCODE_DPAD_DOWN:
-                    case KeyEvent.KEYCODE_DPAD_LEFT:
-                    case KeyEvent.KEYCODE_DPAD_RIGHT:
-                    case KeyEvent.KEYCODE_DPAD_CENTER:
-                    case KeyEvent.KEYCODE_SPACE:
-                    case KeyEvent.KEYCODE_ENTER:
-                        resurrectSelection();
-                        return true;
-                }
-            }
-
             switch (keyCode) {
                 case KeyEvent.KEYCODE_DPAD_LEFT:
-                    handled = arrowScroll(FOCUS_LEFT);
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_LEFT);
+                    }
                     break;
 
                 case KeyEvent.KEYCODE_DPAD_RIGHT:
-                    handled = arrowScroll(FOCUS_RIGHT);
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_RIGHT);
+                    }
                     break;
 
                 case KeyEvent.KEYCODE_DPAD_UP:
-                    if (!event.isAltPressed()) {
-                        handled = arrowScroll(FOCUS_UP);
-
-                    } else {
-                        handled = fullScroll(FOCUS_UP);
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_UP);
+                    } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+                        handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP);
                     }
                     break;
 
                 case KeyEvent.KEYCODE_DPAD_DOWN:
-                    if (!event.isAltPressed()) {
-                        handled = arrowScroll(FOCUS_DOWN);
-                    } else {
-                        handled = fullScroll(FOCUS_DOWN);
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_DOWN);
+                    } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+                        handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN);
                     }
                     break;
 
                 case KeyEvent.KEYCODE_DPAD_CENTER:
                 case KeyEvent.KEYCODE_ENTER: {
-                    if (getChildCount() > 0 && event.getRepeatCount() == 0) {
+                    if (event.hasNoModifiers()
+                            && event.getRepeatCount() == 0 && getChildCount() > 0) {
+                        ensureSelectionOnMovementKey();
                         keyPressed();
                     }
-
                     return true;
                 }
 
                 case KeyEvent.KEYCODE_SPACE:
                     if (mPopup == null || !mPopup.isShowing()) {
-                        if (!event.isShiftPressed()) {
-                            handled = pageScroll(FOCUS_DOWN);
-                        } else {
-                            handled = pageScroll(FOCUS_UP);
+                        if (event.hasNoModifiers()) {
+                            handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN);
+                        } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+                            handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP);
+                        }
+                    }
+                    break;
+
+                case KeyEvent.KEYCODE_PAGE_UP:
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP);
+                    } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+                        handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP);
+                    }
+                    break;
+
+                case KeyEvent.KEYCODE_PAGE_DOWN:
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN);
+                    } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+                        handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN);
+                    }
+                    break;
+
+                case KeyEvent.KEYCODE_MOVE_HOME:
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP);
+                    }
+                    break;
+
+                case KeyEvent.KEYCODE_MOVE_END:
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN);
+                    }
+                    break;
+
+                case KeyEvent.KEYCODE_TAB:
+                    // XXX Sometimes it is useful to be able to TAB through the items in
+                    //     a GridView sequentially.  Unfortunately this can create an
+                    //     asymmetry in TAB navigation order unless the list selection
+                    //     always reverts to the top or bottom when receiving TAB focus from
+                    //     another widget.  Leaving this behavior disabled for now but
+                    //     perhaps it should be configurable (and more comprehensive).
+                    if (false) {
+                        if (event.hasNoModifiers()) {
+                            handled = ensureSelectionOnMovementKey() && sequenceScroll(FOCUS_FORWARD);
+                        } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+                            handled = ensureSelectionOnMovementKey() && sequenceScroll(FOCUS_BACKWARD);
                         }
                     }
                     break;
@@ -1686,6 +1720,64 @@
         return moved;
     }
 
+    /**
+     * Goes to the next or previous item according to the order set by the
+     * adapter.
+     */
+    boolean sequenceScroll(int direction) {
+        int selectedPosition = mSelectedPosition;
+        int numColumns = mNumColumns;
+        int count = mItemCount;
+
+        int startOfRow;
+        int endOfRow;
+        if (!mStackFromBottom) {
+            startOfRow = (selectedPosition / numColumns) * numColumns;
+            endOfRow = Math.min(startOfRow + numColumns - 1, count - 1);
+        } else {
+            int invertedSelection = count - 1 - selectedPosition;
+            endOfRow = count - 1 - (invertedSelection / numColumns) * numColumns;
+            startOfRow = Math.max(0, endOfRow - numColumns + 1);
+        }
+
+        boolean moved = false;
+        boolean showScroll = false;
+        switch (direction) {
+            case FOCUS_FORWARD:
+                if (selectedPosition < count - 1) {
+                    // Move to the next item.
+                    mLayoutMode = LAYOUT_MOVE_SELECTION;
+                    setSelectionInt(selectedPosition + 1);
+                    moved = true;
+                    // Show the scrollbar only if changing rows.
+                    showScroll = selectedPosition == endOfRow;
+                }
+                break;
+
+            case FOCUS_BACKWARD:
+                if (selectedPosition > 0) {
+                    // Move to the previous item.
+                    mLayoutMode = LAYOUT_MOVE_SELECTION;
+                    setSelectionInt(selectedPosition - 1);
+                    moved = true;
+                    // Show the scrollbar only if changing rows.
+                    showScroll = selectedPosition == startOfRow;
+                }
+                break;
+        }
+
+        if (moved) {
+            playSoundEffect(SoundEffectConstants.getContantForFocusDirection(direction));
+            invokeOnItemScrollListener();
+        }
+
+        if (showScroll) {
+            awakenScrollBars();
+        }
+
+        return moved;
+    }
+
     @Override
     protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
         super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
@@ -1729,7 +1821,7 @@
      * change is coming from?
      * @param childIndex The index to check.
      * @param direction The direction, one of
-     *        {FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}
+     *        {FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT, FOCUS_FORWARD, FOCUS_BACKWARD}
      * @return Whether childIndex is a candidate.
      */
     private boolean isCandidateSelection(int childIndex, int direction) {
@@ -1761,9 +1853,16 @@
             case View.FOCUS_UP:
                 // coming from bottom, need to be in last row
                 return rowEnd == count - 1;
+            case View.FOCUS_FORWARD:
+                // coming from top-left, need to be first in top row
+                return childIndex == rowStart && rowStart == 0;
+            case View.FOCUS_BACKWARD:
+                // coming from bottom-right, need to be last in bottom row
+                return childIndex == rowEnd && rowEnd == count - 1;
             default:
                 throw new IllegalArgumentException("direction must be one of "
-                        + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+                        + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT, "
+                        + "FOCUS_FORWARD, FOCUS_BACKWARD}.");
         }
     }
 
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 3703846..1f95159 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -17,6 +17,7 @@
 package android.widget;
 
 import com.android.internal.R;
+import com.android.internal.util.Predicate;
 import com.google.android.collect.Lists;
 
 import android.content.Context;
@@ -103,7 +104,7 @@
 
     Drawable mDivider;
     int mDividerHeight;
-    
+
     Drawable mOverScrollHeader;
     Drawable mOverScrollFooter;
 
@@ -1535,7 +1536,6 @@
             // reset the focus restoration
             View focusLayoutRestoreDirectChild = null;
 
-
             // Don't put header or footer views into the Recycler. Those are
             // already cached in mHeaderViews;
             if (dataChanged) {
@@ -2078,51 +2078,47 @@
         int action = event.getAction();
 
         if (action != KeyEvent.ACTION_UP) {
-            if (mSelectedPosition < 0) {
-                switch (keyCode) {
-                case KeyEvent.KEYCODE_DPAD_UP:
-                case KeyEvent.KEYCODE_DPAD_DOWN:
-                case KeyEvent.KEYCODE_DPAD_CENTER:
-                case KeyEvent.KEYCODE_ENTER:
-                case KeyEvent.KEYCODE_SPACE:
-                    if (resurrectSelection()) {
-                        return true;
-                    }
-                }
-            }
             switch (keyCode) {
             case KeyEvent.KEYCODE_DPAD_UP:
-                if (!event.isAltPressed()) {
-                    while (count > 0) {
-                        handled = arrowScroll(FOCUS_UP);
-                        count--;
+                if (event.hasNoModifiers()) {
+                    if (ensureSelectionOnMovementKey()) {
+                        while (count-- > 0) {
+                            handled |= arrowScroll(FOCUS_UP);
+                        }
                     }
-                } else {
-                    handled = fullScroll(FOCUS_UP);
+                } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+                    handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP);
                 }
                 break;
 
             case KeyEvent.KEYCODE_DPAD_DOWN:
-                if (!event.isAltPressed()) {
-                    while (count > 0) {
-                        handled = arrowScroll(FOCUS_DOWN);
-                        count--;
+                if (event.hasNoModifiers()) {
+                    if (ensureSelectionOnMovementKey()) {
+                        while (count-- > 0) {
+                            handled |= arrowScroll(FOCUS_DOWN);
+                        }
                     }
-                } else {
-                    handled = fullScroll(FOCUS_DOWN);
+                } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+                    handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN);
                 }
                 break;
 
             case KeyEvent.KEYCODE_DPAD_LEFT:
-                handled = handleHorizontalFocusWithinListItem(View.FOCUS_LEFT);
+                if (event.hasNoModifiers()) {
+                    handled = handleHorizontalFocusWithinListItem(View.FOCUS_LEFT);
+                }
                 break;
+
             case KeyEvent.KEYCODE_DPAD_RIGHT:
-                handled = handleHorizontalFocusWithinListItem(View.FOCUS_RIGHT);
+                if (event.hasNoModifiers()) {
+                    handled = handleHorizontalFocusWithinListItem(View.FOCUS_RIGHT);
+                }
                 break;
 
             case KeyEvent.KEYCODE_DPAD_CENTER:
             case KeyEvent.KEYCODE_ENTER:
                 if (mItemCount > 0 && event.getRepeatCount() == 0) {
+                    ensureSelectionOnMovementKey();
                     keyPressed();
                 }
                 handled = true;
@@ -2130,14 +2126,58 @@
 
             case KeyEvent.KEYCODE_SPACE:
                 if (mPopup == null || !mPopup.isShowing()) {
-                    if (!event.isShiftPressed()) {
-                        pageScroll(FOCUS_DOWN);
-                    } else {
-                        pageScroll(FOCUS_UP);
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN);
+                    } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+                        handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP);
                     }
                     handled = true;
                 }
                 break;
+
+            case KeyEvent.KEYCODE_PAGE_UP:
+                if (event.hasNoModifiers()) {
+                    handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP);
+                } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+                    handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_PAGE_DOWN:
+                if (event.hasNoModifiers()) {
+                    handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN);
+                } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
+                    handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_MOVE_HOME:
+                if (event.hasNoModifiers()) {
+                    handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_MOVE_END:
+                if (event.hasNoModifiers()) {
+                    handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN);
+                }
+                break;
+
+            case KeyEvent.KEYCODE_TAB:
+                // XXX Sometimes it is useful to be able to TAB through the items in
+                //     a ListView sequentially.  Unfortunately this can create an
+                //     asymmetry in TAB navigation order unless the list selection
+                //     always reverts to the top or bottom when receiving TAB focus from
+                //     another widget.  Leaving this behavior disabled for now but
+                //     perhaps it should be configurable (and more comprehensive).
+                if (false) {
+                    if (event.hasNoModifiers()) {
+                        handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_DOWN);
+                    } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+                        handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_UP);
+                    }
+                }
+                break;
             }
         }
 
@@ -3402,7 +3442,7 @@
     }
 
     /* (non-Javadoc)
-     * @see android.view.View#findViewWithTag(String)
+     * @see android.view.View#findViewWithTag(Object)
      * First look in our children, then in any header and footer views that may be scrolled off.
      */
     @Override
@@ -3410,12 +3450,12 @@
         View v;
         v = super.findViewWithTagTraversal(tag);
         if (v == null) {
-            v = findViewTagInHeadersOrFooters(mHeaderViewInfos, tag);
+            v = findViewWithTagInHeadersOrFooters(mHeaderViewInfos, tag);
             if (v != null) {
                 return v;
             }
 
-            v = findViewTagInHeadersOrFooters(mFooterViewInfos, tag);
+            v = findViewWithTagInHeadersOrFooters(mFooterViewInfos, tag);
             if (v != null) {
                 return v;
             }
@@ -3427,7 +3467,7 @@
      *
      * Look in the passed in list of headers or footers for the view with the tag.
      */
-    View findViewTagInHeadersOrFooters(ArrayList<FixedViewInfo> where, Object tag) {
+    View findViewWithTagInHeadersOrFooters(ArrayList<FixedViewInfo> where, Object tag) {
         if (where != null) {
             int len = where.size();
             View v;
@@ -3447,6 +3487,55 @@
         return null;
     }
 
+    /**
+     * @hide
+     * @see android.view.View#findViewByPredicate(Predicate)
+     * First look in our children, then in any header and footer views that may be scrolled off.
+     */
+    @Override
+    protected View findViewByPredicateTraversal(Predicate<View> predicate) {
+        View v;
+        v = super.findViewByPredicateTraversal(predicate);
+        if (v == null) {
+            v = findViewByPredicateInHeadersOrFooters(mHeaderViewInfos, predicate);
+            if (v != null) {
+                return v;
+            }
+
+            v = findViewByPredicateInHeadersOrFooters(mFooterViewInfos, predicate);
+            if (v != null) {
+                return v;
+            }
+        }
+        return v;
+    }
+
+    /* (non-Javadoc)
+     *
+     * Look in the passed in list of headers or footers for the first view that matches
+     * the predicate.
+     */
+    View findViewByPredicateInHeadersOrFooters(ArrayList<FixedViewInfo> where,
+            Predicate<View> predicate) {
+        if (where != null) {
+            int len = where.size();
+            View v;
+
+            for (int i = 0; i < len; i++) {
+                v = where.get(i).view;
+
+                if (!v.isRootNamespace()) {
+                    v = v.findViewByPredicate(predicate);
+
+                    if (v != null) {
+                        return v;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
     @Override
     public boolean onTouchEvent(MotionEvent ev) {
         if (mItemsCanFocus && ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() != 0) {
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index 7b35b51..7ad0390 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -30,8 +30,8 @@
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
-import android.graphics.Paint.Align;
 import android.graphics.Rect;
+import android.graphics.Paint.Align;
 import android.text.InputFilter;
 import android.text.InputType;
 import android.text.Spanned;
@@ -41,11 +41,11 @@
 import android.util.SparseArray;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
-import android.view.LayoutInflater.Filter;
 import android.view.MotionEvent;
 import android.view.VelocityTracker;
 import android.view.View;
 import android.view.ViewConfiguration;
+import android.view.LayoutInflater.Filter;
 import android.view.animation.OvershootInterpolator;
 import android.view.inputmethod.InputMethodManager;
 
@@ -62,11 +62,18 @@
  * <p>
  * For an example of using this widget, see {@link android.widget.TimePicker}.
  * </p>
+ *
+ * @attr ref android.R.styleable#NumberPicker_solidColor
  */
 @Widget
 public class NumberPicker extends LinearLayout {
 
     /**
+     * The default update interval during long press.
+     */
+    private static final long DEFAULT_LONG_PRESS_UPDATE_INTERVAL = 300;
+
+    /**
      * The index of the middle selector item.
      */
     private static final int SELECTOR_MIDDLE_ITEM_INDEX = 2;
@@ -115,6 +122,8 @@
      * strings like "01". Keeping a static formatter etc. is the most efficient
      * way to do this; it avoids creating temporary objects on every call to
      * format().
+     *
+     * @hide
      */
     public static final NumberPicker.Formatter TWO_DIGIT_FORMATTER = new NumberPicker.Formatter() {
         final StringBuilder mBuilder = new StringBuilder();
@@ -123,7 +132,7 @@
 
         final Object[] mArgs = new Object[1];
 
-        public String toString(int value) {
+        public String format(int value) {
             mArgs[0] = value;
             mBuilder.delete(0, mBuilder.length());
             mFmt.format("%02d", mArgs);
@@ -159,22 +168,22 @@
     /**
      * Lower value of the range of numbers allowed for the NumberPicker
      */
-    private int mStart;
+    private int mMinValue;
 
     /**
      * Upper value of the range of numbers allowed for the NumberPicker
      */
-    private int mEnd;
+    private int mMaxValue;
 
     /**
      * Current value of this NumberPicker
      */
-    private int mCurrent;
+    private int mValue;
 
     /**
      * Listener to be notified upon current value change.
      */
-    private OnChangeListener mOnChangeListener;
+    private OnValueChangedListener mOnValueChangedListener;
 
     /**
      * Listener to be notified upon scroll state change.
@@ -189,7 +198,7 @@
     /**
      * The speed for updating the value form long press.
      */
-    private long mLongPressUpdateInterval = 300;
+    private long mLongPressUpdateInterval = DEFAULT_LONG_PRESS_UPDATE_INTERVAL;
 
     /**
      * Cache for the string representation of selector indices.
@@ -308,7 +317,7 @@
     /**
      * Flag whether the selector should wrap around.
      */
-    private boolean mWrapSelector;
+    private boolean mWrapSelectorWheel;
 
     /**
      * The back ground color used to optimize scroller fading.
@@ -326,9 +335,10 @@
     private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE;
 
     /**
-     * The callback interface used to indicate the number value has changed.
+     * Interface to listen for changes of the current value.
      */
-    public interface OnChangeListener {
+    public interface OnValueChangedListener {
+
         /**
          * Called upon a change of the current value.
          *
@@ -336,11 +346,11 @@
          * @param oldVal The previous value.
          * @param newVal The new value.
          */
-        void onChange(NumberPicker picker, int oldVal, int newVal);
+        void onValueChange(NumberPicker picker, int oldVal, int newVal);
     }
 
     /**
-     * Interface for listening to the picker scroll state.
+     * Interface to listen for the picker scroll state.
      */
     public interface OnScrollListener {
 
@@ -360,27 +370,29 @@
         public static int SCROLL_STATE_FLING = 2;
 
         /**
-         * Callback method to be invoked while the number picker is being scrolled.
+         * Callback invoked while the number picker scroll state has changed.
          *
-         * @param view The view whose scroll state is being reported
-         * @param scrollState The current scroll state. One of {@link #SCROLL_STATE_IDLE},
-         * {@link #SCROLL_STATE_TOUCH_SCROLL} or {@link #SCROLL_STATE_IDLE}.
+         * @param view The view whose scroll state is being reported.
+         * @param scrollState The current scroll state. One of
+         *            {@link #SCROLL_STATE_IDLE},
+         *            {@link #SCROLL_STATE_TOUCH_SCROLL} or
+         *            {@link #SCROLL_STATE_IDLE}.
          */
         public void onScrollStateChange(NumberPicker view, int scrollState);
     }
 
     /**
-     * Interface used to format the number into a string for presentation.
+     * Interface used to format current value into a string for presentation.
      */
     public interface Formatter {
 
         /**
-         * Formats a string representation of the current index.
+         * Formats a string representation of the current value.
          *
          * @param value The currently selected value.
          * @return A formatted string representation.
          */
-        public String toString(int value);
+        public String format(int value);
     }
 
     /**
@@ -436,9 +448,9 @@
             public void onClick(View v) {
                 mInputText.clearFocus();
                 if (v.getId() == R.id.increment) {
-                    changeCurrent(mCurrent + 1);
+                    changeCurrent(mValue + 1);
                 } else {
-                    changeCurrent(mCurrent - 1);
+                    changeCurrent(mValue - 1);
                 }
             }
         };
@@ -534,7 +546,7 @@
         });
 
         // create the fling and adjust scrollers
-        mFlingScroller = new Scroller(getContext());
+        mFlingScroller = new Scroller(getContext(), null, true);
         mAdjustScroller = new Scroller(getContext(), new OvershootInterpolator());
 
         updateInputTextView();
@@ -551,6 +563,9 @@
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent event) {
+        if (!isEnabled()) {
+            return false;
+        }
         switch (event.getActionMasked()) {
             case MotionEvent.ACTION_DOWN:
                 mLastMotionEventY = mLastDownEventY = event.getY();
@@ -594,6 +609,9 @@
 
     @Override
     public boolean onTouchEvent(MotionEvent ev) {
+        if (!isEnabled()) {
+            return false;
+        }
         if (mVelocityTracker == null) {
             mVelocityTracker = VelocityTracker.obtain();
         }
@@ -702,12 +720,6 @@
         }
     }
 
-    /**
-     * Set the enabled state of this view. The interpretation of the enabled
-     * state varies by subclass.
-     *
-     * @param enabled True if this view is enabled, false otherwise.
-     */
     @Override
     public void setEnabled(boolean enabled) {
         super.setEnabled(enabled);
@@ -716,9 +728,6 @@
         mInputText.setEnabled(enabled);
     }
 
-    /**
-     * Scrolls the selector with the given <code>vertical offset</code>.
-     */
     @Override
     public void scrollBy(int x, int y) {
         int[] selectorIndices = getSelectorIndices();
@@ -734,11 +743,11 @@
             mSelectorElementHeight = mTextSize + selectorTextGapHeight;
         }
 
-        if (!mWrapSelector && y > 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mStart) {
+        if (!mWrapSelectorWheel && y > 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
             mCurrentScrollOffset = mInitialScrollOffset;
             return;
         }
-        if (!mWrapSelector && y < 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mEnd) {
+        if (!mWrapSelectorWheel && y < 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mMaxValue) {
             mCurrentScrollOffset = mInitialScrollOffset;
             return;
         }
@@ -747,7 +756,7 @@
             mCurrentScrollOffset -= mSelectorElementHeight;
             decrementSelectorIndices(selectorIndices);
             changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]);
-            if (selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mStart) {
+            if (selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
                 mCurrentScrollOffset = mInitialScrollOffset;
             }
         }
@@ -755,7 +764,7 @@
             mCurrentScrollOffset += mSelectorElementHeight;
             incrementScrollSelectorIndices(selectorIndices);
             changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]);
-            if (selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mEnd) {
+            if (selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mMaxValue) {
                 mCurrentScrollOffset = mInitialScrollOffset;
             }
         }
@@ -769,16 +778,16 @@
     /**
      * Sets the listener to be notified on change of the current value.
      *
-     * @param onChangeListener The listener.
+     * @param onValueChangedListener The listener.
      */
-    public void setOnChangeListener(OnChangeListener onChangeListener) {
-        mOnChangeListener = onChangeListener;
+    public void setOnValueChangedListener(OnValueChangedListener onValueChangedListener) {
+        mOnValueChangedListener = onValueChangedListener;
     }
 
     /**
      * Set listener to be notified for scroll state changes.
      *
-     * @param onScrollListener the callback, should not be null.
+     * @param onScrollListener The listener.
      */
     public void setOnScrollListener(OnScrollListener onScrollListener) {
         mOnScrollListener = onScrollListener;
@@ -787,164 +796,216 @@
     /**
      * Set the formatter to be used for formatting the current value.
      * <p>
-     * Note: If you have provided alternative values for the selected positons
-     *       this formatter is never invoked.
+     * Note: If you have provided alternative values for the values this
+     * formatter is never invoked.
      * </p>
      *
-     * @param formatter the formatter object. If formatter is null,
-     *            String.valueOf() will be used.
+     * @param formatter The formatter object. If formatter is <code>null</code>,
+     *            {@link String#valueOf(int)} will be used.
      *
-     * @see #setRange(int, int, String[])
+     * @see #setDisplayedValues(String[])
      */
     public void setFormatter(Formatter formatter) {
-        mFormatter = formatter;
-    }
-
-    /**
-     * Set the range of numbers allowed for the number picker. The current value
-     * will be automatically set to the start.
-     *
-     * @param start the start of the range (inclusive)
-     * @param end the end of the range (inclusive)
-     */
-    public void setRange(int start, int end) {
-        setRange(start, end, null);
-    }
-
-    /**
-     * Set the range of numbers allowed for the number picker. The current value
-     * will be automatically set to the start. Also provide a mapping for values
-     * used to display to the user instead of the numbers in the range.
-     *
-     * @param start The start of the range (inclusive).
-     * @param end The end of the range (inclusive).
-     * @param displayedValues The values displayed to the user.
-     */
-    public void setRange(int start, int end, String[] displayedValues) {
-        boolean wrapSelector = (end - start) >= mSelectorIndices.length;
-        setRange(start, end, displayedValues, wrapSelector);
-    }
-
-    /**
-     * Set the range of numbers allowed for the number picker. The current value
-     * will be automatically set to the start. Also provide a mapping for values
-     * used to display to the user.
-     * <p>
-     * Note: The <code>wrapSelectorWheel</code> argument is ignored if the range
-     * (difference between <code>start</code> and <code>end</code>) us less than
-     * five since this is the number of values shown by the selector wheel.
-     * </p>
-     *
-     * @param start the start of the range (inclusive)
-     * @param end the end of the range (inclusive)
-     * @param displayedValues the values displayed to the user.
-     * @param wrapSelectorWheel Whether to wrap the selector wheel.
-     *
-     * @see #setWrapSelectorWheel(boolean)
-     */
-    public void setRange(int start, int end, String[] displayedValues, boolean wrapSelectorWheel) {
-        if (start == mStart && end == mEnd) {
+        if (formatter == mFormatter) {
             return;
         }
-
-        if (start < 0 || end < 0) {
-            throw new IllegalArgumentException("start and end must be > 0");
-        }
-        
-        mDisplayedValues = displayedValues;
-        mStart = start;
-        mEnd = end;
-        mCurrent = start;
-
-        setWrapSelectorWheel(wrapSelectorWheel);
-        updateInputTextView();
-
-        if (displayedValues != null) {
-            // Allow text entry rather than strictly numeric entry.
-            mInputText.setRawInputType(InputType.TYPE_CLASS_TEXT
-                    | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
-        } else {
-            mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
-        }
-
-        resetSelectorIndices();
+        mFormatter = formatter;
+        resetSelectorWheelIndices();
     }
 
     /**
      * Set the current value for the number picker.
+     * <p>
+     * If the argument is less than the {@link NumberPicker#getMinValue()} and
+     * {@link NumberPicker#getWrapSelectorWheel()} is <code>false</code> the
+     * current value is set to the {@link NumberPicker#getMinValue()} value.
+     * </p>
+     * <p>
+     * If the argument is less than the {@link NumberPicker#getMinValue()} and
+     * {@link NumberPicker#getWrapSelectorWheel()} is <code>true</code> the
+     * current value is set to the {@link NumberPicker#getMaxValue()} value.
+     * </p>
+     * <p>
+     * If the argument is less than the {@link NumberPicker#getMaxValue()} and
+     * {@link NumberPicker#getWrapSelectorWheel()} is <code>false</code> the
+     * current value is set to the {@link NumberPicker#getMaxValue()} value.
+     * </p>
+     * <p>
+     * If the argument is less than the {@link NumberPicker#getMaxValue()} and
+     * {@link NumberPicker#getWrapSelectorWheel()} is <code>true</code> the
+     * current value is set to the {@link NumberPicker#getMinValue()} value.
+     * </p>
      *
-     * @param current the current value the start of the range (inclusive)
-     *
-     * @throws IllegalArgumentException when current is not within the range of
-     *             of the number picker.
+     * @param value The current value.
+     * @see #setWrapSelectorWheel(boolean)
+     * @see #setMinValue(int)
+     * @see #setMaxValue(int)
      */
-    public void setCurrent(int current) {
-        if (mCurrent == current) {
+    public void setValue(int value) {
+        if (mValue == value) {
             return;
         }
-        if (current < mStart || current > mEnd) {
-            throw new IllegalArgumentException("current should be >= start and <= end");
+        if (value < mMinValue) {
+            value = mWrapSelectorWheel ? mMaxValue : mMinValue;
         }
-        mCurrent = current;
+        if (value > mMaxValue) {
+            value = mWrapSelectorWheel ? mMinValue : mMaxValue;
+        }
+        mValue = value;
         updateInputTextView();
         updateIncrementAndDecrementButtonsVisibilityState();
     }
 
     /**
-     * Sets whether the selector wheel shown during flinging/scrolling should wrap
-     * around the beginning and end values. By default if the range is more than
-     * five (the number of items shown on the selector wheel) the selector wheel
-     * wrapping is enabled.
+     * Gets whether the selector wheel wraps when reaching the min/max value.
+     *
+     * @return True if the selector wheel wraps.
+     *
+     * @see #getMinValue()
+     * @see #getMaxValue()
+     */
+    public boolean getWrapSelectorWheel() {
+        return mWrapSelectorWheel;
+    }
+
+    /**
+     * Sets whether the selector wheel shown during flinging/scrolling should
+     * wrap around the {@link NumberPicker#getMinValue()} and
+     * {@link NumberPicker#getMaxValue()} values.
+     * <p>
+     * By default if the range (max - min) is more than five (the number of
+     * items shown on the selector wheel) the selector wheel wrapping is
+     * enabled.
+     * </p>
      *
      * @param wrapSelector Whether to wrap.
      */
     public void setWrapSelectorWheel(boolean wrapSelector) {
-        if (wrapSelector && (mEnd - mStart) < mSelectorIndices.length) {
+        if (wrapSelector && (mMaxValue - mMinValue) < mSelectorIndices.length) {
             throw new IllegalStateException("Range less than selector items count.");
         }
-        if (wrapSelector != mWrapSelector) {
+        if (wrapSelector != mWrapSelectorWheel) {
             // force the selector indices array to be reinitialized
             mSelectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] = Integer.MAX_VALUE;
-            mWrapSelector = wrapSelector;
+            mWrapSelectorWheel = wrapSelector;
         }
     }
 
     /**
      * Sets the speed at which the numbers be incremented and decremented when
      * the up and down buttons are long pressed respectively.
+     * <p>
+     * The default value is 300 ms.
+     * </p>
      *
      * @param intervalMillis The speed (in milliseconds) at which the numbers
-     *            will be incremented and decremented (default 300ms).
+     *            will be incremented and decremented.
      */
     public void setOnLongPressUpdateInterval(long intervalMillis) {
         mLongPressUpdateInterval = intervalMillis;
     }
 
     /**
-     * Returns the current value of the NumberPicker.
+     * Returns the value of the picker.
      *
-     * @return the current value.
+     * @return The value.
      */
-    public int getCurrent() {
-        return mCurrent;
+    public int getValue() {
+        return mValue;
     }
 
     /**
-     * Returns the range lower value of the NumberPicker.
+     * Returns the min value of the picker.
      *
-     * @return The lower number of the range.
+     * @return The min value
      */
-    public int getRangeStart() {
-        return mStart;
+    public int getMinValue() {
+        return mMinValue;
     }
 
     /**
-     * Returns the range end value of the NumberPicker.
+     * Sets the min value of the picker.
      *
-     * @return The upper number of the range.
+     * @param minValue The min value.
      */
-    public int getRangeEnd() {
-        return mEnd;
+    public void setMinValue(int minValue) {
+        if (mMinValue == minValue) {
+            return;
+        }
+        if (minValue < 0) {
+            throw new IllegalArgumentException("minValue must be >= 0");
+        }
+        mMinValue = minValue;
+        if (mMinValue > mValue) {
+            mValue = mMinValue;
+        }
+        boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length;
+        setWrapSelectorWheel(wrapSelectorWheel);
+        resetSelectorWheelIndices();
+        updateInputTextView();
+        updateIncrementAndDecrementButtonsVisibilityState();
+    }
+
+    /**
+     * Returns the max value of the picker.
+     *
+     * @return The max value.
+     */
+    public int getMaxValue() {
+        return mMaxValue;
+    }
+
+    /**
+     * Sets the max value of the picker.
+     *
+     * @param maxValue The max value.
+     */
+    public void setMaxValue(int maxValue) {
+        if (mMaxValue == maxValue) {
+            return;
+        }
+        if (maxValue < 0) {
+            throw new IllegalArgumentException("maxValue must be >= 0");
+        }
+        mMaxValue = maxValue;
+        if (mMaxValue < mValue) {
+            mValue = mMaxValue;
+        }
+        boolean wrapSelectorWheel = mMaxValue - mMinValue > mSelectorIndices.length;
+        setWrapSelectorWheel(wrapSelectorWheel);
+        resetSelectorWheelIndices();
+        updateInputTextView();
+        updateIncrementAndDecrementButtonsVisibilityState();
+    }
+
+    /**
+     * Gets the values to be displayed instead of string values.
+     *
+     * @return The displayed values.
+     */
+    public String[] getDisplayedValues() {
+        return mDisplayedValues;
+    }
+
+    /**
+     * Sets the values to be displayed.
+     *
+     * @param displayedValues The displayed values.
+     */
+    public void setDisplayedValues(String[] displayedValues) {
+        if (mDisplayedValues == displayedValues) {
+            return;
+        }
+        mDisplayedValues = displayedValues;
+        if (mDisplayedValues != null) {
+            // Allow text entry rather than strictly numeric entry.
+            mInputText.setRawInputType(InputType.TYPE_CLASS_TEXT
+                    | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
+        } else {
+            mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
+        }
+        updateInputTextView();
+        resetSelectorWheelIndices();
     }
 
     @Override
@@ -979,10 +1040,7 @@
         // children
         // after we have completed drawing ourselves.
 
-        // Draw the selector wheel if needed
-        if (mDrawSelectorWheel) {
-            super.draw(canvas);
-        }
+        super.draw(canvas);
 
         // Draw our children if we are not showing the selector wheel of fading
         // it out
@@ -1020,7 +1078,7 @@
      * Resets the selector indices and clear the cached
      * string representation of these indices.
      */
-    private void resetSelectorIndices() {
+    private void resetSelectorWheelIndices() {
         mSelectorIndexToStringCache.clear();
         int[] selectorIdices = getSelectorIndices();
         for (int i = 0; i < selectorIdices.length; i++) {
@@ -1037,15 +1095,15 @@
      * @param current the new value of the NumberPicker
      */
     private void changeCurrent(int current) {
-        if (mCurrent == current) {
+        if (mValue == current) {
             return;
         }
         // Wrap around the values if we go past the start or end
-        if (mWrapSelector) {
+        if (mWrapSelectorWheel) {
             current = getWrappedSelectorIndex(current);
         }
-        int previous = mCurrent;
-        setCurrent(current);
+        int previous = mValue;
+        setValue(current);
         notifyChange(previous, current);
     }
 
@@ -1110,7 +1168,7 @@
         mPreviousScrollerY = 0;
         Scroller flingScroller = mFlingScroller;
 
-        if (mWrapSelector) {
+        if (mWrapSelectorWheel) {
             if (velocityY > 0) {
                 flingScroller.fling(0, 0, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE);
             } else {
@@ -1118,10 +1176,10 @@
             }
         } else {
             if (velocityY > 0) {
-                int maxY = mTextSize * (mCurrent - mStart);
+                int maxY = mTextSize * (mValue - mMinValue);
                 flingScroller.fling(0, 0, 0, velocityY, 0, 0, 0, maxY);
             } else {
-                int startY = mTextSize * (mEnd - mCurrent);
+                int startY = mTextSize * (mMaxValue - mValue);
                 int maxY = startY;
                 flingScroller.fling(0, startY, 0, velocityY, 0, 0, 0, maxY);
             }
@@ -1155,12 +1213,12 @@
      * Updates the visibility state of the increment and decrement buttons.
      */
     private void updateIncrementAndDecrementButtonsVisibilityState() {
-        if (mWrapSelector || mCurrent < mEnd) {
+        if (mWrapSelectorWheel || mValue < mMaxValue) {
             mIncrementButton.setVisibility(VISIBLE);
         } else {
             mIncrementButton.setVisibility(INVISIBLE);
         }
-        if (mWrapSelector || mCurrent > mStart) {
+        if (mWrapSelectorWheel || mValue > mMinValue) {
             mDecrementButton.setVisibility(VISIBLE);
         } else {
             mDecrementButton.setVisibility(INVISIBLE);
@@ -1172,11 +1230,11 @@
      *         the middle one.
      */
     private int[] getSelectorIndices() {
-        int current = getCurrent();
+        int current = getValue();
         if (mSelectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] != current) {
             for (int i = 0; i < mSelectorIndices.length; i++) {
                 int selectorIndex = current + (i - SELECTOR_MIDDLE_ITEM_INDEX);
-                if (mWrapSelector) {
+                if (mWrapSelectorWheel) {
                     selectorIndex = getWrappedSelectorIndex(selectorIndex);
                 }
                 mSelectorIndices[i] = selectorIndex;
@@ -1190,10 +1248,10 @@
      * @return The wrapped index <code>selectorIndex</code> value.
      */
     private int getWrappedSelectorIndex(int selectorIndex) {
-        if (selectorIndex > mEnd) {
-            return mStart + (selectorIndex - mEnd) % (mEnd - mStart);
-        } else if (selectorIndex < mStart) {
-            return mEnd - (mStart - selectorIndex) % (mEnd - mStart);
+        if (selectorIndex > mMaxValue) {
+            return mMinValue + (selectorIndex - mMaxValue) % (mMaxValue - mMinValue) - 1;
+        } else if (selectorIndex < mMinValue) {
+            return mMaxValue - (mMinValue - selectorIndex) % (mMaxValue - mMinValue) + 1;
         }
         return selectorIndex;
     }
@@ -1207,8 +1265,8 @@
             selectorIndices[i] = selectorIndices[i + 1];
         }
         int nextScrollSelectorIndex = selectorIndices[selectorIndices.length - 2] + 1;
-        if (mWrapSelector && nextScrollSelectorIndex > mEnd) {
-            nextScrollSelectorIndex = mStart;
+        if (mWrapSelectorWheel && nextScrollSelectorIndex > mMaxValue) {
+            nextScrollSelectorIndex = mMinValue;
         }
         selectorIndices[selectorIndices.length - 1] = nextScrollSelectorIndex;
         ensureCachedScrollSelectorValue(nextScrollSelectorIndex);
@@ -1223,8 +1281,8 @@
             selectorIndices[i] = selectorIndices[i - 1];
         }
         int nextScrollSelectorIndex = selectorIndices[1] - 1;
-        if (mWrapSelector && nextScrollSelectorIndex < mStart) {
-            nextScrollSelectorIndex = mEnd;
+        if (mWrapSelectorWheel && nextScrollSelectorIndex < mMinValue) {
+            nextScrollSelectorIndex = mMaxValue;
         }
         selectorIndices[0] = nextScrollSelectorIndex;
         ensureCachedScrollSelectorValue(nextScrollSelectorIndex);
@@ -1241,11 +1299,11 @@
         if (scrollSelectorValue != null) {
             return;
         }
-        if (selectorIndex < mStart || selectorIndex > mEnd) {
+        if (selectorIndex < mMinValue || selectorIndex > mMaxValue) {
             scrollSelectorValue = "";
         } else {
             if (mDisplayedValues != null) {
-                int displayedValueIndex = selectorIndex - mStart;
+                int displayedValueIndex = selectorIndex - mMinValue;
                 scrollSelectorValue = mDisplayedValues[displayedValueIndex];
             } else {
                 scrollSelectorValue = formatNumber(selectorIndex);
@@ -1255,7 +1313,7 @@
     }
 
     private String formatNumber(int value) {
-        return (mFormatter != null) ? mFormatter.toString(value) : String.valueOf(value);
+        return (mFormatter != null) ? mFormatter.format(value) : String.valueOf(value);
     }
 
     private void validateInputTextView(View v) {
@@ -1283,9 +1341,9 @@
          * number.
          */
         if (mDisplayedValues == null) {
-            mInputText.setText(formatNumber(mCurrent));
+            mInputText.setText(formatNumber(mValue));
         } else {
-            mInputText.setText(mDisplayedValues[mCurrent - mStart]);
+            mInputText.setText(mDisplayedValues[mValue - mMinValue]);
         }
         mInputText.setSelection(mInputText.getText().length());
     }
@@ -1295,8 +1353,8 @@
      * NumberPicker.
      */
     private void notifyChange(int previous, int current) {
-        if (mOnChangeListener != null) {
-            mOnChangeListener.onChange(this, previous, mCurrent);
+        if (mOnValueChangedListener != null) {
+            mOnValueChangedListener.onValueChange(this, previous, mValue);
         }
     }
 
@@ -1344,7 +1402,7 @@
                 // Don't force the user to type in jan when ja will do
                 value = value.toLowerCase();
                 if (mDisplayedValues[i].toLowerCase().startsWith(value)) {
-                    return mStart + i;
+                    return mMinValue + i;
                 }
             }
 
@@ -1359,7 +1417,7 @@
                 // Ignore as if it's not a number we don't care
             }
         }
-        return mStart;
+        return mMinValue;
     }
 
     /**
@@ -1431,7 +1489,7 @@
                  * allowed. We have to allow less than min as the user might
                  * want to delete some numbers and then type a new number.
                  */
-                if (val > mEnd) {
+                if (val > mMaxValue) {
                     return "";
                 } else {
                     return filtered;
@@ -1495,7 +1553,7 @@
         }
 
         public void run() {
-            changeCurrent(mCurrent + mUpdateStep);
+            changeCurrent(mValue + mUpdateStep);
             postDelayed(this, mLongPressUpdateInterval);
         }
     }
diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java
index 52d9c08..a7bff62 100644
--- a/core/java/android/widget/RemoteViewsAdapter.java
+++ b/core/java/android/widget/RemoteViewsAdapter.java
@@ -148,11 +148,6 @@
             adapter.mMainQueue.removeMessages(0);
             adapter.mWorkerQueue.removeMessages(0);
 
-            // Clear the cache (the meta data will be re-requested on service re-connection)
-            synchronized (adapter.mCache) {
-                adapter.mCache.reset();
-            }
-
             final RemoteAdapterConnectionCallback callback = adapter.mCallback.get();
             if (callback != null) {
                 callback.onRemoteAdapterDisconnected();
@@ -335,8 +330,8 @@
 
                     // Compose the loading view text
                     TextView loadingTextView = (TextView) mLayoutInflater.inflate(
-				com.android.internal.R.layout.remote_views_adapter_default_loading_view,
-				layout, false);
+                            com.android.internal.R.layout.remote_views_adapter_default_loading_view,
+                            layout, false);
                     loadingTextView.setHeight(mFirstViewHeight);
                     loadingTextView.setTag(new Integer(0));
 
@@ -880,7 +875,7 @@
         // a chance to update itself and return new meta data associated with the new data.
     }
 
-    private void superNotifyDataSetChanged() {
+    void superNotifyDataSetChanged() {
         super.notifyDataSetChanged();
     }
 
diff --git a/core/java/android/widget/ResourceCursorAdapter.java b/core/java/android/widget/ResourceCursorAdapter.java
index aee411e..7341c2c 100644
--- a/core/java/android/widget/ResourceCursorAdapter.java
+++ b/core/java/android/widget/ResourceCursorAdapter.java
@@ -35,13 +35,19 @@
     private LayoutInflater mInflater;
     
     /**
-     * Constructor.
+     * Constructor the enables auto-requery.
+     *
+     * @deprecated This option is discouraged, as it results in Cursor queries
+     * being performed on the application's UI thread and thus can cause poor
+     * responsiveness or even Application Not Responding errors.  As an alternative,
+     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
      *
      * @param context The context where the ListView associated with this adapter is running
      * @param layout resource identifier of a layout file that defines the views
      *            for this list item.  Unless you override them later, this will
      *            define both the item views and the drop down views.
      */
+    @Deprecated
     public ResourceCursorAdapter(Context context, int layout, Cursor c) {
         super(context, c);
         mLayout = mDropDownLayout = layout;
@@ -49,7 +55,11 @@
     }
     
     /**
-     * Constructor.
+     * Constructor with default behavior as per
+     * {@link CursorAdapter#CursorAdapter(Context, Cursor, boolean)}; it is recommended
+     * you not use this, but instead {@link #ResourceCursorAdapter(Context, int, Cursor, int)}.
+     * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER}
+     * will always be set.
      *
      * @param context The context where the ListView associated with this adapter is running
      * @param layout resource identifier of a layout file that defines the views
@@ -58,7 +68,7 @@
      * @param c The cursor from which to get the data.
      * @param autoRequery If true the adapter will call requery() on the
      *                    cursor whenever it changes so the most recent
-     *                    data is always displayed.
+     *                    data is always displayed.  Using true here is discouraged.
      */
     public ResourceCursorAdapter(Context context, int layout, Cursor c, boolean autoRequery) {
         super(context, c, autoRequery);
@@ -67,14 +77,15 @@
     }
 
     /**
-     * Constructor.
+     * Standard constructor.
      *
      * @param context The context where the ListView associated with this adapter is running
-     * @param layout resource identifier of a layout file that defines the views
+     * @param layout Resource identifier of a layout file that defines the views
      *            for this list item.  Unless you override them later, this will
      *            define both the item views and the drop down views.
      * @param c The cursor from which to get the data.
-     * @param flags flags used to determine the behavior of the adapter
+     * @param flags Flags used to determine the behavior of the adapter,
+     * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.
      */
     public ResourceCursorAdapter(Context context, int layout, Cursor c, int flags) {
         super(context, c, flags);
diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java
index dcd58b0..3bf5af3 100644
--- a/core/java/android/widget/SearchView.java
+++ b/core/java/android/widget/SearchView.java
@@ -623,14 +623,16 @@
 
             // If there is text in the query box, handle enter, and action keys
             // The search key is handled by the dialog's onKeyDown().
-            if (!mQueryTextView.isEmpty()) {
-                if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
-                    v.cancelLongPress();
+            if (!mQueryTextView.isEmpty() && event.hasNoModifiers()) {
+                if (event.getAction() == KeyEvent.ACTION_UP) {
+                    if (keyCode == KeyEvent.KEYCODE_ENTER) {
+                        v.cancelLongPress();
 
-                    // Launch as a regular search.
-                    launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, mQueryTextView.getText()
-                            .toString());
-                    return true;
+                        // Launch as a regular search.
+                        launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, mQueryTextView.getText()
+                                .toString());
+                        return true;
+                    }
                 }
                 if (event.getAction() == KeyEvent.ACTION_DOWN) {
                     SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode);
@@ -658,11 +660,11 @@
         if (mSuggestionsAdapter == null) {
             return false;
         }
-        if (event.getAction() == KeyEvent.ACTION_DOWN) {
-
+        if (event.getAction() == KeyEvent.ACTION_DOWN && event.hasNoModifiers()) {
             // First, check for enter or search (both of which we'll treat as a
             // "click")
-            if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH) {
+            if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH
+                    || keyCode == KeyEvent.KEYCODE_TAB) {
                 int position = mQueryTextView.getListSelection();
                 return onItemClicked(position, KeyEvent.KEYCODE_UNKNOWN, null);
             }
diff --git a/core/java/android/widget/SimpleCursorAdapter.java b/core/java/android/widget/SimpleCursorAdapter.java
index d1c2270..3d2a252 100644
--- a/core/java/android/widget/SimpleCursorAdapter.java
+++ b/core/java/android/widget/SimpleCursorAdapter.java
@@ -66,7 +66,23 @@
     String[] mOriginalFrom;
 
     /**
-     * Constructor.
+     * Constructor the enables auto-requery.
+     *
+     * @deprecated This option is discouraged, as it results in Cursor queries
+     * being performed on the application's UI thread and thus can cause poor
+     * responsiveness or even Application Not Responding errors.  As an alternative,
+     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
+     */
+    @Deprecated
+    public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
+        super(context, layout, c);
+        mTo = to;
+        mOriginalFrom = from;
+        findColumns(from);
+    }
+
+    /**
+     * Standard constructor.
      * 
      * @param context The context where the ListView associated with this
      *            SimpleListItemFactory is running
@@ -80,9 +96,12 @@
      *            These should all be TextViews. The first N views in this list
      *            are given the values of the first N columns in the from
      *            parameter.  Can be null if the cursor is not available yet.
+     * @param flags Flags used to determine the behavior of the adapter,
+     * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.
      */
-    public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
-        super(context, layout, c);
+    public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from,
+            int[] to, int flags) {
+        super(context, layout, c, flags);
         mTo = to;
         mOriginalFrom = from;
         findColumns(from);
@@ -318,10 +337,11 @@
     }
 
     @Override
-    public void changeCursor(Cursor c) {
-        super.changeCursor(c);
+    public Cursor swapCursor(Cursor c) {
+        Cursor res = super.swapCursor(c);
         // rescan columns in case cursor layout is different
         findColumns(mOriginalFrom);
+        return res;
     }
     
     /**
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index b90837c..bdf24e0 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -24,6 +24,7 @@
 import android.content.res.TypedArray;
 import android.database.DataSetObserver;
 import android.util.AttributeSet;
+import android.util.DisplayMetrics;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -43,6 +44,9 @@
 public class Spinner extends AbsSpinner implements OnClickListener {
     private static final String TAG = "Spinner";
     
+    // Only measure this many items to get a decent max width.
+    private static final int MAX_ITEMS_MEASURED = 15;
+
     /**
      * Use a dialog window for selecting spinner options.
      */
@@ -584,6 +588,7 @@
         private CharSequence mHintText;
         private TextView mHintView;
         private int mHintResource;
+        private int mPopupMaxWidth;
         
         public DropdownPopup(Context context, AttributeSet attrs,
                 int defStyleRes, int hintResource) {
@@ -591,6 +596,9 @@
             
             mHintResource = hintResource;
             
+            final DisplayMetrics metrics = context.getResources().getDisplayMetrics();
+            mPopupMaxWidth = metrics.widthPixels / 2;
+
             setAnchorView(Spinner.this);
             setModal(true);
             setPromptPosition(POSITION_PROMPT_ABOVE);
@@ -622,9 +630,46 @@
                 setPromptView(textView);
                 mHintView = textView;
             }
+            setContentWidth(Math.min(
+                    Math.max(measureContentWidth(getAdapter()), Spinner.this.getWidth()),
+                    mPopupMaxWidth));
             super.show();
             getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
             setSelection(Spinner.this.getSelectedItemPosition());
         }
+
+        private int measureContentWidth(SpinnerAdapter adapter) {
+            int width = 0;
+            View itemView = null;
+            int itemType = 0;
+            final int widthMeasureSpec =
+                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+            final int heightMeasureSpec =
+                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+
+            // Make sure the number of items we'll measure is capped. If it's a huge data set
+            // with wildly varying sizes, oh well.
+            final int start = Math.max(0, getSelectedItemPosition());
+            final int count = Math.min(adapter.getCount(), start + MAX_ITEMS_MEASURED);
+            for (int i = start; i < count; i++) {
+                final int positionType = adapter.getItemViewType(i);
+                if (positionType != itemType) {
+                    itemType = positionType;
+                    itemView = null;
+                }
+                itemView = adapter.getDropDownView(i, itemView, Spinner.this);
+                if (itemView.getLayoutParams() == null) {
+                    itemView.setLayoutParams(generateDefaultLayoutParams());
+                }
+                itemView.measure(widthMeasureSpec, heightMeasureSpec);
+                width = Math.max(width, itemView.getMeasuredWidth());
+            }
+            return width;
+        }
+
+        private ViewGroup.LayoutParams generateDefaultLayoutParams() {
+            return new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT);
+        }
     }
 }
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index ec2bb74..ed06ded 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -16,6 +16,8 @@
 
 package android.widget;
 
+import java.lang.ref.WeakReference;
+
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
 import android.content.Context;
@@ -54,6 +56,7 @@
     private static final int DEFAULT_ANIMATION_DURATION = 400;
     private static final int FADE_IN_ANIMATION_DURATION = 800;
     private static final int MINIMUM_ANIMATION_DURATION = 50;
+    private static final int STACK_RELAYOUT_DURATION = 100;
 
     /**
      * Parameters effecting the perspective visuals
@@ -192,11 +195,15 @@
      * Animate the views between different relative indexes within the {@link AdapterViewAnimator}
      */
     void animateViewForTransition(int fromIndex, int toIndex, View view) {
-        if (fromIndex == -1 && toIndex > 0) {
+        if (fromIndex == -1 && toIndex == NUM_ACTIVE_VIEWS -1) {
             // Fade item in
             if (view.getAlpha() == 1) {
                 view.setAlpha(0);
             }
+            view.setScaleX(1 - PERSPECTIVE_SCALE_FACTOR);
+            view.setScaleY(1 - PERSPECTIVE_SCALE_FACTOR);
+            view.setTranslationX(mPerspectiveShiftX);
+            view.setTranslationY(0);
             view.setVisibility(VISIBLE);
 
             ObjectAnimator fadeIn = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 1.0f);
@@ -234,10 +241,13 @@
             view.setVisibility(INVISIBLE);
             LayoutParams lp = (LayoutParams) view.getLayoutParams();
             lp.setVerticalOffset(-mSlideAmount);
+        } else if (fromIndex == -1) {
+            view.setAlpha(1.0f);
+            view.setVisibility(VISIBLE);
         } else if (toIndex == -1) {
             // Fade item out
             ObjectAnimator fadeOut = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 0.0f);
-            fadeOut.setDuration(DEFAULT_ANIMATION_DURATION);
+            fadeOut.setDuration(STACK_RELAYOUT_DURATION);
             fadeOut.start();
         }
 
@@ -277,13 +287,17 @@
 
             ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(view, scalePropX, scalePropY,
                     translationY, translationX);
-            oa.setDuration(100);
-            view.setTagInternal(com.android.internal.R.id.viewAnimation, oa);
+            oa.setDuration(STACK_RELAYOUT_DURATION);
+            view.setTagInternal(com.android.internal.R.id.viewAnimation, 
+                    new WeakReference<ObjectAnimator>(oa));
             oa.start();
         } else {
             Object tag = view.getTag(com.android.internal.R.id.viewAnimation);
-            if (tag instanceof ObjectAnimator) {
-                ((ObjectAnimator) tag).cancel();
+            if (tag instanceof WeakReference<?>) {
+                Object obj = ((WeakReference<?>) tag).get();
+                if (obj instanceof ObjectAnimator) {
+                    ((ObjectAnimator) obj).cancel();
+                }
             }
 
             view.setTranslationX(transX);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 9a2cc89..a3bfe8b 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -81,6 +81,7 @@
 import android.text.method.TextKeyListener;
 import android.text.method.TimeKeyListener;
 import android.text.method.TransformationMethod;
+import android.text.style.ClickableSpan;
 import android.text.style.ParagraphStyle;
 import android.text.style.URLSpan;
 import android.text.style.UpdateAppearance;
@@ -782,6 +783,8 @@
                 == (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);
         final boolean webPasswordInputType = variation
                 == (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_WEB_PASSWORD);
+        final boolean numberPasswordInputType = variation
+                == (EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD);
 
         if (inputMethod != null) {
             Class<?> c;
@@ -864,6 +867,7 @@
             mInputType = EditorInfo.TYPE_NULL;
             mInput = null;
             bufferType = BufferType.SPANNABLE;
+            // Required to request focus while in touch mode.
             setFocusableInTouchMode(true);
             // So that selection can be changed using arrow keys and touch is handled.
             setMovementMethod(ArrowKeyMovementMethod.getInstance());
@@ -898,6 +902,11 @@
                 mInputType = (mInputType & ~(EditorInfo.TYPE_MASK_VARIATION))
                         | EditorInfo.TYPE_TEXT_VARIATION_WEB_PASSWORD;
             }
+        } else if ((mInputType & EditorInfo.TYPE_MASK_CLASS) == EditorInfo.TYPE_CLASS_NUMBER) {
+            if (numberPasswordInputType) {
+                mInputType = (mInputType & ~(EditorInfo.TYPE_MASK_VARIATION))
+                        | EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD;
+            }
         }
 
         if (selectallonfocus) {
@@ -944,7 +953,7 @@
         }
         setRawTextSize(textSize);
 
-        if (password || passwordInputType || webPasswordInputType) {
+        if (password || passwordInputType || webPasswordInputType || numberPasswordInputType) {
             setTransformationMethod(PasswordTransformationMethod.getInstance());
             typefaceIndex = MONOSPACE;
         } else if ((mInputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION))
@@ -2748,7 +2757,10 @@
                  */
                 mText = text;
 
-                if (mLinksClickable) {
+                // Do not change the movement method for text that support text selection as it
+                // would prevent an arbitrary cursor displacement.
+                final boolean hasTextSelection = this instanceof EditText || mTextIsSelectable;
+                if (mLinksClickable && !hasTextSelection) {
                     setMovementMethod(LinkMovementMethod.getInstance());
                 }
             }
@@ -3091,7 +3103,9 @@
         return variation
                 == (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD)
                 || variation
-                == (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_WEB_PASSWORD);
+                == (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_WEB_PASSWORD)
+                || variation
+                == (EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD);
     }
 
     private boolean isVisiblePasswordInputType(int inputType) {
@@ -3876,7 +3890,7 @@
         // - ExtractEditText does not call onFocus when it is displayed. Fixing this issue would
         //   allow to test for hasSelection in onFocusChanged, which would trigger a
         //   startTextSelectionMode here. TODO
-        if (this instanceof ExtractEditText && hasSelection() && hasSelectionController()) {
+        if (this instanceof ExtractEditText && hasSelection() && canSelectText()) {
             startSelectionActionMode();
         }
 
@@ -4073,7 +4087,7 @@
      *
      * Use {@link #setTextIsSelectable(boolean)} or the
      * {@link android.R.styleable#TextView_textIsSelectable} XML attribute to make this TextView
-     * selectable (the text is not selectable by default). 
+     * selectable (text is not selectable by default).
      *
      * Note that the content of an EditText is always selectable.
      *
@@ -4088,8 +4102,8 @@
     /**
      * Sets whether or not (default) the content of this view is selectable by the user.
      * 
-     * Note that this methods affect the {@link #setFocusableInTouchMode(boolean)},
-     * {@link #setFocusable(boolean)}, {@link #setClickable(boolean)} and
+     * Note that this methods affect the {@link #setFocusable(boolean)},
+     * {@link #setFocusableInTouchMode(boolean)} {@link #setClickable(boolean)} and
      * {@link #setLongClickable(boolean)} states and you may want to restore these if they were
      * customized.
      *
@@ -4582,9 +4596,8 @@
 
         if ((mInputType & EditorInfo.TYPE_MASK_CLASS) == EditorInfo.TYPE_CLASS_TEXT) {
             int variation = mInputType & EditorInfo.TYPE_MASK_VARIATION;
-
-            if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS ||
-                variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_SUBJECT) {
+            if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
+                    || variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_SUBJECT) {
                 return true;
             }
         }
@@ -4592,6 +4605,23 @@
         return false;
     }
 
+    /**
+     * Returns true if pressing TAB in this field advances focus instead
+     * of inserting the character.  Insert tabs only in multi-line editors.
+     */
+    private boolean shouldAdvanceFocusOnTab() {
+        if (mInput != null && !mSingleLine) {
+            if ((mInputType & EditorInfo.TYPE_MASK_CLASS) == EditorInfo.TYPE_CLASS_TEXT) {
+                int variation = mInputType & EditorInfo.TYPE_MASK_VARIATION;
+                if (variation == EditorInfo.TYPE_TEXT_FLAG_IME_MULTI_LINE
+                        || variation == EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
     private int doKeyDown(int keyCode, KeyEvent event, KeyEvent otherEvent) {
         if (!isEnabled()) {
             return 0;
@@ -4600,16 +4630,12 @@
         switch (keyCode) {
             case KeyEvent.KEYCODE_ENTER:
                 mEnterKeyIsDown = true;
-                // If ALT modifier is held, then we always insert a
-                // newline character.
-                if ((event.getMetaState()&KeyEvent.META_ALT_ON) == 0) {
-                    
+                if (event.hasNoModifiers()) {
                     // When mInputContentType is set, we know that we are
                     // running in a "modern" cupcake environment, so don't need
                     // to worry about the application trying to capture
                     // enter key events.
                     if (mInputContentType != null) {
-                        
                         // If there is an action listener, given them a
                         // chance to consume the event.
                         if (mInputContentType.onEditorActionListener != null &&
@@ -4620,11 +4646,11 @@
                             return -1;
                         }
                     }
-                    
+
                     // If our editor should move focus when enter is pressed, or
                     // this is a generated event from an IME action button, then
                     // don't let it be inserted into the text.
-                    if ((event.getFlags()&KeyEvent.FLAG_EDITOR_ACTION) != 0
+                    if ((event.getFlags() & KeyEvent.FLAG_EDITOR_ACTION) != 0
                             || shouldAdvanceFocusOnEnter()) {
                         return -1;
                     }
@@ -4633,8 +4659,18 @@
                 
             case KeyEvent.KEYCODE_DPAD_CENTER:
                 mDPadCenterIsDown = true;
-                if (shouldAdvanceFocusOnEnter()) {
-                    return 0;
+                if (event.hasNoModifiers()) {
+                    if (shouldAdvanceFocusOnEnter()) {
+                        return 0;
+                    }
+                }
+                break;
+
+            case KeyEvent.KEYCODE_TAB:
+                if (event.hasNoModifiers() || event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+                    if (shouldAdvanceFocusOnTab()) {
+                        return 0;
+                    }
                 }
                 break;
 
@@ -4729,76 +4765,80 @@
         switch (keyCode) {
             case KeyEvent.KEYCODE_DPAD_CENTER:
                 mDPadCenterIsDown = false;
-                /*
-                 * If there is a click listener, just call through to
-                 * super, which will invoke it.
-                 *
-                 * If there isn't a click listener, try to show the soft
-                 * input method.  (It will also
-                 * call performClick(), but that won't do anything in
-                 * this case.)
-                 */
-                if (mOnClickListener == null) {
-                    if (mMovement != null && mText instanceof Editable
-                            && mLayout != null && onCheckIsTextEditor()) {
-                        InputMethodManager imm = (InputMethodManager)
-                                getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
-                        imm.showSoftInput(this, 0);
-                    }
-                }
-                return super.onKeyUp(keyCode, event);
-                
-            case KeyEvent.KEYCODE_ENTER:
-                mEnterKeyIsDown = false;
-                if (mInputContentType != null
-                        && mInputContentType.onEditorActionListener != null
-                        && mInputContentType.enterDown) {
-                    mInputContentType.enterDown = false;
-                    if (mInputContentType.onEditorActionListener.onEditorAction(
-                            this, EditorInfo.IME_NULL, event)) {
-                        return true;
-                    }
-                }
-                
-                if ((event.getFlags()&KeyEvent.FLAG_EDITOR_ACTION) != 0
-                        || shouldAdvanceFocusOnEnter()) {
+                if (event.hasNoModifiers()) {
                     /*
                      * If there is a click listener, just call through to
                      * super, which will invoke it.
                      *
-                     * If there isn't a click listener, try to advance focus,
-                     * but still call through to super, which will reset the
-                     * pressed state and longpress state.  (It will also
+                     * If there isn't a click listener, try to show the soft
+                     * input method.  (It will also
                      * call performClick(), but that won't do anything in
                      * this case.)
                      */
                     if (mOnClickListener == null) {
-                        View v = focusSearch(FOCUS_DOWN);
+                        if (mMovement != null && mText instanceof Editable
+                                && mLayout != null && onCheckIsTextEditor()) {
+                            InputMethodManager imm = (InputMethodManager)
+                                    getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+                            imm.showSoftInput(this, 0);
+                        }
+                    }
+                }
+                return super.onKeyUp(keyCode, event);
 
-                        if (v != null) {
-                            if (!v.requestFocus(FOCUS_DOWN)) {
-                                throw new IllegalStateException("focus search returned a view " +
-                                        "that wasn't able to take focus!");
-                            }
-
-                            /*
-                             * Return true because we handled the key; super
-                             * will return false because there was no click
-                             * listener.
-                             */
-                            super.onKeyUp(keyCode, event);
+            case KeyEvent.KEYCODE_ENTER:
+                mEnterKeyIsDown = false;
+                if (event.hasNoModifiers()) {
+                    if (mInputContentType != null
+                            && mInputContentType.onEditorActionListener != null
+                            && mInputContentType.enterDown) {
+                        mInputContentType.enterDown = false;
+                        if (mInputContentType.onEditorActionListener.onEditorAction(
+                                this, EditorInfo.IME_NULL, event)) {
                             return true;
-                        } else if ((event.getFlags()
-                                & KeyEvent.FLAG_EDITOR_ACTION) != 0) {
-                            // No target for next focus, but make sure the IME
-                            // if this came from it.
-                            InputMethodManager imm = InputMethodManager.peekInstance();
-                            if (imm != null) {
-                                imm.hideSoftInputFromWindow(getWindowToken(), 0);
-                            }
                         }
                     }
 
+                    if ((event.getFlags() & KeyEvent.FLAG_EDITOR_ACTION) != 0
+                            || shouldAdvanceFocusOnEnter()) {
+                        /*
+                         * If there is a click listener, just call through to
+                         * super, which will invoke it.
+                         *
+                         * If there isn't a click listener, try to advance focus,
+                         * but still call through to super, which will reset the
+                         * pressed state and longpress state.  (It will also
+                         * call performClick(), but that won't do anything in
+                         * this case.)
+                         */
+                        if (mOnClickListener == null) {
+                            View v = focusSearch(FOCUS_DOWN);
+
+                            if (v != null) {
+                                if (!v.requestFocus(FOCUS_DOWN)) {
+                                    throw new IllegalStateException(
+                                            "focus search returned a view " +
+                                            "that wasn't able to take focus!");
+                                }
+
+                                /*
+                                 * Return true because we handled the key; super
+                                 * will return false because there was no click
+                                 * listener.
+                                 */
+                                super.onKeyUp(keyCode, event);
+                                return true;
+                            } else if ((event.getFlags()
+                                    & KeyEvent.FLAG_EDITOR_ACTION) != 0) {
+                                // No target for next focus, but make sure the IME
+                                // if this came from it.
+                                InputMethodManager imm = InputMethodManager.peekInstance();
+                                if (imm != null) {
+                                    imm.hideSoftInputFromWindow(getWindowToken(), 0);
+                                }
+                            }
+                        }
+                    }
                     return super.onKeyUp(keyCode, event);
                 }
                 break;
@@ -7208,6 +7248,19 @@
                 handled |= mMovement.onTouchEvent(this, (Spannable) mText, event);
             }
 
+            if (mLinksClickable && mAutoLinkMask != 0 && mTextIsSelectable &&
+                    action == MotionEvent.ACTION_UP && !mIgnoreActionUpEvent && isFocused()) {
+                // The LinkMovementMethod which should handle taps on links has not been installed
+                // to support text selection. We reproduce its behavior here to open links.
+                ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(),
+                        getSelectionEnd(), ClickableSpan.class);
+
+                if (links.length != 0) {
+                    links[0].onClick(this);
+                    handled = true;
+                }
+            }
+
             if (isTextEditable() || mTextIsSelectable) {
                 if (mScrollX != oldScrollX || mScrollY != oldScrollY) {
                     // Hide insertion anchor while scrolling. Leave selection.
@@ -7486,43 +7539,49 @@
 
     @Override
     public boolean onKeyShortcut(int keyCode, KeyEvent event) {
-        switch (keyCode) {
-        case KeyEvent.KEYCODE_A:
-            if (canSelectText()) {
-                return onTextContextMenuItem(ID_SELECT_ALL);
+        final int filteredMetaState = event.getMetaState() & ~KeyEvent.META_CTRL_MASK;
+        if (KeyEvent.metaStateHasNoModifiers(filteredMetaState)) {
+            switch (keyCode) {
+            case KeyEvent.KEYCODE_A:
+                if (canSelectText()) {
+                    return onTextContextMenuItem(ID_SELECT_ALL);
+                }
+                break;
+            case KeyEvent.KEYCODE_X:
+                if (canCut()) {
+                    return onTextContextMenuItem(ID_CUT);
+                }
+                break;
+            case KeyEvent.KEYCODE_C:
+                if (canCopy()) {
+                    return onTextContextMenuItem(ID_COPY);
+                }
+                break;
+            case KeyEvent.KEYCODE_V:
+                if (canPaste()) {
+                    return onTextContextMenuItem(ID_PASTE);
+                }
+                break;
             }
-
-            break;
-
-        case KeyEvent.KEYCODE_X:
-            if (canCut()) {
-                return onTextContextMenuItem(ID_CUT);
-            }
-
-            break;
-
-        case KeyEvent.KEYCODE_C:
-            if (canCopy()) {
-                return onTextContextMenuItem(ID_COPY);
-            }
-
-            break;
-
-        case KeyEvent.KEYCODE_V:
-            if (canPaste()) {
-                return onTextContextMenuItem(ID_PASTE);
-            }
-
-            break;
         }
-
         return super.onKeyShortcut(keyCode, event);
     }
 
+    /**
+     * Unlike {@link #textCanBeSelected()}, this method is based on the <i>current</i> state of the
+     * TextView. {@link #textCanBeSelected()} has to be true (this is one of the conditions to have
+     * a selection controller (see {@link #prepareCursorControllers()}), but this is not sufficient.
+     */
     private boolean canSelectText() {
         return hasSelectionController() && mText.length() != 0;
     }
 
+    /**
+     * Test based on the <i>intrinsic</i> charateristics of the TextView.
+     * The text must be spannable and the movement method must allow for arbitary selection.
+     * 
+     * See also {@link #canSelectText()}.
+     */
     private boolean textCanBeSelected() {
         // prepareCursorController() relies on this method.
         // If you change this condition, make sure prepareCursorController is called anywhere
@@ -7587,9 +7646,7 @@
         int variation = mInputType & InputType.TYPE_MASK_VARIATION;
 
         // Text selection is not permitted in password fields
-        if (variation == InputType.TYPE_TEXT_VARIATION_PASSWORD ||
-                variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD ||
-                variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
+        if (isPasswordInputType(mInputType) || isVisiblePasswordInputType(mInputType)) {
             return -1;
         }
 
@@ -7675,12 +7732,44 @@
         if (hasPasswordTransformationMethod()) {
             // selectCurrentWord is not available on a password field and would return an
             // arbitrary 10-charater selection around pressed position. Select all instead.
-            // Note that cut/copy menu entries are not available for passwords.
-            // This is however useful to delete or paste to replace the entire content.
+            // Cut/copy menu entries are not available for passwords, but being able to select all
+            // is however useful to delete or paste to replace the entire content.
             selectAll();
             return;
         }
 
+        long lastTouchOffset = getLastTouchOffsets();
+        final int minOffset = extractRangeStartFromLong(lastTouchOffset);
+        final int maxOffset = extractRangeEndFromLong(lastTouchOffset);
+
+        int selectionStart, selectionEnd;
+
+        // If a URLSpan (web address, email, phone...) is found at that position, select it.
+        URLSpan[] urlSpans = ((Spanned) mText).getSpans(minOffset, maxOffset, URLSpan.class);
+        if (urlSpans.length == 1) {
+            URLSpan url = urlSpans[0];
+            selectionStart = ((Spanned) mText).getSpanStart(url);
+            selectionEnd = ((Spanned) mText).getSpanEnd(url);
+        } else {
+            long wordLimits = getWordLimitsAt(minOffset);
+            if (wordLimits >= 0) {
+                selectionStart = extractRangeStartFromLong(wordLimits);
+            } else {
+                selectionStart = Math.max(minOffset - 5, 0);
+            }
+
+            wordLimits = getWordLimitsAt(maxOffset);
+            if (wordLimits >= 0) {
+                selectionEnd = extractRangeEndFromLong(wordLimits);
+            } else {
+                selectionEnd = Math.min(maxOffset + 5, mText.length());
+            }
+        }
+
+        Selection.setSelection((Spannable) mText, selectionStart, selectionEnd);
+    }
+
+    private long getLastTouchOffsets() {
         int minOffset, maxOffset;
 
         if (mContextMenuTriggeredByKey) {
@@ -7692,23 +7781,7 @@
             maxOffset = selectionController.getMaxTouchOffset();
         }
 
-        int selectionStart, selectionEnd;
-
-        long wordLimits = getWordLimitsAt(minOffset);
-        if (wordLimits >= 0) {
-            selectionStart = extractRangeStartFromLong(wordLimits);
-        } else {
-            selectionStart = Math.max(minOffset - 5, 0);
-        }
-
-        wordLimits = getWordLimitsAt(maxOffset);
-        if (wordLimits >= 0) {
-            selectionEnd = extractRangeEndFromLong(wordLimits);
-        } else {
-            selectionEnd = Math.min(maxOffset + 5, mText.length());
-        }
-
-        Selection.setSelection((Spannable) mText, selectionStart, selectionEnd);
+        return packRangeInLong(minOffset, maxOffset);
     }
 
     @Override
@@ -7753,28 +7826,25 @@
         boolean added = false;
         mContextMenuTriggeredByKey = mDPadCenterIsDown || mEnterKeyIsDown;
         // Problem with context menu on long press: the menu appears while the key in down and when
-        // the key is released, the view does not receive the key_up event. This ensures that the
-        // state is reset whenever the context menu action is displayed.
-        // mContextMenuTriggeredByKey saved that state so that it is available in
-        // onTextContextMenuItem. We cannot simply clear these flags in onTextContextMenuItem since
+        // the key is released, the view does not receive the key_up event.
+        // We need two layers of flags: mDPadCenterIsDown and mEnterKeyIsDown are set in key down/up
+        // events. We cannot simply clear these flags in onTextContextMenuItem since
         // it may not be called (if the user/ discards the context menu with the back key).
+        // We clear these flags here and mContextMenuTriggeredByKey saves that state so that it is
+        // available in onTextContextMenuItem.
         mDPadCenterIsDown = mEnterKeyIsDown = false;
 
         MenuHandler handler = new MenuHandler();
 
         if (mText instanceof Spanned) {
-            int selStart = getSelectionStart();
-            int selEnd = getSelectionEnd();
+            long lastTouchOffset = getLastTouchOffsets();
+            final int selStart = extractRangeStartFromLong(lastTouchOffset);
+            final int selEnd = extractRangeEndFromLong(lastTouchOffset);
 
-            int min = Math.min(selStart, selEnd);
-            int max = Math.max(selStart, selEnd);
-
-            URLSpan[] urls = ((Spanned) mText).getSpans(min, max,
-                                                        URLSpan.class);
-            if (urls.length == 1) {
-                menu.add(0, ID_COPY_URL, 0,
-                         com.android.internal.R.string.copyUrl).
-                            setOnMenuItemClickListener(handler);
+            URLSpan[] urls = ((Spanned) mText).getSpans(selStart, selEnd, URLSpan.class);
+            if (urls.length > 0) {
+                menu.add(0, ID_COPY_URL, 0, com.android.internal.R.string.copyUrl).
+                        setOnMenuItemClickListener(handler);
 
                 added = true;
             }
@@ -7786,7 +7856,7 @@
         // populates the menu AFTER this call.
         if (menu.size() > 0) {
             menu.add(0, ID_SELECTION_MODE, 0, com.android.internal.R.string.selectTextMode).
-            setOnMenuItemClickListener(handler);
+                    setOnMenuItemClickListener(handler);
             added = true;
         }
 
@@ -7821,7 +7891,9 @@
 
     /**
      * Called when a context menu option for the text view is selected.  Currently
-     * this will be {@link android.R.id#copyUrl} or {@link android.R.id#selectTextMode}.
+     * this will be {@link android.R.id#copyUrl}, {@link android.R.id#selectTextMode},
+     * {@link android.R.id#selectAll}, {@link android.R.id#paste}, {@link android.R.id#cut}
+     * or {@link android.R.id#copy}.
      */
     public boolean onTextContextMenuItem(int id) {
         int min = 0;
@@ -7855,13 +7927,43 @@
                         setPrimaryClip(clip);
                     }
                 }
+                stopSelectionActionMode();
                 return true;
 
             case ID_SELECTION_MODE:
-                startSelectionActionMode();
+                if (mSelectionActionMode != null) {
+                    // Selection mode is already started, simply change selected part.
+                    updateSelectedRegion();
+                } else {
+                    startSelectionActionMode();
+                }
                 return true;
-            }
 
+            case ID_SELECT_ALL:
+                selectAll();
+                // Update controller positions after selection change.
+                if (hasSelectionController()) {
+                    getSelectionController().show();
+                }
+                return true;
+
+            case ID_PASTE:
+                paste(min, max);
+                return true;
+
+            case ID_CUT:
+                setPrimaryClip(ClipData.newPlainText(null, null,
+                        mTransformed.subSequence(min, max)));
+                ((Editable) mText).delete(min, max);
+                stopSelectionActionMode();
+                return true;
+
+            case ID_COPY:
+                setPrimaryClip(ClipData.newPlainText(null, null,
+                        mTransformed.subSequence(min, max)));
+                stopSelectionActionMode();
+                return true;
+        }
         return false;
     }
 
@@ -7979,9 +8081,7 @@
                 startDrag(data, getTextThumbnailBuilder(selectedText), false, localState);
                 stopSelectionActionMode();
             } else {
-                // Start a new selection at current position, keep selectionAction mode on
-                selectCurrentWord();
-                getSelectionController().show();
+                updateSelectedRegion();
             }
             performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
             mDiscardNextActionUp = true;
@@ -7998,6 +8098,17 @@
         return false;
     }
 
+    /**
+     * When selection mode is already started, this method simply updates the selected part of text
+     * to the text under the finger.
+     */
+    private void updateSelectedRegion() {
+        // Start a new selection at current position, keep selectionAction mode on
+        selectCurrentWord();
+        // Updates handles' positions
+        getSelectionController().show();
+    }
+
     private boolean touchPositionIsInSelection() {
         int selectionStart = getSelectionStart();
         int selectionEnd = getSelectionEnd();
@@ -8063,6 +8174,11 @@
             return false;
         }
 
+        if (!canSelectText() || !requestFocus()) {
+            Log.w(LOG_TAG, "TextView does not support text selection. Action mode cancelled.");
+            return false;
+        }
+
         selectCurrentWord();
         final InputMethodManager imm = (InputMethodManager)
                 getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
@@ -8139,26 +8255,15 @@
 
         @Override
         public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-            if (!hasSelectionController()) {
-                Log.w(LOG_TAG, "TextView has no selection controller. Action mode cancelled.");
-                return false;
-            }
-
-            if (!requestFocus()) {
-                return false;
-            }
-
             TypedArray styledAttributes = mContext.obtainStyledAttributes(R.styleable.Theme);
 
             mode.setTitle(mContext.getString(com.android.internal.R.string.textSelectionCABTitle));
             mode.setSubtitle(null);
 
-            if (canSelectText()) {
-                menu.add(0, ID_SELECT_ALL, 0, com.android.internal.R.string.selectAll).
+            menu.add(0, ID_SELECT_ALL, 0, com.android.internal.R.string.selectAll).
                     setAlphabeticShortcut('a').
                     setShowAsAction(
                             MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-            }
 
             if (canCut()) {
                 menu.add(0, ID_CUT, 0, com.android.internal.R.string.cut).
@@ -8215,49 +8320,7 @@
                  mCustomSelectionActionModeCallback.onActionItemClicked(mode, item)) {
                 return true;
             }
-
-            final int itemId = item.getItemId();
-
-            if (itemId == ID_SELECT_ALL) {
-                selectAll();
-                // Update controller positions after selection change.
-                if (hasSelectionController()) {
-                    getSelectionController().show();
-                }
-                return true;
-            }
-
-            int min = 0;
-            int max = mText.length();
-
-            if (isFocused()) {
-                final int selStart = getSelectionStart();
-                final int selEnd = getSelectionEnd();
-
-                min = Math.max(0, Math.min(selStart, selEnd));
-                max = Math.max(0, Math.max(selStart, selEnd));
-            }
-
-            switch (item.getItemId()) {
-                case ID_PASTE:
-                    paste(min, max);
-                    return true;
-
-                case ID_CUT:
-                    setPrimaryClip(ClipData.newPlainText(null, null,
-                            mTransformed.subSequence(min, max)));
-                    ((Editable) mText).delete(min, max);
-                    stopSelectionActionMode();
-                    return true;
-
-                case ID_COPY:
-                    setPrimaryClip(ClipData.newPlainText(null, null,
-                            mTransformed.subSequence(min, max)));
-                    stopSelectionActionMode();
-                    return true;
-            }
-
-            return false;
+            return onTextContextMenuItem(item.getItemId());
         }
 
         @Override
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index 203b637..107ea07 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -25,7 +25,7 @@
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.NumberPicker.OnChangeListener;
+import android.widget.NumberPicker.OnValueChangedListener;
 
 import java.text.DateFormatSymbols;
 import java.util.Calendar;
@@ -68,13 +68,15 @@
     private boolean mIsAm;
 
     // ui components
-    private final NumberPicker mHourPicker;
-    private final NumberPicker mMinutePicker;
-    private final NumberPicker mAmPmPicker;
+    private final NumberPicker mHourSpinner;
+    private final NumberPicker mMinuteSpinner;
+    private final NumberPicker mAmPmSpinner;
     private final TextView mDivider;
 
     private final String[] mAmPmStrings;
 
+    private boolean mIsEnabled;
+
     // callbacks
     private OnTimeChangedListener mOnTimeChangedListener;
 
@@ -109,9 +111,9 @@
             true);
 
         // hour
-        mHourPicker = (NumberPicker) findViewById(R.id.hour);
-        mHourPicker.setOnChangeListener(new NumberPicker.OnChangeListener() {
-            public void onChange(NumberPicker spinner, int oldVal, int newVal) {
+        mHourSpinner = (NumberPicker) findViewById(R.id.hour);
+        mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangedListener() {
+            public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
                 mCurrentHour = newVal;
                 if (!mIs24HourView) {
                     // adjust from [1-12] to [0-11] internally, with the times
@@ -133,21 +135,22 @@
         mDivider.setText(R.string.time_picker_separator);
 
         // digits of minute
-        mMinutePicker = (NumberPicker) findViewById(R.id.minute);
-        mMinutePicker.setRange(0, 59);
-        mMinutePicker.setOnLongPressUpdateInterval(100);
-        mMinutePicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
-        mMinutePicker.setOnChangeListener(new NumberPicker.OnChangeListener() {
-            public void onChange(NumberPicker spinner, int oldVal, int newVal) {
+        mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
+        mMinuteSpinner.setMinValue(0);
+        mMinuteSpinner.setMaxValue(59);
+        mMinuteSpinner.setOnLongPressUpdateInterval(100);
+        mMinuteSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
+        mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangedListener() {
+            public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
                 mCurrentMinute = newVal;
                 onTimeChanged();
             }
         });
 
         // am/pm
-        mAmPmPicker = (NumberPicker) findViewById(R.id.amPm);
-        mAmPmPicker.setOnChangeListener(new OnChangeListener() {
-            public void onChange(NumberPicker picker, int oldVal, int newVal) {
+        mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm);
+        mAmPmSpinner.setOnValueChangedListener(new OnValueChangedListener() {
+            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
                 picker.requestFocus();
                 if (mIsAm) {
                     // Currently AM switching to PM
@@ -187,10 +190,19 @@
 
     @Override
     public void setEnabled(boolean enabled) {
+        if (mIsEnabled == enabled) {
+            return;
+        }
         super.setEnabled(enabled);
-        mMinutePicker.setEnabled(enabled);
-        mHourPicker.setEnabled(enabled);
-        mAmPmPicker.setEnabled(enabled);
+        mMinuteSpinner.setEnabled(enabled);
+        mHourSpinner.setEnabled(enabled);
+        mAmPmSpinner.setEnabled(enabled);
+        mIsEnabled = enabled;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return mIsEnabled;
     }
 
     /**
@@ -228,6 +240,7 @@
             dest.writeInt(mMinute);
         }
 
+        @SuppressWarnings("unused")
         public static final Parcelable.Creator<SavedState> CREATOR
                 = new Creator<SavedState>() {
             public SavedState createFromParcel(Parcel in) {
@@ -313,7 +326,7 @@
 
     @Override
     public int getBaseline() {
-        return mHourPicker.getBaseline(); 
+        return mHourSpinner.getBaseline();
     }
 
     /**
@@ -329,22 +342,26 @@
                 currentHour = 12;
             }
         }
-        mHourPicker.setCurrent(currentHour);
+        mHourSpinner.setValue(currentHour);
         mIsAm = mCurrentHour < 12;
-        mAmPmPicker.setCurrent(mIsAm ? Calendar.AM : Calendar.PM);
+        mAmPmSpinner.setValue(mIsAm ? Calendar.AM : Calendar.PM);
         onTimeChanged();
     }
 
     private void configurePickerRanges() {
         if (mIs24HourView) {
-            mHourPicker.setRange(0, 23);
-            mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
-            mAmPmPicker.setVisibility(View.GONE);
+            mHourSpinner.setMinValue(0);
+            mHourSpinner.setMaxValue(23);
+            mHourSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
+            mAmPmSpinner.setVisibility(View.GONE);
         } else {
-            mHourPicker.setRange(1, 12);
-            mHourPicker.setFormatter(null);
-            mAmPmPicker.setVisibility(View.VISIBLE);
-            mAmPmPicker.setRange(0, 1, mAmPmStrings);
+            mHourSpinner.setMinValue(1);
+            mHourSpinner.setMaxValue(12);
+            mHourSpinner.setFormatter(null);
+            mAmPmSpinner.setVisibility(View.VISIBLE);
+            mAmPmSpinner.setMinValue(0);
+            mAmPmSpinner.setMaxValue(1);
+            mAmPmSpinner.setDisplayedValues(mAmPmStrings);
         }
     }
 
@@ -358,7 +375,7 @@
      * Set the state of the spinners appropriate to the current minute.
      */
     private void updateMinuteDisplay() {
-        mMinutePicker.setCurrent(mCurrentMinute);
+        mMinuteSpinner.setValue(mCurrentMinute);
         onTimeChanged();
     }
 }
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index 3a58867..633bdd3 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -505,12 +505,13 @@
         }
         mContainerView.setVisibility(View.VISIBLE);
         mContainerView.setAlpha(0);
-        mContainerView.setTranslationY(-mContainerView.getHeight());
         AnimatorSet anim = new AnimatorSet();
-        AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "translationY", 0))
-            .with(ObjectAnimator.ofFloat(mContainerView, "alpha", 1));
+        AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 1));
         if (mContentView != null) {
-            b.with(ObjectAnimator.ofFloat(mContentView, "translationY", -mContainerView.getHeight(), 0));
+            b.with(ObjectAnimator.ofFloat(mContentView, "translationY",
+                    -mContainerView.getHeight(), 0));
+            mContainerView.setTranslationY(-mContainerView.getHeight());
+            b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", 0));
         }
         anim.addListener(mShowListener);
         mCurrentAnim = anim;
@@ -527,11 +528,12 @@
         }
         mContainerView.setAlpha(1);
         AnimatorSet anim = new AnimatorSet();
-        AnimatorSet.Builder b = anim.play(
-                ObjectAnimator.ofFloat(mContainerView, "translationY", -mContainerView.getHeight()))
-            .with(ObjectAnimator.ofFloat(mContainerView, "alpha", 0));
+        AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 0));
         if (mContentView != null) {
-            b.with(ObjectAnimator.ofFloat(mContentView, "translationY", 0, -mContainerView.getHeight()));
+            b.with(ObjectAnimator.ofFloat(mContentView, "translationY",
+                    0, -mContainerView.getHeight()));
+            b.with(ObjectAnimator.ofFloat(mContainerView, "translationY",
+                    -mContainerView.getHeight()));
         }
         anim.addListener(mHideListener);
         mCurrentAnim = anim;
diff --git a/core/java/com/android/internal/app/LocalePicker.java b/core/java/com/android/internal/app/LocalePicker.java
index 6f6b40b..e32c62d 100644
--- a/core/java/com/android/internal/app/LocalePicker.java
+++ b/core/java/com/android/internal/app/LocalePicker.java
@@ -82,6 +82,11 @@
      * {@link LocaleInfo#label}.
      */
     public static ArrayAdapter<LocaleInfo> constructAdapter(Context context) {
+        return constructAdapter(context, R.layout.locale_picker_item, R.id.locale);
+    }
+
+    public static ArrayAdapter<LocaleInfo> constructAdapter(Context context,
+            int layoutId, int fieldId) {
         final Resources resources = context.getResources();
         final String[] locales = context.getAssets().getLocales();
         final String[] specialLocaleCodes = resources.getStringArray(R.array.special_locale_codes);
@@ -149,8 +154,6 @@
             localeInfos[i] = preprocess[i];
         }
         Arrays.sort(localeInfos);
-        final int layoutId = R.layout.locale_picker_item;
-        final int fieldId = R.id.locale;
         return new ArrayAdapter<LocaleInfo>(context, layoutId, fieldId, localeInfos);
     }
 
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 18e1b45..f58f261 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -24,7 +24,6 @@
 import android.os.Process;
 import android.os.SystemProperties;
 import android.util.Config;
-import android.util.Finalizers;
 import android.util.Log;
 import android.util.Slog;
 
@@ -142,12 +141,6 @@
             Debug.enableEmulatorTraceOutput();
         }
 
-        /**
-         * Initialize the thread used to reclaim resources without
-         * going through finalizers.
-         */
-        Finalizers.init();
-
         initialized = true;
     }
 
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 215809f..b2fbd3a7 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -31,7 +31,8 @@
 interface IInputMethodManager {
     List<InputMethodInfo> getInputMethodList();
     List<InputMethodInfo> getEnabledInputMethodList();
-    List<InputMethodSubtype> getEnabledInputMethodSubtypeList(in InputMethodInfo imi);
+    List<InputMethodSubtype> getEnabledInputMethodSubtypeList(in InputMethodInfo imi,
+            boolean allowsImplicitlySelectedSubtypes);
     // TODO: We should change the return type from List to List<Parcelable>
     // Currently there is a bug that aidl doesn't accept List<Parcelable>
     List getShortcutInputMethodsAndSubtypes();
diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
index a5fd38e..a070835 100644
--- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java
+++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
@@ -124,7 +124,7 @@
         if (mOverflowOnly) {
             item = mMenu.getOverflowItem(position);
         } else {
-            item = mMenu.getItem(position);
+            item = mMenu.getVisibleItems().get(position);
         }
         mMenu.performItemAction(item, 0);
         dismiss();
@@ -142,12 +142,18 @@
         // Menus don't tend to be long, so this is more sane than it looks.
         int width = 0;
         View itemView = null;
+        int itemType = 0;
         final int widthMeasureSpec =
             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
         final int heightMeasureSpec =
             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
         final int count = adapter.getCount();
         for (int i = 0; i < count; i++) {
+            final int positionType = adapter.getItemViewType(i);
+            if (positionType != itemType) {
+                itemType = positionType;
+                itemView = null;
+            }
             itemView = adapter.getView(i, itemView, null);
             itemView.measure(widthMeasureSpec, heightMeasureSpec);
             width = Math.max(width, itemView.getMeasuredWidth());
diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java
index e520e69..e63a68f 100644
--- a/core/java/com/android/internal/widget/ActionBarContainer.java
+++ b/core/java/com/android/internal/widget/ActionBarContainer.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.util.AttributeSet;
+import android.view.MotionEvent;
 import android.widget.FrameLayout;
 
 /**
@@ -39,4 +40,10 @@
         setBackgroundDrawable(a.getDrawable(com.android.internal.R.styleable.ActionBar_background));
         a.recycle();
     }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        super.onTouchEvent(ev);
+        return true;
+    }
 }
diff --git a/core/java/com/android/internal/widget/DigitalClock.java b/core/java/com/android/internal/widget/DigitalClock.java
index 23e2277..ebfe9a9 100644
--- a/core/java/com/android/internal/widget/DigitalClock.java
+++ b/core/java/com/android/internal/widget/DigitalClock.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.res.AssetManager;
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.graphics.Typeface;
@@ -41,12 +42,16 @@
  */
 public class DigitalClock extends RelativeLayout {
 
+    private static final String SYSTEM = "/system/fonts/";
+    private static final String SYSTEM_FONT_TIME_BACKGROUND = SYSTEM + "AndroidClock.ttf";
+    private static final String SYSTEM_FONT_TIME_FOREGROUND = SYSTEM + "AndroidClock_Highlight.ttf";
     private final static String M12 = "h:mm";
     private final static String M24 = "kk:mm";
 
     private Calendar mCalendar;
     private String mFormat;
-    private TextView mTimeDisplay;
+    private TextView mTimeDisplayBackground;
+    private TextView mTimeDisplayForeground;
     private AmPm mAmPm;
     private ContentObserver mFormatChangeObserver;
     private boolean mLive = true;
@@ -117,9 +122,14 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
 
-        mTimeDisplay = (TextView) findViewById(R.id.timeDisplay);
-        mTimeDisplay.setTypeface(Typeface.createFromFile("/system/fonts/Clockopia.ttf"));
-        mAmPm = new AmPm(this, Typeface.createFromFile("/system/fonts/DroidSans-Bold.ttf"));
+        AssetManager assets = mContext.getAssets();
+
+        /* The time display consists of two tones. That's why we have two overlapping text views. */
+        mTimeDisplayBackground = (TextView) findViewById(R.id.timeDisplayBackground);
+        mTimeDisplayBackground.setTypeface(Typeface.createFromFile(SYSTEM_FONT_TIME_BACKGROUND));
+        mTimeDisplayForeground = (TextView) findViewById(R.id.timeDisplayForeground);
+        mTimeDisplayForeground.setTypeface(Typeface.createFromFile(SYSTEM_FONT_TIME_FOREGROUND));
+        mAmPm = new AmPm(this, Typeface.createFromFile(SYSTEM_FONT_TIME_BACKGROUND));
         mCalendar = Calendar.getInstance();
 
         setDateFormat();
@@ -175,12 +185,13 @@
         }
 
         CharSequence newTime = DateFormat.format(mFormat, mCalendar);
-        mTimeDisplay.setText(newTime);
+        mTimeDisplayBackground.setText(newTime);
+        mTimeDisplayForeground.setText(newTime);
         mAmPm.setIsMorning(mCalendar.get(Calendar.AM_PM) == 0);
     }
 
     private void setDateFormat() {
-        mFormat = android.text.format.DateFormat.is24HourFormat(getContext()) 
+        mFormat = android.text.format.DateFormat.is24HourFormat(getContext())
             ? M24 : M12;
         mAmPm.setShowAmPm(mFormat.equals(M12));
     }
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 8eeed3d..e9566ad 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -123,6 +123,7 @@
 	android_media_ToneGenerator.cpp \
 	android_hardware_Camera.cpp \
 	android_hardware_SensorManager.cpp \
+	android_hardware_UsbManager.cpp \
 	android_debug_JNITest.cpp \
 	android_util_FileObserver.cpp \
 	android/opengl/poly_clip.cpp.arm \
@@ -200,7 +201,8 @@
 	libmedia \
 	libwpa_client \
 	libjpeg \
-	libnfc_ndef
+	libnfc_ndef \
+	libusbhost
 
 ifeq ($(USE_OPENGL_RENDERER),true)
 	LOCAL_SHARED_LIBRARIES += libhwui
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 2dfebe5..961bc1f1 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -77,8 +77,8 @@
 extern int register_android_opengl_jni_GLES20(JNIEnv* env);
 
 extern int register_android_hardware_Camera(JNIEnv *env);
-
 extern int register_android_hardware_SensorManager(JNIEnv *env);
+extern int register_android_hardware_UsbManager(JNIEnv *env);
 
 extern int register_android_media_AudioRecord(JNIEnv *env);
 extern int register_android_media_AudioSystem(JNIEnv *env);
@@ -1266,6 +1266,7 @@
     REG_JNI(register_com_android_internal_os_ZygoteInit),
     REG_JNI(register_android_hardware_Camera),
     REG_JNI(register_android_hardware_SensorManager),
+    REG_JNI(register_android_hardware_UsbManager),
     REG_JNI(register_android_media_AudioRecord),
     REG_JNI(register_android_media_AudioSystem),
     REG_JNI(register_android_media_AudioTrack),
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 73c9a50..dac748d 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -26,7 +26,6 @@
 jfieldID gOptions_ditherFieldID;
 jfieldID gOptions_purgeableFieldID;
 jfieldID gOptions_shareableFieldID;
-jfieldID gOptions_nativeAllocFieldID;
 jfieldID gOptions_preferQualityOverSpeedFieldID;
 jfieldID gOptions_widthFieldID;
 jfieldID gOptions_heightFieldID;
@@ -155,12 +154,6 @@
             env->GetBooleanField(options, gOptions_justBoundsFieldID);
 }
 
-static bool optionsReportSizeToVM(JNIEnv* env, jobject options) {
-    return NULL == options ||
-            !env->GetBooleanField(options, gOptions_nativeAllocFieldID);
-}
-
-
 static SkPixelRef* installPixelRef(SkBitmap* bitmap, SkStream* stream,
                                    int sampleSize, bool ditherImage) {
     SkImageRef* pr;
@@ -188,7 +181,6 @@
     bool doDither = true;
     bool isPurgeable = forcePurgeable ||
                         (allowPurgeable && optionsPurgeable(env, options));
-    bool reportSizeToVM = optionsReportSizeToVM(env, options);
     bool preferQualityOverSpeed = false;
     jobject javaBitmap = NULL;
     
@@ -220,7 +212,7 @@
     decoder->setPreferQualityOverSpeed(preferQualityOverSpeed);
 
     NinePatchPeeker     peeker(decoder);
-    JavaPixelAllocator  javaAllocator(env, reportSizeToVM);
+    JavaPixelAllocator  javaAllocator(env);
     SkBitmap*           bitmap;
     if (javaBitmap == NULL) {
         bitmap = new SkBitmap;
@@ -583,7 +575,6 @@
     gOptions_ditherFieldID = getFieldIDCheck(env, gOptions_class, "inDither", "Z");
     gOptions_purgeableFieldID = getFieldIDCheck(env, gOptions_class, "inPurgeable", "Z");
     gOptions_shareableFieldID = getFieldIDCheck(env, gOptions_class, "inInputShareable", "Z");
-    gOptions_nativeAllocFieldID = getFieldIDCheck(env, gOptions_class, "inNativeAlloc", "Z");
     gOptions_preferQualityOverSpeedFieldID = getFieldIDCheck(env, gOptions_class,
             "inPreferQualityOverSpeed", "Z");
     gOptions_widthFieldID = getFieldIDCheck(env, gOptions_class, "outWidth", "I");
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index c81db82..f89967b 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -81,10 +81,7 @@
 
     JavaPixelAllocator *javaAllocator = new JavaPixelAllocator(env);
     decoder->setAllocator(javaAllocator);
-    JavaMemoryUsageReporter *javaMemoryReporter = new JavaMemoryUsageReporter(env);
-    decoder->setReporter(javaMemoryReporter);
     javaAllocator->unref();
-    javaMemoryReporter->unref();
 
     if (!decoder->buildTileIndex(stream, &width, &height)) {
         char msg[100];
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 5134c24..48ff5ed 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -9,9 +9,6 @@
 #include "SkRegion.h"
 #include <android_runtime/AndroidRuntime.h>
 
-//#define REPORT_SIZE_TO_JVM
-//#define TRACK_LOCK_COUNT
-
 void doThrow(JNIEnv* env, const char* exc, const char* msg) {
     // don't throw a new exception if we already have one pending
     if (env->ExceptionCheck() == JNI_FALSE) {
@@ -186,10 +183,6 @@
 static jfieldID gRegion_nativeInstanceID;
 static jmethodID gRegion_constructorMethodID;
 
-static jobject   gVMRuntime_singleton;
-static jmethodID gVMRuntime_trackExternalAllocationMethodID;
-static jmethodID gVMRuntime_trackExternalFreeMethodID;
-
 ///////////////////////////////////////////////////////////////////////////////
 
 void GraphicsJNI::get_jrect(JNIEnv* env, jobject obj, int* L, int* T, int* R, int* B)
@@ -428,10 +421,6 @@
     return env;
 }
 
-#ifdef TRACK_LOCK_COUNT
-    static int gLockCount;
-#endif
-
 ///////////////////////////////////////////////////////////////////////////////
 
 AndroidPixelRef::AndroidPixelRef(JNIEnv* env, void* storage, size_t size, jbyteArray storageObj,
@@ -539,36 +528,10 @@
     return arrayObj;
 }
 
-bool GraphicsJNI::mallocPixelRef(JNIEnv* env, SkBitmap* bitmap, SkColorTable* ctable) {
-    Sk64 size64 = bitmap->getSize64();
-    if (size64.isNeg() || !size64.is32()) {
-        doThrow(env, "java/lang/IllegalArgumentException",
-                     "bitmap size exceeds 32bits");
-        return false;
-    }
-
-    size_t size = size64.get32();
-
-    // call the version of malloc that returns null on failure
-    void* addr = sk_malloc_flags(size, 0);
-
-    if (NULL == addr) {
-        return false;
-    }
-
-    SkPixelRef* pr = new AndroidPixelRef(env, addr, size, NULL, ctable);
-    bitmap->setPixelRef(pr)->unref();
-    // since we're already allocated, we lockPixels right away
-    // HeapAllocator behaves this way too
-    bitmap->lockPixels();
-    return true;
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
-JavaPixelAllocator::JavaPixelAllocator(JNIEnv* env, bool allocateInJavaHeap)
-    : fAllocateInJavaHeap(allocateInJavaHeap),
-      fStorageObj(NULL),
+JavaPixelAllocator::JavaPixelAllocator(JNIEnv* env)
+    : fStorageObj(NULL),
       fAllocCount(0) {
     if (env->GetJavaVM(&fVM) != JNI_OK) {
         SkDebugf("------ [%p] env->GetJavaVM failed\n", env);
@@ -585,49 +548,9 @@
         SkDebugf("WARNING: One-shot allocator has already allocated (alloc count = %d)\n", fAllocCount);
 //        sk_throw();
     }
-
-    if (fAllocateInJavaHeap) {
-        fStorageObj = GraphicsJNI::allocateJavaPixelRef(env, bitmap, ctable);
-        fAllocCount += 1;
-        return fStorageObj != NULL;
-    }
-    return GraphicsJNI::mallocPixelRef(env, bitmap, ctable);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-JavaMemoryUsageReporter::JavaMemoryUsageReporter(JNIEnv* env)
-    : fTotalSize(0) {
-    if (env->GetJavaVM(&fVM) != JNI_OK) {
-        SkDebugf("------ [%p] env->GetJavaVM failed\n", env);
-        sk_throw();
-    }
-}
-
-JavaMemoryUsageReporter::~JavaMemoryUsageReporter() {
-    JNIEnv* env = vm2env(fVM);
-    jlong jtotalSize = fTotalSize;
-    env->CallVoidMethod(gVMRuntime_singleton,
-            gVMRuntime_trackExternalFreeMethodID,
-            jtotalSize);
-}
-
-bool JavaMemoryUsageReporter::reportMemory(size_t memorySize) {
-    jlong jsize = memorySize;  // the VM wants longs for the size
-    JNIEnv* env = vm2env(fVM);
-    bool r = env->CallBooleanMethod(gVMRuntime_singleton,
-            gVMRuntime_trackExternalAllocationMethodID,
-            jsize);
-    if (GraphicsJNI::hasException(env)) {
-        return false;
-    }
-    if (!r) {
-        LOGE("VM won't let us allocate %zd bytes\n", memorySize);
-        doThrowOOME(env, "bitmap size exceeds VM budget");
-        return false;
-    }
-    fTotalSize += memorySize;
-    return true;
+    fStorageObj = GraphicsJNI::allocateJavaPixelRef(env, bitmap, ctable);
+    fAllocCount += 1;
+    return fStorageObj != NULL;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -716,21 +639,5 @@
     gRegion_constructorMethodID = env->GetMethodID(gRegion_class, "<init>",
         "(II)V");
     
-    // Get the VMRuntime class.
-    c = env->FindClass("dalvik/system/VMRuntime");
-    SkASSERT(c);
-    // Look up VMRuntime.getRuntime().
-    m = env->GetStaticMethodID(c, "getRuntime", "()Ldalvik/system/VMRuntime;");
-    SkASSERT(m);
-    // Call VMRuntime.getRuntime() and hold onto its result.
-    gVMRuntime_singleton = env->CallStaticObjectMethod(c, m);
-    SkASSERT(gVMRuntime_singleton);
-    gVMRuntime_singleton = (jobject)env->NewGlobalRef(gVMRuntime_singleton);
-    // Look up the VMRuntime methods we'll be using.
-    gVMRuntime_trackExternalAllocationMethodID =
-                        env->GetMethodID(c, "trackExternalAllocation", "(J)Z");
-    gVMRuntime_trackExternalFreeMethodID =
-                            env->GetMethodID(c, "trackExternalFree", "(J)V");
-
     return 0;
 }
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index a71ce83..d678a5d 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -65,12 +65,6 @@
     static jbyteArray allocateJavaPixelRef(JNIEnv* env, SkBitmap* bitmap,
                                      SkColorTable* ctable);
 
-    /** Set a pixelref for the bitmap (needs setConfig to already be called)
-        Returns true on success. If it returns false, then it failed, and the
-        appropriate exception will have been raised.
-    */
-    static bool mallocPixelRef(JNIEnv*, SkBitmap*, SkColorTable* ctable);
-
     /** Copy the colors in colors[] to the bitmap, convert to the correct
         format along the way.
     */
@@ -141,7 +135,7 @@
  */
 class JavaPixelAllocator : public SkBitmap::Allocator {
 public:
-    JavaPixelAllocator(JNIEnv* env, bool allocateInJavaHeap=true);
+    JavaPixelAllocator(JNIEnv* env);
     // overrides
     virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable);
     
@@ -169,18 +163,6 @@
     int fAllocCount;
 };
 
-class JavaMemoryUsageReporter : public SkVMMemoryReporter {
-public:
-    JavaMemoryUsageReporter(JNIEnv* env);
-    virtual ~JavaMemoryUsageReporter();
-    // overrides
-    virtual bool reportMemory(size_t memorySize);
-
-private:
-    JavaVM* fVM;
-    size_t fTotalSize;
-};
-
 enum JNIAccess {
     kRO_JNIAccess,
     kRW_JNIAccess
diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp
index fad9539..c4cd2a6 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -50,13 +50,14 @@
     return GET_WINDOW(env, javaWindow);
 }
 
-static void native_init_empty(JNIEnv * env, jobject object, jboolean localOnly)
+static void native_init_empty(JNIEnv * env, jobject object, jint cursorWindowSize,
+        jboolean localOnly)
 {
     uint8_t * data;
     size_t size;
     CursorWindow * window;
 
-    window = new CursorWindow(MAX_WINDOW_SIZE);
+    window = new CursorWindow(cursorWindowSize);
     if (!window) {
         jniThrowException(env, "java/lang/RuntimeException", "No memory for native window object");
         return;
@@ -614,7 +615,7 @@
 static JNINativeMethod sMethods[] =
 {
      /* name, signature, funcPtr */
-    {"native_init", "(Z)V", (void *)native_init_empty},
+    {"native_init", "(IZ)V", (void *)native_init_empty},
     {"native_init", "(Landroid/os/IBinder;)V", (void *)native_init_memory},
     {"native_getBinder", "()Landroid/os/IBinder;", (void *)native_getBinder},
     {"native_clear", "()V", (void *)native_clear},
diff --git a/core/jni/android_database_SQLiteDatabase.cpp b/core/jni/android_database_SQLiteDatabase.cpp
index 7aeed98..a5878a9 100644
--- a/core/jni/android_database_SQLiteDatabase.cpp
+++ b/core/jni/android_database_SQLiteDatabase.cpp
@@ -46,7 +46,6 @@
 
 #define UTF16_STORAGE 0
 #define INVALID_VERSION -1
-#define SQLITE_SOFT_HEAP_LIMIT (4 * 1024 * 1024)
 #define ANDROID_TABLE "android_metadata"
 /* uncomment the next line to force-enable logging of all statements */
 // #define DB_LOG_STATEMENTS
@@ -66,6 +65,7 @@
 static jfieldID offset_db_handle;
 static jmethodID method_custom_function_callback;
 static jclass string_class = NULL;
+static jint sSqliteSoftHeapLimit = 0;
 
 static char *createStr(const char *path, short extra) {
     int len = strlen(path) + extra;
@@ -129,7 +129,7 @@
     // The soft heap limit prevents the page cache allocations from growing
     // beyond the given limit, no matter what the max page cache sizes are
     // set to. The limit does not, as of 3.5.0, affect any other allocations.
-    sqlite3_soft_heap_limit(SQLITE_SOFT_HEAP_LIMIT);
+    sqlite3_soft_heap_limit(sSqliteSoftHeapLimit);
 
     // Set the default busy handler to retry for 1000ms and then return SQLITE_BUSY
     err = sqlite3_busy_timeout(handle, 1000 /* ms */);
@@ -379,10 +379,14 @@
     if (meta != NULL) sqlite3_free_table(meta);
 }
 
+static void native_setSqliteSoftHeapLimit(JNIEnv* env, jobject clazz, jint limit) {
+    sSqliteSoftHeapLimit = limit;
+}
+
 static jint native_releaseMemory(JNIEnv *env, jobject clazz)
 {
     // Attempt to release as much memory from the
-    return sqlite3_release_memory(SQLITE_SOFT_HEAP_LIMIT);
+    return sqlite3_release_memory(sSqliteSoftHeapLimit);
 }
 
 static void native_finalize(JNIEnv* env, jobject object, jint statementId)
@@ -466,6 +470,7 @@
     {"enableSqlProfiling", "(Ljava/lang/String;S)V", (void *)enableSqlProfiling},
     {"native_setLocale", "(Ljava/lang/String;I)V", (void *)native_setLocale},
     {"native_getDbLookaside", "()I", (void *)native_getDbLookaside},
+    {"native_setSqliteSoftHeapLimit", "(I)V", (void *)native_setSqliteSoftHeapLimit},
     {"releaseMemory", "()I", (void *)native_releaseMemory},
     {"native_finalize", "(I)V", (void *)native_finalize},
     {"native_addCustomFunction",
diff --git a/core/jni/android_hardware_UsbManager.cpp b/core/jni/android_hardware_UsbManager.cpp
new file mode 100644
index 0000000..8f32abf
--- /dev/null
+++ b/core/jni/android_hardware_UsbManager.cpp
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+
+#include "jni.h"
+#include "JNIHelp.h"
+#include "android_runtime/AndroidRuntime.h"
+
+#include <usbhost/usbhost.h>
+
+#include <stdio.h>
+
+using namespace android;
+
+static jint android_hardware_UsbManager_get_device_id(JNIEnv *env, jobject clazz, jstring name)
+{
+    const char *nameStr = env->GetStringUTFChars(name, NULL);
+    int id = usb_device_get_unique_id_from_name(nameStr);
+    env->ReleaseStringUTFChars(name, nameStr);
+    return id;
+}
+
+static jstring android_hardware_UsbManager_get_device_name(JNIEnv *env, jobject clazz, jint id)
+{
+    char* name = usb_device_get_name_from_unique_id(id);
+    jstring result = env->NewStringUTF(name);
+    free(name);
+    return result;
+}
+
+static JNINativeMethod method_table[] = {
+    { "native_get_device_id", "(Ljava/lang/String;)I",
+                                (void*)android_hardware_UsbManager_get_device_id },
+    { "native_get_device_name", "(I)Ljava/lang/String;",
+                                (void*)android_hardware_UsbManager_get_device_name },
+};
+
+int register_android_hardware_UsbManager(JNIEnv *env)
+{
+    jclass clazz = env->FindClass("android/hardware/UsbManager");
+    if (clazz == NULL) {
+        LOGE("Can't find android/hardware/UsbManager");
+        return -1;
+    }
+
+    return AndroidRuntime::registerNativeMethods(env, "android/hardware/UsbManager",
+            method_table, NELEM(method_table));
+}
+
diff --git a/core/jni/android_server_BluetoothService.cpp b/core/jni/android_server_BluetoothService.cpp
index b9ae526..2c39871 100644
--- a/core/jni/android_server_BluetoothService.cpp
+++ b/core/jni/android_server_BluetoothService.cpp
@@ -1154,7 +1154,7 @@
 }
 
 static jboolean connectPanDeviceNative(JNIEnv *env, jobject object, jstring path,
-                                       jstring srcRole, jstring dstRole) {
+                                       jstring dstRole) {
     LOGV(__FUNCTION__);
 #ifdef HAVE_BLUETOOTH
     LOGE("connectPanDeviceNative");
@@ -1165,7 +1165,6 @@
 
     if (nat && eventLoopNat) {
         const char *c_path = env->GetStringUTFChars(path, NULL);
-        const char *src = env->GetStringUTFChars(srcRole, NULL);
         const char *dst = env->GetStringUTFChars(dstRole, NULL);
 
         int len = env->GetStringLength(path) + 1;
@@ -1175,12 +1174,10 @@
         bool ret = dbus_func_args_async(env, nat->conn, -1,onPanDeviceConnectionResult,
                                     context_path, eventLoopNat, c_path,
                                     DBUS_NETWORK_IFACE, "Connect",
-                                    DBUS_TYPE_STRING, &src,
                                     DBUS_TYPE_STRING, &dst,
                                     DBUS_TYPE_INVALID);
 
         env->ReleaseStringUTFChars(path, c_path);
-        env->ReleaseStringUTFChars(srcRole, src);
         env->ReleaseStringUTFChars(dstRole, dst);
         return ret ? JNI_TRUE : JNI_FALSE;
     }
@@ -1274,7 +1271,7 @@
 
     {"setBluetoothTetheringNative", "(ZLjava/lang/String;Ljava/lang/String;)Z",
               (void *)setBluetoothTetheringNative},
-    {"connectPanDeviceNative", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
+    {"connectPanDeviceNative", "(Ljava/lang/String;Ljava/lang/String;)Z",
               (void *)connectPanDeviceNative},
     {"disconnectPanDeviceNative", "(Ljava/lang/String;)Z", (void *)disconnectPanDeviceNative},
 };
diff --git a/core/jni/android_view_Display.cpp b/core/jni/android_view_Display.cpp
index 2e160ae..ac8835a 100644
--- a/core/jni/android_view_Display.cpp
+++ b/core/jni/android_view_Display.cpp
@@ -17,6 +17,8 @@
 #include <stdio.h>
 #include <assert.h>
 
+#include <cutils/properties.h>
+
 #include <surfaceflinger/SurfaceComposerClient.h>
 #include <ui/PixelFormat.h>
 #include <ui/DisplayInfo.h>
@@ -24,6 +26,7 @@
 #include "jni.h"
 #include <android_runtime/AndroidRuntime.h>
 #include <utils/misc.h>
+#include <utils/Log.h>
 
 // ----------------------------------------------------------------------------
 
@@ -41,6 +44,9 @@
 };
 static offsets_t offsets;
 
+static int gOldSize = -1;
+static int gNewSize = -1;
+
 static void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL)
 {
     jclass npeClazz = env->FindClass(exc);
@@ -69,14 +75,16 @@
         JNIEnv* env, jobject clazz)
 {
     DisplayID dpy = env->GetIntField(clazz, offsets.display);
-    return SurfaceComposerClient::getDisplayWidth(dpy);
+    jint w = SurfaceComposerClient::getDisplayWidth(dpy);
+    return w == gOldSize ? gNewSize : w;
 }
 
 static jint android_view_Display_getHeight(
         JNIEnv* env, jobject clazz)
 {
     DisplayID dpy = env->GetIntField(clazz, offsets.display);
-    return SurfaceComposerClient::getDisplayHeight(dpy);
+    int h = SurfaceComposerClient::getDisplayHeight(dpy);
+    return h == gOldSize ? gNewSize : h;
 }
 
 static jint android_view_Display_getOrientation(
@@ -92,6 +100,13 @@
     return SurfaceComposerClient::getNumberOfDisplays();
 }
 
+static jint android_view_Display_unmapDisplaySize(
+        JNIEnv* env, jclass clazz, jint newSize)
+{
+    if (newSize == gNewSize) return gOldSize;
+    return newSize;
+}
+
 // ----------------------------------------------------------------------------
 
 const char* const kClassPathName = "android/view/Display";
@@ -110,7 +125,9 @@
     {   "getHeight", "()I",
             (void*)android_view_Display_getHeight },
     {   "getOrientation", "()I",
-            (void*)android_view_Display_getOrientation }
+            (void*)android_view_Display_getOrientation },
+    {   "unmapDisplaySize", "(I)I",
+            (void*)android_view_Display_unmapDisplaySize }
 };
 
 void nativeClassInit(JNIEnv* env, jclass clazz)
@@ -125,6 +142,16 @@
 
 int register_android_view_Display(JNIEnv* env)
 {
+    char buf[PROPERTY_VALUE_MAX];
+    int len = property_get("persist.demo.screensizehack", buf, "");
+    if (len > 0) {
+        int temp1, temp2;
+        if (sscanf(buf, "%d=%d", &temp1, &temp2) == 2) {
+            gOldSize = temp1;
+            gNewSize = temp2;
+        }
+    }
+
     return AndroidRuntime::registerNativeMethods(env,
             kClassPathName, gMethods, NELEM(gMethods));
 }
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 92b50c7..981661a 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1335,6 +1335,11 @@
                 android:exported="true">
         </activity>
 
+        <activity android:name="android.content.SyncActivityTooManyDeletes"
+               android:theme="@android:style/Theme.Holo.Dialog"
+               android:label="@string/sync_too_many_deletes">
+        </activity>
+
         <activity android:name="com.android.server.ShutdownActivity"
             android:permission="android.permission.SHUTDOWN"
             android:excludeFromRecents="true">
diff --git a/core/res/assets/webkit/youtube.html b/core/res/assets/webkit/youtube.html
index 289f8cf..d808bcf 100644
--- a/core/res/assets/webkit/youtube.html
+++ b/core/res/assets/webkit/youtube.html
@@ -38,19 +38,29 @@
                 // All images are loaded, so display them.
                 // (Note that the images are loaded from javascript, so might load
                 // after document.onload fires)
-                ctx.drawImage(background, 0, 0, width, height);
+
                 playWidth = play.width;
                 playHeight = play.height;
                 logoWidth = logo.width;
                 logoHeight = logo.height;
                 var ratio = 1;
                 // If the page is smaller than it 'should' be in either dimension
-                // we scale the play button and logo according to the dimension that
-                // has been shrunk the most.
+                // we scale the background, play button and logo according to the
+                // dimension that has been shrunk the most.
                 if (width / height > defWidth / defHeight && height < defHeight) {
                     ratio = height / defHeight;
+                    // Stretch the background in this dimension only.
+                    backgroundHeight = background.height / ratio;
+                    ctx.drawImage(background, 0, 0, background.width, background.height,
+                        0, (height - backgroundHeight) / 2, width, backgroundHeight);
                 } else if (width / height < defWidth / defHeight && width < defWidth) {
                     ratio = width / defWidth;
+                    backgroundWidth = background.width / ratio;
+                    ctx.drawImage(background, 0, 0, background.width, background.height,
+                        (width - backgroundWidth) / 2, 0, backgroundWidth, height);
+                } else {
+                    // In this case stretch the background in both dimensions to fill the space.
+                    ctx.drawImage(background, 0, 0, width, height);
                 }
                 playWidth *= ratio;
                 playHeight *= ratio;
diff --git a/core/res/res/drawable-hdpi/day_picker_week_view_dayline_holo_dark.9.png b/core/res/res/drawable-hdpi/day_picker_week_view_dayline_holo.9.png
similarity index 100%
rename from core/res/res/drawable-hdpi/day_picker_week_view_dayline_holo_dark.9.png
rename to core/res/res/drawable-hdpi/day_picker_week_view_dayline_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/day_picker_week_view_dayline_holo_light.9.png b/core/res/res/drawable-hdpi/day_picker_week_view_dayline_holo_light.9.png
deleted file mode 100644
index 2edae8f..0000000
--- a/core/res/res/drawable-hdpi/day_picker_week_view_dayline_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/nav_divider.png b/core/res/res/drawable-hdpi/nav_divider.png
deleted file mode 100644
index 7ca3e61..0000000
--- a/core/res/res/drawable-hdpi/nav_divider.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png
index 6fbd7d2..f43f9ad 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png
index 3a4cdec..2ada3ef 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png
index b1c3991..5ed7040 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png
index 6fbce8c..d4a01cf 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png
index 3bb4c29..ada6251 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png
index 8f02162..1247c7a 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png
index 8f57d2c..3d13454 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png
index df6f76b..4898244 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png
index a47bf31..bb1074c 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png
index 04046aa..e6e5a0f 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png
index b6021e0..b54e603 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png
index 0f38d6b..70ee54c 100644
--- a/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png
index 14a4e31..a55c96a 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png
index 21a2ac1..4e31c72 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png
index 1a1da57..8158596 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png
index a242c80..37e5c0d 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png
index 50045e4..7ec94e6 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png
index 659b3c7..780fff1 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png
index 9112530..73c8dd9 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png
index 21aa7f7..3b96480 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png
index d145975..21f0871 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png
index 167bab7..49e3c15 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png
index 2844c3f..a15a5f5 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png
index 9d83038..7441361 100644
--- a/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/day_picker_week_view_dayline_holo_dark.9.png b/core/res/res/drawable-mdpi/day_picker_week_view_dayline_holo.9.png
similarity index 100%
rename from core/res/res/drawable-mdpi/day_picker_week_view_dayline_holo_dark.9.png
rename to core/res/res/drawable-mdpi/day_picker_week_view_dayline_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/day_picker_week_view_dayline_holo_light.9.png b/core/res/res/drawable-mdpi/day_picker_week_view_dayline_holo_light.9.png
deleted file mode 100644
index a8cfd77..0000000
--- a/core/res/res/drawable-mdpi/day_picker_week_view_dayline_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/nav_divider.png b/core/res/res/drawable-mdpi/nav_divider.png
deleted file mode 100644
index c9413d7..0000000
--- a/core/res/res/drawable-mdpi/nav_divider.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png
index d86534c..113b369 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png
index 6ae5d4b..e3c416e 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png
index fd578b6..e123db9 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png
index a0caaa9..f93d082 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png
index f6f4ed2..d8bd34f 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png
index 2591adb..0747f82 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png
index efee099..1c7abf8 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png
index f7b09de..ec9d1f2 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png
index 76f13a6..d6259e2 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png
index cb8e764..aac5f31 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png
index 7c0d0bc..fd8076f 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png
index 9d7ff6b..c06ff40 100644
--- a/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png
index cfdfd174..d69615d 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png
index 43bdf1d..eb7a283 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png
index 2ffe46b..1ee5510 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png
index 51bb2d0..2269577 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png
index dece157..9954130 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png
index 384cb32..8553d1c 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png
index 84ec4f7..b4ed2c5 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png
index 318befc..2496fb8 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png
index d97a832..3bcdd71 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png
index 19d75e5..1113de7 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png
index 1189e5c..7303a19 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png
index 9f283ab..7abdbfc 100644
--- a/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/layout-xlarge/keyguard_screen_status_land.xml b/core/res/res/layout-xlarge/keyguard_screen_status_land.xml
index 8589862..f91fe4f 100644
--- a/core/res/res/layout-xlarge/keyguard_screen_status_land.xml
+++ b/core/res/res/layout-xlarge/keyguard_screen_status_land.xml
@@ -38,6 +38,7 @@
         android:layout_marginTop="32dip"
         android:singleLine="true"
         android:ellipsize="marquee"
+        android:visibility="gone"
         />
 
     <com.android.internal.widget.DigitalClock android:id="@+id/time"
@@ -47,37 +48,46 @@
         android:layout_alignParentLeft="true"
         android:layout_marginTop="8dip"
         android:layout_marginBottom="8dip"
+        android:layout_marginLeft="-10dip"
         >
 
-        <TextView android:id="@+id/timeDisplay"
+        <!-- Because we can't have multi-tone fonts, we render two TextViews, one on
+        top of the other. Hence the redundant layout... -->
+        <TextView android:id="@+id/timeDisplayBackground"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:singleLine="true"
             android:ellipsize="none"
             android:textSize="120sp"
             android:textAppearance="?android:attr/textAppearanceMedium"
-            android:shadowColor="#C0000000"
-            android:shadowDx="0"
-            android:shadowDy="0"
-            android:shadowRadius="3.0"
+            android:textColor="@color/lockscreen_clock_background"
             android:layout_marginBottom="6dip"
             />
 
+        <TextView android:id="@+id/timeDisplayForeground"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="none"
+            android:textSize="120sp"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:textColor="@color/lockscreen_clock_foreground"
+            android:layout_alignLeft="@id/timeDisplayBackground"
+            android:layout_alignTop="@id/timeDisplayBackground"
+            android:layout_marginBottom="6dip"
+            />
 
         <TextView android:id="@+id/am_pm"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_toRightOf="@id/timeDisplay"
-            android:layout_alignBaseline="@id/timeDisplay"
+            android:layout_toRightOf="@id/timeDisplayBackground"
+            android:layout_alignBaseline="@id/timeDisplayBackground"
             android:singleLine="true"
             android:ellipsize="none"
             android:textSize="30sp"
             android:layout_marginLeft="8dip"
             android:textAppearance="?android:attr/textAppearanceMedium"
-            android:shadowColor="#C0000000"
-            android:shadowDx="0"
-            android:shadowDy="0"
-            android:shadowRadius="3.0"
+            android:textColor="@color/lockscreen_clock_am_pm"
             />
 
     </com.android.internal.widget.DigitalClock>
@@ -87,32 +97,33 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_below="@id/time"
-        android:layout_marginTop="5dip"
+        android:layout_marginTop="10dip"
         android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textSize="32sp"
+        android:textSize="22sp"
         />
 
-    <!-- used for instructions such as "draw pattern to unlock", the next alarm, and charging
-         status.  -->
+    <!-- Status2 is generally charge status  -->
     <TextView
         android:id="@+id/status2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentTop="true"
         android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textSize="32sp"
-        android:layout_marginTop="50dip"
+        android:textSize="22sp"
+        android:layout_marginTop="10dip"
         android:drawablePadding="4dip"
         />
+
+    <!-- Status1 is generally alarm status -->
     <TextView
         android:id="@+id/status1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginTop="15dip"
-        android:textSize="32sp"
+        android:layout_marginTop="10dip"
+        android:textSize="22sp"
         android:textAppearance="?android:attr/textAppearanceMedium"
         />
-        
+
     <TextView
         android:id="@+id/propertyOf"
         android:lineSpacingExtra="8dip"
@@ -120,7 +131,7 @@
         android:layout_height="wrap_content"
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:textSize="22sp"
-        android:layout_marginTop="50dip"
+        android:layout_marginTop="20dip"
         android:singleLine="false"
         android:visibility="invisible"
         />
diff --git a/core/res/res/layout-xlarge/keyguard_screen_status_port.xml b/core/res/res/layout-xlarge/keyguard_screen_status_port.xml
index 8589862..c529e0b 100644
--- a/core/res/res/layout-xlarge/keyguard_screen_status_port.xml
+++ b/core/res/res/layout-xlarge/keyguard_screen_status_port.xml
@@ -38,6 +38,7 @@
         android:layout_marginTop="32dip"
         android:singleLine="true"
         android:ellipsize="marquee"
+        android:visibility="gone"
         />
 
     <com.android.internal.widget.DigitalClock android:id="@+id/time"
@@ -47,37 +48,45 @@
         android:layout_alignParentLeft="true"
         android:layout_marginTop="8dip"
         android:layout_marginBottom="8dip"
-        >
+        android_layout_marginLeft="-10dip">
 
-        <TextView android:id="@+id/timeDisplay"
+        <!-- Because we can't have multi-tone fonts, we render two TextViews, one on
+        top of the other. Hence the redundant layout... -->
+        <TextView android:id="@+id/timeDisplayBackground"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:singleLine="true"
             android:ellipsize="none"
             android:textSize="120sp"
             android:textAppearance="?android:attr/textAppearanceMedium"
-            android:shadowColor="#C0000000"
-            android:shadowDx="0"
-            android:shadowDy="0"
-            android:shadowRadius="3.0"
+            android:textColor="@color/lockscreen_clock_background"
             android:layout_marginBottom="6dip"
             />
 
+        <TextView android:id="@+id/timeDisplayForeground"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="none"
+            android:textSize="120sp"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:textColor="@color/lockscreen_clock_foreground"
+            android:layout_marginBottom="6dip"
+            android:layout_alignLeft="@id/timeDisplayBackground"
+            android:layout_alignTop="@id/timeDisplayBackground"
+            />
 
         <TextView android:id="@+id/am_pm"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_toRightOf="@id/timeDisplay"
-            android:layout_alignBaseline="@id/timeDisplay"
+            android:layout_toRightOf="@id/timeDisplayBackground"
+            android:layout_alignBaseline="@id/timeDisplayBackground"
             android:singleLine="true"
             android:ellipsize="none"
             android:textSize="30sp"
             android:layout_marginLeft="8dip"
             android:textAppearance="?android:attr/textAppearanceMedium"
-            android:shadowColor="#C0000000"
-            android:shadowDx="0"
-            android:shadowDy="0"
-            android:shadowRadius="3.0"
+            android:textColor="@color/lockscreen_clock_am_pm"
             />
 
     </com.android.internal.widget.DigitalClock>
@@ -87,40 +96,40 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_below="@id/time"
-        android:layout_marginTop="5dip"
+        android:layout_marginTop="10dip"
         android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textSize="32sp"
+        android:textSize="22sp"
         />
 
-    <!-- used for instructions such as "draw pattern to unlock", the next alarm, and charging
-         status.  -->
+    <!-- used for status such as the next alarm, and charging status.  -->
     <TextView
         android:id="@+id/status2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentTop="true"
         android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textSize="32sp"
-        android:layout_marginTop="50dip"
+        android:textSize="22sp"
+        android:layout_marginTop="10dip"
         android:drawablePadding="4dip"
         />
+
     <TextView
         android:id="@+id/status1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginTop="15dip"
-        android:textSize="32sp"
+        android:layout_marginTop="10dip"
+        android:textSize="22sp"
         android:textAppearance="?android:attr/textAppearanceMedium"
         />
-        
+
     <TextView
         android:id="@+id/propertyOf"
         android:lineSpacingExtra="8dip"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_marginTop="20dip"
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:textSize="22sp"
-        android:layout_marginTop="50dip"
         android:singleLine="false"
         android:visibility="invisible"
         />
diff --git a/core/res/res/layout-xlarge/preference_list_content_single.xml b/core/res/res/layout-xlarge/preference_list_content_single.xml
index 6899ed0..6725996 100644
--- a/core/res/res/layout-xlarge/preference_list_content_single.xml
+++ b/core/res/res/layout-xlarge/preference_list_content_single.xml
@@ -30,18 +30,14 @@
 
         <LinearLayout
             android:id="@+id/headers"
+            style="?attr/preferencePanelStyle"
             android:orientation="vertical"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_marginRight="@dimen/preference_screen_side_margin"
-            android:layout_marginLeft="@dimen/preference_screen_side_margin"
-            android:layout_marginTop="48dp"
-            android:layout_marginBottom="48dp"
             android:paddingLeft="32dip"
             android:paddingRight="32dip"
             android:paddingTop="32dip"
-            android:paddingBottom="32dip"
-            android:background="?attr/preferencePanelBackground">
+            android:paddingBottom="32dip" >
 
             <ListView android:id="@android:id/list"
                 android:layout_width="match_parent"
diff --git a/core/res/res/layout/day_picker.xml b/core/res/res/layout/calendar_view.xml
similarity index 82%
rename from core/res/res/layout/day_picker.xml
rename to core/res/res/layout/calendar_view.xml
index a030df8..176bb8b 100644
--- a/core/res/res/layout/day_picker.xml
+++ b/core/res/res/layout/calendar_view.xml
@@ -48,43 +48,37 @@
         <TextView android:layout_width="0dip"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:gravity="center"
-            style="?android:attr/dayPickerWeekDayViewStyle" />
-        <TextView android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:gravity="center"
-            style="?android:attr/dayPickerWeekDayViewStyle" />
+            android:gravity="center" />
 
         <TextView android:layout_width="0dip"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:gravity="center"
-            style="?android:attr/dayPickerWeekDayViewStyle" />
+            android:gravity="center" />
 
         <TextView android:layout_width="0dip"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:gravity="center"
-            style="?android:attr/dayPickerWeekDayViewStyle" />
+            android:gravity="center" />
 
         <TextView android:layout_width="0dip"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:gravity="center"
-            style="?android:attr/dayPickerWeekDayViewStyle" />
+            android:gravity="center" />
 
         <TextView android:layout_width="0dip"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:gravity="center"
-            style="?android:attr/dayPickerWeekDayViewStyle" />
+            android:gravity="center" />
 
         <TextView android:layout_width="0dip"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:gravity="center"
-            style="?android:attr/dayPickerWeekDayViewStyle" />
+            android:gravity="center" />
+
+        <TextView android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:gravity="center" />
 
     </LinearLayout>
 
diff --git a/core/res/res/layout/date_picker.xml b/core/res/res/layout/date_picker.xml
index 5c023ee..e9663b1 100644
--- a/core/res/res/layout/date_picker.xml
+++ b/core/res/res/layout/date_picker.xml
@@ -32,8 +32,8 @@
     <LinearLayout android:id="@+id/pickers"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginRight="15dip"
-        android:layout_weight="0.5"
+        android:layout_marginRight="22dip"
+        android:layout_weight="1"
         android:orientation="horizontal"
         android:gravity="center">
 
@@ -42,10 +42,8 @@
             android:id="@+id/month"
             android:layout_width="48dip"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="15dip"
-            android:layout_marginRight="15dip"
-            android:layout_marginTop="35dip"
-            android:layout_marginBottom="35dip"
+            android:layout_marginLeft="22dip"
+            android:layout_marginRight="22dip"
             android:focusable="true"
             android:focusableInTouchMode="true"
             />
@@ -55,10 +53,8 @@
             android:id="@+id/day"
             android:layout_width="48dip"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="15dip"
-            android:layout_marginRight="15dip"
-            android:layout_marginTop="35dip"
-            android:layout_marginBottom="35dip"
+            android:layout_marginLeft="22dip"
+            android:layout_marginRight="22dip"
             android:focusable="true"
             android:focusableInTouchMode="true"
             />
@@ -68,25 +64,23 @@
             android:id="@+id/year"
             android:layout_width="48dip"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="15dip"
-            android:layout_marginRight="15dip"
-            android:layout_marginTop="35dip"
-            android:layout_marginBottom="35dip"       
+            android:layout_marginLeft="22dip"
+            android:layout_marginRight="22dip"
             android:focusable="true"
             android:focusableInTouchMode="true"
             />
 
     </LinearLayout>
 
-    <!-- mini-month day-picker -->
-      <DayPicker
-          android:id="@+id/mini_month_day_picker"
-          android:layout_width="200dip"
-          android:layout_height="230dip"
-          android:layout_marginLeft="15dip"
-          android:layout_weight="0.5"
-          android:focusable="true"
-          android:focusableInTouchMode="true"
-          />
+    <!-- calendar view -->
+    <CalendarView
+        android:id="@+id/calendar_view"
+        android:layout_width="245dip"
+        android:layout_height="280dip"
+        android:layout_marginLeft="22dip"
+        android:layout_weight="1"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        />
 
 </LinearLayout>
diff --git a/core/res/res/layout/date_picker_dialog.xml b/core/res/res/layout/date_picker_dialog.xml
index 148e192..004d52a 100644
--- a/core/res/res/layout/date_picker_dialog.xml
+++ b/core/res/res/layout/date_picker_dialog.xml
@@ -20,5 +20,6 @@
 <DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/datePicker"
     android:layout_gravity="center_horizontal"
-    android:layout_width="250dip"
-    android:layout_height="600dip"/>
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    />
diff --git a/core/res/res/layout/fragment_bread_crumb_item.xml b/core/res/res/layout/fragment_bread_crumb_item.xml
index e97508f..dbbb9a5 100644
--- a/core/res/res/layout/fragment_bread_crumb_item.xml
+++ b/core/res/res/layout/fragment_bread_crumb_item.xml
@@ -20,11 +20,12 @@
         >
     <ImageView
             android:id="@android:id/left_icon"
-            android:src="@drawable/nav_divider"
+            android:src="?attr/dividerVertical"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:layout_marginTop="8dip"
-            android:layout_marginBottom="8dip"
+            android:scaleType="fitXY"
+            android:layout_marginTop="12dip"
+            android:layout_marginBottom="12dip"
         />
 
     <TextView
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock.xml b/core/res/res/layout/keyguard_screen_tab_unlock.xml
index 6edbdf9..77ae0d3 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock.xml
@@ -67,35 +67,43 @@
         android:layout_marginBottom="8dip"
         >
 
-        <TextView android:id="@+id/timeDisplay"
+        <!-- Because we can't have multi-tone fonts, we render two TextViews, one on
+        top of the other. Hence the redundant layout... -->
+        <TextView android:id="@+id/timeDisplayBackground"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:singleLine="true"
             android:ellipsize="none"
             android:textSize="72sp"
             android:textAppearance="?android:attr/textAppearanceMedium"
-            android:shadowColor="#C0000000"
-            android:shadowDx="0"
-            android:shadowDy="0"
-            android:shadowRadius="3.0"
-            android:layout_marginBottom="10dip"
+            android:layout_marginBottom="6dip"
+            android:textColor="@color/lockscreen_clock_background"
             />
 
+        <TextView android:id="@+id/timeDisplayForeground"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="none"
+            android:textSize="72sp"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:layout_marginBottom="6dip"
+            android:textColor="@color/lockscreen_clock_foreground"
+            android:layout_alignLeft="@id/timeDisplayBackground"
+            android:layout_alignTop="@id/timeDisplayBackground"
+            />
 
         <TextView android:id="@+id/am_pm"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_toRightOf="@id/timeDisplay"
-            android:layout_alignBaseline="@id/timeDisplay"
+            android:layout_toRightOf="@id/timeDisplayBackground"
+            android:layout_alignBaseline="@id/timeDisplayBackground"
             android:singleLine="true"
             android:ellipsize="none"
             android:textSize="22sp"
             android:layout_marginLeft="8dip"
             android:textAppearance="?android:attr/textAppearanceMedium"
-            android:shadowColor="#C0000000"
-            android:shadowDx="0"
-            android:shadowDy="0"
-            android:shadowRadius="3.0"
+            android:textColor="@color/lockscreen_clock_am_pm"
             />
 
     </com.android.internal.widget.DigitalClock>
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
index e66b492..e48df20 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
@@ -68,35 +68,43 @@
             android:layout_marginBottom="8dip"
             >
 
-            <TextView android:id="@+id/timeDisplay"
+           <!-- Because we can't have multi-tone fonts, we render two TextViews, one on
+            top of the other. Hence the redundant layout... -->
+            <TextView android:id="@+id/timeDisplayBackground"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:singleLine="true"
                 android:ellipsize="none"
                 android:textSize="72sp"
                 android:textAppearance="?android:attr/textAppearanceMedium"
-                android:shadowColor="#C0000000"
-                android:shadowDx="0"
-                android:shadowDy="0"
-                android:shadowRadius="3.0"
                 android:layout_marginBottom="6dip"
+                android:textColor="@color/lockscreen_clock_background"
                 />
 
+            <TextView android:id="@+id/timeDisplayForeground"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:ellipsize="none"
+                android:textSize="72sp"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:layout_marginBottom="6dip"
+                android:textColor="@color/lockscreen_clock_foreground"
+                android:layout_alignLeft="@id/timeDisplayBackground"
+                android:layout_alignTop="@id/timeDisplayBackground"
+                />
 
             <TextView android:id="@+id/am_pm"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_toRightOf="@id/timeDisplay"
-                android:layout_alignBaseline="@id/timeDisplay"
+                android:layout_toRightOf="@id/timeDisplayBackground"
+                android:layout_alignBaseline="@id/timeDisplayBackground"
                 android:singleLine="true"
                 android:ellipsize="none"
                 android:textSize="22sp"
                 android:layout_marginLeft="8dip"
                 android:textAppearance="?android:attr/textAppearanceMedium"
-                android:shadowColor="#C0000000"
-                android:shadowDx="0"
-                android:shadowDy="0"
-                android:shadowRadius="3.0"
+                android:textColor="@color/lockscreen_clock_am_pm"
                 />
 
         </com.android.internal.widget.DigitalClock>
diff --git a/core/res/res/layout/keyguard_screen_unlock_landscape.xml b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
index 83381a1..c14afbf 100644
--- a/core/res/res/layout/keyguard_screen_unlock_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
@@ -68,35 +68,45 @@
             android:layout_marginBottom="8dip"
             >
 
-            <TextView android:id="@+id/timeDisplay"
+            <!-- Because we can't have multi-tone fonts, we render two TextViews, one on
+            top of the other. Hence the redundant layout... -->
+            <TextView android:id="@+id/timeDisplayBackground"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:singleLine="true"
                 android:ellipsize="none"
                 android:textSize="72sp"
                 android:textAppearance="?android:attr/textAppearanceMedium"
-                android:shadowColor="#C0000000"
-                android:shadowDx="0"
-                android:shadowDy="0"
-                android:shadowRadius="3.0"
                 android:layout_marginBottom="6dip"
+                android:textColor="@color/lockscreen_clock_background"
                 />
 
+            <TextView android:id="@+id/timeDisplayForeground"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:ellipsize="none"
+                android:textSize="72sp"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:layout_marginBottom="6dip"
+                android:layout_alignLeft="@id/timeDisplayBackground"
+                android:layout_alignTop="@id/timeDisplayBackground"
+                android:textColor="@color/lockscreen_clock_foreground"
+                />
+
+
 
             <TextView android:id="@+id/am_pm"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_toRightOf="@id/timeDisplay"
-                android:layout_alignBaseline="@id/timeDisplay"
+                android:layout_toRightOf="@id/timeDisplayBackground"
+                android:layout_alignBaseline="@id/timeDisplayBackground"
                 android:singleLine="true"
                 android:ellipsize="none"
                 android:textSize="22sp"
                 android:layout_marginLeft="8dip"
                 android:textAppearance="?android:attr/textAppearanceMedium"
-                android:shadowColor="#C0000000"
-                android:shadowDx="0"
-                android:shadowDy="0"
-                android:shadowRadius="3.0"
+                android:textColor="@color/lockscreen_clock_am_pm"
                 />
 
         </com.android.internal.widget.DigitalClock>
diff --git a/core/res/res/layout/keyguard_screen_unlock_portrait.xml b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
index 8dacfaf..85e1db1 100644
--- a/core/res/res/layout/keyguard_screen_unlock_portrait.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
@@ -58,34 +58,41 @@
             android:layout_marginBottom="8dip"
             >
 
-            <TextView android:id="@+id/timeDisplay"
+            <!-- Because we can't have multi-tone fonts, we render two TextViews, one on
+            top of the other. Hence the redundant layout... -->
+            <TextView android:id="@+id/timeDisplayBackground"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:singleLine="true"
                 android:ellipsize="none"
                 android:textSize="56sp"
                 android:textAppearance="?android:attr/textAppearanceMedium"
-                android:shadowColor="#C0000000"
-                android:shadowDx="0"
-                android:shadowDy="0"
-                android:shadowRadius="3.0"
                 android:layout_marginBottom="6dip"
+                android:textColor="@color/lockscreen_clock_background"
+                />
+
+            <TextView android:id="@+id/timeDisplayForeground"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:ellipsize="none"
+                android:textSize="56sp"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:layout_marginBottom="6dip"
+                android:textColor="@color/lockscreen_clock_foreground"
                 />
 
             <TextView android:id="@+id/am_pm"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_toRightOf="@id/timeDisplay"
-                android:layout_alignBaseline="@id/timeDisplay"
+                android:layout_toRightOf="@id/timeDisplayBackground"
+                android:layout_alignBaseline="@id/timeDisplayBackground"
                 android:singleLine="true"
                 android:ellipsize="none"
                 android:textSize="18sp"
                 android:layout_marginLeft="4dip"
                 android:textAppearance="?android:attr/textAppearanceMedium"
-                android:shadowColor="#C0000000"
-                android:shadowDx="0"
-                android:shadowDy="0"
-                android:shadowRadius="3.0"
+                android:textColor="@color/lockscreen_clock_am_pm"
                 />
 
         </com.android.internal.widget.DigitalClock>
diff --git a/core/res/res/layout/preference_list_content.xml b/core/res/res/layout/preference_list_content.xml
index e7783da..a5f87d3 100644
--- a/core/res/res/layout/preference_list_content.xml
+++ b/core/res/res/layout/preference_list_content.xml
@@ -34,7 +34,7 @@
             android:orientation="vertical"
             android:layout_width="0px"
             android:layout_height="match_parent"
-            android:layout_marginRight="0dp"
+            android:layout_marginRight="@dimen/preference_screen_side_margin_negative"
             android:layout_marginLeft="@dimen/preference_screen_side_margin"
             android:layout_marginTop="32dp"
             android:layout_marginBottom="32dp"
@@ -61,7 +61,7 @@
                 android:layout_width="0px"
                 android:layout_height="match_parent"
                 android:layout_weight="20"
-                android:layout_marginLeft="-4dp"
+                android:layout_marginLeft="@dimen/preference_screen_side_margin"
                 android:layout_marginRight="@dimen/preference_screen_side_margin"
                 android:layout_marginTop="16dp"
                 android:layout_marginBottom="16dp"
diff --git a/core/res/res/layout/time_picker.xml b/core/res/res/layout/time_picker.xml
index bf81c18..382b2f6 100644
--- a/core/res/res/layout/time_picker.xml
+++ b/core/res/res/layout/time_picker.xml
@@ -30,9 +30,8 @@
         android:id="@+id/hour"
         android:layout_width="48dip"
         android:layout_height="wrap_content"
-        android:layout_marginRight="13dip"
-        android:layout_marginTop="35dip"
-        android:layout_marginBottom="35dip"
+        android:layout_marginLeft="22dip"
+        android:layout_marginRight="20dip"
         android:focusable="true"
         android:focusableInTouchMode="true"
         />
@@ -50,10 +49,8 @@
         android:id="@+id/minute"
         android:layout_width="48dip"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="13dip"
-        android:layout_marginRight="15dip"
-        android:layout_marginTop="35dip"
-        android:layout_marginBottom="35dip"
+        android:layout_marginLeft="20dip"
+        android:layout_marginRight="22dip"
         android:focusable="true"
         android:focusableInTouchMode="true"
         />
@@ -63,9 +60,8 @@
         android:id="@+id/amPm"
         android:layout_width="48dip"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="15dip"
-        android:layout_marginTop="35dip"
-        android:layout_marginBottom="35dip"
+        android:layout_marginLeft="22dip"
+        android:layout_marginRight="22dip"
         android:focusable="true"
         android:focusableInTouchMode="true"
         />
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 73b1286..a9b907d8 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"البريد الصوتي"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"حدثت مشكلة في الاتصال أو أن كود MMI غير صحيح."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"تم تقييد التشغيل لأرقام الاتصال الثابت فقط."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"تم تمكين الخدمة."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"تم تمكين الخدمة لـ:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"تم تعطيل الخدمة."</string>
@@ -126,7 +125,7 @@
     <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="2292820184396262278">"سعة تخزين الجهاز اللوحي ممتلئة! احذف بعض الملفات لتحرير مساحة."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"وحدة تخزين الجهاز اللوحي ممتلئة! احذف بعض الملفات لتوفير مساحة."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"سعة تخزين الهاتف ممتلئة! احذف بعض الملفات لتحرير مساحة."</string>
     <string name="me" msgid="6545696007631404292">"أنا"</string>
     <string name="power_dialog" product="tablet" msgid="8545351420865202853">"خيارات الجهاز اللوحي"</string>
@@ -139,8 +138,7 @@
     <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>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"هل تريد إيقاف التشغيل؟"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"حديثة"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"ليس هناك أية تطبيقات حديثة."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"خيارات الجهاز اللوحي"</string>
@@ -160,7 +158,7 @@
     <string name="permgrouplab_messages" msgid="7521249148445456662">"رسائلك"</string>
     <string name="permgroupdesc_messages" msgid="7045736972019211994">"قراءة وكتابة الرسائل القصيرة SMS والرسائل الإلكترونية والرسائل الأخرى."</string>
     <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"معلوماتك الشخصية"</string>
-    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"للدخول المباشر إلى التقويم وجهات الاتصال المخزّنة في الجهاز اللوحي."</string>
+    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"الدخول المباشر إلى جهات اتصالك والتقويم المخزنين على الجهاز اللوحي."</string>
     <string name="permgroupdesc_personalInfo" product="default" msgid="5488050357388806068">"الدخول المباشر إلى التقويم وجهات الاتصال المخزّنة على الهاتف."</string>
     <string name="permgrouplab_location" msgid="635149742436692049">"موقعك"</string>
     <string name="permgroupdesc_location" msgid="2430258821648348660">"مراقبة موقعك الفعلي"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"أدوات التطوير"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"الميزات مطلوبة فقط لمطوّري التطبيق."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"التخزين"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"الدخول إلى بطاقة SD."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"الدخول إلى وحدة تخزين USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"الدخول إلى بطاقة SD."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"تعطيل شريط الحالة أو تعديله"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"للسماح للتطبيق بتعطيل شريط الحالة أو إضافة رموز نظام وإزالتها."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"شريط الحالة"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"للسماح للتطبيق بأن يكون شريط الحالة."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"توسيع/تصغير شريط الحالة"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"للسماح للتطبيق بتوسيع شريط الحالة أو تصغيره."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"اعتراض المكالمات الصادرة"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"إرسال رسائل قصيرة SMS"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"للسماح للتطبيق بإرسال رسائل قصيرة SMS. قد تكلفك التطبيقات الضارة المال من خلال إرسال رسائل بدون تأكيدك."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"قراءة الرسائل القصيرة SMS أو رسائل الوسائط المتعددة"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"للسماح للتطبيق بقراءة الرسائل القصيرة SMS المخزنة على الجهاز اللوحي أو بطاقة SIM. قد تقرأ التطبيقات الضارة رسائلك السرية."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"للسماح للتطبيق بقراءة الرسائل القصيرة SMS المخزنة على الجهاز اللوحي أو بطاقة SIM. يمكن للتطبيقات الضارة قراءة رسائلك السرية."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"للسماح للتطبيق بقراءة الرسائل القصيرة SMS المخزنة على الهاتف أو بطاقة SIM. قد تقرأ التطبيقات الضارة رسائلك السرية."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"تعديل الرسائل القصيرة SMS أو رسائل الوسائط المتعددة"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"للسماح للتطبيق بالكتابة إلى الرسائل القصيرة SMS المخزّنة في الجهاز اللوحي أو بطاقة SIM. قد تحذف التطبيقات الضارة رسائلك."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"للسماح للتطبيق بالكتابة على الرسائل القصيرة SMS المخزنة على الجهاز اللوحي أو بطاقة SIM. يمكن للتطبيقات الضارة حذف رسائلك."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"للسماح للتطبيق بالكتابة إلى الرسائل القصيرة SMS المخزنة على الهاتف أو بطاقة SIM. قد تحذف التطبيقات الضارة رسائلك."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"تلقي WAP"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"للسماح للتطبيق بتلقي رسائل WAP ومعالجتها. قد تراقب بعض التطبيقات الضارة رسائلك أو تحذفها بدون عرضها لك."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"منع التبديل بين التطبيقات"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"منع المستخدم من التبديل إلى تطبيق آخر."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"مراقبة بدء تشغيل جميع التطبيقات والتحكم فيها"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"للسماح لأحد التطبيقات بمراقبة كيفية بدء النظام للأنشطة والتحكم فيها. قد تُعرِّض التطبيقات الضارة النظام للضرر بشكل كامل. لن تكون هناك حاجة لهذا الإذن سوى للتطوير فقط، وليس للاستخدام العادي على الإطلاق."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"للسماح لتطبيق ما بمراقبة كيفية تشغيل النظام للأنشطة والتحكم بها. ربما تهدد التطبيقات الضارة النظام. ويكون هذا الإذن ضروريًا فقط للتطوير، وليس للاستخدام العادي مطلقًا."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"إرسال بث الحزمة الذي تمت إزالته"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"للسماح لتطبيق ما ببث تنبيه يفيد بإزالة حزمة تطبيق ما. قد تستخدم التطبيقات الضارة هذا لإنهاء أية تطبيقات أخرى قيد التشغيل."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"إرسال بث SMS مستلم"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"عرض النوافذ غير المصرح بها"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"للسماح بإنشاء نوافذ بقصد استخدامها بواسطة واجهة مستخدم النظام الداخلي. ليس للاستخدام بواسطة التطبيقات العادية."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"عرض تنبيهات مستوى النظام"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"للسماح لأحد التطبيقات بعرض نوافذ تنبيه النظام. يمكن أن تستحوذ التطبيقات الضارة على الشاشة بالكامل."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"للسماح للتطبيق بإظهار نوافذ تنبيه النظام. يمكن أن تتحكم التطبيقات الضارة في الشاشة بأكملها."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"تعديل سرعة الرسوم المتحركة العمومية"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"للسماح لتطبيق ما بتغيير سرعة الرسوم المتحركة العمومية (رسوم متحركة أسرع أو أبطأ) في أي وقت."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"إدارة رموز التطبيق"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"للسماح للتطبيقات بإنشاء وإدارة رموزها الخاصة، وتجاوز ترتيب Z العادي. لا يجب استخدامه على الإطلاق للتطبيقات العادية."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"مفاتيح الضغط وأزرار التحكم"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"للسماح لأحد التطبيقات بتسليم أحداث الإرسال الخاصة به (ضغطات المفاتيح وغير ذلك) إلى تطبيقات أخرى. يمكن أن تستخدم التطبيقات الضارة ذلك للاستحواذ على الجهاز اللوحي."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"للسماح للتطبيق بتوصيل أحداث إدخالاته الخاصة (ضغطات المفاتيح، وما إلى ذلك) للتطبيقات الأخرى. يمكن أن تستخدم التطبيقات الضارة ذلك للتحكم في الجهاز اللوحي."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"للسماح لتطبيق ما بتسليم أحداث الإرسال الخاصة به (ضغطات المفاتيح وغير ذلك) إلى تطبيقات أخرى. يمكن أن تستخدم التطبيقات الضارة ذلك للاستحواذ على الهاتف."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"تسجيل ما تكتبه والإجراءات التي تتخذها"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"للسماح للتطبيقات بمراقبة الأحرف التي تضغط عليها حتى عند التفاعل مع تطبيق آخر (مثل إدخال كلمة مرور). لا يجب استخدامه على الإطلاق للتطبيقات العادية."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"تثبيت التطبيقات مباشرة"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"للسماح لتطبيق ما بتثبيت حزم Android الجديدة أو المحدّثة. يمكن أن تستخدم التطبيقات الضارة ذلك لإضافة تطبيقات جديدة ذات أذونات قوية على نحو عشوائي."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"حذف جميع بيانات ذاكرة التخزين المؤقت للتطبيق"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"للسماح لأحد التطبيقات بتفريغ سعة تخزين الجهاز اللوحي من خلال حذف بعض الملفات من دليل ذاكرة التخزين المؤقت للتطبيق. ويكون الدخول في العادة مقيّدًا بشدة لمعالجة النظام."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"للسماح لتطبيق ما بإفراغ وحدة تخزين الجهاز اللوحي من خلال حذف بعض الملفات في دليل ذاكرة التخزين المؤقت للتطبيق. وعادةً يكون الدخول مقيدًا جدًا لتشغيل النظام."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"للسماح لتطبيق ما بتفريغ سعة تخزين الهاتف من خلال حذف بعض الملفات من دليل ذاكرة التخزين المؤقت للتطبيق. ويكون الدخول في العادة مقيّدًا بشدة لمعالجة النظام."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"نقل موارد التطبيق"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"للسماح لتطبيق ما بنقل موارد التطبيق من الوسائط الداخلية إلى الوسائط الخارجية والعكس."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"قراءة ملفات سجل النظام"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"للسماح لأحد التطبيقات بالقراءة من ملفات السجل المختلفة بالنظام. يسمح هذا باكتشاف معلومات عامة حول ما تجريه في الجهاز اللوحي، ومن المحتمل أن تحتوي على معلومات شخصية أو خاصة."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"للسماح لأحد التطبيقات بالقراءة من ملفات السجل المختلفة بالنظام. يسمح هذا باكتشاف معلومات عامة حول ما تجريه في الجهاز اللوحي، ومن المحتمل أن تحتوي على معلومات شخصية أو خاصة."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"قراءة بيانات السجل الحساسة"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"للسماح لتطبيق ما بالقراءة من ملفات سجلات النظام المتنوعة. ويسمح ذلك للتطبيق باكتشاف المعلومات العامة حول ما تفعله بالجهاز اللوحي، ومن المحتمل أن يتضمن معلومات شخصية أو خاصة."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"للسماح لتطبيق ما بالقراءة من ملفات سجلات النظام المتنوعة. ويسمح ذلك للتطبيق باكتشاف المعلومات العامة حول ما تفعله بالهاتف، ومن المحتمل أن يتضمن معلومات شخصية أو خاصة."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"قراءة/كتابة إلى الموارد المملوكة بواسطة التشخيص"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"للسماح لتطبيق ما بالقراءة والكتابة إلى أي مورد مملوك بواسطة مجموعة التشخيصات؛ على سبيل المثال، الملفات في /dev. من المحتمل أن يؤثر ذلك في استقرار النظام وأمانه. يجب ألا يستخدم ذلك سوى للتشخيصات الخاصة بالنظام من قِبل المصنِّع أو المشغِّل."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"تمكين مكونات التطبيق أو تعطيلها"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"للسماح لأحد التطبيقات بتغير ما إذ كان مكون تطبيق آخر ممكّنًا أم لا. يمكن أن تستخدم التطبيقات الضارة ذلك لتعطيل قدرات الجهاز اللوحي المهمة. يجب توخي الحذر عند استخدام هذا الإذن، إذ يحتمل أن يحول مكونات التطبيق إلى حالة غير قابلة للاستخدام أو غير متسقة أو غير مستقرة."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"للسماح لأحد التطبيقات بتغير ما إذ كان مكون تطبيق آخر ممكّنًا أم لا. يمكن أن تستخدم التطبيقات الضارة ذلك لتعطيل قدرات الجهاز اللوحي المهمة. يجب توخي الحذر عند استخدام هذا الإذن، إذ يحتمل أن يحول مكونات التطبيق إلى حالة غير قابلة للاستخدام أو غير متسقة أو غير مستقرة."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"للسماح لتطبيق ما بتغيير ما إذا كان سيتم تمكين مكون لتطبيق آخر أم لا. يمكن أن تستخدم التطبيقات الضارة ذلك لتعطيل قدرات الجهاز اللوحي المهمة. يجب توخي الحذر عند استخدام هذا الإذن، وذلك لأنه من الممكن أن يؤدي ذلك إلى جعل حالة مكونات التطبيق غير قابلة للاستخدام أو غير متناسقة أو غير مستقرة."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"للسماح لتطبيق ما بتغيير ما إذا كان سيتم تمكين مكون لتطبيق آخر أم لا. يمكن أن تستخدم التطبيقات الضارة ذلك لتعطيل قدرات الهاتف المهمة. يجب توخي الحذر عند استخدام هذا الإذن، وذلك لأنه من الممكن أن يؤدي ذلك إلى جعل حالة مكونات التطبيق غير قابلة للاستخدام أو غير متناسقة أو غير مستقرة."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"تعيين التطبيقات المفضلة"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"للسماح لتطبيق ما بتعديل التطبيقات المفضلة. يمكن أن يسمح ذلك للتطبيقات الضارة بتغيير التطبيقات قيد التشغيل بشكل غير ملحوظ، وانتحال صفة تطبيقاتك الحالية لجمع بيانات خاصة منك."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"تعديل إعدادات النظام العمومية"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"تعديل خريطة خدمات Google"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"للسماح لتطبيق ما بتعديل خريطة خدمات Google. ليس للاستخدام بواسطة التطبيقات العادية."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"البدء تلقائيًا عند التشغيل"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"للسماح لأحد التطبيقات ببدء تشغيل نفسه عقب انتهاء النظام من التشغيل. قد يؤدي ذلك إلى استغراق مزيد من الوقت عند بدء الجهاز اللوحي والسماح للتطبيق بإبطاء الأداء الإجمالي للجهاز اللوحي من خلال تشغيله دومًا."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"للسماح للتطبيق ببدء ذاته فور انتهاء النظام من التمهيد. ويمكن أن يؤدي ذلك إلى إطالة فترة بدء الجهاز اللوحي والسماح للتطبيق بإبطاء الجهاز اللوحي بالكامل من خلال التشغيل بصفة مستمرة."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"للسماح لتطبيق ما ببدء تشغيل نفسه عقب انتهاء النظام من التشغيل. قد يؤدي ذلك إلى استغراق مزيد من الوقت عن بدء الهاتف والسماح للتطبيق بإبطاء الأداء الإجمالي للهاتف حيث يتم تشغيله دومًا."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"إرسال بث طويل الزيارة"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"للسماح لأحد التطبيقات بإرسال بث طويل الزيارة، والذي يظل بعد انتهاء البث. قد تجعل التطبيقات الضارة الجهاز اللوحي بطيئًا أو غير مستقر من خلال التسبب في استخدامه لمساحة كبيرة للغاية من الذاكرة."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"للسماح للتطبيق بإرسال عمليات بث طويلة الزيارة، والتي تبقى بعد انتهاء البث. يمكن أن تبطئ التطبيقات الضارة الجهاز اللوحي أو تجعله غير مستقر عبر جعله يستخدم ذاكرة كبيرة جدًا."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"للسماح لتطبيق ما بإرسال بث طويل الزيارة، والذي يظل بعد انتهاء البث. قد تجعل التطبيقات الضارة الهاتف بطيئًا أو غير مستقر من خلال التسبب في استخدام مساحة كبيرة للغاية من الذاكرة."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"قراءة بيانات جهة الاتصال"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"للسماح لأحد التطبيقات بقراءة جميع بيانات (عنوان) جهات الاتصال المخزّنة في الجهاز اللوحي. يمكن أن تستخدم التطبيقات الضارة هذا لإرسال بياناتك إلى أشخاص آخرين."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"للسماح لتطبيق ما بقراءة كل بيانات جهة الاتصال (العنوان) المخزنة على الجهاز اللوحي. ويمكن للتطبيقات الضارة استخدام ذلك لإرسال بياناتك إلى أشخاص آخرين."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"للسماح لتطبيق ما بقراءة جميع بيانات (عنوان) جهات الاتصال المخزّنة في هاتفك. يمكن أن تستخدم التطبيقات الضارة هذا لإرسال بياناتك إلى أشخاص آخرين."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"كتابة بيانات جهة الاتصال"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"للسماح لأحد التطبيقات بتعديل بيانات (عنوان) جهة الاتصال المخزّنة في الجهاز اللوحي. يمكن أن تستخدم التطبيقات الضارة ذلك لمسح بيانات جهة الاتصال أو تعديلها."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"للسماح للتطبيق بتعديل بيانات جهة الاتصال (العنوان) المخزنة على الجهاز اللوحي. يمكن أن تستخدم التطبيقات الضارة ذلك لمحو بيانات جهة الاتصال أو تعديلها."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"للسماح لتطبيق ما بتعديل بيانات (عنوان) جهة الاتصال المخزّنة في هاتفك. يمكن أن تستخدم التطبيقات الضارة ذلك لمسح بيانات جهة الاتصال أو تعديلها."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"قراءة أحداث التقويم"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"للسماح لأحد التطبيقات بقراءة جميع أحداث التقويم المخزّنة في الجهاز اللوحي. يمكن أن تستخدم التطبيقات الضارة هذا لإرسال أحداث تقويمك إلى أشخاص آخرين."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"للسماح لتطبيق ما بقراءة كل أحداث التقويم المخزنة على الجهاز اللوحي. ويمكن للتطبيقات الضارة استخدام ذلك لإرسال أحداث التقويم إلى أشخاص آخرين."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"للسماح لتطبيق ما بقراءة جميع أحداث التقويم المخزّنة في هاتفك. يمكن أن تستخدم التطبيقات الضارة هذا لإرسال أحداث تقويمك إلى أشخاص آخرين."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"إضافة أحداث تقويم أو تعديلها وإرسال رسالة إلكترونية إلى الضيوف"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"للسماح لتطبيق ما بإضافة أحداث أو تغييرها في تقويمك، مما قد يؤدي إلى إرسال رسائل إلكترونية إلى الضيوف. يمكن أن تستخدم التطبيقات الضارة ذلك لمسح أحداث تقويمك أو تعديلها أو لإرسال رسائل إلكترونية إلى الضيوف."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"إذن لتثبيت موفر خدمة موقع"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"إنشاء مصادر مواقع وهمية للاختبار. قد تستخدم التطبيقات الضارة هذا لتجاوز الموقع و/أو الحالة المُرجَعة بواسطة مصادر مواقع حقيقية مثل موفري خدمة الشبكة أو GPS أو مراقبة وإعداد تقارير حول موقعك إلى مصدر خارجي."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"موقع (GPS) جيد"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"للدخول إلى مصادر المواقع الجيدة، مثل نظام تحديد المواقع العالمي على الجهاز اللوحي، حيث يتوفر ذلك. يمكن أن تستخدم التطبيقات الضارة ذلك لتحديد مكانك، وقد تستهلك المزيد من طاقة البطارية."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"الدخول إلى مصادر المواقع الجيدة مثل نظام تحديد المواقع العالمي على الجهاز اللوحي، حيث يتوفر ذلك. يمكن أن تستخدم التطبيقات الضارة ذلك لتحديد مكانك، وقد تستهلك المزيد من طاقة البطارية."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"الدخول إلى مصادر المواقع الجيدة مثل نظام تحديد المواقع العالمي على الهاتف، حيث يتوفر ذلك. يمكن أن تستخدم التطبيقات الضارة ذلك لتحديد مكانك، وقد تستهلك المزيد من طاقة البطارية."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"موقع تقريبي (مستند إلى الشبكة)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"للدخول إلى مصادر المواقع التقريبية، مثل قاعدة بيانات شبكة الهاتف الخلوي لتحديد موقع تقريبي للجهاز اللوحي، حيث يتوفر ذلك. يمكن أن تستخدم التطبيقات الضارة ذلك لتحديد مكانك بالتقريب."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"الدخول إلى مصادر المواقع التقريبية مثل قاعدة بيانات شبكة الهاتف الخلوي لتحديد موقع تقريبي للجهاز اللوحي، حيث يتوفر ذلك. يمكن أن تستخدم التطبيقات الضارة ذلك لتحديد مكانك بالتقريب."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"الدخول إلى مصادر المواقع التقريبية مثل قاعدة بيانات شبكة الهاتف الخلوي لتحديد موقع تقريبي للهاتف، حيث يتوفر ذلك. يمكن أن تستخدم التطبيقات الضارة ذلك لتحديد مكانك بالتقريب."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"الدخول إلى SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"للسماح للتطبيق باستخدام ميزات SurfaceFlinger ذات المستوى المنخفض."</string>
@@ -334,11 +330,11 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"للسماح للتطبيق بتعديل الإعدادات الصوتية العمومية مثل مستوى الصوت والتوجيه."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"تسجيل الصوت"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"للسماح للتطبيق بالدخول إلى مسار تسجيل الصوت."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"التقاط صور"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"للسماح للتطبيق بالتقاط صور بالكاميرا. يتيح ذلك للتطبيق جمع الصور التي تعرضها الكاميرا في أي وقت."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"تعطيل الجهاز اللوحي بشكل دائم"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"التقاط صور ومقاطع فيديو"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"للسماح للتطبيق بالتقاط صور ومقاطع فيديو باستخدام الكاميرا. يسمح ذلك للتطبيق بتجميع الصور التي تعرضها الكاميرا في أي وقت."</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="7379164636920817963">"للسماح للتطبيق بتعطيل الجهاز اللوحي بالكامل بشكل دائم. هذا خطير للغاية."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"للسماح للتطبيق بتعطيل الجهاز اللوحي بأكمله نهائيًا. هذا خطير جدًا."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"للسماح للتطبيق بتعطيل الهاتف بالكامل على الدوام. هذا خطير للغاية."</string>
     <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"فرض إعادة تشغيل الجهاز اللوحي"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"فرض إعادة تشغيل الهاتف"</string>
@@ -348,31 +344,29 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"للسماح للتطبيق بتحميل أنظمة الملفات وإلغاء تحميلها لسعة التخزين القابلة للإزالة."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"تنسيق سعة التخزين الخارجية"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"للسماح للتطبيق بتنسيق سعة التخزين القابلة للإزالة."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"الحصول على معلومات حول سعة التخزين الآمنة"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"للسماح للتطبيق بالحصول على معلومات حول سعة التخزين الآمنة."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"إنشاء سعة تخزين آمنة"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"للسماح للتطبيق بإنشاء سعة تخزين آمنة."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"مسح سعة التخزين الآمنة"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"للسماح للتطبيق بمسح سعة التخزين الآمنة."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"تحميل/إلغاء تحميل سعة التخزين الآمنة"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"للسماح للتطبيق بتحميل / إلغاء تحميل سعة تخزين آمنة."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"إعادة تسمية سعة التخزين الآمنة"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"للسماح للتطبيق بإعادة تسمية سعة التخزين الآمنة."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"الحصول على معلومات حول وحدة التخزين الداخلية"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"للسماح للتطبيقات بالحصول على معلومات حول وحدة التخزين الداخلية."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"إنشاء وحدة تخزين داخلية"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"للسماح لتطبيق ما بإنشاء وحدة تخزين داخلية."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"مسح وحدة التخزين الداخلية"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"للسماح لتطبيق ما بمسح وحدة التخزين الداخلية."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"تركيب / إلغاء تركيب وحدة التخزين الداخلية"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"للسماح لتطبيق ما بتركيب/إلغاء تركيب وحدة التخزين الداخلية."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"إعادة تسمية وحدة التخزين الداخلية"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"للسماح لتطبيق ما بإعادة تسمية وحدة التخزين الداخلية."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"التحكم بالهزاز"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"للسماح للتطبيق بالتحكم في الهزاز."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"التحكم في الضوء الوامض"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"للسماح للتطبيق بالتحكم في الضوء الوامض."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"الدخول إلى أجهزة USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"للسماح للتطبيق بالدخول إلى أجهزة USB."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"اختبار الأجهزة"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"للسماح للتطبيق بالتحكم في الأجهزة الطرفية المتنوعة بغرض اختبار الأجهزة."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"اتصال مباشر بأرقام الهواتف"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"للسماح للتطبيق بالاتصال بأرقام الهواتف بدون تدخل منك. قد تسبب التطبيقات في وجود اتصالات غير متوقعة في فاتورة الهاتف. لاحظ أن هذا لا يسمح للتطبيق بالاتصال بأرقام الطوارئ."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"اتصال مباشر بأي رقم من أرقام الهواتف"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"للسماح للتطبيق بالاتصال بأي رقم هاتف، بما في ذلك أرقام الطوارئ، بدون تدخل منك. قد تجري التطبيقات الضارة اتصالات غير ضرورية وغير قانونية بخدمات الطوارئ."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"بدء إعداد جهاز CDMA لوحي مباشرة"</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="6457447676108355905">"للسماح للتطبيق ببدء توفير CDMA. قد تبدأ التطبيقات الضارة توفير CDMA بدون الحاجة إلى ذلك."</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"التحكم في تنبيهات تحديث الموقع"</string>
@@ -387,14 +381,14 @@
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"للسماح للتطبيق بالدخول إلى ميزات الهاتف للجهاز. يمكن أن يحدد تطبيق، بهذا الإذن، رقم الهاتف والرقم التسلسلي لهذا الهاتف وما إذا كانت هناك مكالمة نشطة والرقم الذي يجري الاتصال به وما إلى ذلك."</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="4032181488045338551">"للسماح لأحد التطبيقات بمنع الجهاز اللوحي من الانتقال إلى وضع السكون."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"للسماح لتطبيق ما بمنع الجهاز اللوحي من الانتقال إلى وضع السكون."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"للسماح لتطبيق ما بمنع الهاتف من الانتقال إلى وضع السكون."</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="3853773100100451905">"للسماح للتطبيق بتشغيل الجهاز اللوحي أو إيقاف تشغيله."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"للسماح للتطبيق بتشغيل الهاتف أو إيقاف تشغيله."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"تشغيل في وضع اختبار المصنع"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"للتشغيل كاختبار مصنِّع بمستوى أدنى، مما يسمح بالدخول الكامل إلى جهاز الجهاز اللوحي. لا يتوفر سوى عند تشغيل الجهاز اللوحي في وضع اختبار المصنِّع."</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="6417041752170585837">"للسماح للتطبيق بتعيين خلفية النظام."</string>
@@ -403,15 +397,15 @@
     <string name="permlab_masterClear" msgid="2315750423139697397">"إعادة تعيين النظام إلى الإعدادات الافتراضية للمصنع"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"للسماح لتطبيق ما بإعادة تعيين النظام بالكامل على إعدادات المصنع، ومسح جميع البيانات والتهيئة والتطبيقات المثبتة."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"تعيين الوقت"</string>
-    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"للسماح لأحد التطبيقات بتغيير وقت ساعة الجهاز اللوحي."</string>
+    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"للسماح لتطبيق ما بتغيير وقت ساعة الجهاز اللوحي."</string>
     <string name="permdesc_setTime" product="default" msgid="667294309287080045">"للسماح لتطبيق ما بتغيير وقت ساعة الهاتف."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"تعيين المنطقة الزمنية"</string>
-    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"للسماح لأحد التطبيقات بتغيير المنطقة الزمنية للجهاز اللوحي."</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"للسماح لتطبيق ما بتغيير المنطقة الزمنية للجهاز اللوحي."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"للسماح لتطبيق ما بتغيير المنطقة الزمنية للهاتف."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"العمل كخدمة مدير حساب"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"للسماح لتطبيق ما بإجراء مكالمات إلى مصدِّقي الحساب"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"اكتشاف الحسابات المعروفة"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"للسماح لأحد التطبيقات بالحصول على قائمة بالحسابات المعروفة بواسطة الجهاز اللوحي."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"للسماح لتطبيق ما بالحصول على قائمة بالحسابات المعروفة بواسطة الجهاز اللوحي."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"للسماح لتطبيق ما بالحصول على قائمة الحسابات المعروفة بواسطة الهاتف."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"العمل كمصدِّق للحساب"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"للسماح لتطبيق ما باستخدام إمكانيات مصدِّق الحساب لـ AccountManager، بما في ذلك إنشاء حسابات والحصول على كلمات مرورها وتعينها."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"السماح باستقبال بث Wi-Fi متعدد"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"للسماح لتطبيق ما باستلام حزم غير موجهة مباشرة إلى جهازك. يمكن أن يكون ذلك مفيدًا عند اكتشاف خدمات معروضة بالقرب منك. يستخدم ذلك الطاقة أكثر من وضع البث غير المتعدد."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"إدارة البلوتوث"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"للسماح لأحد التطبيقات بتهيئة جهاز البلوتوث اللوحي المحلي، واكتشاف الأجهزة البعيدة والاقتران بها."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"للسماح لتطبيق ما بتهيئة لوحة البلوتوث المحلي، واكتشاف أجهزة التحكم عن بعد والاقتران بها."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"للسماح لتطبيق ما بتهيئة هاتف البلوتوث المحلي، واكتشاف أجهزة التحكم عن بعد والاقتران معها."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"إنشاء اتصالات بلوتوث"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"للسماح لأحد التطبيقات بعرض تهيئة جهاز البلوتوث اللوحي المحلي، وإجراء اتصالات مع أجهزة مقترنة وقبولها."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"للسماح للتطبيق بعرض مكونات لوحة البلوتوث المحلي، وإجراء الاتصالات وقبولها مع الأجهزة المقترنة."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"للسماح لتطبيق ما بعرض تهيئة هاتف البلوتوث المحلي، وإجراء اتصالات وقبولها باستخدام الأجهزة المقترنة."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"التحكم في اتصال الحقل القريب"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"للسماح لتطبيق ما بالاتصال بعلامات اتصال حقل قريب (NFC)، والبطاقات وبرامج القراءة."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"تعطيل تأمين المفاتيح"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"للسماح لتطبيق ما بتعطيل تأمين المفاتيح وأي أمان كلمة مرور مرتبطة. ومثال صحيح لذلك هو تعطيل الهاتف لتأمين المفاتيح عند استلام مكالمة هاتفية واردة، ثم إعادة تمكين تأمين المفاتيح عند انتهاء المكالمة."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"قراءة إعدادات المزامنة"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"للسماح لتطبيق ما بقراءة أي كلمات وأسماء وعبارات خاصة ربما خزنها المستخدم في قاموس المستخدم."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"كتابة إلى القاموس المعرّف بواسطة المستخدم"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"للسماح لتطبيق ما بكتابة كلمات جديدة إلى قاموس المستخدم."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"تعديل/حذف محتويات بطاقة SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"تعديل/حذف محتويات وحدة تخزين USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"تعديل/حذف محتويات بطاقة SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"للسماح لتطبيق ما بالكتابة إلى بطاقة SD."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"للسماح لتطبيق ما بالكتابة على وحدة تخزين USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"للسماح لتطبيق ما بالكتابة إلى بطاقة SD."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"تعديل/حذف محتويات وحدة تخزين الوسائط الداخلية"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"للسماح لتطبيق ما بتعديل محتويات وحدة تخزين الوسائط الداخلية."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"الدخول إلى نظام ملفات ذاكرة التخزين المؤقت"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"للسماح لتطبيق ما بقراءة نظام ملفات ذاكرة التخزين المؤقت والكتابة به."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"تحديد كلمة المرور"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"لتقييد أنواع كلمات المرور المسموح لك باستخدامها."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"ملاحظة محاولات تسجيل الدخول"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"لمراقبة عدد مرات إدخال كلمات المرور غير الصحيحة عند إلغاء تأمين الشاشة وتأمين الجهاز اللوحي أو مسح جميع بياناته في حالة إدخال الكثير من كلمات المرور غير الصحيحة"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"لمراقبة عدد مرات إدخال كلمات المرور غير الصحيحة عند إلغاء تأمين الشاشة وتأمين الجهاز اللوحي أو مسح جميع بياناته في حالة إدخال الكثير من كلمات المرور غير الصحيحة"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"إعادة تعيين كلمة المرور"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"فرض كلمة مرورك إلى قيمة جديدة، مما يتطلب منحك المشرف إياها قبل أن تتمكن من تسجيل الدخول."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"فرض التأمين"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"التحكم أثناء تأمين الجهاز، يتطلب إعادة إدخال كلمة المرور."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"إجراء/تلقي مكالمات عبر الإنترنت"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"للسماح لتطبيق ما باستخدام خدمة SIP لإجراء/تلقي مكالمات عبر الإنترنت."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"تعيين قواعد كلمة المرور"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"التحكم في الطول والأحرف المسموح بها في كلمات مرور إلغاء قفل الشاشة"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"مراقبة محاولات إلغاء قفل الشاشة"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"مراقبة عدد كلمات المرور غير الصحيحة التي تم إدخالها عند إلغاء قفل الشاشة، وقفل الجهاز اللوحي ومحو كل بيانات الجهاز إذا تم إدخال عدد أكبر من اللازم من كلمات المرور غير الصحيحة"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"مراقبة عدد كلمات المرور غير الصحيحة التي تم إدخالها عند إلغاء قفل الشاشة، وقفل الهاتف ومحو كل بيانات الهاتف إذا تم إدخال عدد أكبر من اللازم من كلمات المرور غير الصحيحة"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"تغيير كلمة مرور إلغاء قفل الشاشة"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"تغيير كلمة مرور إلغاء قفل الشاشة"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"تأمين الشاشة"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"التحكم في كيفية ووقت قفل الشاشة"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"مسح جميع البيانات"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"لمسح بيانات الجهاز اللوحي بدون تحذير، من خلال إجراء إعادة الضبط بحسب بيانات المصنع"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"لمسح بيانات الجهاز اللوحي بدون تحذير، من خلال إجراء إعادة الضبط بحسب بيانات المصنع"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"محو بيانات الجهاز اللوحي بدون تحذير، وذلك عبر إجراء إعادة الضبط بحسب بيانات المصنع"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"محو بيانات الهاتف بدون تحذير، وذلك عبر إجراء إعادة الضبط بحسب بيانات المصنع"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"تعيين الخادم الوكيل العمومي للجهاز"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"تعيين الخادم الوكيل العمومي للجهاز لكي يتم استخدامه أثناء تمكين السياسة. يعين مشرف الجهاز الأول فقط الخادم الوكيل العمومي الفعال."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"تعيين انتهاء صلاحية كلمة المرور"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"التحكم في الوقت المستغرق قبل الحاجة إلى تغيير كلمة مرور شاشة التوقف"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"الرئيسية"</item>
     <item msgid="869923650527136615">"الجوال"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"جهاز نداء العمل"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"مساعد"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"رسالة وسائط متعددة"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"مخصص"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"عيد ميلاد"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"الذكرى السنوية"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"حدث"</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>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"عمل"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"آخر"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"مخصص"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <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="3731488827218876115">"أدخل رقم التعريف الشخصي"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"أدخل كلمة المرور لإلغاء التأمين"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"أدخل رقم التعريف الشخصي (PIN) لإلغاء القفل"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"كود PIN غير صحيح!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"لإلغاء التأمين، اضغط على \"القائمة\" ثم على 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"رقم الطوارئ"</string>
@@ -646,14 +609,13 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"العودة إلى الاتصال"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"صحيح!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"عذرًا، حاول مرة أخرى"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"عذرًا، أعد المحاولة"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"شحن (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"تم الشحن."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<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="7381499217732227295">"ليس هناك بطاقة SIM."</string>
-    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ليست هناك بطاقة 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="8874620818937719067">"الرجاء إدخال بطاقة SIM."</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"مكالمات الطوارئ فقط"</string>
@@ -663,11 +625,9 @@
     <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="3514742106066877476">"لقد رسمت نقش إلغاء التأمين بطريقة غير صحيحة <xliff:g id="NUMBER_0">%d</xliff:g> مرة. "\n\n"الرجاء إعادة المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <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_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"لقد أدخلت كلمة المرور بشكل غير صحيح عدد <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="6827749231465145590">"لقد أدخلت رقم التعريف الشخصي (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="8687762517114904651">"لقد رسمت نقش إلغاء التأمين بصورة خاطئة عدد <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="3351013842320127827">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <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_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>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"هل تريد الانتقال بعيدًا عن هذه الصفحة؟"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"حدد \"موافق\" للمتابعة، أو \"إلغاء\" للبقاء في الصفحة الحالية."</string>
     <string name="save_password_label" msgid="6860261758665825069">"تأكيد"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"نصيحة: اضغط مرتين للتكبير والتصغير."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"الملء التلقائي"</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"ملء تلقائي"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"إعداد ملء تلقائي"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"قراءة سجل المتصفح والإشارات"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"للسماح للتطبيق بقراءة جميع عناوين URL التي انتقل إليها المتصفح. وجميع إشارات المتصفح."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"كتابة سجل المتصفح والإشارات"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"للسماح لأحد التطبيقات بتعديل سجل المتصفح أو الإشارات المرجعية المخزّنة في الجهاز اللوحي. يمكن أن تستخدم التطبيقات الضارة ذلك لمسح بيانات المتصفح أو تعديلها."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"للسماح لتطبيق ما بتعديل سجل المتصفح أو الإشارات المخزنة على الجهاز اللوحي. يمكن للتطبيقات الضارة استخدام هذا لمحو بيانات المتصفح أو تعديلها."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"للسماح لتطبيق ما بتعديل سجل المتصفح أو الإشارات في هاتفك. يمكن أن تستخدم التطبيقات الضارة ذلك لمسح بيانات المتصفح أو تعديلها."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"تعيين المنبه في ساعة المنبه"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"للسماح للتطبيق بضبط المنبه في تطبيق ساعة منبه مثبّت. ربما لا تنفذ بعض تطبيقات المنبه هذه الميزة."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"تعديل أذونات الموقع الجغرافي للمتصفح"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"للسماح لتطبيق ما بتعديل أذونات الموقع الجغرافي للمتصفح. يمكن أن تستخدم التطبيقات الضارة هذا للسماح بإرسال معلومات الموقع إلى مواقع ويب عشوائية."</string>
     <string name="save_password_message" msgid="767344687139195790">"هل تريد من المتصفح تذكر كلمة المرور هذه؟"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"قص"</string>
     <string name="copy" msgid="2681946229533511987">"نسخ"</string>
     <string name="paste" msgid="5629880836805036433">"لصق"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"ليس هناك شيء للصقه"</string>
     <string name="copyUrl" msgid="2538211579596067402">"نسخ عنوان URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"تحديد نص..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"تحديد النص"</string>
     <string name="inputMethod" msgid="1653630062304567879">"طريقة الإرسال"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"تعديل النص"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"إجراءات النص"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"المساحة منخفضة"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"مساحة تخزين الجهاز اللوحي منخفضة."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"انخفضت مساحة تخزين الجهاز اللوحي."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"مساحة تخزين الهاتف منخفضة."</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>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"جارٍ التحميل..."</string>
     <string name="capital_on" msgid="1544682755514494298">"في"</string>
     <string name="capital_off" msgid="6815870386972805832">"إيقاف"</string>
     <string name="whichApplication" msgid="4533185947064773386">"إكمال الإجراء باستخدام"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"فرض الإغلاق"</string>
     <string name="report" msgid="4060218260984795706">"إرسال تقرير"</string>
     <string name="wait" msgid="7147118217226317732">"انتظار"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"تمت إعادة توجيه التطبيق"</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="smv_application" msgid="295583804361236288">"انتهك التطبيق <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="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> يعمل"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"تحديد للتبديل إلى التطبيق"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"هل تريد التبديل بين التطبيقات؟"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"يوجد تطبيق آخر قيد التشغيل فعليًا ويجب إيقافه لكي تتمكن من بدء تطبيق جديد."</string>
+    <string name="old_app_action" msgid="493129172238566282">"عودة إلى <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"عدم بدء التطبيق الجديد."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"بدء <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"إيقاف التطبيق القديم بدون الحفظ."</string>
     <string name="sendText" msgid="5132506121645618310">"تحديد إجراء للنص"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"مستوى صوت الرنين"</string>
     <string name="volume_music" msgid="5421651157138628171">"مستوى صوت الوسائط"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"عرض الكل"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"تخزين USB كبير السعة"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB متصل"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"لقد أوصلت هاتفك بجهاز الكمبيوتر عبر USB. حدد الزر أدناه إذا كنت تريد نسخ ملفات بين الكمبيوتر وبطاقة SD لجهاز Android."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"لقد أوصلت هاتفك بجهاز الكمبيوتر عبر USB. حدد الزر أدناه إذا كنت تريد نسخ ملفات بين الكمبيوتر وبطاقة SD لجهاز Android."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"لقد اتصلت بجهاز الكمبيوتر من خلال USB. المس الزر أدناه إذا كنت تريد نسخ الملفات بين جهاز الكمبيوتر ووحدة تخزين Android."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"لقد اتصلت بجهاز الكمبيوتر من خلال USB. المس الزر أدناه إذا كنت تريد نسخ الملفات بين جهاز الكمبيوتر وبطاقة SD لـ Android."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"تشغيل سعة تخزين USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"هناك مشكلة في استخدام بطاقة SD لسعة تخزين USB."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"هناك مشكلة في استخدام بطاقة SD لسعة تخزين USB."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"هناك مشكلة في استخدام وحدة تخزين USB للتخزين الجماعي لـ USB."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"هناك مشكلة في استخدام بطاقة SD للتخزين الجماعي لـ USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB متصل"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"يمكنك التحديد لنسخ الملفات إلى/من جهاز الكمبيوتر."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"إيقاف تشغيل سعة تخزين USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"حدد لإيقاف تشغيل سعة تخزين USB."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"سعة USB التخزينية المستخدمة"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"قبل إيقاف تشغيل سعة تخزين USB، تأكد من إلغاء تحميل (\"تم إخراجها\") بطاقة SD لـ Android من جهاز الكمبيوتر."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"قبل إيقاف تشغيل وحدة تخزين USB، تأكد من إلغاء تركيب (\"إخراج\") وحدة تخزين USB لـ Android من الكمبيوتر."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"قبل إيقاف تشغيل سعة تخزين USB، تأكد من إلغاء تحميل (\"تم إخراجها\") بطاقة SD لـ Android من جهاز الكمبيوتر."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"إيقاف تشغيل سعة تخزين USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"حدثت مشكلة في إيقاف تشغيل سعة USB التخزينية. تحقق من إلغاء تحميل مضيف USB، ثم حاول مرة أخرى."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"إذا شغّلت سعة تخزين USB، فستتوقف بعض التطبيقات التي تستخدمها وربما تصبح غير متاحة لحين إيقاف تشغيل سعة تخزين USB."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"أخفقت عملية USB"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"موافق"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"تنسيق بطاقة SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"تهيئة وحدة تخزين USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"تنسيق بطاقة SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"هل تريد تنسيق بطاقة SD؟ ستفقد جميع البيانات على بطاقتك."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"هل تريد تهيئة وحدة تخزين USB، ومحو كل الملفات المخزنة بها؟ لا يمكن عكس هذا الإجراء!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"هل تريد تنسيق بطاقة SD؟ ستفقد جميع البيانات على بطاقتك."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"تنسيق"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"تم توصيل تصحيح أخطاء USB"</string>
@@ -960,28 +897,28 @@
     <string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
     <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
     <string name="candidates_style" msgid="4333913089637062257"><u>"العناصر المرشحة"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"تحضير بطاقة SD"</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>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"بطاقة SD فارغة"</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>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"بطاقة SD فارغة أو تحتوي على نظام ملفات غير معتمد."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"وحدة تخزين USB فارغة أو بها نظام ملفات غير صالح."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"بطاقة SD فارغة أو تحتوي على نظام ملفات غير معتمد."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"بطاقة 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>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"بطاقة SD تالفة. قد يجب عليك إعادة تنسيقها."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"تلف وحدة تخزين USB. ربما يتوجب عليك إعادة تهيئتها."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"بطاقة SD تالفة. قد يجب عليك إعادة تنسيقها."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"تمت إزالة بطاقة 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>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"ألغ تحميل بطاقة 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>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"يمكن إزالة بطاقة 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>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"يمكنك إزالة بطاقة 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>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"تمت إزالة بطاقة 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>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"تمت إزالة بطاقة 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="4168820609403385789">"لم يتم العثور على أية أنشطة متطابقة"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"تحديث إحصاءات استخدام المكون"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"إرسال"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"التالي"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"تم"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"السابق"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"تنفيذ"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"طلب رقم"\n"باستخدام <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"إنشاء جهة اتصال"\n"باستخدام <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"بروتوكول L2TP/IPSec VPN المستند إلى المفتاح المشترك مسبقًا"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"بروتوكول L2TP/IPSec VPN المستند إلى الشهادة"</string>
     <string name="upload_file" msgid="2897957172366730416">"اختيار ملف"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <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="668663626721675614">"حدد للخروج من وضع السيارة."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"النطاق أو نقطة الاتصال نشطة"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"يمكنك اللمس للتهيئة"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <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="2609734763845705708">"يمكنك اللمس لمعرفة المزيد حول استخدام بيانات الجوال"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"تم تجاوز حد بيانات الجوال"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"يمكنك اللمس لمعرفة المزيد حول استخدام بيانات الجوال"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"ليس هناك أية مطابقات"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"بحث في الصفحة"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"مطابقة واحدة"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> من <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"تم"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"جارٍ إلغاء تركيب وحدة تخزين USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"جارٍ إلغاء تركيب بطاقة SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"جارٍ محو وحدة تخزين USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"جارٍ محو بطاقة SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"أخفق محو وحدة تخزين USB."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"أخفق محو بطاقة 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">"بطاقة SD قيد الاستخدام حاليًا بواسطة كمبيوتر."</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>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index d6684c5..0797e28 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Гласова поща"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Има проблем с връзката или MMI кодът е невалиден."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Операцията е ограничена само до фиксираните номера за набиране."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Услугата бе активирана."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Услугата бе активирана за:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Услугата бе деактивирана."</string>
@@ -129,7 +128,7 @@
     <string name="low_memory" product="tablet" msgid="2292820184396262278">"Хранилището на таблета е пълно! Изтрийте файлове, за да освободите място."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"Хранилището на телефона е пълно! Изтрийте файлове, за да освободите място."</string>
     <string name="me" msgid="6545696007631404292">"Аз"</string>
-    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Опции на таблета"</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>
@@ -139,11 +138,10 @@
     <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>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Искате ли да изключите?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Скорошни"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Няма скорошни приложения."</string>
-    <string name="global_actions" product="tablet" msgid="408477140088053665">"Опции на таблета"</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>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Инструменти за програмиране"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Функции, необходими само за програмисти на приложения."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Съхранение"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Достъп до SD картата."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Достъп до USB хранилището."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Достъп до SD картата."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"деактивиране или промяна на лентата на състоянието"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Разрешава на приложението да деактивира лентата на състоянието или да добавя и премахва системни икони."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"лента на състоянието"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Разрешава на приложението да бъде лентата на състоянието."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"разгъване или свиване на лентата на състоянието"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Разрешава на приложението да разгъва или свива лентата на състоянието."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"прехващане на изходящи обаждания"</string>
@@ -281,14 +277,14 @@
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Разрешава на приложението да освобождава място в хранилището на телефона, като изтрива файлове в директорията за кеш на приложенията. Достъпът е много ограничен, обикновено до системния процес."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Преместване на ресурси на приложенията"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Разрешава на приложението да мести ресурси на приложения от вътрешни към външни носители и обратно."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"четене на системните журнални файлове"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Разрешава на приложението да чете от различните регистрационни файлове на системата. Това му позволява да получи обща информация какво правите с таблета, което потенциално включва лични или поверителни данни."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Разрешава на приложението да чете от различните регистрационни файлове на системата. Това му позволява да получи обща информация какво правите с таблета, което потенциално включва лични или поверителни данни."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"четене на поверителни данни от регистрационните файлове"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Разрешава на приложението да чете от различните регистрационни файлове на системата. Това му позволява да получи обща информация какво правите с таблета, потенциално включително и лични или поверителни данни."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Разрешава на приложението да чете от различните регистрационни файлове на системата. Това му позволява да получи обща информация какво правите с телефона, потенциално включително и лични или поверителни данни."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"четене/запис в ресурси, притежавани от diag"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Разрешава на приложението да чете и записва във всеки ресурс, притежаван от групата diag, например файловете в /dev. Това потенциално може да засегне стабилността и защитеността на системата. То трябва да се използва САМО за специфично за хардуера диагностициране от страна на производителя или оператора."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"активиране или деактивиране на компоненти на приложенията"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Разрешава на приложението да активира или деактивира компонент на друго приложение. Злонамерените приложения могат да използват това, за да деактивират важни функционалности на таблета. С това разрешение трябва да се внимава, тъй като компонентите на приложенията може да бъдат приведени в неизползваемо, несъгласувано или нестабилно състояние."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Разрешава на приложението да активира или деактивира компонент на друго приложение. Злонамерените приложения могат да използват това, за да деактивират важни функционалности на таблета. С това разрешение трябва да се внимава, тъй като компонентите на приложенията може да бъдат приведени в неизползваемо, несъгласувано или нестабилно състояние."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Разрешава на приложението да активира или деактивира компонент на друго приложение. Злонамерените приложения могат да използват това, за да деактивират важни възможности на таблета. С това разрешение трябва да се внимава, тъй като компонентите на приложенията може да бъдат приведени в неизползваемо, нееднородно или нестабилно състояние."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Разрешава на приложението да активира или деактивира компонент на друго приложение. Злонамерените приложения могат да използват това, за да деактивират важни възможности на телефона. С това разрешение трябва да се внимава, тъй като компонентите на приложенията може да бъдат приведени в неизползваемо, нееднородно или нестабилно състояние."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"задаване на предпочитани приложения"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Разрешава на приложението да променя предпочитаните ви приложения. Това може да позволи на злонамерени приложения скрито да променят приложенията, които се изпълняват, като ги фалшифицират, за да се сдобият с ваши лични данни."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"промяна на глобалните системни настройки"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"промяна на картата на услугите на Google"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Разрешава на приложението да променя картата на услугите на Google. Не е предназначено за нормални приложения."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"автоматично стартиране при зареждане"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Разрешава на приложението да се стартира веднага, щом системата завърши зареждането си. Това може да доведе до по-бавно стартиране на таблета и да позволи на приложението да забави таблета като цяло, тъй като се изпълнява постоянно."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Разрешава на приложението да се стартира веднага щом системата завърши зареждането си. Това може да доведе до по-бавно стартиране на таблета и да позволи на приложението да забави таблета като цяло, тъй като се изпълнява постоянно."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Разрешава на приложението да се стартира веднага щом системата завърши зареждането си. Това може да доведе до по-бавно стартиране на телефона и да позволи на приложението да забави телефона като цяло, тъй като се изпълнява постоянно."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"изпращане на оставащи излъчвания"</string>
     <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Разрешава на приложението да изпраща оставащи излъчвания, които се запазват след края на излъчването. Злонамерените приложения могат да причинят бавна или нестабилна работа на таблета, като го накарат да използва твърде много памет."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Разрешава на приложението да изпраща оставащи излъчвания, които се запазват след края на излъчването. Злонамерените приложения могат да причинят бавна или нестабилна работа на телефона, като го накарат да използва твърде много памет."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"четене на данни за контактите"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Разрешава на приложението да чете всички данни за контактите (за адрес), съхранени в таблета. Злонамерените приложения могат да използват това, за да изпратят данните ви на други хора."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Разрешава на приложението да чете всички данни за контактите (за адрес), съхранени в таблета. Злонамерените приложения могат да използват това, за да изпращат данните ви на други хора."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Разрешава на приложението да чете всички данни за контактите (за адрес), съхранени в телефона. Злонамерените приложения могат да използват това, за да изпратят данните ви на други хора."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"запис на данни за контактите"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Разрешава на приложението да променя данните за контактите (за адрес), съхранени в таблета ви. Злонамерените приложения могат да използват това, за да изтрият или променят тези данни."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Разрешава на приложението да променя данните за контактите (за адрес), съхранени в таблета ви. Злонамерените приложения може да използват това, за да изтрият или променят тези данни."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Разрешава на приложението да променя данните за контактите (за адрес), съхранени в телефона ви. Злонамерените приложения могат да използват това, за да изтрият или променят тези данни."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"четене на събития от календара"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Разрешава на приложението да чете всички съхранени в таблета събития в календара ви. Злонамерените приложения могат да използват това, за да изпратят тези събития на други хора."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Разрешава на приложението да чете всички съхранени в таблета събития в календара ви. Злонамерените приложения могат да използват това, за да изпращат тези събития на други хора."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Разрешава на приложението да чете всички съхранени в телефона събития в календара ви. Злонамерените приложения могат да използват това, за да изпратят тези събития на други хора."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"добавяне или промяна на събития в календара и изпращане на имейл до гостите"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Разрешава на приложението да добавя или променя събитията в календара ви, при което може да се изпрати имейл до гостите. Злонамерените приложения могат да използват това, за да изтрият или променят тези събития или да изпратят имейл до гостите."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"разрешение за инсталиране на доставчик на местоположение"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Създаване на мними източници на местоположение за тестване. Злонамерените приложения могат да използват това, за да заменят местоположението и/или състоянието, връщано от истинските източници, като GPS или мрежовите доставчици, или да наблюдават местоположението ви и да го предават на външен източник."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"местоположение с висока точност (GPS)"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Достъп до източници за местоположение с висока точност, където са налице, например системата GPS на таблета. Злонамерените приложения могат да използват това, за да определят приблизително къде се намирате, и може да изразходват повече енергия от батерията."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Достъп до източници за местоположение с висока точност, където са налице, като системата GPS на таблета. Злонамерените приложения могат да използват това, за да определят къде се намирате, и може да изразходват повече енергия от батерията."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Достъп до източници за местоположение с висока точност, където са налице, като системата GPS на телефона. Злонамерените приложения могат да използват това, за да определят приблизително къде се намирате, и може да изразходват повече енергия от батерията."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"местоположение с ниска точност (основано на мрежата)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Достъп до източници за местоположение с ниска точност, където са налице, например базата от данни за клетъчната мрежа, за да се определи приблизително местоположение на таблета. Злонамерените приложения могат да използват това, за да определят приблизително къде се намирате."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Достъп до източници за местоположение с ниска точност, където са налице, като например базата от данни за клетъчната мрежа, за да се определи приблизително местоположение на таблета. Злонамерените приложения могат да използват това, за да определят приблизително къде се намирате."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Достъп до източници за местоположение с ниска точност, където са налице, като например базата от данни за клетъчната мрежа, за да се определи приблизително местоположение на телефона. Злонамерените приложения могат да използват това, за да определят приблизително къде се намирате."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"достъп до SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Разрешава на приложението да използва функциите на SurfaceFlinger от ниско ниво."</string>
@@ -334,8 +330,8 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Разрешава на приложението да променя глобалните настройки на звука, като например силата или пътя на сигнала."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"запис на звук"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Разрешава на приложението достъп до пътя за запис на звук."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"правене на снимки"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Разрешава на приложението да прави снимки. Това му позволява по всяко време да събира изображенията, които камерата вижда."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"правене на снимки и видеоклипове"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Разрешава на приложението да прави снимки и видеоклипове. Това му позволява по всяко време да събира изображенията, които камерата вижда."</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="7379164636920817963">"Разрешава на приложението да деактивира целия таблет за постоянно. Това е много опасно."</string>
@@ -348,24 +344,22 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Разрешава на приложението да активира или деактивира файлови системи за сменяемо устройство за съхранение."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"форматиране на външно устройство за съхранение"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Разрешава на приложението да форматира сменяемо устройство за съхранение."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"поставяне на информация в защитено хранилище"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Разрешава на приложението да поставя информация в защитено хранилище."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"създаване на защитено хранилище"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Разрешава на приложението да създава защитено хранилище."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"унищожаване на защитено хранилище"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Разрешава на приложението да унищожава защитено хранилище."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"активира и деактивира защитено хранилище"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Разрешава на приложението да активира или да деактивира защитено хранилище."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"преименуване на защитено хранилище"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Разрешава на приложението да преименува защитено хранилище."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"получаване на информация за вътрешното хранилище"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Разрешава на приложението да получава информация за вътрешното хранилище."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"създаване на вътрешно хранилище"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Разрешава на приложението да създаде вътрешно хранилище."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"унищожаване на вътрешното хранилище"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Разрешава на приложението да унищожи вътрешното хранилище."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"свързване / спиране на вътрешно хранилище"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Разрешава на приложението да свързва или спира вътрешното хранилище."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"преименуване на вътрешно хранилище"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Разрешава на приложението да преименува вътрешното хранилище."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"контролиране на вибрацията"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Разрешава на приложението да контролира устройството за вибрация."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"контролиране на фенерчето"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Разрешава на приложението да контролира фенерчето."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"достъп до USB устройства"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Разрешава на приложението достъп до USB устройства."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"тест на хардуера"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Разрешава на приложението да контролира различни периферни устройства с цел тестване на хардуера."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"директно обаждане до телефонни номера"</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"разрешаване на приемане на мултикаст през Wi-Fi мрежата"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Разрешава на приложението да получава пакети, които не са адресирани директно към устройството ви. Това може да е полезно при откриване на предлагани в района услуги. Консумира се повече мощност, отколкото в режим без мултикаст."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"администриране на Bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Разрешава на приложението да конфигурира локалния Bluetooth таблет, както и да открива и да се сдвоява с отдалечени устройства."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Разрешава на приложението да конфигурира локалния таблет с Bluetooth, както и да открива и да се сдвоява с отдалечени устройства."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Разрешава на приложението да конфигурира локалния Bluetooth телефон, както и да открива и да се сдвоява с отдалечени устройства."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"създаване на връзки през Bluetooth"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Разрешава на приложението да вижда конфигурацията на локалния Bluetooth таблет и да изгражда и приема връзки със сдвоени устройства."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Разрешава на приложението да вижда конфигурацията на локалния таблет с Bluetooth и да изгражда и приема връзки със сдвоени устройства."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Разрешава на приложението да вижда конфигурацията на локалния Bluetooth телефон и да изгражда и приема връзки със сдвоени устройства."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"контролиране на комуникацията в близкото поле"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Разрешава на приложението да комуникира с маркери, карти и четци, ползващи комуникация в близкото поле (NFC)."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"деактивиране на заключването на клавиатурата"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Разрешава на приложението да деактивира заключването на клавиатурата и свързаната защита с парола. Това е допустимо, когато например телефонът деактивира заключването при получаване на входящо обаждане и после го активира отново, когато обаждането завърши."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"четене на настройките за синхронизиране"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Разрешава на приложението да чете частни думи, имена и фрази, които потребителят може да е съхранил в потребителския речник."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"запис в дефинирания от потребителя речник"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Разрешава на приложението да записва нови думи в потребителския речник."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"промяна/изтриване на съдържанието на SD картата"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"промяна/изтриване на съдържанието в USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"промяна/изтриване на съдържанието на SD картата"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Разрешава на приложението да записва върху SD картата."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Разрешава на приложението да записва в USB хранилището."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Разрешава на приложението да записва върху SD картата."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"промяна/изтриване на съдържанието на вътрешното мултимедийно хранилище"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Разрешава на приложението да променя съдържанието на вътрешното мултимедийно хранилище."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"достъп до файловата система на кеша"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Разрешава на приложението да чете и записва във файловата система на кеша."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Ограничаване на паролата"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Ограничава типовете пароли, които можете да използвате."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Наблюдение на опитите за вход"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Наблюдава броя на неправилните пароли, въведени при отключване на екрана, и заключва таблета или изтрива всички данни от него, ако са въведени твърде много неправилни пароли"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Наблюдава броя на неправилните пароли, въведени при отключване на екрана, и заключва таблета или изтрива всички данни от него, ако са въведени твърде много неправилни пароли"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Повторно задаване на паролата"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Принудително задава нова стойност на паролата ви, при което администраторът трябва да ви я даде, преди да можете да влезете."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Принудително заключване"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Контролира кога устройството се заключва, при което се изисква отново да въведете паролата му."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"извършване/получаване на интернет обаждания"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Разрешава на приложението да използва услугата SIP за извършване/получаване на интернет обаждания."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Задаване на правила за паролата"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Контролирайте дължината и позволените знаци за паролите за отключване на екрана"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Наблюдаване на опитите за отключване на екрана"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Наблюдава броя въведени неправилни пароли при отключването на екрана и заключва таблета или изтрива всички данни от него, ако неправилните пароли са твърде много"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Наблюдава броя въведени неправилни пароли при отключването на екрана и заключва телефона или изтрива всички данни от него, ако неправилните пароли са твърде много"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Промяна на паролата за отключване на екрана"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Промяна на паролата за отключване на екрана"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Заключване на екрана"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Контролирайте как и кога екранът се заключва"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Изтриване на всички данни"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Изтрива данните от таблета без предупреждение, като извършва възстановяване на фабричните настройки"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Изтрива данните от таблета без предупреждение, като извършва възстановяване на фабричните настройки"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Изтриване на данните в таблета без предупреждение чрез възстановяване на фабричните настройки"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Изтриване на данните в телефона без предупреждение чрез възстановяване на фабричните настройки"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Задаване на глобален прокси сървър за устройството"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Задаване на глобалния прокси сървър, който да се използва, когато правилото е активирано. Само първият администратор на устройството задава действителния глобален прокси сървър."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Срок на валидност на паролата"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Контролирайте след колко време трябва да се променя паролата при заключване на екрана"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Домашен"</item>
     <item msgid="869923650527136615">"Мобилен"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Служебен пейджър"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Асистент"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Персонализирано"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Рожден ден"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Годишнина"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Събитие"</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>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Работа"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Друго"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"По избор"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <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="3731488827218876115">"Въведете PIN кода"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Въведете паролата, за да отключите"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Въведете PIN за отключване"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Неправилен PIN код!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"За да отключите, натиснете „Меню“ и после 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Спешен номер"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Назад към обаждането"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Правилно!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Съжаляваме, опитайте отново"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Съжаляваме, опитайте отново"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Зарежда се (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Зареден."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <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="3514742106066877476">"Нарисувахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%d</xliff:g> пъти. "\n\n"Моля, опитайте отново след <xliff:g id="NUMBER_1">%d</xliff:g> секунди."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Нарисувахте неправилно фигурата си за отключване <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_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Въведохте неправилно паролата си <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="6827749231465145590">"Въведохте неправилно своя 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="8687762517114904651">"Начертахте неправилно фигурата си за отключване <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="3351013842320127827">"Нарисувахте неправилно фигурата си за отключване <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_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>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Искате ли да напуснете тази страница?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Изберете „OK“, за да продължите, или „Отказ“, за да останете на нея."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Потвърждение"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Съвет: докоснете двукратно, за да увеличите или намалите мащаба."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Автопоп."</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Автоматично попълване"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Настройка"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"четене на историята и отметките на браузъра"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Разрешава на приложението да чете всички URL адреси, посетени от браузъра, и всички негови отметки."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"запис в историята и отметките на браузъра"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Разрешава на приложението да променя историята или отметките на браузъра, съхранени в таблета ви. Злонамерените приложения могат да използват това, за да изтрият или променят данните на браузъра ви."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Разрешава на приложението да променя историята или отметките на браузъра, съхранени в таблета ви. Злонамерените приложения може да използват това, за да изтрият или променят данните на браузъра ви."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Разрешава на приложението да променя историята или отметките на браузъра, съхранени на телефона ви. Злонамерените приложения могат да използват това, за да изтрият или променят данните на браузъра ви."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"навиване на будилника"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Разрешава на приложението да навие инсталирано приложение будилник. Някои будилници може да не изпълнят тази функция."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Промяна на разрешенията за местоположение в браузъра"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Разрешава на приложението да променя разрешенията на браузъра за местоположение. Злонамерените приложения могат да използват това, за да изпращат информация за местоположението до произволни уебсайтове."</string>
     <string name="save_password_message" msgid="767344687139195790">"Искате ли браузърът да запомни тази парола?"</string>
@@ -830,15 +784,12 @@
     <string name="cut" msgid="3092569408438626261">"Изрязване"</string>
     <string name="copy" msgid="2681946229533511987">"Копиране"</string>
     <string name="paste" msgid="5629880836805036433">"Поставяне"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Нищо за поставяне"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Копиране на URL адреса"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Избиране на текст..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Избиране на текст"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Метод на въвеждане"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Редактиране на текст"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Действия с текста"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Мястото не достига"</string>
     <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Мястото в хранилището на таблета намалява."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Мястото в хранилището на телефона намалява."</string>
@@ -847,8 +798,7 @@
     <string name="yes" msgid="5362982303337969312">"OK"</string>
     <string name="no" msgid="5141531044935541497">"Отказ"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Внимание"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Зарежда се..."</string>
     <string name="capital_on" msgid="1544682755514494298">"ВКЛ"</string>
     <string name="capital_off" msgid="6815870386972805832">"ИЗКЛ"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Изпълняване на действието чрез"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Принудително затваряне"</string>
     <string name="report" msgid="4060218260984795706">"Подаване на сигнал"</string>
     <string name="wait" msgid="7147118217226317732">"Изчакване"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Приложението се пренасочи"</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="smv_application" msgid="295583804361236288">"Приложението <xliff:g id="APPLICATION">%1$s</xliff:g> (процес <xliff:g id="PROCESS">%2$s</xliff:g>) наруши правилото за стриктен режим, наложено от самото него."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Процесът <xliff:g id="PROCESS">%1$s</xliff:g> наруши правилото за стриктен режим, наложено от самия него."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> се изпълнява"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Изберете за превключване към приложение"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Да се превключат ли приложенията?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Вече се изпълнява друго приложение, което трябва да бъде спряно, преди да можете да стартирате ново."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Назад към <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Новото приложение да не се стартира."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Стартиране на <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Спиране на старото приложение без запазване."</string>
     <string name="sendText" msgid="5132506121645618310">"Избиране на действие за текст"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Сила на звука при звънене"</string>
     <string name="volume_music" msgid="5421651157138628171">"Сила на звука"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Показване на всички"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB устройство за съхранение"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Връзка през USB"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Свързахте телефона с компютъра си през USB. Изберете долния бутон, ако искате да копирате файлове между компютъра и SD картата си от Android."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Свързахте телефона с компютъра си през USB. Изберете долния бутон, ако искате да копирате файлове между компютъра и SD картата си от Android."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Свързахте се с компютъра си през USB. Докоснете долния бутон, ако искате да копирате файлове между компютъра и USB хранилището си от Android."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Свързахте се с компютъра си през USB. Докоснете долния бутон, ако искате да копирате файлове между компютъра и SD картата си от Android."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Включване на USB устройството за съхранение"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Възникна проблем при използването на SD картата ви като USB устройство за съхранение."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Възникна проблем при използването на SD картата ви като USB устройство за съхранение."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Възникна проблем при използването на USB хранилището ви като масово USB хранилище."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Възникна проблем при използването на SD картата ви като масово USB хранилище."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Връзка през USB"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Изберете, за да копирате файлове към или от компютъра си."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Изключване на USB устройството за съхранение"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Изберете, за да изключите USB устройството за съхранение."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"USB устройството за съхранение се използва"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Преди да изключите работата като USB устройство за съхранение, уверете се, че сте премахнали активирането (че сте „изхвърлили“) SD картата от Android от компютъра си."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Преди да изключите USB хранилището си за Android, уверете се, че сте го спрели (със съответната команда за изваждане) от компютъра си."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Преди да изключите работата като USB устройство за съхранение, уверете се, че сте премахнали активирането (че сте „изхвърлили“) SD картата от Android от компютъра си."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Изключване на USB устройството за съхранение"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"При изключването на работата като USB устройство за съхранение възникна проблем. Уверете се, че сте премахнали активирането на USB хоста, и опитайте отново."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Ако включите работата като USB устройство за съхранение, някои използвани от вас приложения ще спрат и може да бъдат недостъпни, докато не я изключите."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Операцията през USB не бе успешна"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Форматиране на SD картата"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Форматиране на USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Форматиране на SD картата"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Наистина ли искате да форматирате SD картата? Всички данни на нея ще се заличат."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Да се форматира ли USB хранилището, изтривайки всички файлове в него? Действието не може да бъде отменено!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Наистина ли искате да форматирате SD картата? Всички данни на нея ще се заличат."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Форматиране"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Отстраняването на грешки през USB е свързано"</string>
@@ -960,28 +897,28 @@
     <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>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"SD картата се подготвя"</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>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Празна SD карта"</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>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"SD картата е празна или е с неподдържана файлова система."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"USB хранилището е празно или е с неподдържана файлова система."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"SD картата е празна или е с неподдържана файлова система."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"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>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"SD картата е повредена. Може да трябва да я преформатирате."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"USB хранилището е повредено. Може да трябва да го форматирате отново."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"SD картата е повредена. Може да трябва да я преформатирате."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"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>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Премахнете активирането на 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>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Премахването на 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>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Можете безопасно да премахнете 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>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"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>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"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="4168820609403385789">"Не бяха намерени съответстващи дейности"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"актуализиране на статистическите данни за използването на компонентите"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Изпращане"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Напред"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Готово"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Пред."</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Изпълнение"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Набиране"\n"с използване на <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Създаване на контакт"\n"с използване на <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Основана на предварително споделен ключ L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Основана на сертификати L2TP/IPSec VPN"</string>
     <string name="upload_file" msgid="2897957172366730416">"Избор на файл"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <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="668663626721675614">"Изберете, за да излезете от мото режима."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Има активна споделена връзка или безжична точка за достъп"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Докоснете, за да конфигурирате"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <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="2609734763845705708">"Докоснете, за да научите повече за мобилния трафик на данни"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Лимитът за мобилния трафик на данни бе надхвърлен"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Докоснете, за да научите повече за мобилния трафик на данни"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <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="INDEX">%d</xliff:g> от <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Готово"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"USB хранилището се спира..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"SD картата се спира..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"USB хранилището се изтрива..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"SD картата се изтрива..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Изтриването на USB хранилището не бе успешно."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Изтриването на 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">"SD картата се използва понастоящем от компютър."</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>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 76b2725..c31d76f 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Correu de veu"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Problema de connexió o codi MMI no vàlid."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"L\'operació està restringida a números de marcatge fixos."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"El servei s\'ha activat."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"S\'ha activat el servei per a:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"El servei s\'ha desactivat."</string>
@@ -126,7 +125,7 @@
     <string name="contentServiceSync" msgid="8353523060269335667">"Sincronització"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronització"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Massa supressions de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
-    <string name="low_memory" product="tablet" msgid="2292820184396262278">"L\'emmagatzematge de la tauleta és ple. Suprimeix fitxers per alliberar espai."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"L\'emmagatzematge de la tauleta és ple. Suprimeix uns quants fitxers per alliberar espai."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"L\'emmagatzematge del telèfon és ple. Suprimiu fitxers per alliberar espai."</string>
     <string name="me" msgid="6545696007631404292">"Mi"</string>
     <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opcions de la tauleta"</string>
@@ -139,8 +138,7 @@
     <string name="shutdown_progress" msgid="2281079257329981203">"S\'està apagant..."</string>
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"La tauleta s\'apagarà."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"El telèfon s\'apagarà."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Vols desconnectar-lo?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recents"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"No hi ha cap aplicació recent."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opcions de la tauleta"</string>
@@ -160,7 +158,7 @@
     <string name="permgrouplab_messages" msgid="7521249148445456662">"Els vostres missatges"</string>
     <string name="permgroupdesc_messages" msgid="7045736972019211994">"Llegeix i escriu SMS, correu electrònic i altres missatges."</string>
     <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"La vostra informació personal"</string>
-    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Accés directe als contactes i al calendari emmagatzemats a la tauleta."</string>
+    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Accés directe als contactes i al calendari emmagatzemat a la tauleta."</string>
     <string name="permgroupdesc_personalInfo" product="default" msgid="5488050357388806068">"Accés directe als contactes i al calendari emmagatzemats al telèfon."</string>
     <string name="permgrouplab_location" msgid="635149742436692049">"La vostra ubicació"</string>
     <string name="permgroupdesc_location" msgid="2430258821648348660">"Supervisa la ubicació física"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Eines de desenvolupament"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Funcions que només necessiten els desenvolupadors d\'aplicacions."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Emmagatzematge"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Accedeix a la targeta SD."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Accedeix a l\'emmag. USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Accedeix a la targeta SD."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"desactivar o modificar la barra d\'estat"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Permet a l\'aplicació desactivar la barra d\'estat o afegir i eliminar icones del sistema."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"barra d\'estat"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Permet que l\'aplicació sigui la barra d\'estat."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"ampliar/reduir la barra d\'estat"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Permet a l\'aplicació ampliar o reduir la barra d\'estat."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"interceptar les trucades de sortida"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"enviar missatges SMS"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Permet a l\'aplicació enviar missatges SMS. Les aplicacions malicioses poden costar-vos diners en enviar missatges sense la vostra confirmació."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"llegir SMS o MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Permet a l\'aplicació llegir missatges SMS emmagatzemats a la tauleta o a la targeta SIM. Les aplicacions malicioses podrien llegir els missatges confidencials."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Permet que una aplicació llegeixi missatges SMS emmagatzemats a la tauleta o a la targeta SIM. Les aplicacions malicioses poden llegir els teus missatges confidencials."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Permet a l\'aplicació llegir missatges SMS emmagatzemats al telèfon o a la targeta SIM. Les aplicacions malicioses podrien llegir els missatges confidencials."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"editar SMS o MMS"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Permet que l\'aplicació escrigui als missatges SMS emmagatzemats a la tauleta o a la targeta SIM. Les aplicacions malicioses podrien suprimir els missatges."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Permet que una aplicació escrigui a missatges SMS emmagatzemats a la tauleta o a la targeta SIM. Les aplicacions malicioses poden suprimir els teus missatges."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Permet a l\'aplicació escriure als missatges SMS emmagatzemats al telèfon o a la targeta SIM. Les aplicacions malicioses podrien suprimir els missatges."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"rebre WAP"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Permet a l\'aplicació rebre i processar missatges WAP. Les aplicacions malicioses poden supervisar els missatges o suprimir-los sense mostrar-vos-els."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"impedir els canvis d\'aplicació"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Impedeix que l\'usuari canviï a una altra aplicació."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"supervisar i controlar tots els inicis d\'aplicacions"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Permet que una aplicació supervisi i controli com el sistema inicia les activitats. Les aplicacions malicioses poden posar el sistema en greu perill. Aquest permís només és necessari per al desenvolupament, mai per a l\'ús normal."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Permet que una aplicació supervisi i controli com el sistema inicia activitats. Les aplicacions malicioses poden comprometre totalment el sistema. Aquest permís només és necessari per a desenvolupament, mai per a ús normal."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"enviar difusió d\'eliminació de paquet"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Permet a una aplicació difondre una notificació que indica que s\'ha eliminat un paquet d\'aplicació. Les aplicacions malicioses poden utilitzar-ho per destruir qualsevol altra aplicació que s\'executi."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"enviar difusió d\'SMS rebut"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"visualitzar finestres no autoritzades"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permet la creació de finestres que utilitzarà la interfície d\'usuari del sistema interna. No indicat per a les aplicacions normals."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"visualitzar les alertes del sistema"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Permet que una aplicació mostri les finestres d\'alerta del sistema. Les aplicacions malicioses poden agafar el control de tota la pantalla."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Permet que una aplicació mostri finestres d\'alertes del sistema. Les aplicacions malicioses poden ocupar tota la pantalla."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"modificar la velocitat d\'animacions global"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Permet a una aplicació canviar la velocitat global d\'animació (animacions més ràpides o lentes) en qualsevol moment."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"gestionar els testimonis d\'aplicació"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Permet a les aplicacions crear i gestionar els seus propis testimonis passant per alt l\'ordre Z normal. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"prémer tecles i botons de control"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Permet que una aplicació lliuri els seus propis esdeveniments d\'entrada (tecles premudes, etc.) a altres aplicacions. Les aplicacions malicioses poden utilitzar-ho per agafar el control de la tauleta."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Permet que una aplicació lliuri els seus propis esdeveniments d\'entrada (tecles premudes, etc.) a d\'altres aplicacions. Les aplicacions malicioses poden utilitzar aquesta funció per controlar la tauleta."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Permet a una aplicació lliurar els seus propis esdeveniments d\'entrada (tecles premudes, etc.) a altres aplicacions. Les aplicacions malicioses poden utilitzar-ho per agafar el control del telèfon."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"enregistrar allò que escriviu i les accions que dueu a terme"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Permet a les aplicacions fer un seguiment de les tecles que premeu, fins i tot quan s\'interactua amb una altra aplicació (com ara introduir una contrasenya). No s\'hauria de necessitar mai per a les aplicacions normals."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"instal·lar aplicacions directament"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Permet a una aplicació instal·lar paquets d\'Android nous o actualitzats. Les aplicacions malicioses poden utilitzar-ho per afegir aplicacions noves amb permisos arbitràriament potents."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"suprimir totes les dades de memòria cau d\'aplicacions"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Permet que una aplicació alliberi emmagatzematge a la tauleta suprimint fitxers del directori de la memòria cau d\'aplicacions. Normalment l\'accés es restringeix als processos del sistema."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Permet que una aplicació alliberi emmagatzematge de la tauleta suprimint fitxers al directori de la memòria cau de l\'aplicació. Habitualment, l\'accés és molt restringit a processos del sistema."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Permet a una aplicació alliberar emmagatzematge al telèfon suprimint fitxers del directori de la memòria cau d\'aplicacions. Normalment l\'accés es restringeix als processos del sistema."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Desplaça els recursos de les aplicacions"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Permet a una aplicació desplaçar els recursos d\'aplicació de suports interns a externs i viceversa."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"llegir els fitxers de registre del sistema"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Permet que una aplicació llegeixi dels fitxers de registre del sistema. Això li permet descobrir informació general sobre allò que fas amb la tauleta, i pot incloure informació personal o privada."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Permet que una aplicació llegeixi dels fitxers de registre del sistema. Això li permet descobrir informació general sobre allò que fas amb la tauleta, i pot incloure informació personal o privada."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"llegeix les dades sensibles del registre"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Permet que una aplicació llegeixi els diversos fitxers de registre del sistema. Això li permet descobrir informació general sobre què estàs fent amb la tauleta, i pot incloure informació personal o privada."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Permet que una aplicació llegeixi els diversos fitxers de registre del sistema. Això li permet descobrir informació general sobre què estàs fent amb el telèfon i, potencialment, pot incloure informació personal o privada."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"llegir/escriure recursos propietat de diag"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Permet a una aplicació llegir i escriure a qualsevol recurs propietat del grup diag; per exemple, els fitxers de /dev. Això podria afectar l\'estabilitat i la seguretat del sistema. Només l\'hauria d\'utilitzar el fabricant o l\'operador per a diagnòstics de maquinari."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"activar o desactivar els components de l\'aplicació"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permet que una aplicació canviï si un component d\'una altra aplicació està activat o no. Les aplicacions malicioses poden utilitzar-ho per desactivar funcions importants de la tauleta. Cal anar amb compte amb aquest permís, ja que pot ser que els components de l\'aplicació passin a un estat inutilitzable, incoherent o inestable."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permet que una aplicació canviï si un component d\'una altra aplicació està activat o no. Les aplicacions malicioses poden utilitzar-ho per desactivar funcions importants de la tauleta. Cal anar amb compte amb aquest permís, ja que pot ser que els components de l\'aplicació passin a un estat inutilitzable, incoherent o inestable."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permet que una aplicació canviï si un component d\'una altra aplicació està activat o no. Les aplicacions malicioses poden utilitzar aquesta funció per desactivar funcions importants de la tauleta. Cal anar amb compte amb aquest permís, ja que és possible que els components d\'una aplicació esdevinguin inutilitzables, incoherents o inestables."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permet que una aplicació canviï si un component d\'una altra aplicació està activat o no. Les aplicacions malicioses poden utilitzar aquesta funció per desactivar funcions importants del telèfon. Cal anar amb compte amb aquest permís, ja que és possible que els components d\'una aplicació esdevinguin inutilitzables, incoherents o inestables."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"definir les aplicacions preferides"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Permet a una aplicació modificar les aplicacions preferides. Això pot permetre a les aplicacions malicioses canviar silenciosament les aplicacions que s\'executen, falsejar les aplicacions existents o recollir dades privades vostres."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"modificar la configuració global del sistema"</string>
@@ -301,16 +297,16 @@
     <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Permet que una aplicació s\'iniciï tan bon punt el sistema hagi acabat d\'arrancar. Això pot fer que es trigui més en iniciar la tauleta i permetre a l\'aplicació alentir de manera generalitzada la tauleta en executar-se sempre."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Permet a una aplicació iniciar-se tan bon punt el sistema hagi acabat d\'arrancar. Això pot fer que es trigui més en iniciar el telèfon i permetre a l\'aplicació alentir de manera generalitzada el telèfon en executar-se sempre."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"enviar difusió permanent"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Permet que una aplicació enviï informacions atractives, que es conserven després de finalitzar la difusió. Les aplicacions malicioses poden alentir o desestabilitzar la tauleta en fer-li utilitzar massa memòria."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Permet que una aplicació enviï transmissions \"enganxoses\" que es queden al sistema un cop finalitzada la transmissió. Les aplicacions malicioses poden alentir la tauleta o fer-la inestable en provocar que utilitzi massa memòria."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Permet a una aplicació enviar difusions permanents, que es conserven després de finalitzar la difusió. Les aplicacions malicioses poden alentir o desestabilitzar el telèfon en fer-li utilitzar massa memòria."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"llegir les dades de contacte"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Permet que una aplicació llegeixi totes les dades de contacte (adreces) emmagatzemades a la tauleta. Les aplicacions malicioses poden utilitzar-ho per enviar les vostres dades a altres persones."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Permet que una aplicació llegeixi totes les dades dels contactes (adreces) de la tauleta. Les aplicacions malicioses poden utilitzar aquesta funció per enviar dades a altres persones."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Permet a una aplicació llegir totes les dades de contacte (adreces) emmagatzemades al telèfon. Les aplicacions malicioses poden utilitzar-ho per enviar les vostres dades a altres persones."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"escriure dades de contacte"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Permet que una aplicació modifiqui les dades de contacte (adreça) emmagatzemades a la tauleta. Les aplicacions malicioses poden utilitzar-ho per esborrar o modificar les dades de contacte."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Permet que una aplicació modifiqui les dades de contactes (adreces) emmagatzemades a la tauleta. Les aplicacions malicioses poden utilitzar aquesta funció per esborrar o per modificar les teves dades de contactes."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Permet a una aplicació modificar les dades de contacte (adreça) emmagatzemades al telèfon. Les aplicacions malicioses poden utilitzar-ho per esborrar o modificar les dades de contacte."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"llegir els esdeveniments del calendari"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Permet que una aplicació llegeixi tots els esdeveniments del calendari emmagatzemats a la tauleta. Les aplicacions malicioses poden utilitzar-ho per enviar els teus esdeveniments del calendari a altres persones."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Permet que una aplicació llegeixi tots els esdeveniments del calendari emmagatzemats a la tauleta. Les aplicacions malicioses poden utilitzar aquesta funció per enviar els teus esdeveniments del calendari a altres persones."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Permet a una aplicació llegir tots els esdeveniments del calendari emmagatzemats al telèfon. Les aplicacions malicioses poden utilitzar-ho per enviar els vostres esdeveniments del calendari a altres persones."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"afegir o modificar esdeveniments del calendari i enviar correu electrònic als convidats"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Permet a una aplicació afegir o canviar els esdeveniments del calendari, cosa que pot fer que s\'enviï correu electrònic als convidats. Les aplicacions malicioses poden utilitzar-ho per esborrar o modificar els esdeveniments del calendari o per enviar correu electrònic als convidats."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"permís per instal·lar un proveïdor d\'ubicacions"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Crea orígens d\'ubicacions ficticis per fer proves. Les aplicacions malicioses poden utilitzar-ho per substituir la ubicació i/o l\'estat retornats per orígens d\'ubicacions reals, com ara els proveïdors de xarxa o GPS o per supervisar i informar de la vostra ubicació a un origen extern."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"ubicació exacta (GPS)"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Accedeix a orígens d\'ubicacions exactes, com ara el Sistema de posicionament global (GPS) a la tauleta, si estan disponibles. Les aplicacions malicioses poden utilitzar-ho per determinar on sou i poden consumir energia addicional de la bateria."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Accedeix a fonts d\'ubicació precises, com ara el Sistema de Posicionament Global (GPS) a la tauleta, si estan disponibles. Les aplicacions malicioses poden utilitzar aquesta funció per determinar on ets, i és possible que es consumeixi potència addicional."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Accedeix a orígens d\'ubicacions exactes, com ara el Servei de posicionament global (GPS) al telèfon, si estan disponibles. Les aplicacions malicioses poden utilitzar-ho per determinar on sou i poden consumir energia addicional de la bateria."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"ubicació aproximada (basada en xarxa)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Accedeix a orígens d\'ubicacions aproximades, com ara la base de dades de la xarxa de telefonia mòbil, per determinar la ubicació aproximada de la tauleta, si aquesta funció està disponible. Les aplicacions malicioses poden utilitzar-ho per determinar on ets aproximadament."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Accedeix a completes fonts d\'ubicació, com ara la base de dades de la xarxa mòbil, per determinar una ubicació aproximada de la tauleta, si està disponible. Les aplicacions malicioses poden utilitzar aquesta funció per determinar la teva ubicació aproximada."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Accedeix a orígens d\'ubicacions aproximades, com ara la base de dades de la xarxa de telefonia mòbil, per determinar la ubicació aproximada del telèfon, si aquesta funció està disponible. Les aplicacions malicioses poden utilitzar-ho per determinar on sou aproximadament."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"accedir a SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Permet a l\'aplicació utilitzar les funcions de baix nivell de SurfaceFlinger."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Permet a l\'aplicació modificar la configuració global de l\'àudio, com ara el volum i l\'encaminament."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"enregistrar àudio"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Permet a l\'aplicació accedir al camí d\'enregistrament d\'àudio."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"fer fotos"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Permet a l\'aplicació fer fotos amb la càmera. Això li permet recollir les imatges que veu la càmera en qualsevol moment."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desactivar la tauleta de manera permanent"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"fes fotos i vídeos"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Permet que l\'aplicació faci fotos i vídeos amb la càmera. Això permet que l\'aplicació pugui recopilar les imatges que està veient la càmera en qualsevol moment."</string>
+    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desactiva la tauleta de manera permanent"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"desactivar definitivament el telèfon"</string>
-    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Permet a l\'aplicació desactivar tota la tauleta definitivament. Això és molt perillós."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Permet que l\'aplicació desactivi tota la tauleta de manera permanent. Aquesta acció és molt perillosa."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Permet a l\'aplicació desactivar tot el telèfon definitivament. Això és molt perillós."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"forçar l\'arrencada de la tauleta"</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"fes que la tauleta es reiniciï"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"forçar el reinici del telèfon"</string>
-    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Permet que l\'aplicació forci l\'arrencada de la tauleta."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Permet que l\'aplicació faci que es reiniciï la tauleta."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Permet a l\'aplicació forçar el reinici del telèfon."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"muntar i desmuntar sistemes de fitxers"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Permet a l\'aplicació muntar i desmuntar sistemes de fitxers per a l\'emmagatzematge extraïble."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatar l\'emmagatzematge extern"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Permet a l\'aplicació formatar l\'emmagatzematge extraïble."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"obtenir informació sobre l\'emmagatzematge segur"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Permet a l\'aplicació obtenir informació sobre l\'emmagatzematge segur."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"crear emmagatzematge segur"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Permet a l\'aplicació crear emmagatzematge segur."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"destruir l\'emmagatzematge segur"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Permet a l\'aplicació destruir l\'emmagatzematge segur."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"muntar i desmuntar l\'emmagatzematge segur"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Permet a l\'aplicació muntar o desmuntar l\'emmagatzematge segur."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"canviar el nom de l\'emmagatzematge segur"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Permet a l\'aplicació canviar el nom de l\'emmagatzematge segur."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"obtén informació sobre l\'emmagatzematge intern"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Permet que l\'aplicació obtingui informació de l\'emmagatzematge intern."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"crea emmagatzematge intern"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Permet que l\'aplicació creï emmagatzematge intern."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"destrueix l\'emmagatzematge intern"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Permet que l\'aplicació destrueixi l\'emmagatzematge intern."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"instal·la / desinstal·la l\'emmagatzematge intern"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Permet que l\'aplicació instal·li / desinstal·li l\'emmagatzematge intern."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"canvia el nom de l\'emmagatzematge intern"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Permet que l\'aplicació canviï el nom de l\'emmagatzematge intern."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"controlar el vibrador"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Permet a l\'aplicació controlar el vibrador."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"controlar el flaix"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Permet a l\'aplicació controlar el flaix."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"accedeix a dispositius USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Permet que l\'aplicació accedeixi als dispositius USB."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"provar el maquinari"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Permet a l\'aplicació controlar diversos perifèrics per fer proves de maquinari."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"trucar directament a números de telèfon"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Permet a l\'aplicació trucar a números de telèfon sense la vostra intervenció. Les aplicacions malicioses poden fer que apareguin trucades inesperades a la factura del telèfon. Tingueu en compte que això no permet a l\'aplicació trucar a números d\'emergència."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"trucar directament a qualsevol número de telèfon"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Permet a l\'aplicació trucar a qualsevol número de telèfon, inclosos els números d\'emergència, sense la vostra intervenció. Les aplicacions malicioses poden fer trucades innecessàries i il·legals a serveis d\'emergència."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"iniciar directament la configuració de la tauleta CDMA"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"inicia directament la configuració de la tauleta CDMA"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"iniciar directament la configuració del telèfon CDMA"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Permet a l\'aplicació iniciar l\'aprovisionament CDMA. Les aplicacions malicioses podrien iniciar l\'aprovisionament CDMA innecessàriament."</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"controlar les notificacions d\'actualització de la ubicació"</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Permet a l\'aplicació controlar les funcions de telèfon del dispositiu. Una aplicació amb aquest permís pot canviar de xarxa, activar i desactivar la ràdio del telèfon i dur a terme accions semblants sense notificar-vos-ho."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"llegir l\'estat i la identitat del telèfon"</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Permet a l\'aplicació accedir a les funcions de telèfon del dispositiu. Una aplicació amb aquest permís pot determinar el número de telèfon i el número de sèrie del telèfon, si una trucada està activa, el número al qual s\'ha connectat la trucada i elements semblants."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"impedir que la tauleta se suspengui"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"evita que la tauleta entri en mode d\'inactivitat"</string>
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"impedir que el telèfon se suspengui"</string>
-    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Permet que una aplicació impedeixi que la tauleta se suspengui."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Permet que una aplicació impedeixi que la tauleta entri en mode d\'inactivitat."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Permet a una aplicació impedir que el telèfon se suspengui."</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"engegar o apagar la tauleta"</string>
+    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"activa o desactiva la tauleta"</string>
     <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"engegar o apagar el telèfon"</string>
-    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Permet que l\'aplicació engegui o apagui la tauleta."</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Permet que l\'aplicació encengui i apagui la tauleta."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Permet a l\'aplicació engegar o apagar el telèfon."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"executar en mode de proves de fàbrica"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"S\'executa com a prova del fabricant de baix nivell, cosa que permet l\'accés total al maquinari de la tauleta. Només està disponible quan una tauleta s\'executa en mode de proves del fabricant."</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Executa com a prova de perfil baix del fabricant que permet accés complet al maquinari de la tauleta. Només està disponible quan la tauleta s\'executa en mode de prova del fabricant."</string>
     <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"S\'executa com a prova del fabricant de baix nivell, cosa que permet l\'accés total al maquinari del telèfon. Només està disponible quan un telèfon s\'executa en mode de proves del fabricant."</string>
     <string name="permlab_setWallpaper" msgid="6627192333373465143">"definir l\'empaperat"</string>
     <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Permet l\'aplicació definir l\'empaperat del sistema."</string>
@@ -406,12 +400,12 @@
     <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Permet que una aplicació canviï l\'hora del rellotge de la tauleta."</string>
     <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Permet a una aplicació canviar l\'hora del rellotge del telèfon."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"definir el fus horari"</string>
-    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Permet que una aplicació canviï el fus horari de la tauleta."</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Permet que una aplicació canviï la zona horària de la tauleta."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Permet a una aplicació canviar el fus horari del telèfon."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"actuar com a AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Permet a una aplicació fer trucades a autenticadors de comptes"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"descobrir comptes coneguts"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Permet que una aplicació obtingui la llista de comptes que coneix la tauleta."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Permet que una aplicació obtingui la llista de comptes coneguts per la tauleta."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Permet a una aplicació obtenir la llista de comptes que coneix el telèfon."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"fer d\'autenticador de comptes"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Permet a una aplicació utilitzar les funcions d\'autenticador de comptes d\'AccountManager, incloses la creació de comptes i l\'obtenció i la definició de les seves contrasenyes."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"permetre la recepció de multidifusió Wi-fi"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Permet a una aplicació rebre paquets no adreçats directament al vostre dispositiu. Això pot ser útil en detectar serveis oferts a prop. Utilitza més energia que el mode que no utilitza la multidifusió."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"administració de Bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Permet que una aplicació configuri la tauleta Bluetooth local i que detecti dispositius remots i s\'hi emparelli."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Permet que una aplicació configuri la tauleta Bluetooth local i que cerqui i emparelli dispositius remots."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Permet a una aplicació configurar el telèfon Bluetooth local i detectar dispositius remots i emparellar-se amb ells."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"crear connexions Bluetooth"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Permet que una aplicació visualitzi la configuració de la tauleta Bluetooth local i que estableixi i accepti connexions amb els dispositius emparellats."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Permet que una aplicació mostri la configuració de la tauleta Bluetooth local i que estableixi i accepti connexions amb dispositius emparellats."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Permet a una aplicació visualitzar la configuració del telèfon Bluetooth local i establir i acceptar connexions amb els dispositius emparellats."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"controla Near Field Communication (NFC)"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Permet que una aplicació es comuniqui amb les etiquetes, les targetes i els lectors de Near Field Communication (NFC)"</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"desactivar el bloqueig del teclat"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Permet a una aplicació desactivar el bloqueig del teclat i qualsevol element de seguretat de contrasenyes associat. Un exemple d\'això és la desactivació per part del telèfon del bloqueig del teclat en rebre una trucada telefònica entrant i després la reactivació del bloqueig del teclat quan finalitza la trucada."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"llegir la configuració de sincronització"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Permet a una aplicació llegir les paraules, els noms i les frases privats que l\'usuari pot haver emmagatzemat al diccionari de l\'usuari."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"escriure al diccionari definit per l\'usuari"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permet a una aplicació escriure paraules noves al diccionari de l\'usuari."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"modificar/suprimir el contingut de les targetes SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"modifica/suprimeix el contingut de l\'emmagatzematge USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificar/suprimir el contingut de les targetes SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Permet a una aplicació escriure a la targeta SD."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Permet que una aplicació gravii a l\'emmagatzematge USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Permet a una aplicació escriure a la targeta SD."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modifica/suprimeix el contingut d\'emmagatzematge de mitjans interns"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permet que una aplicació modifiqui el contingut de l\'emmagatzematge de mitjans interns."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"accedir al sistema de fitxers de la memòria cau"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permet a una aplicació llegir el sistema de fitxers de la memòria cau i escriure-hi."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Limita la contrasenya"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Restringeix els tipus de contrasenyes que podeu utilitzar."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Vigila els intents d\'inici de sessió"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Controla el nombre de contrasenyes incorrectes que s\'han introduït quan es desbloqueja la pantalla, i bloqueja la tauleta o esborra\'n totes les dades si s\'introdueixen massa contrasenyes incorrectes"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Controla el nombre de contrasenyes incorrectes que s\'han introduït quan es desbloqueja la pantalla, i bloqueja la tauleta o esborra\'n totes les dades si s\'introdueixen massa contrasenyes incorrectes"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Restableix la contrasenya"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Força un valor nou per a la contrasenya, amb la qual cosa l\'administrador us l\'ha de donar perquè pugueu iniciar la sessió."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Força el bloqueig"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Controla quan es bloqueja el dispositiu i requereix que en torneu a introduir la contrasenya."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"fes/rep trucades per Internet"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Permet que una aplicació utilitzi el servei SIP per fer i rebre trucades per Internet."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Defineix les normes de contrasenya"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Controla la longitud i els caràcters permesos a les contrasenyes de desbloqueig de pantalla"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Supervisa els intents de desbloqueig de la pantalla"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Supervisa el nombre de contrasenyes incorrectes introduïdes en desbloquejar la pantalla, i bloqueja la tauleta o n\'esborra totes les dades si s\'introdueixen massa contrasenyes incorrectes"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Supervisa el nombre de contrasenyes incorrectes introduïdes en desbloquejar la pantalla, i bloqueja el telèfon o esborra totes les dades del telèfon si s\'introdueixen massa contrasenyes incorrectes"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Canvia la contrasenya de desbloqueig de pantalla"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Canvia la contrasenya de desbloqueig de pantalla"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Bloqueja la pantalla"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Controla com i quan es bloqueja la pantalla"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Esborra totes les dades"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Esborra les dades de la tauleta sense cap advertiment i restableix les dades de fàbrica"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Esborra les dades de la tauleta sense cap advertiment i restableix les dades de fàbrica"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Esborra les dades de la tauleta sense advertiment mitjançant un restabliment de les dades de fàbrica"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Esborra les dades del telèfon sense advertiment mitjançant un restabliment de les dades de fàbrica"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Defineix el servidor intermediari global del dispositiu"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Defineix el servidor intermediari global del dispositiu que cal utilitzar mentre la política estigui activada. Només el primer administrador del dispositiu pot definir el servidor intermediari global efectiu."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Defineix la caducitat de la contrasenya"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Controla quant de temps abans de la pantalla de bloqueig cal canviar la contrasenya"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Casa"</item>
     <item msgid="869923650527136615">"Mòbil"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Cercapersones de la feina"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Auxiliar"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Personalitzats"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Aniversari"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Aniversari"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Esdeveniment"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Altres"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Personalitzada"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Casa"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Feina"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Feina"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Altres"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Personalitzat"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Personalitzada"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Germà"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Fill"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Parella de fet"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Pare"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Amic"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Gerent"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Mare"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Pare/mare"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Company"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Recomanat per"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Familiar"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Germana"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Cònjuge"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalitzada"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Particular"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Feina"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Altres"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Introduïu el codi PIN"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Introduïu la contrasenya per desbloquejar-lo"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Introdueix el PIN per desbloquejar"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Codi PIN incorrecte."</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Per desbloquejar-lo, premeu Menú i després 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número d\'emergència"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Torna a la trucada"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcte!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Torneu-ho a provar"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Torna-ho a provar"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"S\'està carregant (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Carregada."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"La targeta SIM està bloquejada."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"S\'està desbloquejant la targeta SIM..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Heu dibuixat el patró de desbloqueig de manera incorrecta <xliff:g id="NUMBER_0">%d</xliff:g> vegades. "\n\n"Torneu-ho a provar d\'aquí a <xliff:g id="NUMBER_1">%d</xliff:g> segons."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Has dibuixat malament el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se\'t demanarà que desbloquegis la tauleta amb l\'inici de sessió de Google."\n\n" Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Has introduït una contrasenya incorrecta <xliff:g id="NUMBER_0">%d</xliff:g> vegades. "\n\n"Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_1">%d</xliff:g> segons."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Has introduït un PIN incorrecte <xliff:g id="NUMBER_0">%d</xliff:g> vegades. "\n\n"Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_1">%d</xliff:g> segons."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Has dibuixat incorrectament el teu patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, el sistema et demanarà que desbloquegis la tauleta utilitzant l\'inici de sessió de Google."\n\n" Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Heu dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades de manera incorrecta. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se us demanarà que desbloquegeu el telèfon amb l\'inici de sessió de Google."\n\n" Torneu-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Torneu-ho a provar d\'aquí a <xliff:g id="NUMBER">%d</xliff:g> segons."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Heu oblidat el patró?"</string>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Voleu sortir d\'aquesta pàgina?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Seleccioneu D\'acord per continuar o Cancel·la per quedar-vos a la pàgina actual."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Confirma"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Consell: Piqueu dos cops per ampliar i reduir."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Emp. aut"</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Emplenament automàtic"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Conf. Empl. aut."</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"llegir l\'historial i les adreces d\'interès del navegador"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permet a l\'aplicació llegir tots els URL que ha visitat el navegador i totes les adreces d\'interès del navegador."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"escriure l\'historial i les adreces d\'interès del navegador"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Permet que una aplicació modifiqui l\'historial o els marcadors del navegador emmagatzemats a la tauleta. Les aplicacions malicioses poden utilitzar-ho per esborrar o per modificar les dades del navegador."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Permet que una aplicació modifiqui l\'historial del navegador o els marcadors emmagatzemats a la tauleta. Les aplicacions malicioses poden utilitzar aquesta funció per esborrar o per modificar les dades del navegador."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Permet a una aplicació modificar l\'historial o les adreces d\'interès del navegador emmagatzemats al telèfon. Les aplicacions malicioses poden utilitzar-ho per esborrar o modificar les dades del navegador."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"defineix l\'alarma com a despertador"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Permet que l\'aplicació defineixi una alarma en una aplicació de despertador instal·lada. És possible que algunes aplicacions de despertador no incorporin aquesta funció."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modifica els permisos d\'ubicació geogràfica del navegador"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Permet a una aplicació modificar els permisos d\'ubicació geogràfica del navegador. Les aplicacions malicioses poden utilitzar-ho per permetre l\'enviament d\'informació d\'ubicació a llocs web arbitraris."</string>
     <string name="save_password_message" msgid="767344687139195790">"Voleu que el navegador recordi aquesta contrasenya?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"Retalla"</string>
     <string name="copy" msgid="2681946229533511987">"Copia"</string>
     <string name="paste" msgid="5629880836805036433">"Enganxa"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Cap elem. per engan."</string>
     <string name="copyUrl" msgid="2538211579596067402">"Copia l\'URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Selecciona el text..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selecció de text"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Mètode d\'entrada"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Edita el text"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Accions de text"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Queda poc espai"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Comença a quedar poc espai d\'emmagatzematge a la tauleta."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"L\'espai d\'emmagatzematge de la tauleta comença a ser escàs."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Comença a quedar poc espai d\'emmagatzematge al telèfon."</string>
     <string name="ok" msgid="5970060430562524910">"D\'acord"</string>
     <string name="cancel" msgid="6442560571259935130">"Cancel·la"</string>
     <string name="yes" msgid="5362982303337969312">"D\'acord"</string>
     <string name="no" msgid="5141531044935541497">"Cancel·la"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Atenció"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"S\'està carregant..."</string>
     <string name="capital_on" msgid="1544682755514494298">"ACTIVAT"</string>
     <string name="capital_off" msgid="6815870386972805832">"DESACTIVAT"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Completa l\'acció mitjançant"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Força el tancament"</string>
     <string name="report" msgid="4060218260984795706">"Informe"</string>
     <string name="wait" msgid="7147118217226317732">"Espera"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Aplicació redirigida"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> s\'està executant."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> es va iniciar originalment."</string>
+    <string name="smv_application" msgid="295583804361236288">"L\'aplicació <xliff:g id="APPLICATION">%1$s</xliff:g> (procés <xliff:g id="PROCESS">%2$s</xliff:g>) ha incomplert la seva política autoimposada de mode estricte."</string>
+    <string name="smv_process" msgid="5120397012047462446">"El procés <xliff:g id="PROCESS">%1$s</xliff:g> ha incomplert la seva política de mode estricte."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> s\'està executant"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Selecciona per canviar a l\'aplicació"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Canvi d\'aplicacions?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Ja està funcionant una altra aplicació que s\'ha d\'aturar abans de poder iniciar-ne una de nova."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Torna a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"No iniciïs la nova aplicació."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Inicia <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Atura l\'aplicació antiga sense desar."</string>
     <string name="sendText" msgid="5132506121645618310">"Seleccioneu una acció per al text"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Volum del timbre"</string>
     <string name="volume_music" msgid="5421651157138628171">"Volum de multimèdia"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Mostra\'ls tots"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"Emmagatzematge massiu USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB connectat"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Heu connectat el telèfon a l\'equip per USB. Seleccioneu el botó de més avall si voleu copiar fitxers entre l\'equip i la targeta SD d\'Android."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Heu connectat el telèfon a l\'equip per USB. Seleccioneu el botó de més avall si voleu copiar fitxers entre l\'equip i la targeta SD d\'Android."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"T\'has connectat a l\'equip per USB. Toca el botó següent si vols copiar els fitxers entre l\'equip i l\'emmagatzematge USB d\'Android."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"T\'has connectat a l\'equip per USB. Toca el botó següent si vols copiar els fitxers entre l\'equip i la targeta SD d\'Android."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Activa l\'emmagatzematge USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Hi ha un problema per utilitzar la targeta SD per a l\'emmagatzematge USB."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Hi ha un problema per utilitzar la targeta SD per a l\'emmagatzematge USB."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Hi ha un problema en l\'ús del teu emmagatzematge USB per a emmagatzematge massiu USB."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Hi ha un problema en l\'ús de la teva targeta SD per a l\'emmagatzematge massiu USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB connectat"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Seleccioneu-ho per copiar fitxers a/de l\'equip."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Desactiva l\'emmagatzematge USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Seleccioneu-ho per desactivar l\'emmagatzematge USB."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"S\'està utilitzant l\'emmagatzematge USB"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Abans de desactivar l\'emmagatzematge USB, assegureu-vos d\'haver desmuntat (\"expulsat\") la targeta SD d\'Android de l\'equip."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Abans de desactivar l\'emmagatzematge USB, assegura\'t d\'haver desinstal·lat (\"expulsat\") l\'emmagatzematge USB de l\'Android del teu equip."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Abans de desactivar l\'emmagatzematge USB, assegureu-vos d\'haver desmuntat (\"expulsat\") la targeta SD d\'Android de l\'equip."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Desactiva l\'emmagatzematge USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"S\'ha produït un problema en desactivar l\'emmagatzematge USB. Comproveu que heu desmuntat l\'amfitrió d\'USB i torneu-ho a provar."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Si activeu l\'emmagatzematge USB, algunes de les aplicacions que utilitzeu s\'aturaran i pot ser que no estiguin disponibles fins que desactiveu l\'emmagatzematge USB."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Error de l\'operació d\'USB"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"D\'acord"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formata la targeta SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formata l\'emmag. USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Formata la targeta SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Esteu segur que voleu formatar la targeta SD? Es perdran totes les dades de la targeta."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Vols formatar l\'emmagatzematge USB i esborrar tots els fitxers que hi ha emmagatzemats? L\'acció no es podrà desfer."</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Esteu segur que voleu formatar la targeta SD? Es perdran totes les dades de la targeta."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formata"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuració d\'USB connectada"</string>
@@ -960,28 +897,28 @@
     <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>"candidats"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"S\'està preparant la targeta SD"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"S\'està preparant l\'emmagatzematge USB"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"S\'està preparant la targeta SD"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"S\'està comprovant si hi ha errors."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Targeta SD en blanc"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Emmagatzematge USB buit"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Targeta SD en blanc"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"La targeta SD és buida o té un sistema de fitxers incompatible."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Emmagatzematge USB buit o sistema de fitxers no admès."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"La targeta SD és buida o té un sistema de fitxers incompatible."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Targeta SD malmesa"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Emmagatzematge USB danyat"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Targeta SD malmesa"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Targeta SD malmesa. Pot ser que l\'hàgiu de tornar a formatar."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Emmagatzematge USB danyat. És possible que l\'hagis de tornar a formatar."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Targeta SD malmesa. Pot ser que l\'hàgiu de tornar a formatar."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Targeta SD extreta inesperadament"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Emmag. USB retirat inesperadament"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"Targeta SD extreta inesperadament"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Expulseu la targeta SD abans d\'extreure-la per evitar la pèrdua de dades."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Desinstal·la l\'emmagatzematge USB abans de retirar-la per evitar pèrdues de dades."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Expulseu la targeta SD abans d\'extreure-la per evitar la pèrdua de dades."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"La targeta SD es pot extreure"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"És segur retirar l\'emmagatzematge USB"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"La targeta SD es pot extreure"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Podeu extreure la targeta SD sense problemes."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Pots retirar l\'emmagatzematge USB de forma segura."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Podeu extreure la targeta SD sense problemes."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Targeta SD extreta"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Emmagatzematge USB retirat"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Targeta SD extreta"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"S\'ha extret la targeta SD. Inseriu-ne una."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Emmagatzematge USB retirat. Insereix el mitjà nou."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"S\'ha extret la targeta SD. Inseriu-ne una."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"No s\'ha trobat cap activitat coincident"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"actualitzar les estadístiques d\'ús de components"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Envia"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Següent"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Fet"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Anterior"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Executa"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Marca el número"\n"mitjançant <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Crea un contacte"\n"mitjançant <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"VPN L2TP/IPSec basada en clau compartida prèviament"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"VPN L2TP/IPSec basada en certificats"</string>
     <string name="upload_file" msgid="2897957172366730416">"Trieu un fitxer"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"No s\'ha escollit cap fitxer"</string>
     <string name="reset" msgid="2448168080964209908">"Reinicia"</string>
     <string name="submit" msgid="1602335572089911941">"Envia"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mode de cotxe activat"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Seleccioneu-ho per sortir del mode de cotxe."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Ancoratge a la xarxa o punt de connexió actiu"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Toqueu per configurar"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Enrere"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Següent"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Omet"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Ús de dades mòbils alt"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Toqueu-ho per obtenir més informació sobre l\'ús de dades als mòbils"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"S\'ha superat el límit de dades mòbils"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Toqueu-ho per obtenir més informació sobre l\'ús de dades als mòbils"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Cap coincidència"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Troba-ho a la pàgina"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 coincidència"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Fet"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"S\'està desinstal·lant l\'emmagatzematge USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"S\'està desinstal·lant la targeta SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"S\'està esborrant l\'emmagatzematge USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"S\'està esborrant la targeta SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"S\'ha produït un error en esborrar l\'emmagatzematge USB."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"S\'ha produït un error en esborrar la targeta SD."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"La targeta SD s\'ha retirat abans de desinstal·lar-la."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Actualment s\'està comprovant l\'emmagatzematge USB."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"S\'està comprovant la targeta SD."</string>
+    <string name="media_removed" msgid="7001526905057952097">"S\'ha retirat la targeta SD."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Actualment, un equip està utilitzant l\'emmagatzematge USB."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Actualment, un equip està utilitzant la targeta SD."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Mitjà extern en un estat desconegut."</string>
+    <string name="share" msgid="1778686618230011964">"Comparteix"</string>
+    <string name="find" msgid="4808270900322985960">"Cerca"</string>
+    <string name="websearch" msgid="4337157977400211589">"Cerca al web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 50cd0c3..ba9ef89 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Neznámý stav externího média."</string>
     <string name="share" msgid="1778686618230011964">"Sdílet"</string>
     <string name="find" msgid="4808270900322985960">"Najít"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Vyhledat na webu"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 6c46995..7bd864b 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Eksternt medie i ukendt tilstand."</string>
     <string name="share" msgid="1778686618230011964">"Del"</string>
     <string name="find" msgid="4808270900322985960">"Find"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Websøgning"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 8e23d5b..cee3504 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -541,7 +541,7 @@
     <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
     <string name="phoneTypeMain" msgid="6766137010628326916">"Hauptnummer"</string>
     <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Weitere Faxnummer"</string>
-    <string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string>
+    <string name="phoneTypeRadio" msgid="4093738079908667513">"Funktelefon"</string>
     <string name="phoneTypeTelex" msgid="3367879952476250512">"Telex"</string>
     <string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY/TDD"</string>
     <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Handy (geschäftl.)"</string>
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Unbekannter Status des externen Speichermediums"</string>
     <string name="share" msgid="1778686618230011964">"Freigeben"</string>
     <string name="find" msgid="4808270900322985960">"Suchen"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Websuche"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 5dd1372..8e22d70 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Το εξωτερικό μέσο είναι σε άγνωστη κατάσταση."</string>
     <string name="share" msgid="1778686618230011964">"Κοινή χρ."</string>
     <string name="find" msgid="4808270900322985960">"Εύρεση"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Αναζήτηση ιστού"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index f1d19b8..1302cf3 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -138,8 +138,7 @@
     <string name="shutdown_progress" msgid="2281079257329981203">"Shutting down…"</string>
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Your tablet will shut down."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Your phone will shut down."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Would you like to shut down?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"No recent applications."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet options"</string>
@@ -176,7 +175,7 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Development tools"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Features only needed for application developers."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Storage"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Access the SD card."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Access the USB storage."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Access the SD card."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Allows application to disable the status bar or add and remove system icons."</string>
@@ -241,7 +240,7 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"display unauthorised windows"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Allows the creation of windows that are intended to be used by the internal system user interface. Not for use by normal applications."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"display system-level alerts"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Allows an application to show system-alert windows. Malicious applications can take over the entire screen."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Allows an application to show system alert windows. Malicious applications can take over the entire screen."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"modify global animation speed"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Allows an application to change the global animation speed (faster or slower animations) at any time."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"manage application tokens"</string>
@@ -274,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"directly install applications"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Allows an application to install new or updated Android packages. Malicious applications can use this to add new applications with arbitrarily powerful permissions."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"delete all application cache data"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Allows an application to free tablet storage by deleting files in application cache directory. Access is very restricted, usually to system processes."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Allows an application to free tablet storage by deleting files in application cache directory. Access is very restricted, usually to system process."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Allows an application to free phone storage by deleting files in application cache directory. Access is usually very restricted to system process."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Move application resources"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Allows an application to move application resources from internal to external media and vice versa."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"read system log files"</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"read sensitive log data"</string>
     <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Allows an application to read from the system\'s various log files. This allows it to discover general information about what you are doing with the tablet, potentially including personal or private information."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Allows an application to read from the system\'s various log files. This allows it to discover general information about what you are doing with the tablet, potentially including personal or private information."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Allows an application to read from the system\'s various log files. This allows it to discover general information about what you are doing with the phone, potentially including personal or private information."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"read/write to resources owned by diag"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Allows an application to read and write to any resource owned by the diag group; for example, files in /dev. This could potentially affect system stability and security. This should ONLY be used for hardware-specific diagnostics by the manufacturer or operator."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"enable or disable application components"</string>
     <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Allows an application to change whether a component of another application is enabled or not. Malicious applications can use this to disable important tablet capabilities. Care must be used with this permission, as it is possible to get application components into an unusable, inconsistent or unstable state."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Allows an application to change whether a component of another application is enabled or not. Malicious applications can use this to disable important tablet capabilities. Care must be used with this permission, as it is possible to get application components into an unusable, inconsistent or unstable state."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Allows an application to change whether a component of another application is enabled or not. Malicious applications can use this to disable important phone capabilities. Care must be used with this permission, as it is possible to get application components into an unusable, inconsistent or unstable state."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"set preferred applications"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Allows an application to modify your preferred applications. This can allow malicious applications to silently change the applications that are run, spoofing your existing applications to collect private data from you."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"modify global system settings"</string>
@@ -318,7 +317,7 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"permission to install a location provider"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Create mock location sources for testing. Malicious applications can use this to override the location and/or status returned by real-location sources such as GPS or Network providers, or monitor and report your location to an external source."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"fine (GPS) location"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Access fine location sources, such as the Global Positioning System on the tablet, where available. Malicious applications can use this to determine where you are. This may consume additional battery power."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Access fine location sources such as the Global Positioning System on the tablet, where available. Malicious applications can use this to determine where you are and may consume additional battery power."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Access fine location sources, such as the Global Positioning System on the phone, where available. Malicious applications can use this to determine where you are and may consume additional battery power."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"coarse (network-based) location"</string>
     <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Access coarse location sources, such as the mobile network database, to determine an approximate tablet location, where available. Malicious applications can use this to determine approximately where you are."</string>
@@ -345,16 +344,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Allows the application to mount and unmount file systems for removable storage."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"format external storage"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Allows the application to format removable storage."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"get information on secure storage"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Allows the application to get information on secure storage."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"create secure storage"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Allows the application to create secure storage."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"destroy secure storage"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Allows the application to destroy secure storage."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"mount/unmount secure storage"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Allows the application to mount/unmount secure storage."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"rename secure storage"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Allows the application to rename secure storage."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"get information on internal storage"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Allows the application to get information on internal storage."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"create internal storage"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Allows the application to create internal storage."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"destroy internal storage"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Allows the application to destroy internal storage."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"mount/unmount internal storage"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Allows the application to mount/unmount internal storage."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"rename internal storage"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Allows the application to rename internal storage."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"control vibrator"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Allows the application to control the vibrator."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"control flashlight"</string>
@@ -384,7 +383,7 @@
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"prevent phone from sleeping"</string>
     <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Allows an application to prevent the tablet from going to sleep."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Allows an application to prevent the phone from going to sleep."</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"Turn tablet on or off"</string>
+    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"turn tablet on or off"</string>
     <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"turn phone on or off"</string>
     <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Allows the application to turn the tablet on or off."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Allows the application to turn the phone on or off."</string>
@@ -438,10 +437,8 @@
     <string name="permlab_bluetooth" msgid="8361038707857018732">"create Bluetooth connections"</string>
     <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Allows an application to view configuration of the local Bluetooth tablet and to make and accept connections with paired devices."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Allows an application to view configuration of the local Bluetooth phone and to make and accept connections with paired devices."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"control Near-Field Communication"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Allows an application to communicate with Near-Field Communication (NFC) tags, cards and readers."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"disable key lock"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Allows an application to disable the key lock and any associated password security. A legitimate example of this is the phone disabling the key lock when receiving an incoming phone call, then re-enabling the key lock when the call is finished."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string>
@@ -458,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Allows an application to read any private words, names and phrases that the user may have stored in the user dictionary."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"write to user-defined dictionary"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Allows an application to write new words into the user dictionary."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"modify/delete SD card contents"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"modify/delete USB storage contents"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modify/delete SD card contents"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Allows an application to write to the SD card."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Allows an application to write to the USB storage."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Allows an application to write to the SD card."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modify/delete internal media storage contents"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Allows an application to modify the contents of the internal media storage."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"access the cache file system"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Allows an application to read and write the cache file system."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Limit password"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Restrict the types of passwords that you are allowed to use."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Watch login attempts"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Monitor the number of incorrect passwords entered when unlocking the screen and lock the tablet or erase all the tablet\'s data if too many incorrect passwords are entered."</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Monitor the number of incorrect passwords entered when unlocking the screen and lock the tablet or erase all the tablet\'s data if too many incorrect passwords are entered."</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Reset Password"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Force your password to a new value, requiring the administrator to give it to you before you can log in."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Force lock"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Control when device locks, requiring you to re-enter its password."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"make/receive Internet calls"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Allows an application to use the SIP service to make/receive Internet calls."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Set password rules"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Control the length and the characters allowed in screen-unlock passwords"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Monitor screen-unlock attempts"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Monitor the number of incorrect passwords entered when unlocking the screen and lock the tablet or erase all the tablet\'s data if too many incorrect passwords are entered"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Monitor the number of incorrect passwords entered when unlocking the screen and lock the phone or erase all the phone\'s data if too many incorrect passwords are entered"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Change the screen-unlock password"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Change the screen-unlock password"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Lock the screen"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Control how and when the screen locks"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Erase all data"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Erase the tablet\'s data without warning by performing a factory data reset"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Erase the tablet\'s data without warning by performing a factory data reset"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Erase the phone\'s data without warning by performing a factory data reset"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Set the device global proxy"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Set the device\'s global proxy to be used while policy is enabled. Only the first device admin sets the effective global proxy."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Set password expiry"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Control how long before lock-screen password needs to be changed"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Home"</item>
     <item msgid="869923650527136615">"Mobile"</item>
@@ -556,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Work Pager"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistant"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Customised"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Birthday"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Anniversary"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Event"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Other"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Custom"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Home"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Work"</string>
@@ -587,44 +575,25 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Work"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Other"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Custom"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Customised"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistant"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Brother"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Child"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Domestic Partner"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Father"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Friend"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Manager"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Mother"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Parent"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Referred by"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Relative"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Sister"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Spouse"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Customised"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Home"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Work"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Other"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Enter PIN code"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Enter password to unlock"</string>
     <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Enter PIN to unlock"</string>
@@ -689,23 +658,17 @@
     <string name="double_tap_toast" msgid="1068216937244567247">"Tip: double-tap to zoom in and out."</string>
     <string name="autofill_this_form" msgid="1272247532604569872">"Auto-Fill"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Set up Auto-Fill"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"read Browser\'s history and bookmarks"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Allows the application to read all the URLs that the browser has visited and all of the browser\'s bookmarks."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"write Browser\'s history and bookmarks"</string>
     <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Allows an application to modify the Browser\'s history or bookmarks stored on your tablet. Malicious applications can use this to erase or modify your Browser\'s data."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Allows an application to modify the browser\'s history or bookmarks stored on your phone. Malicious applications can use this to erase or modify your browser\'s data."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"set alarm in alarm clock"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Allows the application to set an alarm in an installed alarm clock application. Some alarm clock applications may not implement this feature."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modify Browser geo-location permissions"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Allows an application to modify the browser\'s geo-location permissions. Malicious applications can use this to allow the sending of location information to arbitrary websites."</string>
     <string name="save_password_message" msgid="767344687139195790">"Do you want the browser to remember this password?"</string>
@@ -821,15 +784,12 @@
     <string name="cut" msgid="3092569408438626261">"Cut"</string>
     <string name="copy" msgid="2681946229533511987">"Copy"</string>
     <string name="paste" msgid="5629880836805036433">"Paste"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Nothing to paste"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Copy URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Select text..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Text selection"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Input method"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Edit text"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Text actions"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Low on space"</string>
     <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Tablet storage space is getting low."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Phone storage space is getting low."</string>
@@ -857,12 +817,9 @@
     <string name="force_close" msgid="3653416315450806396">"Force close"</string>
     <string name="report" msgid="4060218260984795706">"Report"</string>
     <string name="wait" msgid="7147118217226317732">"Wait"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Application redirected"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> is now running."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> was originally launched."</string>
     <string name="smv_application" msgid="295583804361236288">"The application <xliff:g id="APPLICATION">%1$s</xliff:g> (process <xliff:g id="PROCESS">%2$s</xliff:g>) has violated its self-enforced StrictMode policy."</string>
     <string name="smv_process" msgid="5120397012047462446">"The process <xliff:g id="PROCESS">%1$s</xliff:g> has violated its self-enforced StrictMode policy."</string>
     <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
@@ -911,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Show all"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB Mass Storage"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB connected"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"You have connected your phone to your computer via USB. Select the button below if you want to copy files between your computer and your Android\'s SD card."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"You have connected your phone to your computer via USB. Select the button below if you want to copy files between your computer and your Android\'s SD card."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"You have connected to your computer via USB. Touch the button below if you want to copy files between your computer and your Android‘s USB storage."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"You have connected to your computer via USB. Touch the button below if you want to copy files between your computer and your Android‘s SD card."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Turn off USB storage"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"There is a problem using your SD card for USB storage."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"There is a problem using your SD card for USB storage."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"There is a problem with using your USB storage for USB mass storage."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"There is a problem with using your SD card for USB mass storage."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB connected"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Select to copy files to/from your computer."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Turn off USB storage"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Select to turn off USB storage."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"USB storage in use"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Before turning off USB storage, make sure that you have unmounted (“ejected”) your Android‘s SD card from your computer."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Before turning off USB storage, make sure that you have unmounted (“ejected”) your Android‘s USB storage from your computer."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Before turning off USB storage, make sure that you have unmounted (“ejected”) your Android‘s SD card from your computer."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Turn off USB storage"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"We\'ve encountered a problem turning off USB storage. Check to ensure that you have unmounted the USB host, then try again."</string>
@@ -929,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"If you turn on USB storage, some applications that you are using will stop and may be unavailable until you turn off USB storage."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"USB operation failed"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Format SD card"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Format USB storage"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Format SD card"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Are you sure that you want to format the SD card? All data on your card will be lost."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Format USB storage, erasing all files stored there? Action cannot be reversed!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Are you sure that you want to format the SD card? All data on your card will be lost."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
@@ -940,28 +897,28 @@
     <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>"candidates"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Preparing SD card"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Preparing USB storage"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Preparing SD card"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Checking for errors."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Blank SD card"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Blank USB storage"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Blank SD card"</string>
-    <!-- outdated translation 1312266820092958014 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"The SD card is blank or using an unsupported file system."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"USB storage blank or has unsupported file system."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"SD card blank or has unsupported file system."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Damaged SD card"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Damaged USB storage"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Damaged SD card"</string>
-    <!-- outdated translation 2679412884290061775 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"The SD card is damaged. You may have to reformat your card."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"USB storage damaged. You may have to reformat it."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"SD card damaged. You may have to reformat it."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"SD card removed unexpectedly"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB storage removed unexpectedly"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD card removed unexpectedly"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Unmount SD card before removing to avoid data loss."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Unmount USB storage before removing to avoid data loss."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Unmount SD card before removing to avoid data loss."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"SD card safe to remove"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB storage safe to remove"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD card safe to remove"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"You can safely remove SD card."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"You can safely remove USB storage."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"You can safely remove SD card."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Removed SD card"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Removed USB storage"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Removed SD card"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"SD card removed. Insert a new one."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB storage removed. Insert new media."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD card removed. Insert a new one."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"No matching activities found"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"update component usage statistics"</string>
@@ -975,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Send"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Next"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Done"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Prev"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Execute"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Dial number"\n", using <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Create contact"\n", using <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1008,52 +964,34 @@
     <string name="tethered_notification_message" msgid="3067108323903048927">"Touch to configure"</string>
     <string name="back_button_label" msgid="2300470004503343439">"Back"</string>
     <string name="next_button_label" msgid="1080555104677992408">"Next"</string>
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="skip_button_label" msgid="1275362299471631819">"Skip"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"High mobile data use"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Touch to learn more about mobile data usage"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Mobile data limit exceeded"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Touch to learn more about mobile data usage"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"No matches"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Find on page"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 Match"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Done"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Unmounting USB storage..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Unmounting SD card..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Erasing USB storage..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Erasing SD card..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Failed to erase USB storage."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Failed to erase SD card."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"SD card was removed before being unmounted."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB storage is currently being checked."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"SD card is currently being checked."</string>
+    <string name="media_removed" msgid="7001526905057952097">"SD card has been removed."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"USB storage is currently in use by a computer."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"SD card is currently in use by a computer."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"External media in unknown state."</string>
+    <string name="share" msgid="1778686618230011964">"Share"</string>
+    <string name="find" msgid="4808270900322985960">"Find"</string>
+    <string name="websearch" msgid="4337157977400211589">"Web Search"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1064,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 1818af1..794a7a2 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -152,7 +152,7 @@
     <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"El modo avión está Encendido"</string>
     <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"El modo avión está Apagado"</string>
     <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
-    <string name="android_system_label" msgid="6577375335728551336">"Sistema Androide"</string>
+    <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
     <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servicios que te cuestan dinero"</string>
     <string name="permgroupdesc_costMoney" msgid="8193824940620517189">"Admite aplicaciones que realizan actividades que te pueden costar dinero."</string>
     <string name="permgrouplab_messages" msgid="7521249148445456662">"Tus mensajes"</string>
@@ -211,7 +211,7 @@
     <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Permite que una aplicación habilite el modo auto."</string>
     <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"eliminar los procesos de fondo"</string>
     <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Permite que una aplicación elimine los procesos de fondo de otras aplicaciones, aun si la memoria no es baja."</string>
-    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"provocar la detención de otras aplicaciones"</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"forzar la detención de otras aplicaciones"</string>
     <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Permite que una aplicación provoque la detención de otras aplicaciones."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"provocar que la aplicación se acerque"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Admite una aplicación que provoca que cualquier actividad del fondo se acerque y vuelva a alejarse. Se debe evitar utilizarlo en aplicaciones normales."</string>
@@ -373,8 +373,8 @@
     <string name="permdesc_locationUpdates" msgid="2300018303720930256">"Permite activar y desactivar las notificaciones de actualización de ubicación de la radio. Las aplicaciones normales no deben utilizarlo."</string>
     <string name="permlab_checkinProperties" msgid="7855259461268734914">"acceder a las propiedades de protección"</string>
     <string name="permdesc_checkinProperties" msgid="7150307006141883832">"Admite el acceso de lectura y escritura a las propiedades subidas por el servicio de protección. Las aplicaciones normales no deben utilizarlo."</string>
-    <string name="permlab_bindGadget" msgid="776905339015863471">"elegir controles"</string>
-    <string name="permdesc_bindGadget" msgid="2098697834497452046">"Admite que la aplicación indique al sistema cuáles controles puede utilizar cada aplicación. Con este permiso, las aplicaciones pueden brindar acceso a los datos personales a otras aplicaciones. Las aplicaciones normales no deben utilizarlo."</string>
+    <string name="permlab_bindGadget" msgid="776905339015863471">"elegir widgets"</string>
+    <string name="permdesc_bindGadget" msgid="2098697834497452046">"Admite que la aplicación indique al sistema qué widgets puede utilizar cada aplicación. Con este permiso, las aplicaciones pueden brindar acceso a los datos personales a otras aplicaciones. Las aplicaciones normales no deben utilizarlo."</string>
     <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"modificar el estado del teléfono"</string>
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Admite que la aplicación controle las funciones telefónicas del dispositivo. Una aplicación con este permiso puede cambiar las redes, encender y apagar la radio del teléfono y funciones similares sin notificarte en ningún momento."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"leer el estado del teléfono y la identidad"</string>
@@ -606,7 +606,7 @@
     <string name="lockscreen_screen_locked" msgid="7288443074806832904">"Pantalla bloqueada."</string>
     <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Presiona el Menú para desbloquear o realizar una llamada de emergencia."</string>
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Presionar Menú para desbloquear."</string>
-    <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Extraer el patrón para desbloquear"</string>
+    <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dibujar el patrón de desbloqueo"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Llamada de emergencia"</string>
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Regresar a llamada"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcto"</string>
@@ -614,7 +614,7 @@
     <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Lo sentimos, vuelve a intentarlo"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Cargando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Cargada."</string>
-    <string name="lockscreen_battery_short" msgid="3617549178603354656">"Segmento <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="lockscreen_low_battery" msgid="1482873981919249740">"Conecta tu cargador."</string>
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"No hay tarjeta SIM."</string>
     <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"No hay tarjeta SIM en el tablet."</string>
@@ -657,7 +657,7 @@
     <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"¿Deseas salir de esta página?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Selecciona Aceptar para continuar o Cancelar para permanecer en la página actual."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string>
-    <string name="double_tap_toast" msgid="1068216937244567247">"Sugerencia: presiona dos veces para acercar y alejar"</string>
+    <string name="double_tap_toast" msgid="1068216937244567247">"Sugerencia: presiona dos veces para acercar o alejar (zoom)"</string>
     <string name="autofill_this_form" msgid="1272247532604569872">"Autocompl."</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Conf func Autocompl"</string>
     <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string>
@@ -784,7 +784,7 @@
     <string name="Midnight" msgid="5630806906897892201">"Medianoche"</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">"Seleccionar todos"</string>
+    <string name="selectAll" msgid="6876518925844129331">"Seleccionar todo"</string>
     <string name="cut" msgid="3092569408438626261">"Cortar"</string>
     <string name="copy" msgid="2681946229533511987">"Copiar"</string>
     <string name="paste" msgid="5629880836805036433">"Pegar"</string>
@@ -820,7 +820,7 @@
     <string name="anr_process" msgid="1246866008169975783">"El proceso <xliff:g id="PROCESS">%1$s</xliff:g> no responde."</string>
     <string name="force_close" msgid="3653416315450806396">"Forzar cierre"</string>
     <string name="report" msgid="4060218260984795706">"Notificar"</string>
-    <string name="wait" msgid="7147118217226317732">"Espera"</string>
+    <string name="wait" msgid="7147118217226317732">"Esperar"</string>
     <string name="launch_warning_title" msgid="8323761616052121936">"Se redirigió la aplicación"</string>
     <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> se está ejecutando ahora."</string>
     <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> se inició originalmente."</string>
@@ -995,8 +995,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Medios externos en estado desconocido."</string>
     <string name="share" msgid="1778686618230011964">"Compartir"</string>
     <string name="find" msgid="4808270900322985960">"Buscar"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Buscar en la Web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1007,4 +1006,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index da06dab..e46e0d1 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Estado de medio externo desconocido"</string>
     <string name="share" msgid="1778686618230011964">"Compartir"</string>
     <string name="find" msgid="4808270900322985960">"Buscar"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Búsqueda web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 7e00ebd..621332c 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"پست صوتی"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"مشکل در اتصال یا کد MMI نامعتبر."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"عملکرد فقط به شماره های شماره گیری ثابت محدود است."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"سرویس فعال شد."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"سرویس فعال شد برای:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"سرویس غیرفعال شده است."</string>
@@ -126,7 +125,7 @@
     <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="2292820184396262278">"محل ذخیره رایانه لوحی پر است! برخی از فایل ها را حذف کنید تا فضا خالی شود."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"حافظه رایانه لوحی پر است! برخی از فایل ها را حذف کنید تا فضا خالی شود."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"محل ذخیره تلفن پر است! برخی از فایل ها را حذف کنید تا فضا خالی شود."</string>
     <string name="me" msgid="6545696007631404292">"من"</string>
     <string name="power_dialog" product="tablet" msgid="8545351420865202853">"گزینه های رایانه لوحی"</string>
@@ -139,8 +138,7 @@
     <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>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"آیا می خواهید دستگاه را خاموش کنید؟"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"اخیر"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"برنامه اخیری موجود نیست."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"گزینه های رایانه لوحی"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"ابزارهای توسعه"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"ویژگی ها فقط برای برنامه نویسان برنامه کاربردی لازم است."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"ذخیره سازی"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"به کارت SD دسترسی داشته باشید."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"به حافظه USB دسترسی پیدا کنید."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"به کارت SD دسترسی داشته باشید."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"غیرفعال کردن یا تغییر نوار وضعیت"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"به برنامه کاربردی اجازه می دهد نوار وضعیت را غیرفعال کرده یا نمادهای سیستم را اضافه کرده و حذف کند."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"نوار وضعیت"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"به برنامه کاربردی اجازه می دهد که نوار وضعیت شود."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"گسترش دادن/جمع کردن نوار وضعیت"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"به برنامه کاربردی اجازه می دهد نوار وضعیت را کوچک یا بزرگ کند."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"توقف تماس های خروجی"</string>
@@ -196,7 +192,7 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"ارسال پیامک ها"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"به برنامه کاربردی اجازه می دهد پیامک ارسال کند. برنامه های مضر ممکن است با ارسال پیام هایی بدون تأیید شما، هزینه هایی را برای شما ایجاد کنند."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"خواندن پیامک یا MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"به برنامه کاربردی اجازه می دهد پیامک های ذخیره شده در رایانه لوحی شما یا سیم کارت را بخواند. برنامه های مضر می توانند پیام های محرمانه شما را بخوانند."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"به برنامه اجازه می دهد پیامک های ذخیره شده در رایانه لوحی شما یا سیم کارت را بخواند. برنامه های مضر می توانند پیام های محرمانه شما را بخوانند."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"به برنامه کاربردی اجازه می دهد پیامک های ذخیره شده در گوشی شما یا سیم کارت را بخواند. برنامه های مضر می توانند پیام های محرمانه شما را بخوانند."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"ویرایش پیامک یا MMS"</string>
     <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"به برنامه کاربردی اجازه می دهد در پیامک های ذخیره شده در رایانه لوحی شما یا سیم کارت بنویسد. برنامه های مضر می توانند پیام های شما را حذف کنند."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"ممانعت از جابجایی برنامه"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"مانع از جابجایی کاربر به یک برنامه دیگر می شود."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"نظارت و بررسی تمام راه اندازی های برنامه کاربردی"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"به یک برنامه کاربردی امکان می دهد نحوه راه اندازی فعالیت ها توسط سیستم را کنترل و نظارت کند. برنامه های مضر ممکن است به طور کامل سیستم را تحت کنترل بگیرند. این مجوز تنها برای بهبود لازم است و هرگز برای استفاده های معمولی کاربرد ندارد."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"به یک برنامه کاربردی اجازه می دهد نحوه راه اندازی فعالیت ها توسط سیستم را کنترل و نظارت کند. برنامه های مضر ممکن است به طور کامل سیستم را تحت کنترل بگیرند. این مجوز تنها برای بهبود لازم است و هرگز برای استفاده های معمولی تلفن کاربرد ندارد."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"ارسال پخش بسته حذف شده"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"به یک برنامه کاربردی اجازه می دهد اعلانی را پخش کند که یک بسته برنامه آن را حذف کرده است. برنامه های مضر از این امکان برای از بین بردن سایر برنامه های در حال اجرا استفاده می کنند."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"ارسال پخش دریافت شده توسط پیامک"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"نمایش پنجره های غیرمجاز"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"اجازه می دهد پنجره هایی ایجاد شوند که برای استفاده توسط رابط کاربر سیستم داخلی در نظر گرفته شده است. برای استفاده با برنامه های معمولی در نظر گرفته نشده است."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"هشدارهای سطح سیستم نمایش"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"به یک برنامه کاربردی اجازه می دهد پنجره های هشدار سیستم را نمایش دهد. برنامه های مضر می توانند کنترل کل صفحه را در دست بگیرند."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"به یک برنامه کاربردی اجازه می دهد پنجره های هشدار سیستم را نمایش دهد. برنامه های مضر می توانند کنترل تمام صفحه را در دست بگیرند."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"اصلاح سرعت انیمیشن کلی"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"به یک برنامه کاربردی اجازه می دهد تا کل سرعت انیمیشن را در هر زمان تغییر دهد (انیمیشن هایی سریعتر یا آرام تر)."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"مدیریت کدهای برنامه"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"به برنامه های کاربردی اجازه می دهد کدهای خود را ایجاد کرده و مدیریت کنند و همچنین ترتیب بندی Z خود را تأیید کنند. هرگز برای برنامه های معمولی مورد نیاز نیست."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"کلیدها و دکمه های کنترل را فشار دهید"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"به یک برنامه کاربردی اجازه می دهد رویدادهای ورودی خود (فشارهای کلید و سایر موارد) را به دیگر برنامه ها تحویل دهد. برنامه های مضر از این امکان می توانند برای کنترل رایانه لوحی استفاده کنند."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"به یک برنامه کاربردی اجازه می دهد رویدادهای ورودی خود (فشارهای کلید و سایر موارد) را به دیگر برنامه ها تحویل دهد. برنامه های مضر از این امکان می توانند برای مسلط شدن بر رایانه لوحی استفاده کنند."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"به یک برنامه کاربردی اجازه می دهد رویدادهای ورودی خود (فشارهای کلید و سایر موارد) را به دیگر برنامه ها تحویل دهد. برنامه های مضر از این امکان می توانند برای مسلط شدن بر گوشی استفاده کنند."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"مواردی که می نویسید و کارهایی که انجام می دهید را ضبط کنید"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"به برنامه های کاربردی اجازه می دهد حتی زمانی که با برنامه دیگری در حال ارتباط هستید (مانند وارد کردن یک رمز ورود)، بتوانند کلیدهایی را که فشار می دهید ببینند. هرگز برای برنامه های معمولی مورد نیاز نیست."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"نصب مستقیم برنامه های کاربردی"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"به یک برنامه کاربردی اجازه می دهد تا بسته های Android جدید یا به روز شده را نصب کند. برنامه های مضر می توانند از این امکان برای افزودن برنامه های جدید با مجوزهای خودسرانه قدرتمند استفاده کنند."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"حذف کل داده های حافظه پنهان برنامه"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"به یک برنامه کاربردی اجازه می دهد با حذف فایل ها در دایرکتوری حافظه پنهان برنامه، فضای آزاد در محل ذخیره سازی رایانه لوحی ایجاد کند. دسترسی به فرآیندهای سیستم معمولاً بسیار محدود است."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"به یک برنامه کاربردی اجازه می دهد با حذف فایل ها در دایرکتوری حافظه پنهان برنامه، فضای آزاد در محل ذخیره سازی گوشی ایجاد کند. دسترسی به فرآیندهای سیستم معمولاً بسیار محدود است."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"به یک برنامه کاربردی اجازه می دهد با حذف فایل ها در دایرکتوری حافظه پنهان برنامه، فضای آزاد در محل ذخیره سازی گوشی ایجاد کند. دسترسی به فرآیندهای سیستم معمولاً بسیار محدود است."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"انتقال منابع برنامه کاربردی"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"به یک برنامه کاربردی اجازه می دهد منابع برنامه را از رسانه داخلی به رسانه خارجی منتقل کرده و بالعکس."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"خواندن فایل های گزارش سیستم"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"به یک برنامه کاربردی اجازه می دهد فایل های مختلف گزارش سیستم را بخواند. با این کار، اطلاعات کلی مربوط به کاری که با رایانه لوحی انجام می دهید مشخص می شود که ممکن است شامل حاوی اطلاعات شخصی و خصوصی باشند."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"به یک برنامه کاربردی اجازه می دهد فایل های مختلف گزارش سیستم را بخواند. با این کار، اطلاعات کلی مربوط به کاری که با رایانه لوحی انجام می دهید مشخص می شود که ممکن است شامل حاوی اطلاعات شخصی و خصوصی باشند."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"مطالعه داده های گزارش حساس"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"به یک برنامه کاربردی اجازه می دهد فایل های مختلف گزارش سیستم را بخواند. با این کار، اطلاعات کلی مربوط به کاری که با رایانه لوحی انجام می دهید را کشف می کند، که ممکن است حاوی اطلاعات شخصی و خصوصی باشند."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"به یک برنامه کاربردی اجازه می دهد فایل های مختلف گزارش سیستم را بخواند. با این کار، اطلاعات کلی مربوط به کاری که با گوشی انجام می دهید را کشف می کند، که ممکن است حاوی اطلاعات شخصی و خصوصی باشند."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"خواندن/نوشتن منابع متعلق به تشخیص"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"به یک برنامه کاربردی امکان می دهد هر منبع متعلق به گروه تشخیص را بخواند یا بنویسد، مانند فایل های موجود در /dev. این امر می تواند بصورت بالقوه بر ثبات و امنیت سیستم تأثیر بگذارد. از این امکان تنها باید برای شناسایی مشکلات مخصوص سخت افزار توسط سازنده یا اپراتور استفاده شود."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"فعال یا غیرفعال کردن مؤلفه های برنامه"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"به یک برنامه کاربردی اجازه می دهد تا فعال شدن یا فعال نشدن مؤلفه یک برنامه دیگر را تغییر دهد. برنامه های مضر می توانند از این امکان برای غیرفعال کردن قابلیت های مهم رایانه لوحی استفاده کنند. در مورد مجوزها دقت بیشتری داشته باشید، زیرا امکان دارد مؤلفه های یک برنامه را به حالت بلااستفاده، ناسازگار یا بدون ثبات تبدیل کند."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"به یک برنامه کاربردی اجازه می دهد تا فعال شدن یا فعال نشدن مؤلفه یک برنامه دیگر را تغییر دهد. برنامه های مضر می توانند از این امکان برای غیرفعال کردن قابلیت های مهم رایانه لوحی استفاده کنند. در مورد مجوزها دقت بیشتری داشته باشید، زیرا امکان دارد مؤلفه های یک برنامه را به حالت بلااستفاده، ناسازگار یا بدون ثبات تبدیل کند."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"به یک برنامه کاربردی اجازه می دهد تا فعال شدن یا فعال نشدن مؤلفه یک برنامه دیگر را تغییر دهد. برنامه های مضر می توانند از این امکان برای غیرفعال کردن قابلیت های مهم رایانه لوحی استفاده کنند. در استفاده از این مجوز دقت کنید، زیرا امکان دارد مؤلفه های یک برنامه را به حالت بلااستفاده، ناسازگار یا بدون ثبات تبدیل کند."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"به یک برنامه کاربردی اجازه می دهد تا فعال شدن یا فعال نشدن مؤلفه یک برنامه دیگر را تغییر دهد. برنامه های مضر می توانند از این امکان برای غیرفعال کردن قابلیت های مهم گوشی استفاده کنند. این مجوز باید به دقت استفاده شود، زیرا امکان دارد مؤلفه های یک برنامه را به حالت بلااستفاده، ناسازگار یا بدون ثبات تبدیل کند."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"تنظیم برنامه های برگزیده"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"به یک برنامه کاربردی اجازه می دهد برنامه های برگزیده شما را تغییر دهد. این امر به برنامه های مضر امکان می دهد تا به آرامی برنامه های در حال اجرا را تغییر دهند و سبب جمع آوری اطلاعات شخصی و خصوصی شما توسط برنامه های موجود شوند."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"اصلاح کردن تنظیمات سیستم کلی"</string>
@@ -301,7 +297,7 @@
     <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"به یک برنامه کاربردی اجازه می دهد با پایان راه اندازی سیستم، به طور خودکار شروع به کار کند. این امر سبب می شود مدت بیشتری طول بکشد تا رایانه لوحی شروع به کار کند و به برنامه اجازه می دهد تا با اجرای دائمی، سرعت کلی رایانه لوحی را کم کند."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"به یک برنامه کاربردی اجازه می دهد با پایان راه اندازی سیستم، به طور خودکار شروع به کار کند. این امر سبب می شود مدت بیشتری طول بکشد تا گوشی شروع به کار کند و به برنامه اجازه می دهد تا با اجرای دائمی، سرعت کلی تلفن را کم کند."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"ارسال پخش چسبنده"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"به یک برنامه کاربردی اجازه می دهد پخش های چسبنده را ارسال کند که پس از پایان پخش همچنان باقی می مانند. برنامه های مضر می توانند با وادار کردن رایانه لوحی به استفاده بیش از حد حافظه، رایانه لوحی را کند کرده یا ناپایدار کنند."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"به یک برنامه کاربردی اجازه می دهد پخش های چسبنده را ارسال کند که پس از پایان پخش همچنان باقی می مانند. برنامه های مضر می توانند با وادار کردن رایانه لوحی به استفاده بیش از حد حافظه، تلفن را کند کرده یا ناپایدار کنند."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"به یک برنامه کاربردی اجازه می دهد پخش های چسبنده را ارسال کند که پس از پایان پخش همچنان باقی می مانند. برنامه های مضر می توانند با وادار کردن تلفن به استفاده بیش از حد حافظه، تلفن را کند کرده یا ناپایدار کنند."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"خواندن اطلاعات تماس"</string>
     <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"به یک برنامه کاربردی اجازه می دهد تمام اطلاعات تماس (آدرس) ذخیره شده در رایانه لوحی شما را بخواند. برنامه های مضر می توانند از این امکان برای ارسال اطلاعات شما به دیگر افراد استفاده کنند."</string>
@@ -310,7 +306,7 @@
     <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"به یک برنامه کاربردی اجازه می دهد اطلاعات تماس (آدرس) ذخیره شده در رایانه لوحی شما را تغییر دهد. برنامه های مضر می توانند از این امکان برای حذف یا تغییر اطلاعات تماس شما استفاده کنند."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"به یک برنامه کاربردی اجازه می دهد اطلاعات تماس (آدرس) ذخیره شده در گوشی شما را تغییر دهد. برنامه های مضر می توانند از این امکان برای حذف یا تغییر اطلاعات تماس شما استفاده کنند."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"خواندن رویدادهای تقویم"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"به یک برنامه کاربردی اجازه می دهد که تمام رویدادهای تقویم ذخیره شده در رایانه لوحی شما را بخواند. برنامه های کاربردی مضر می توانند از این ویژگی برای ارسال رویدادهای تقویم شما به سایر افراد استفاده کنند."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"به یک برنامه کاربردی اجازه می دهد که تمام رویدادهای تقویم ذخیره شده در رایانه لوحی شما را بخواند. برنامه های مضر می توانند از این ویژگی برای ارسال رویدادهای تقویم شما به سایر افراد استفاده کنند."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"به یک برنامه کاربردی اجازه می دهد که تمام رویدادهای تقویم ذخیره شده در گوشی شما را بخواند. برنامه های کاربردی مضر می توانند از این ویژگی برای ارسال رویدادهای تقویم شما به سایر افراد استفاده کنند."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"افزودن یا اصلاح رویدادهای تقویم و ارسال ایمیل به مهمانان"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"به یک برنامه کاربردی اجازه می دهد که رویدادهای تقویم شما را، که ممکن است برای مهمانان ایمیل ارسال کند، اضافه کرده یا حذف کند. برنامه های مضر می توانند از این امکان برای پاک کردن یا تغییر رویدادهای تقویم و یا ارسال ایمیل به مهمانان استفاده کنند."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"مجوز برای نصب یک ارائه دهنده مکان"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"منابع مکان کاذب را برای تست ایجاد کنید. برنامه های مضر می توانند از این امکان برای لغو مکان و وضعیت بازگردانده شده توسط منابع مکان واقعی مانند GPS یا ارائه دهندگان شبکه استفاده کنند، یا مکان شما را کنترل کرده و آن را به یک منبع خارجی گزارش دهند."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"مکان مناسب (GPS)"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"به منابع مکان دقیق مانند سیستم موقعیت یابی جهانی، در صورت وجود، در گوشی خود متصل شوید. برنامه های مضر می توانند از آن برای تعیین محل شما استفاده کنند، و ممکن است مقدار بیشتری باتری مصرف کنند."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"به منابع مکانی دقیق مانند سیستم موقعیت یابی جهانی، در صورت وجود، در رایانه لوحی خود متصل شوید. برنامه های مضر می توانند از این برنامه برای تعیین محل شما استفاده کنند و مقدار بیشتری باتری مصرف کنند."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"به منابع مناسب مکان مانند سیستم موقعیت یابی جهانی،در صورت وجود، در گوشی خود متصل شوید. برنامه های مضر می توانند از این برنامه برای تعیین محل شما استفاده کننده و مقدار بیشتری باتری مصرف کنند."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"مکان نامشخص (وابسته به شبکه)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"برای تعیین مکان تقریبی رایانه لوحی، در صورت وجود، به منابع مکان نامشخص مانند پایگاه داده شبکه سلولی دسترسی پیدا کنید. برنامه های مضر می توانند از آن برای تعیین محل تقریبی شما استفاده کنند."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"برای تعیین مکان تقریبی رایانه لوحی در صورت وجود، به منابع مکان نامشخص مانند پایگاه داده شبکه تلفن همراه دسترسی پیدا کنید. برنامه های مضر می توانند از این مورد برای تعیین محل تقریبی شما استفاده کنند."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"برای تعیین مکان تقریبی گوشی، در صورت وجود، به منابع مکان نامشخص مانند پایگاه داده شبکه سلولی دسترسی پیدا کنید. برنامه های مضر می توانند از این مورد برای تعیین محل تقریبی شما استفاده کنند."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"دسترسی به SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"به برنامه کاربردی اجازه می دهد از ویژگی های سطح پایین SurfaceFlinger استفاده کند."</string>
@@ -334,13 +330,13 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"به برنامه کاربردی اجازه می دهد تنظیمات صوتی کلی را اصلاح کند، مانند میزان صدا و مسیریابی."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"ضبط صدا"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"به برنامه کاربردی اجازه می دهد به مسیر ضبط صدا دسترسی داشته باشد."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"گرفتن عکس ها"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"به برنامه کاربردی اجازه می دهد تصاویری را با دوربین ضبط کند. با این کار برنامه در هر زمان می تواند تصاویر قابل مشاهده توسط دوربین را ببیند."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"غیر فعال کردن رایانه لوحی بصورت دائم"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"عکسبرداری و فیلمبرداری"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"به برنامه کاربردی اجازه می دهد با دوربین عکسبرداری و فیلمبرداری کند. با این کار به برنامه امکان داده می شود در هر زمان تصاویری که دوربین مشاهده می کند را جمع آوری کند."</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="7379164636920817963">"به برنامه کاربردی اجازه می دهد تا رایانه لوحی را به طور کلی و دائمی غیرفعال کند. این کار بسیار خطرناک است."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"به برنامه کاربردی اجازه می دهد تا گوشی را به طور کلی و دائمی غیرفعال کند. این کار بسیار خطرناک است."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"راه اندازی مجدد رایانه لوحی به اجبار"</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="4555793623560701557">"به برنامه کاربردی اجازه می دهد تا سبب راه اندازی مجدد رایانه لوحی شود."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"به برنامه کاربردی اجازه می دهد تا سبب راه اندازی مجدد گوشی شود."</string>
@@ -348,31 +344,29 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"به برنامه کاربردی اجازه می دهد تا فایل سیستم ها را برای دستگاه ذخیره سازی جداشدنی نصب کرده یا جدا کند."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"فرمت کردن دستگاه ذخیره سازی خارجی"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"به برنامه کاربردی اجازه می دهد تا دستگاه ذخیره سازی جداشدنی را فرمت کند."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"دریافت اطلاعات مربوط به ذخیره سازی ایمن"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"به برنامه کاربردی اجازه می دهد تا اطلاعات مربوط به ذخیره سازی ایمن را دریافت کند."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"ایجاد محل ذخیره سازی ایمن"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"به برنامه کاربردی اجازه می دهد تا ذخیره سازی ایمن را ایجاد کند."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"از بین بردن ذخیره ایمن"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"به برنامه کاربردی اجازه می دهد تا ذخیره سازی ایمن را از بین ببرد."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"نصب/باز کردن محل ذخیره ایمن"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"به برنامه کاربردی اجازه می دهد تا دستگاه ذخیره سازی ایمن را نصب کرده یا جدا کند."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"تغییر نام ذخیره سازی ایمن"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"به برنامه کاربردی اجازه می دهد تا نام دستگاه ذخیره سازی ایمن را تغییر دهد."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"دریافت اطلاعات مربوط به حافظه داخلی"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"به برنامه کاربردی اجازه می دهد تا اطلاعات مربوط به حافظه داخلی را دریافت کند."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"ایجاد حافظه داخلی"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"به برنامه کاربردی اجازه می دهد تا حافظه داخلی را ایجاد کند."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"خراب کردن حافظه داخلی"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"به برنامه کاربردی اجازه می دهد تا حافظه داخلی را از بین ببرد."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"نصب/باز کردن حافظه داخلی"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"به برنامه کاربردی اجازه می دهد تا حافظه داخلی را نصب کرده یا جدا کند."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"نامگذاری مجدد دستگاه ذخیره داخلی"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"به برنامه کاربردی اجازه می دهد تا نام حافظه داخلی را تغییر دهد."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"کنترل لرزاننده"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"به برنامه کاربردی اجازه می دهد لرزاننده را کنترل کند."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"کنترل چراغ قوه"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"به برنامه کاربردی اجازه می دهد چراغ قوه را کنترل کند."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"دسترسی به دستگاه های USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"به برنامه کاربردی اجازه می دهد به دستگاه های USB دسترسی پیدا کند."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"تست سخت افزار"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"به برنامه کاربردی اجازه می دهد سایر برنامه های جانبی را برای تست سخت افزاری کنترل کند."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"تماس مستقیم با شماره تلفن ها"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"به برنامه کاربردی اجازه می دهد تا بدون دخالت شما با هر شماره تلفنی تماس بگیرد. برنامه های مضر ممکن است باعث تماس های غیرمنتظره ای در صورتحساب تلفن شما شوند. توجه داشته باشید که این ویژگی به برنامه کاربردی اجازه نمی دهد با شماره های اضطراری تماس بگیرد."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"تماس مستقیم با هر شماره تلفنی"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"به برنامه کاربردی اجازه می دهد تا بدون دخالت شما با هر شماره تلفنی، از جمله شماره های اضطراری تماس بگیرد. برنامه های مضر می توانند تماس های غیرقانونی و غیرضروری با شماره های اضطراری برقرار کنند."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"شروع مستقیم راه اندازی رایانه لوحی CDMA"</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="6457447676108355905">"به برنامه کاربردی اجازه می دهد تا ارائه مجوز CDMA را آغاز کند. برنامه های مضر ممکن است ارائه مجوز CDMA را بدون ضرورت شروع کنند."</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"کنترل اعلان های به روز رسانی مکان"</string>
@@ -411,7 +405,7 @@
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"عملکرد به عنوان AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"به یک برنامه کاربردی امکان می دهد با تأیید کنندگان اعتبار حساب تماس بگیرند"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"یافتن حساب های شناخته شده"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"به یک برنامه کاربردی امکان می دهد لیستی از حساب های شناخته شده توسط رایانه لوحی را دریافت کند."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"به یک برنامه کاربردی اجازه می دهد لیستی از حساب های شناخته شده توسط رایانه لوحی را دریافت کند."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"به یک برنامه کاربردی امکان می دهد لیستی از حساب های شناخته شده توسط گوشی را دریافت کند."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"عملکرد به عنوان تأیید کننده اعتبار حساب"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"به یک برنامه کاربردی اجازه می دهد از قابلیت های تأیید کننده اعتبار حساب مربوط به مدیر حساب استفاده کند، از جمله ایجاد چندین حساب و دریافت و تنظیم رمزهای ورود آنها."</string>
@@ -441,12 +435,10 @@
     <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"به یک برنامه کاربردی اجازه می دهد تا رایانه لوحی محلی بلوتوث را پیکربندی کرده، دستگاه های راه دور را شناسایی کرده و با آنها جفت شود."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"به یک برنامه کاربردی اجازه می دهد تا تلفن محلی بلوتوث را پیکربندی کرده، دستگاه های راه دور را شناسایی کرده و با آنها جفت شود."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"ایجاد اتصال های بلوتوث"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"به یک برنامه کاربردی اجازه می دهد تا پیکربندی رایانه لوحی بلوتوث محلی را مشاهده کند، اتصال ها را با دستگاه های جفت شده برقرار کرده، آنها را بپذیرد."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"به یک برنامه کاربردی اجازه می دهد تا پیکربندی تلفن لوحی بلوتوث محلی را مشاهده کند، اتصال ها را با دستگاه های جفت شده برقرار کرده، آنها را بپذیرد."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"به یک برنامه کاربردی اجازه می دهد تا پیکربندی تلفن بلوتوث محلی را مشاهده کند، اتصال ها را با دستگاه های جفت شده برقرار کرده، آنها را بپذیرد."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"کنترل ارتباط راه نزدیک"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"به یک برنامه کاربردی برای ارتباط با برچسب های ارتباط راه نزدیک (NFC)، کارت ها و خواننده ها اجازه می دهد."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"غیرفعال کردن قفل کلید"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"به یک برنامه کاربردی اجازه می دهد قفل کلید و حفاظت رمز ورود همراه با کلیه کلیدها را غیرفعال کند. یک نمونه قانونی از این مورد، غیرفعال شدن قفل کلید در هنگام دریافت تماس تلفنی و سپس فعال کردن قفل کلید پس از پایان تماس است."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"خواندن تنظیمات همگام سازی"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"به یک برنامه کاربردی امکان می دهد که تمام کلمات شخصی، نام ها و عباراتی که ممکن است کاربر در فرهنگ لغت کاربر ذخیره کرده باشد را بخواند."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"نوشتن در فرهنگ لغت تعریف شده توسط کاربر"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"به یک برنامه کاربردی اجازه می دهد کلمات جدیدی را در فرهنگ لغت کاربر بنویسد."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"اصلاح کردن/حذف محتویات کارت SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"اصلاح/حذف محتواهای حافظه USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"اصلاح کردن/حذف محتویات کارت SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"به یک برنامه کاربردی اجازه می دهد در کارت SD رایت کند."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"به یک برنامه کاربردی اجازه می دهد تا دستگاه USB را بنویسید."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"به یک برنامه کاربردی اجازه می دهد در کارت SD رایت کند."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"اصلاح/حذف محتواهای ذخیره سازی رسانه داخلی"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"به یک برنامه کاربردی برای اصلاح محتواهای حافظه رسانه داخلی اجازه می دهد."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"دسترسی به سیستم فایل حافظه پنهان"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"به یک برنامه کاربردی امکان می دهد سیستم فایل حافظه پنهان را بخواند و بنویسد."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"محدود کردن رمز ورود"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"انواع رمز ورود که مجاز به استفاده از آنها هستید را محدود کنید."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"تعداد دفعات ورود به سیستم برای مشاهده"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"تعداد رمز ورودهای نادرست وارد شده هنگام بازکردن قفل را نظارت کنید، و رایانه لوحی را قفل کنید یا در صورتی که تعداد زیادی رمز ورود نادرست وارد شده، کلیه داده های رایانه لوحی را حذف کنید"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"تعداد رمز ورودهای نادرست وارد شده هنگام بازکردن قفل را نظارت کنید، و رایانه لوحی را قفل کنید یا در صورتی که تعداد زیادی رمز ورود نادرست وارد شده، کلیه داده های رایانه لوحی را حذف کنید"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"بازنشانی رمز ورود"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"رمز ورود شما را به اجبار به یک مورد جدید تبدیل می کند، سرپرست را ملزم می کند قبل از ورود به برنامه، آن را به شما تحویل دهد."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"قفل اجباری"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"کنترل هنگام قفل شدن دستگاه و الزام شما به وارد کردن دوباره رمز ورود."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"علامتگذاری/دریافت تماس های اینترنتی"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"به یک برنامه کاربردی اجازخ می دهد از سرویس SIP جهت برقراری یا دریافت تماس های اینترنتی استفاده کند."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"تنظیم قوانین رمز ورود"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"کنترل طول و نویسه های مجاز رمزهای ورود قفل گشایی صفحه"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"نمایش تلاش های قفل گشایی صفحه"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"تعداد رمزهای ورود نادرست وارد شده هنگام قفل گشایی صفحه نشان داده می شود و در صورتی که رمز ورودهای نادرست بسیاری وارد شود، گوشی قفل شده یا همه داده های رایانه لوحی پاک می شود."</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"تعداد رمزهای ورود نادرست وارد شده هنگام قفل گشایی صفحه نشان داده می شود و در صورتی که رمز ورودهای نادرست بسیاری وارد شود، گوشی قفل شده یا همه داده های گوشی پاک می شود."</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"تغییر رمز ورود قفل گشایی صفحه"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"تغییر رمز ورود قفل گشایی صفحه"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"قفل کردن صفحه"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"کنترل نحوه قفل شدن صفحه و زمان آن"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"پاک کردن تمام داده ها"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"پاک کردن داده رایانه لوحی بدون اخطار، با اجرای یک بازنشانی به داده های کارخانه"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"پاک کردن داده رایانه لوحی بدون اخطار، با اجرای یک بازنشانی به داده های کارخانه"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"پاک کردن داده های رایانه لوحی بدون هشدار با انجام یک عملکرد بازنشانی داده های کارخانه"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"پاک کردن داده های گوشی بدون هشدار با انجام یک عملکرد بازنشانی داده های کارخانه"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"تنظیم پروکسی جهانی دستگاه"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"پروکسی جهانی دستگاه مورد نظر را جهت استفاده هنگام فعال بودن خط مشی تنظیم کنید. فقط اولین سرپرست دستگاه پروکسی جهانی مفید را تنظیم می کند."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"تنظیم زمان انقضای رمز ورود"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"کنترل مدت زمانی که رمز ورود صفحه قفل قبل از تغییر یافتن لازم دارد"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"خانه"</item>
     <item msgid="869923650527136615">"تلفن همراه"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"پیجوی محل کار"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"دستیار"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"سفارشی"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"تاریخ تولد"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"سالگرد"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"رویداد"</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>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"محل کار"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"سایر موارد"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"سفارشی"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <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="3731488827218876115">"کد پین را وارد کنید"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"رمز ورود را برای بازگشایی قفل وارد کنید"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"کد پین را برای بازگشایی قفل وارد کنید"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"پین کد اشتباه است!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"برای بازگشایی قفل، منو را فشار دهید و سپس 0 را فشار دهید."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"شماره اضطراری"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"بازگشت به تماس"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"صحیح است!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"متأسفیم، دوباره امتحان کنید"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"متأسفیم، دوباره امتحان کنید"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"شارژ کردن (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"شارژ شد."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"سیم کارت قفل شد."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"بازگشایی قفل سیم کارت..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"شما الگوی بازگشایی قفل خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیده اید. "\n\n"لطفاً پس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"شما الگوی بازگشایی قفل خود را <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_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"شما رمز ورود خود را <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="6827749231465145590">"شما کد پین خود را <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="8687762517114904651">"شما الگوی بازگشایی قفل خود را <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="3351013842320127827">"شما الگوی بازگشایی قفل خود را <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_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>
@@ -698,23 +658,17 @@
     <string name="double_tap_toast" msgid="1068216937244567247">"نکته: برای انجام بزرگنمایی مثبت و منفی، دو بار ضربه بزنید."</string>
     <string name="autofill_this_form" msgid="1272247532604569872">"تکمیل خودکار"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"تنظیم تکمیل خودکار"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"خواندن سابقه و نشانک های مرورگر"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"به برنامه کاربردی اجازه می دهد تا تمام URL های بازدید شده توسط مرورگر و تمام نشانک های آن را بخواند."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"نوشتن سابقه مرورگر و نشانک ها"</string>
     <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"به یک برنامه کاربردی اجازه می دهد سابقه مرورگر یا نشانک ذخیره شده در رایانه لوحی شما را تغییر دهد. برنامه های مضر می توانند از این امکان برای حذف یا تغییر داده های مرورگر شما استفاده کنند."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"به یک برنامه کاربردی اجازه می دهد سابقه مرورگر یا نشانک ذخیره شده در گوشی شما را تغییر دهد. برنامه های مضر می توانند از این امکان برای حذف یا تغییر داده های مرورگر شما استفاده کنند."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"تنظیم هشدار در ساعت زنگ دار"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"به برنامه کاربردی برای تنظیم یک هشدار در یک برنامه ساعت زنگ دار نصب شده اجازه می دهد. در برخی از برنامه های ساعت زنگ دار ممکن است این ویژگی اجرا نشود."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"اصلاح کردن مجوزهای مکان جغرافیایی مرورگر"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"به یک برنامه کاربردی اجازه می دهد مجوزهای مکان جغرافیایی مرورگر را تغییر دهد. برنامه های مضر می توانند از این گزینه استفاده کرده و اطلاعات مربوط به مکان را به وب سایت های غیر قانونی ارسال کنند."</string>
     <string name="save_password_message" msgid="767344687139195790">"می خواهید مرورگر این رمز ورود را به خاطر داشته باشد؟"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"برش"</string>
     <string name="copy" msgid="2681946229533511987">"کپی"</string>
     <string name="paste" msgid="5629880836805036433">"جای گذاری"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"چیزی برای جای گذاری نیست"</string>
     <string name="copyUrl" msgid="2538211579596067402">"کپی URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"انتخاب متن..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"انتخاب متن"</string>
     <string name="inputMethod" msgid="1653630062304567879">"روش ورودی"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"ویرایش متن"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"عملکردهای متنی"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"فضا کم است"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"فضای ذخیره سازی رایانه لوحی در حال کم شدن است."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"فضای ذخیره رایانه لوحی در حال کم شدن است."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"فضای ذخیره سازی تلفن در حال کم شدن است."</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>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"در حال بارگیری..."</string>
     <string name="capital_on" msgid="1544682755514494298">"روشن"</string>
     <string name="capital_off" msgid="6815870386972805832">"خاموش"</string>
     <string name="whichApplication" msgid="4533185947064773386">"تکمیل عملکرد با استفاده از"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"بستن اجباری"</string>
     <string name="report" msgid="4060218260984795706">"گزارش"</string>
     <string name="wait" msgid="7147118217226317732">"منتظر بمانید"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"برنامه هدایت مجدد شد"</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="smv_application" msgid="295583804361236288">"برنامه <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="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> در حال اجرا"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"انتخاب برای رفتن به برنامه"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"جابجایی در برنامه ها؟"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"برنامه دیگری در حال حاضر در حال اجرا است که قبل از شروع برنامه جدید دیگری باید متوقف شود."</string>
+    <string name="old_app_action" msgid="493129172238566282">"بازگشت به <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"برنامه جدید راه اندازی نشود."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"شروع <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"برنامه قدیمی بدون ذخیره متوقف شود."</string>
     <string name="sendText" msgid="5132506121645618310">"انتخاب یک عملکرد برای متن"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"میزان صدای زنگ"</string>
     <string name="volume_music" msgid="5421651157138628171">"میزان صدای رسانه"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"نمایش همه"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"دستگاه ذخیره سازی انبوه USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB متصل شد"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"شما گوشی خود را از طریق USB به رایانه متصل کرده اید. اگر می خواهید فایل ها را بین رایانه خود و کارت SD کپی کنید، دکمه زیر را انتخاب کنید."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"شما گوشی خود را از طریق USB به رایانه متصل کرده اید. اگر می خواهید فایل ها را بین رایانه خود و کارت SD کپی کنید، دکمه زیر را انتخاب کنید."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"شما از طریق USB به رایانه متصل شده اید. اگر می خواهید فایل ها را بین رایانه خود و حافظه USB در Android کپی کنید، دکمه زیر را لمس کنید."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"شما از طریق USB به رایانه متصل شده اید. اگر می خواهید فایل ها را بین رایانه خود و کارت SD در Android کپی کنید، دکمه زیر را لمس کنید."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"روشن کردن دستگاه ذخیره سازی USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"مشکلی در استفاده از کارت SD برای دستگاه ذخیره سازی USB وجود دارد."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"مشکلی در استفاده از کارت SD برای دستگاه ذخیره سازی USB وجود دارد."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"مشکلی در استفاده از حافظه USB برای ذخیره سازی انبوه USB وجود دارد."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"مشکلی در استفاده از کارت SD برای حافظه انبوه USB وجود دارد."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB متصل شد"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"انتخاب کنید تا فایل ها در/از رایانه شما کپی شود."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"خاموش کردن دستگاه ذخیره سازی USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"برای خاموش کردن دستگاه ذخیره سازی USB انتخاب کنید."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"دستگاه ذخیره سازی USB در حال استفاده است"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"قبل از خاموش کردن دستگاه ذخیره سازی USB، بررسی کنید که کارت SD Android را از رایانه خود جدا کرده باشید."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"قبل از خاموش کردن حافظه USB، مطمئن شوید که دستگاه ذخیره سازی Android USB خود را از رایانه خود جدا کرده باشید."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"قبل از خاموش کردن دستگاه ذخیره سازی USB، بررسی کنید که کارت SD Android را از رایانه خود جدا کرده باشید."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"خاموش کردن دستگاه ذخیره سازی USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"مشکلی در خاموش کردن دستگاه ذخیره سازی USB وجود داشت. بررسی کنید که میزبان USB را جدا کرده باشید و سپس دوباره امتحان کنید."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"در صورت روشن کردن دستگاه ذخیره سازی USB، برخی از برنامه هایی که از آنها استفاده می کنید متوقف می شوند و تا زمانی که دستگاه ذخیره سازی USB را خاموش نکنید امکان استفاده از آنها وجود نخواهد داشت."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"عملکرد USB انجام نشد"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"تأیید"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"فرمت کردن کارت SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"فرمت کردن حافظه USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"فرمت کردن کارت SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"مطمئن هستید که می خواهید این کارت SD را فرمت کنید؟ تمام اطلاعات موجود در کارت شما از بین می رود."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"فرمت کردن حافظه USB، همه فایل های ذخیره شده در آنجا پاک شود؟ عملکرد قابل بازگشت نیست!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"مطمئن هستید که می خواهید این کارت SD را فرمت کنید؟ تمام اطلاعات موجود در کارت شما از بین می رود."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"قالب"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"رفع عیب USB متصل شد"</string>
@@ -960,28 +897,28 @@
     <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>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"آماده کردن کارت SD"</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>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"کارت SD خالی"</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>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"کارت SD خالی است یا سیستم فایل آن پشتیبانی نمی شود."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"حافظه USB خالی است یا از سیستم فایل پشتیبانی نشده ای برخوردار است."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"کارت SD خالی است یا سیستم فایل آن پشتیبانی نمی شود."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"کارت 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>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"کارت SD خراب است. لازم است که آن را دوباره فرمت کنید."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"حافظه USB خراب است. لازم است که آن را دوباره فرمت کنید."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"کارت SD خراب است. لازم است که آن را دوباره فرمت کنید."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"کارت 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>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"کارت 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>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"کارت 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>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"کارت 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>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"کارت 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>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"کارت 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="4168820609403385789">"فعالیتی مطابق با این مورد یافت نشد"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"به روزرسانی آمار مربوط به استفاده مؤلفه"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"ارسال"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"بعدی"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"انجام شد"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"قبلی"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"اجرا کردن"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"شماره گیری "\n"با استفاده از <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"ایجاد مخاطب"\n"با استفاده از <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"L2TP/IPSec VPN بر پایه کلید از پیش مشترک شده"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN وابسته به گواهی"</string>
     <string name="upload_file" msgid="2897957172366730416">"انتخاب فایل"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <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="668663626721675614">"برای خروج از حالت خودرو انتخاب کنید."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"اتصال داده با سیم یا نقطه اتصال فعال"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"برای پیکربندی، لمس کنید"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <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="2609734763845705708">"برای کسب اطلاعات بیشتر درباره استفاده از داده های تلفن همراه، لمس کنید"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"داده های تلفن همراه از مقدار مجاز بیشتر است"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"برای کسب اطلاعات بیشتر درباره استفاده از داده های تلفن همراه، لمس کنید"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <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="INDEX">%d</xliff:g> از <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"انجام شد"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"قطع اتصال حافظه USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"قطع اتصال کارت SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"در حال پاک کردن حافظه USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"در حال پاک کردن کارت SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"حافظه USB پاک نشد."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"کارت 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">"حافظه در حال حاضر توسط رایانه دیگری استفاده می شود."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"کارت SD در حال حاضر توسط یک رایانه در حال استفاده است."</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>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index ff8c464..3149028 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Vastaaja"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Yhteysongelma tai virheellinen MMI-koodi."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Voit suorittaa toiminnon vain sallitut puhelut -numeroihin."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Palvelu otettiin käyttöön."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Palvelu käytössä luokalle:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Palvelu on poistettu käytöstä."</string>
@@ -139,8 +138,7 @@
     <string name="shutdown_progress" msgid="2281079257329981203">"Suljetaan..."</string>
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet-laitteesi sammutetaan."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Puhelin suljetaan."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Haluatko sammuttaa laitteen?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Viimeisimmät"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Ei viimeaikaisia sovelluksia."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet-laitteen asetukset"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Kehittäjätyökalut"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Ominaisuudet, joita vain sovellusten kehittäjät tarvitsevat."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Tallennustila"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Käytä SD-korttia."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Käytä USB-tallennustilaa."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Käytä SD-korttia."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"poista tilapalkki käytöstä tai muokkaa tilapalkkia"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Antaa sovelluksen poistaa tilapalkin käytöstä tai lisätä ja poistaa järjestelmäkuvakkeita."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"tilapalkki"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Antaa sovelluksen sijaita tilapalkissa."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"laajentaa/tiivistää tilarivin"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Antaa sovelluksen laajentaa tai tiivistää tilapalkin."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"katkaise soitettavia puheluita"</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"estä sovellusten vaihto"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Estää käyttäjää vaihtamasta toiseen sovellukseen."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"tarkkaile ja hallitse kaikkien sovelluksien käynnistämistä"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Antaa sovelluksen tarkkailla ja hallita järjestelmän käynnistämiä toimintoja. Haittasovellukset saattavat vaarantaa järjestelmän täysin. Tätä lupaa tarvitaan vain kehitykseen, ei tavalliseen käyttöön."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Antaa sovelluksen tarkkailla ja hallita järjestelmän käynnistämiä toimintoja. Haitalliset sovellukset saattavat vaarantaa järjestelmän täysin. Tätä lupaa tarvitaan vain kehitykseen, ei tavalliseen laitteen käyttöön."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"lähetä paketeista poistettuja lähetyksiä"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Antaa sovelluksen lähettää ilmoituksen, että sovelluspaketti on poistettu. Haitalliset sovellukset saattavat sulkea käynnissä olevia sovelluksia."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"lähetä tekstiviestillä vastaanotettuja lähetyksiä"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"näytä luvattomia ikkunoita"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Antaa sovelluksen luoda ikkunoita, jotka on tarkoitettu sisäisen järjestelmän käyttöliittymän käyttöön. Ei tavallisten sovelluksien käyttöön."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"näytä järjestelmätason ilmoituksia"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Antaa sovelluksen näyttää järjestelmäilmoitusikkunoita. Haittasovellukset saattavat kaapata käyttöönsä koko ruudun."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Antaa sovelluksen näyttää järjestelmävaroitusikkunoita. Haittasovellukset voivat kaapata käyttöönsä koko ruudun."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"muokkaa yleistä animaationopeutta"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Antaa sovelluksen muuttaa yleistä animaationopeutta (nopeammaksi tai hitaammaksi) milloin tahansa."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"hallitse sovellustunnuksia"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Antaa sovelluksen luoda ja hallinnoida omia tunnisteitaan ja ohittaa tavallisen Z-järjestyksen. Ei tavallisten sovelluksien käyttöön."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"painaa näppäimiä ja hallintapainikkeita"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Antaa sovelluksen toimittaa omia syöttötapahtumiaan (näppäimen painalluksia jne.) muille sovelluksille. Haittasovellukset voivat ottaa tämän avulla tablet-laitteen haltuunsa."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Antaa sovelluksen lähettää omia syöttötapahtumia (näppäimen painalluksia jne.) muille sovelluksille. Haittasovellukset voivat ottaa koko tablet-laitteen haltuunsa."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Antaa sovelluksen toimittaa omia syöttötapahtumiaan (näppäimen painalluksia jne.) muille sovelluksille. Haitalliset sovellukset saattavat ottaa tämän avulla puhelimen haltuunsa."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"tallenna kirjoittamiasi merkkejä ja suorittamiasi toimintoja"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Antaa sovelluksien tarkkailla painamiasi näppäimiä jopa toisten sovellusten käytön yhteydessä (kuten salasanoja syötettäessä). Ei tavallisten sovelluksien käyttöön."</string>
@@ -281,14 +277,14 @@
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Antaa sovelluksen vapauttaa puhelimesta tallennustilaa poistamalla sovelluksen välimuistihakemistossa olevia tiedostoja. Käyttöoikeus myönnetään yleensä vain järjestelmäprosesseille."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Siirrä sovellusresursseja"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Antaa sovelluksen siirtää sovellusresursseja sisäisistä medioista ulkoisiin ja päin vastoin."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"lue järjestelmälokitiedostoja"</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"lukea arkaluonteisia lokitietoja"</string>
     <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Antaa sovelluksen lukea järjestelmän lokitiedostoja. Näin sovellus saa tietoonsa tietoja siitä, mitä teet tablet-laitteella, ja mahdollisia yksityisiä tai arkaluonteisia tietoja."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Antaa sovelluksen lukea järjestelmän lokitiedostoja. Näin sovellus saa tietoonsa tietoja siitä, mitä teet tablet-laitteella, ja mahdollisia yksityisiä tai arkaluonteisia tietoja."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Antaa sovelluksen lukea järjestelmän lokitiedostoja. Näin sovellus saa tietoonsa tietoja siitä, mitä teet puhelimella, ja mahdollisia yksityisiä tai arkaluonteisia tietoja."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"lue diag:in omistamia resursseja / kirjoita resursseihin"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Antaa sovelluksen lukea ja kirjoittaa kaikkiin diag-ryhmän omistamiin resursseihin, esimerkiksi /dev-hakemistossa oleviin tiedostoihin. Tämä saattaa mahdollisesti vaikuttaa järjestelmän vakauteen ja tietosuojaan. Suositellaan käytettäväksi VAIN operaattorin tai valmistajan laitteistodiagnooseihin."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"ota sovelluskomponentteja käyttöön tai poista niitä käytöstä"</string>
     <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Antaa sovelluksen päättää, onko toisen sovelluksen komponentti käytössä vai ei. Haittasovellukset saattavat käyttää tätä tärkeiden tablet-laitteen ominaisuuksien käytöstä poistamiseen. Mieti tarkkaan ennen tämän luvan myöntämistä, etteivät sovellusten komponentit mene käyttämättömään, yhteensopimattomaan tai epävakaaseen tilaan."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Antaa sovelluksen päättää, onko toisen sovelluksen komponentti käytössä vai ei. Haittasovellukset saattavat käyttää tätä tärkeiden tablet-laitteen ominaisuuksien käytöstä poistamiseen. Mieti tarkkaan ennen tämän luvan myöntämistä, etteivät sovellusten komponentit mene käyttämättömään, yhteensopimattomaan tai epävakaaseen tilaan."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Antaa sovelluksen päättää, onko toisen sovelluksen komponentti käytössä vai ei. Haittasovellukset saattavat käyttää tätä tärkeiden puhelimen ominaisuuksien käytöstä poistamiseen. Mieti tarkkaan ennen tämän luvan myöntämistä, etteivät sovellusten komponentit mene käyttämättömään, yhteensopimattomaan tai epävakaaseen tilaan."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"aseta ensisijaisia sovelluksia"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Antaa sovelluksen muokata ensisijaisia sovelluksiasi. Haitalliset sovellukset saattavat muuttaa käynnissä olevia sovelluksia ja huijata olemassa olevia sovelluksiasi keräämään sinulta yksityisiä tietoja."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"muokkaa yleisiä järjestelmän asetuksia"</string>
@@ -301,10 +297,10 @@
     <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Antaa sovelluksen käynnistää itsensä heti, kun järjestelmä on käynnistynyt uudelleen. Tämä voi hidastaa tablet-laitteen käynnistymistä ja sallia sovelluksen hidastaa tablet-laitetta yleisesti olemalla aina käynnissä."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Antaa sovelluksen käynnistää itsensä, kun järjestelmä on käynnistynyt uudelleen. Tämä voi pitkittää puhelimen käynnistysaikaa, ja sovellus voi hidastaa puhelimen toimintaa olemalla aina käynnissä."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"lähetä tärkeä lähetys"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Antaa sovelluksen lähettää tärkeitä lähetyksiä, jotka jäävät voimaan lähetyksen päätyttyä. Haittasovellukset voivat hidastaa tablet-laitteen toimintaa tai tehdä siitä epävakaan lisäämällä sen muistin käyttöä."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Antaa sovelluksen lähettää tärkeitä lähetyksiä, jotka jäävät voimaan lähetyksen päätyttyä. Haittasovellukset saattavat hidastaa puhelimen toimintaa tai tehdä siitä epävakaan lisäämällä sen muistin käyttöä."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Antaa sovelluksen lähettää tärkeitä lähetyksiä, jotka jäävät voimaan lähetyksen päätyttyä. Haitalliset sovellukset saattavat hidastaa puhelimen toimintaa tai tehdä siitä epävakaan lisäämällä sen muistin käyttöä."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"lue yhteystietoja"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Antaa sovelluksen tarkastella kaikkia tablet-laitteellesi tallennettuja yhteystietoja (osoitteita). Haittasovellukset voivat käyttää tätä tietojesi lähettämiseen muille"</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Antaa sovelluksen tarkastella kaikkia tablet-laitteellesi tallennettuja yhteystietoja (osoitteita). Haittasovellukset voivat käyttää tätä tietojesi lähettämiseen muille ihmisille."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Antaa sovelluksen lukea kaikki puhelimeesi tallennetut yhteystiedot (osoitteet). Haitalliset sovellukset saattavat käyttää tätä tietojesi lähettämiseen muille."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"kirjoita yhteystietoja"</string>
     <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Antaa sovelluksen muokata tablet-laitteellesi tallennettuja yhteystietoja (osoitteita). Haittasovellukset voivat käyttää tätä yhteystietojesi pyyhkimiseen tai muokkaamiseen."</string>
@@ -324,7 +320,7 @@
     <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Käytä sijaintilähteitä, kuten GPS-järjestelmää tablet-laitteella, jos saatavilla. Haittasovellukset voivat käyttää tätä sijaintisi määrittämiseen ja voivat kuluttaa akkuasi tavallista enemmän."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Käyttää tarkkoja sijaintilähteitä kuten GPS:ää puhelimella, jos saatavilla. Haitalliset sovellukset saattavat käyttää tätä määrittääkseen sijaintisi, ja ne saattavat myös kuluttaa enemmän akkua."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"summittainen (verkkopohjainen) sijainti"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Käytä summittaisia sijaintilähteitä, kuten matkapuhelinverkon tietokantaa, määrittääkseen likimääräisen tablet-laitteen sijainnin, jos saatavilla. Haittasovellukset saattavat käyttää tätä likimääräisen sijaintisi määrittämiseen."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Käytä summittaisia sijaintilähteitä kuten matkapuhelinverkon tietokantaa likimääräisen tablet-laitteen sijainnin määrittämiseen, jos saatavilla. Haittasovellukset saattavat käyttää tätä likimääräisen sijaintisi määrittämiseen."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Käyttää summittaisia sijaintilähteitä, kuten matkapuhelinverkon tietokantaa, määrittääkseen likimääräisen puhelimen sijainnin, jos saatavilla. Haitalliset sovellukset saattavat käyttää tätä likimääräisen sijaintisi määrittämiseen."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"käytä SurfaceFlinger-sovellusta"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Antaa sovelluksen käyttää SurfaceFlinger-sovelluksen alatason ominaisuuksia."</string>
@@ -334,8 +330,8 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Antaa sovelluksen muokata yleisiä ääniasetuksia, kuten äänenvoimakkuutta ja reititystä."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"tallentaa ääntä"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Antaa sovelluksen käyttää äänitallennepolkua."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"ota kuvia"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Antaa sovelluksen ottaa kuvia kameralla. Sovellus saa siis käyttöönsä kaikki kameran näkemät kohteet."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"ota kuvia ja videoita"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Antaa sovelluksen tallentaa kuvia ja videoita kameralla. Näin sovellus voi aina kerätä kameran näkemät kuvat."</string>
     <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"poista tablet-laite käytöstä lopullisesti"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"poista puhelin käytöstä pysyvästi"</string>
     <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Antaa sovelluksen poistaa koko tablet-laitteen käytöstä lopullisesti. Tämä on hyvin vaarallista."</string>
@@ -348,31 +344,29 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Antaa sovelluksen ottaa käyttöön ja poistaa käytöstä tiedostojärjestelmiä siirrettäviin tallennuslaitteisiin."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"alusta ulkoinen tallennustila"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Antaa sovelluksen muokata siirrettävää tallennuslaitetta."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"saa tietoja suojatusta tallennustilasta"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Antaa sovelluksen hankkia suojatussa tallennustilassa olevia tietoja."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"luo suojattua tallennustilaa"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Antaa sovelluksen luoda suojattua tallennustilaa."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"tuhoa suojattua tallennustilaa"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Antaa sovelluksen tuhota suojattua tallennustilaa."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"ota käyttöön / poista käytöstä suojattua tallennustilaa"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Antaa sovelluksen ottaa käyttöön / poistaa käytöstä suojattua tallennustilaa."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"nimeä suojatun tallennustilan uudelleen"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Antaa sovelluksen nimetä suojattua tallennustilaa uudelleen."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"hae tietoja sisäisestä tallennustilasta"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Antaa sovelluksen hakea tietoja sisäisestä tallennustilasta."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"luo sisäistä tallennustilaa"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Antaa sovelluksen luoda sisäistä tallennustilaa."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"tuhoa sisäistä tallennustilaa"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Antaa sovelluksen tuhota sisäistä tallennustilaa."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"ota käyttöön tai poista käytöstä sisäistä tallennustilaa"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Antaa sovelluksen ottaa käyttöön tai poistaa käytöstä sisäistä tallennustilaa."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"nimeä sisäistä tallennustilaa uudelleen"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Antaa sovelluksen nimetä sisäistä tallennustilaa uudelleen."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"hallitse värinää"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Antaa sovelluksen hallita värinää."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"hallitse taskulamppua"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Antaa sovelluksen hallita lamppua."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"käytä USB-tiloja"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Antaa sovelluksen käyttää USB-tiloja."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"testaa laitteistoa"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Antaa sovelluksen hallita useita liitännäislaitteita laitteistotestaustarkoituksessa."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"soittaa puhelinnumeroihin suoraan"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Antaa sovelluksen soittaa puhelinnumeroihin ilman omaa hallintaasi. Haitalliset sovellukset saattavat soittaa odottamattomia puheluita ja kasvattaa puhelinlaskuasi. Huomaa, että tämä ei anna sovellukselle lupaa soittaa hätänumeroihin."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"soita mihin tahansa puhelinnumeroon suoraan"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Antaa sovelluksen soittaa mihin tahansa numeroon, myös hätänumeroihin, ilman omaa hallintaasi. Haitalliset sovellukset saattavat soittaa hätänumeroihin laittomia ja tarpeettomia puheluita."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"aloita CDMA-tabletin asetuksien määrittäminen"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"käynnistä CDMA-tablet-laitteen asetukset"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"aloita CDMA-puhelimen asetuksien määrittäminen"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Antaa sovelluksen aloittaa CDMA-määrityksen. Haitalliset sovellukset saattavat aloittaa CDMA-määrityksen tarpeettomasti."</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"hallitse sijaintien päivitysilmoituksia"</string>
@@ -443,10 +437,8 @@
     <string name="permlab_bluetooth" msgid="8361038707857018732">"luo Bluetooth-yhteyksiä"</string>
     <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Antaa sovelluksen tarkastella paikallisen Bluetooth-tabletin asetuksia sekä muodostaa ja hyväksyä laitepariyhteyksiä."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Antaa sovelluksen tarkastella paikallisen Bluetooth-puhelimen asetuksia sekä muodostaa ja hyväksyä laitepariyhteyksiä muihin laitteisiin."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"hallitse Near Field Communication -tunnistusta"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Antaa sovelluksen viestiä Near Field Communication (NFC) -tunnisteiden, -korttien ja -lukijoiden kanssa."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"poista näppäinlukitus käytöstä"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Antaa sovelluksen poistaa näppäinlukituksen ja siihen liittyvän salasanasuojauksen käytöstä. Esimerkki: puhelin poistaa näppäinlukituksen käytöstä saapuvan puhelun yhteydessä ja ottaa näppäinlukituksen takaisin käyttöön puhelun päätyttyä."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lue synkronointiasetuksia"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Antaa sovelluksen lukea yksityisiä sanoja, nimiä ja ilmauksia, joita käyttäjä on tallentanut sanakirjaan."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"kirjoita käyttäjän määrittämään sanakirjaan"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Antaa sovelluksen kirjoittaa uusia sanoja käyttäjän sanakirjaan."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"muokkaa/poista SD-kortin sisältöä"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"muokkaa/poista USB-sisältöä"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"muokkaa/poista SD-kortin sisältöä"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Antaa sovelluksen kirjoittaa SD-kortille."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Antaa sovelluksen kirjoittaa USB-tallennustilaan."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Antaa sovelluksen kirjoittaa SD-kortille."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"muokkaa/poista säilytystilan sisältöä"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Antaa sovelluksen muokata sisäisen tallennustilan sisältöä."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"käytä välimuistin tiedostojärjestelmää"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Antaa sovelluksen lukea välimuistin tiedostojärjestelmää ja kirjoittaa sinne."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Rajoita salasanaa"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Rajaa käytettävien salasanojen tyyppejä."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Tarkkaile kirjautumisyrityksiä"</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"soita/vastaanota internetpuheluita"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Antaa sovelluksen käyttää SIP-palvelua internetpuheluiden soittamiseen/vastaanottamiseen."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Aseta salasanasäännöt"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Hallinnoi ruudun lukituksenpoistosalasanoissa sallittuja merkkejä ja salasanan pituutta"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Tarkkaile ruudun lukituksen poistoyrityksiä"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Tarkkaile ruudun lukitusta poistettaessa annettujen virheellisten salasanojen lukumäärää ja lukitse tablet-laite tai tyhjennä kaikki tabletin tiedot, jos virheellisiä salasanoja annetaan liian monta."</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Tarkkaile ruudun lukitusta poistettaessa annettujen virheellisten salasanojen lukumäärää ja lukitse tablet-laite tai tyhjennä kaikki tabletin tiedot, jos virheellisiä salasanoja annetaan liian monta."</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Palauta salasana"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Pakota salasanalle uusi arvo ja vaadi järjestelmänvalvojaa antamaan se sinulle ennen kuin voit kirjautua sisään."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Pakota lukitus"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Hallitse laitteen lukittumista, sinun täytyy antaa salasana uudelleen."</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Tarkkaile ruudun lukitusta poistettaessa annettujen virheellisten salasanojen lukumäärää ja lukitse puhelin tai tyhjennä kaikki puhelimen tiedot, jos virheellisiä salasanoja annetaan liian monta."</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Vaihda ruudunlukituksen poiston salasanaa"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Vaihda ruudunlukituksen poiston salasanaa"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Lukitse ruutu"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Hallinnoi, milloin ja miten ruutu lukittuu"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Pyyhi kaikki tiedot"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Tyhjennä tablet-laitteen tiedot varoituksetta palauttamalla tehdasasetukset."</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Tyhjennä tablet-laitteen tiedot varoituksetta palauttamalla tehdasasetukset."</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Tyhjennä puhelimen tiedot varoituksetta palauttamalla tehdasasetukset."</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Aseta laitteen yleinen välityspalvelin"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Aseta laitteen yleinen välityspalvelin käyttöön, kun käytäntö on käytössä. Vain ensimmäinen laitteen järjestelmänhallitsija voi asettaa käytettävän yleisen välityspalvelimen."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Aseta salasanan umpeutuminen"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Valitse, kuinka pian ruudunlukituksen poiston salasana tulee vaihtaa"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Puhelinnumero (koti)"</item>
     <item msgid="869923650527136615">"Mobiili"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Hakulaite (työ)"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Avustaja"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"Multimediaviesti"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Oma"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Syntymäpäivä"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Vuosipäivä"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Tapahtuma"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Muu"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Muokattu"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Sähköposti (koti)"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Työ"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Työ"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Muu"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Muokattu"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Muokattu"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Avustaja"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Veli"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Lapsi"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Avopuoliso"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Isä"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Ystävä"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Johtaja"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Äiti"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Vanhempi"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Kumppani"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Suosittelija"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Sukulainen"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Sisko"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Puoliso"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Muokattu"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Koti"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Työ"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Muu"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Anna PIN-koodi"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Poista lukitus antamalla salasana"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Poista lukitus antamalla PIN-koodi"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Virheellinen PIN-koodi!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Poista lukitus painamalla Valikko-painiketta ja 0-näppäintä."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Hätänumero"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Palaa puheluun"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Oikein!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Yritä uudelleen"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Yritä uudelleen"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Ladataan (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Muutettu."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM-kortti on lukittu."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM-kortin lukitusta poistetaan…"</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Olet piirtänyt lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. "\n\n"Yritä uudelleen <xliff:g id="NUMBER_1">%d</xliff:g> sekunnin kuluttua."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%d</xliff:g> kertaa, sinua pyydetään poistamaan tablet-laitteesi lukitus Google-sisäänkirjautumisen avulla."\n\n" Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Olet antanut salasanasi väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. "\n\n"Yritä uudelleen <xliff:g id="NUMBER_1">%d</xliff:g> sekunnin kuluttua."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Olet antanut PIN-koodisi väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. "\n\n"Yritä uudelleen <xliff:g id="NUMBER_1">%d</xliff:g> sekunnin kuluttua."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Piirsit lukituksenpoistokuvin väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%d</xliff:g> kertaa, sinua pyydetään poistamaan tablet-laitteesi lukitus Google-sisäänkirjautumisen avulla."\n\n" Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%d</xliff:g> kertaa, sinua pyydetään poistamaan puhelimesi lukitus Google-sisäänkirjautumisen avulla."\n\n" Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Yritä uudelleen <xliff:g id="NUMBER">%d</xliff:g> sekunnin kuluttua."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Unohditko mallin?"</string>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Siirrytäänkö pois tältä sivulta?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Valitse OK, jos haluat jatkaa, tai Peruuta, jos et halua siirtyä pois sivulta."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Vahvista"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Vinkki: lähennä ja loitonna kaksoisnapauttamalla"</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Aut. täyt."</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Automaattinen täyttö"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Autom. täyttö"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"lue selaimen historiaa ja kirjanmerkkejä"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Antaa sovelluksen lukea kaikki selaimen käyttämät URL-osoitteet ja selaimen kirjanmerkit."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"kirjoita selaimen historiaa ja kirjanmerkkejä"</string>
     <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Antaa sovelluksen muokata selaimen historiaa tai tablet-laitteellesi tallennettuja kirjanmerkkejä. Haittasovellukset voivat käyttää tätä selaimen tietojen pyyhkimiseen tai muokkaamiseen."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Antaa sovelluksen muokata puhelimeen tallennettuja selaimen historia- ja kirjanmerkkitietoja. Haitalliset sovellukset voivat käyttää tätä pyyhkiäkseen tai muokatakseen selaimen tietoja."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"aseta herätys herätyskelloon"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Antaa sovelluksen asettaa herätyksen asennettuun herätyskellosovellukseen. Kaikki herätyskellosovellukset eivät välttämättä käytä tätä ominaisuutta."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"muokkaa selaimen maantieteellisen sijainnin lupia"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Antaa sovelluksen muokata selaimen maantieteellisen sijainnin lupia. Haitalliset sovellukset saattavat käyttää tätä sijaintitietojen lähettämiseen satunnaisiin verkkosivustoihin."</string>
     <string name="save_password_message" msgid="767344687139195790">"Haluatko selaimen muistavan tämän salasanan?"</string>
@@ -830,15 +784,12 @@
     <string name="cut" msgid="3092569408438626261">"Leikkaa"</string>
     <string name="copy" msgid="2681946229533511987">"Kopioi"</string>
     <string name="paste" msgid="5629880836805036433">"Liitä"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Ei mitään liitettävää"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Kopioi URL-osoite"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Tekstin valinta..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstin valinta"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Syöttötapa"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Muokkaa tekstiä"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstitoiminnot"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Tila vähissä"</string>
     <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Tablet-laitteen tallennustila on vähissä."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Puhelimen tallennustila on vähissä."</string>
@@ -847,8 +798,7 @@
     <string name="yes" msgid="5362982303337969312">"OK"</string>
     <string name="no" msgid="5141531044935541497">"Peruuta"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Huomio"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Ladataan..."</string>
     <string name="capital_on" msgid="1544682755514494298">"OTA KÄYTTÖÖN"</string>
     <string name="capital_off" msgid="6815870386972805832">"POISTA KÄYTÖSTÄ"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Tee toiminto käyttäen sovellusta"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Pakota sulkeutumaan"</string>
     <string name="report" msgid="4060218260984795706">"Ilmoita"</string>
     <string name="wait" msgid="7147118217226317732">"Odota"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Sovellus uudelleenohjasi"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> on nyt käynnissä."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> käynnistettiin alun perin."</string>
+    <string name="smv_application" msgid="295583804361236288">"Sovellus <xliff:g id="APPLICATION">%1$s</xliff:g> (prosessi <xliff:g id="PROCESS">%2$s</xliff:g>) on rikkonut itse käyttöön ottamaansa StrictMode-käytäntöä."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Prosessi <xliff:g id="PROCESS">%1$s</xliff:g> on rikkonut itse käyttöön ottamaansa StrictMode-käytäntöä."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> käynnissä"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Vaihda sovellusta"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Vaihdetaanko sovellusta?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Toinen sovellus on jo käynnissä. Sulje kyseinen sovellus, ennen kuin käynnistät uuden."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Palaa kohteeseen <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Älä käynnistä uutta sovellusta."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Käynnistä <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Pysäytä vanha sovellus tallentamatta."</string>
     <string name="sendText" msgid="5132506121645618310">"Valitse tekstille toiminto"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Soittoäänen voimakkuus"</string>
     <string name="volume_music" msgid="5421651157138628171">"Median äänenvoimakkuus"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Näytä kaikki"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB-massamuisti"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB yhdistetty"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Olet yhdistänyt puhelimesi tietokoneeseesi USB-yhteyden kautta. Valitse alla oleva painike, jos haluat kopioida tiedostoja tietokoneesi ja Androidin SD-korttisi välillä."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Olet yhdistänyt puhelimesi tietokoneeseesi USB-yhteyden kautta. Valitse alla oleva painike, jos haluat kopioida tiedostoja tietokoneesi ja Androidin SD-korttisi välillä."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Olet yhdistänyt laitteesi tietokoneeseesi USB-kaapelin kautta. Kosketa alla olevaa painiketta, jos haluat kopioida tiedostoja tietokoneesi ja Androidin USB-tallennustilan välillä"</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Olet yhdistänyt laitteesi tietokoneeseesi USB-kaapelin kautta. Kosketa alla olevaa painiketta, jos haluat kopioida tiedostoja tietokoneesi ja Androidin SD-kortin välillä."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Ota USB-tallennustila käyttöön"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"SD-kortin käyttämisessä USB-tallennustilana esiintyi ongelma."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"SD-kortin käyttämisessä USB-tallennustilana esiintyi ongelma."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Ongelma käytettäessä USB-tilaa USB-massamuistina."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Ongelma käytettäessä SD-korttia USB-massamuistina."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB yhdistetty"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Kopioi tiedostoja tietokoneelle tai tietokoneelta valitsemalla tämä."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Poista USB-tallennustila käytöstä"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Poista USB-tallennustila käytöstä valitsemalla tämä."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-tallennustila käytössä"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Varmista ennen USB-tallennustilan käytöstä poistoa, että olet poistanut Androidin SD-kortin käytöstä tietokoneestasi."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Varmista ennen USB-tallennustilan kytkemistä pois päältä, että olet poistanut Androidin USB-tallennustilan käytöstä tietokoneellasi."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Varmista ennen USB-tallennustilan käytöstä poistoa, että olet poistanut Androidin SD-kortin käytöstä tietokoneestasi."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Poista USB-tallennustila käytöstä"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Ongelma USB-tallennustilan käytöstä poistamisessa. Tarkista, että olet poistanut USB-laitteen käytöstä ja yritä uudelleen."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Jos otat USB-tallennustilan käyttöön, osa käyttämistäsi sovelluksista pysähtyy eivätkä ne välttämättä ole käytössä kunnes poistat USB-tallennustilan käytöstä."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"USB-toiminto epäonnistui"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Alusta SD-kortti"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Alusta USB-tila"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Alusta SD-kortti"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Haluatko varmasti alustaa SD-kortin? Kaikki kortilla olevat tiedot menetetään."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Haluatko alustaa USB-tilan ja poistaa kaikki siellä olevat tiedostot? Toimintoa ei voi peruuttaa!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Haluatko varmasti alustaa SD-kortin? Kaikki kortilla olevat tiedot menetetään."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Muoto"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-vianetsintä yhdistetty"</string>
@@ -960,28 +897,28 @@
     <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>"kandidaatit"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Valmistellaan SD-korttia"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Valmistellaan USB-tilaa"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Valmistellaan SD-korttia"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Tarkistetaan virheiden varalta."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Tyhjä SD-kortti"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Tyhjä USB-tallennustila"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Tyhjä SD-kortti"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"SD-kortti on tyhjä tai sen tiedostojärjestelmää ei tueta."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"USB-tallennustila on tyhjä tai sen tiedostojärjestelmää ei tueta."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"SD-kortti on tyhjä tai sen tiedostojärjestelmää ei tueta."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Vahingoittunut SD-kortti"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"USB-tila vahingoittunut"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Vahingoittunut SD-kortti"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"SD-kortti vioittunut. Saatat joutua alustamaan kortin."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"USB-tallennustila on vahingoittunut. Voit joutua alustamaan sen uudelleen."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"SD-kortti vioittunut. Saatat joutua alustamaan kortin."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"SD-kortti poistettiin yllättäen"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB-tila poistettiin yllättäen"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD-kortti poistettiin yllättäen"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Poista SD-kortti käytöstä ennen kuin poistat sen, jotta tietoja ei katoa."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Poista USB-tallennustila käytöstä ennen sen irrottamista estääksesi tietoja katoamasta."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Poista SD-kortti käytöstä ennen kuin poistat sen, jotta tietoja ei katoa."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"SD-kortti voidaan poistaa"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Voit nyt poistaa USB-tilan"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD-kortti voidaan poistaa"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Voit nyt poistaa SD-kortin."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Voit nyt poistaa USB-tallennustilan turvallisesti."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Voit nyt poistaa SD-kortin."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"SD-kortti poistettu"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"USB-tallennustila on poistettu"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SD-kortti poistettu"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"SD-kortti poistettu. Aseta uusi kortti."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB-tallennustila poistettu. Lisää uusi laite."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD-kortti poistettu. Aseta uusi kortti."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Osuvia toimintoja ei löytynyt"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"päivitä komponenttien käyttötietoja"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Lähetä"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Seuraava"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Valmis"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Edell."</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Suorita"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Valitse numero"\n" <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Luo yhteystieto"\n"käyttäen numeroa <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Esijaettuun avaimeen perustuva L2TP/IPSec-suojattu VPN-verkko"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Varmenteeseen perustuva L2TP/IPSec-suojattu VPN-verkko"</string>
     <string name="upload_file" msgid="2897957172366730416">"Valitse tiedosto"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Ei valittua tiedostoa"</string>
     <string name="reset" msgid="2448168080964209908">"Palauta"</string>
     <string name="submit" msgid="1602335572089911941">"Lähetä"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Autotila käytössä"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Poistu autotilasta valitsemalla tämä."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Internetyhteyden jakaminen tai yhteyspiste käytössä"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Kosketa ja tee määritykset"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Takaisin"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Seuraava"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Ohita"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Paljon mobiilitiedonsiirtoa"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Saat lisätietoja mobiilitiedonsiirrosta koskettamalla"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Mobiilitiedonsiirtoraja ylitetty"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Saat lisätietoja mobiilitiedonsiirrosta koskettamalla"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Ei tuloksia"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Etsi sivulta"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 tulos"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g>/<xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Valmis"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Poistetaan USB-tallennustilaa käytöstä..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Poistetaan SD-korttia käytöstä..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Tyhjennetään USB-tallennustilaa..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Tyhjennetään SD-korttia..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">" USB-tallennustilan tyhjentäminen epäonnistui."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"SD-kortin tyhjentäminen epäonnistui."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"SD-kortti irrotettiin ennen sen käytöstä poistamista."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB-tallennustilaa tarkistetaan."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"SD-korttia tarkistetaan."</string>
+    <string name="media_removed" msgid="7001526905057952097">"SD-kortti on poistettu."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"USB-tallennustila on tietokoneen käytössä."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"SD-kortti on tietokoneen käytössä."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Ulkoinen media tuntemattomassa tilassa."</string>
+    <string name="share" msgid="1778686618230011964">"Jaa"</string>
+    <string name="find" msgid="4808270900322985960">"Etsi"</string>
+    <string name="websearch" msgid="4337157977400211589">"Verkkohaku"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 9ec5675..3ea7e0d 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"État du support externe inconnu"</string>
     <string name="share" msgid="1778686618230011964">"Partager"</string>
     <string name="find" msgid="4808270900322985960">"Rechercher"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Recherche Web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 2c07d41..40e8dff 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Govorna pošta"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Problem s vezom ili nevažeći MMI kôd."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Operacija je ograničena samo na brojeve s fiksnim biranjem."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Usluga nije omogućena."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Usluga je omogućena za korisnika:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Usluga je onemogućena."</string>
@@ -126,10 +125,10 @@
     <string name="contentServiceSync" msgid="8353523060269335667">"Sinkronizacija"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkronizacija"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Previše brisanja stavki <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
-    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Prostor za pohranu na tablet računalo pun je! Izbrišite dio datoteka da biste oslobodili prostor."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Pohrana tabletnog uređaja je puna! Izbrišite neke datoteke da biste oslobodili prostor."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"Prostor za pohranu na telefonu pun je! Izbrišite dio datoteka da biste oslobodili prostor."</string>
     <string name="me" msgid="6545696007631404292">"Ja"</string>
-    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opcije tablet računala"</string>
+    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opcije tabletnog uređaja"</string>
     <string name="power_dialog" product="default" msgid="1319919075463988638">"Opcije telefona"</string>
     <string name="silent_mode" msgid="7167703389802618663">"Bešumni način"</string>
     <string name="turn_on_radio" msgid="3912793092339962371">"Uključi bežični prijenos"</string>
@@ -137,13 +136,12 @@
     <string name="screen_lock" msgid="799094655496098153">"Zaključavanje zaslona"</string>
     <string name="power_off" msgid="4266614107412865048">"Isključi"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Isključivanje..."</string>
-    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Vaše će se tablet računalo isključiti."</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Vaš tabletni uređaj će se isključiti."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Vaš će se telefon ipak isključiti"</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Želite li isključiti uređaj?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavni"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Nema nedavnih aplikacija."</string>
-    <string name="global_actions" product="tablet" msgid="408477140088053665">"Opcije tablet računala"</string>
+    <string name="global_actions" product="tablet" msgid="408477140088053665">"Opcije tabletnog uređaja"</string>
     <string name="global_actions" product="default" msgid="2406416831541615258">"Opcije telefona"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Zaključavanje zaslona"</string>
     <string name="global_action_power_off" msgid="4471879440839879722">"Isključi"</string>
@@ -160,7 +158,7 @@
     <string name="permgrouplab_messages" msgid="7521249148445456662">"Vaše poruke"</string>
     <string name="permgroupdesc_messages" msgid="7045736972019211994">"Čitajte i pišite SMS-ove, poruke e-pošte i ostale poruke."</string>
     <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Vaši osobni podaci"</string>
-    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Izravan pristup kontaktima i kalendaru pohranjenom na tablet računalu."</string>
+    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Izravan pristup kontaktima i kalendaru pohranjenima na tabletnom uređaju."</string>
     <string name="permgroupdesc_personalInfo" product="default" msgid="5488050357388806068">"Izravan pristup kontaktima i kalendaru pohranjenom na telefonu."</string>
     <string name="permgrouplab_location" msgid="635149742436692049">"Vaša lokacija"</string>
     <string name="permgroupdesc_location" msgid="2430258821648348660">"Praćenje vaše fizičke lokacije"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Razvojni alati"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Značajke potrebne samo za razvojne programere aplikacija."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Prostor za pohranu"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Pristup SD kartici."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Pristupi memoriji USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Pristup SD kartici."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"onemogućavanje ili izmjena trake statusa"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Aplikaciji omogućuje isključivanje trake statusa i uklanjanje sistemskih ikona."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"traka statusa"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Aplikaciji omogućuje da bude traka statusa."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"proširivanje/sažimanje trake statusa"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Aplikaciji omogućuje širenje ili sažimanje na traci statusa."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"prekini izlazne pozive"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"slanje SMS poruka"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Aplikaciji omogućuje slanje SMS poruka. Zlonamjerne aplikacije mogu stvarati troškove slanjem poruka bez vaše potvrde."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"čitanje SMS-a ili MMS-a"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Aplikaciji omogućuje čitanje SMS poruka pohranjenih na tablet računalu ili SIM kartici. Zlonamjerne aplikacije mogu čitati vaše povjerljive poruke."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Aplikaciji omogućuje čitanje SMS poruka pohranjenih na tabletnom uređaju ili SIM kartici. Zlonamjerne aplikacije mogu čitati vaše povjerljive poruke."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Aplikaciji omogućuje čitanje SMS poruka pohranjenih na telefonu ili SIM kartici. Zlonamjerne aplikacije mogu čitati vaše povjerljive poruke."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"uređivanje SMS-a ili MMS-a"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Aplikaciji omogućuje pisanje na SMS poruke pohranjene na tablet računalu ili SIM kartici. Zlonamjerne aplikacije mogu izbrisati vaše poruke."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Aplikaciji omogućuje pisanje u SMS poruke pohranjene na tabletnom uređaju ili SIM kartici. Zlonamjerne aplikacije mogu izbrisati vaše poruke."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Aplikaciji omogućuje pisanje SMS poruka za pohranjivanje na telefonu ili SIM kartici. Zlonamjerne aplikacije mogu izbrisati vaše poruke."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"primanje WAP-a"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Aplikaciji omogućuje primanje i obradu WAP poruka. Zlonamjerne aplikacije mogu pratiti vaše poruke ili ih izbrisati prije nego što ih vi vidite."</string>
@@ -250,7 +246,7 @@
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"upravljanje tokenima aplikacije"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Aplikacijama omogućuje stvaranje tokena i upravljanje tokenima, zaobilaženjem uobičajenog z-rasporeda. Nikad ne bi trebalo koristiti za uobičajene aplikacije."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"pritisnite tipke i gumbe za nadzor"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Aplikaciji omogućuje isporuku vlastitih događaja unosa (pritisci tipki itd.) u drugu aplikaciju. Zlonamjerne aplikacije mogu to upotrijebiti za preuzimanje tablet računala."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Aplikaciji omogućuje isporuku vlastitih događaja unosa (pritisaka tipki itd.) u drugu aplikaciju. Zlonamjerne aplikacije to mogu upotrijebiti za preuzimanje tabletnog uređaja."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Aplikaciji omogućuje isporuku vlastitih unosa događaja (pritiskom tipke itd.) u drugu aplikaciju. Zlonamjerne aplikacije to mogu koristiti za preuzimanje telefona."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"bilježi što pišete i koje radnje poduzimate"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Aplikacijama omogućuje praćenje pritisnutih tipki kod interakcije s drugom aplikacijom (primjerice kod unosa zaporke). Nikad ne bi trebalo koristiti za uobičajene aplikacije."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"izravno instaliranje aplikacija"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Aplikaciji omogućuje instaliranje novih ili ažuriranih paketa sustava Android. Zlonamjerne aplikacije mogu to upotrijebiti za dodavanje aplikacija uz moćna, samovoljna dopuštenja."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"brisanje svih podataka iz predmemorije aplikacije"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Aplikaciji omogućuje oslobađanje mjesta za pohranu na tablet računalu brisanjem datoteka u direktoriju predmemorije aplikacije. Pristup je veoma ograničen obično na sistemski postupak."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Aplikaciji omogućuje oslobađanje mjesta za pohranu na tabletnom uređaju brisanjem datoteka u direktoriju predmemorije aplikacije. Pristup je veoma ograničen obično sistemskom postupku."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Aplikaciji omogućuje oslobađanje mjesta za pohranu na telefonu brisanjem datoteka u direktoriju predmemorije aplikacije. Pristup je veoma ograničen obično sistemskim postupkom."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Premjesti izvore aplikacije"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Aplikaciji omogućuje premještanje resursa aplikacije iz internih na vanjske medije i obratno."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"čitanje datoteka dnevnika sustava"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Aplikaciji omogućuje čitanje raznih sistemskih datoteka dnevnika. Tako možemo otkriti opće informacije o tome što radite na tablet računalu, što potencijalno uključuje osobne i privatne podatke."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Aplikaciji omogućuje čitanje raznih sistemskih datoteka dnevnika. Tako možemo otkriti opće informacije o tome što radite na tablet računalu, što potencijalno uključuje osobne i privatne podatke."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"čitaj osjetljive podatke dnevnika"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Aplikaciji omogućuje čitanje raznih sistemskih datoteka dnevnika. Tako može otkriti opće informacije o tome što radite na tabletnom uređaju, što potencijalno uključuje osobne ili privatne informacije."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Aplikaciji omogućuje čitanje raznih sistemskih datoteka dnevnika. Tako može otkriti opće informacije o tome što radite na telefonu, što potencijalno uključuje osobne ili privatne informacije."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"pisanje/čitanje u resursima čije je vlasnik dijagnostika"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Aplikaciji omogućuje čitanje i pisanje u bilo koji resurs u vlasništvu dijagnostičke grupe; na primjer, datoteke u stavci /dev. To potencijalno može utjecati na stabilnost i sigurnost sustava. To se treba koristiti SAMO za dijagnostiku koja se posebno odnosi na hardver od strane proizvođača ili operatera."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"omogućavanje ili onemogućavanje komponenti aplikacije"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Aplikaciji omogućuje promjenu postavke omogućavanja ili onemogućavanja komponente druge aplikacije. Zlonamjerne aplikacije mogu to upotrijebiti kako bi onemogućile važne mogućnosti tablet računala. Pažljivo upotrebljavajte to dopuštenje jer postoji mogućnost dobivanja komponenata u beskorisnom, nekonzistentnom ili nestabilnom stanju."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Aplikaciji omogućuje promjenu postavke omogućavanja ili onemogućavanja komponente druge aplikacije. Zlonamjerne aplikacije mogu to upotrijebiti kako bi onemogućile važne mogućnosti tablet računala. Pažljivo upotrebljavajte to dopuštenje jer postoji mogućnost dobivanja komponenata u beskorisnom, nekonzistentnom ili nestabilnom stanju."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Aplikaciji omogućuje promjenu postavke omogućavanja ili onemogućavanja komponente druge aplikacije. Zlonamjerne aplikacije mogu to upotrijebiti kako bi onemogućile važne mogućnosti tabletnog uređaja. Pažljivo upotrebljavajte to dopuštenje jer postoji mogućnost dobivanja komponenata u beskorisnom, nekonzistentnom ili nestabilnom stanju."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Aplikaciji omogućuje promjenu postavke omogućavanja ili onemogućavanja komponente druge aplikacije. Zlonamjerne aplikacije mogu to upotrijebiti kako bi onemogućile važne mogućnosti telefona. Pažljivo upotrebljavajte to dopuštenje jer postoji mogućnost dobivanja komponenata u beskorisnom, nekonzistentnom ili nestabilnom stanju."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"postavljanje željene lokacije"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Aplikaciji omogućuje izmjenu željenih aplikacija. To zlonamjernim aplikacijama može omogućiti da neprimjetno mijenjaju pokrenute aplikacije uz preobrazbu postojećih aplikacija na način da prikupljaju vaše osobne podatke."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"izmjena postavki globalnog sustava"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"izmjena karte Google usluga"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Aplikaciji omogućuje izmjenu karte Google usluga. Nije za upotrebu na uobičajenim aplikacijama."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"automatski pokreni ponovno pokretanje"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Aplikacijama omogućuje samopokretanje odmah nakon završetka ponovnog pokretanja sustava. To može uzrokovati duže pokretanje tablet uređaja, a aplikacija može usporiti ukupan rad tablet uređaja."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Aplikaciji omogućuje samopokretanje odmah nakon završetka pokretanja sustava. To može uzrokovati duže pokretanje tabletnog uređaja, a aplikacija ga može usporiti svojim neprekidnim radom."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Aplikacijama omogućuje samopokretanje odmah nakon završetka ponovnog pokretanja sustava. To može uzrokovati duže pokretanje telefona, a aplikacija može usporiti ukupan rad telefona."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"slanje privlačnih prijenosa"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Aplikaciji omogućuje slanje privlačnih prijenosa, koji se zadržavaju nakon završetka prijenosa. Zlonamjerne aplikacije mogu usporiti rad tablet računala ili ga učiniti nestabilnim uz upotrebu previše memorije."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Aplikaciji omogućuje slanje privlačnih prijenosa, koji se zadržavaju nakon završetka prijenosa. Zlonamjerne aplikacije mogu usporiti rad tabletnog uređaja ili ga učiniti nestabilnim uz upotrebu previše memorije."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Aplikaciji omogućuje slanje privlačnih prijenosa, koji se zadržavaju nakon završetka prijenosa. Zlonamjerne aplikacije mogu usporiti rad telefona ili ga učiniti nestabilnim uz upotrebu previše memorije."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"čitanje kontaktnih podataka"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Aplikaciji omogućuje čitanje svih podataka o kontaktima (adrese) koji su pohranjeni na tablet računalu. Zlonamjerne aplikacije mogu to upotrijebiti za slanje podataka drugim ljudima."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Aplikaciji omogućuje čitanje svih podataka o kontaktima (adrese) koji su pohranjeni na tabletnom uređaju. Zlonamjerne aplikacije to mogu upotrijebiti za slanje podataka drugim ljudima."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Aplikaciji omogućuje čitanje svih podataka o kontaktima (adrese) koji su pohranjeni na računalu. Zlonamjerne aplikacije to mogu koristiti za slanje podataka drugim ljudima."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"pisanje kontaktnih podataka"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Aplikaciji omogućuje izmjenu kontaktnih podataka (adrese) koji su pohranjeni na vašem tablet računalu. Zlonamjerne aplikacije mogu to upotrijebiti za brisanje ili izmjenu vaših kontaktnih podataka."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Aplikaciji omogućuje izmjenu kontaktnih podataka (adrese) koji su pohranjeni na vašem tabletnom uređaju. Zlonamjerne aplikacije mogu to upotrijebiti za brisanje ili izmjenu kontaktnih podataka."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Aplikaciji omogućuje izmjenu kontaktnih podataka (adrese) koji su pohranjeni na vašem telefonu. Zlonamjerne aplikacije to mogu koristiti za brisanje ili izmjenu vaših kontaktnih podataka."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"čitanje kalendarskih događaja"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Aplikaciji omogućuje čitanje svih kalendarskih događaja pohranjenih na tablet računalu. Zlonamjerne aplikacije mogu to upotrijebiti za slanje kalendarskih događaja drugim ljudima."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Aplikaciji omogućuje čitanje svih događaja na kalendaru koji su pohranjeni na tabletnom uređaju. Zlonamjerne aplikacije to mogu upotrijebiti za slanje događaja na kalendaru drugim ljudima."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Aplikaciji omogućuje čitanje svih kalendarskih događaja pohranjenih na računalu. Zlonamjerne aplikacije to mogu koristiti za slanje kalendarskih događaja drugim ljudima."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"dodavanje ili izmjena kalendarskih događaja i slanje e-pošte gostima"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Aplikaciji omogućuje dodavanje i promjenu događaja na kalendaru, čime se mogu slati poruke e-pošte gostima. Zlonamjerne aplikacije to mogu koristiti za brisanje ili izmjenu kalendarskih događaja ili za slanje poruka e-pošte gostima."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"dopuštenje za instaliranje davatelja usluge lociranja"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Stvorite izvore približnih lokacija za testiranje. Zlonamjerne aplikacije to mogu koristiti za poništavanje lokacije i/ili statusa koji prikazuju pravi izvori lokacija poput GPS-a ili mrežnih davatelja ili mogu pratiti i prijavljivati vašu lokaciju vanjskom izvoru."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"ispravna (GPS) lokacija"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Pristupite preciznim izvorima lokacije kao što je Global Positioning System na tablet računalu, ako je to dostupno. Zlonamjerne aplikacije mogu to upotrijebiti kako bi utvrdile vaš položaj i mogu dodatno crpiti baterijsku energiju."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Pristupite preciznim izvorima lokacije kao što je Global Positioning System na tabletnom uređaju, gdje je to dostupno. Zlonamjerne aplikacije mogu to upotrijebiti kako bi utvrdile vaš položaj i mogu dodatno crpiti baterijsku energiju."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Pristupite izvorima lokacije kao što je Global Positioning System na telefonu, ako je to dostupno. Zlonamjerne aplikacije mogu to upotrijebiti kako bi utvrdile vaš položaj i mogu dodatno crpiti baterijsku energiju."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"široka (mrežno temeljena) lokacija"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Pristupite općim izvorima lokacije poput podatkovne baze mobilne mreže kako biste utvrdili približnu lokaciju tablet računala, ako je to dostupno. Zlonamjerne aplikacije mogu to upotrijebiti za približno utvrđivanje vašeg položaja."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Pristupite općim izvorima lokacije poput podatkovne baze mobilne mreže kako biste utvrdili približnu lokaciju telefona, ako je to dostupno. Zlonamjerne aplikacije mogu to upotrijebiti za približno utvrđivanje vašeg položaja."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Pristupite općim izvorima lokacije poput podatkovne baze mobilne mreže kako biste utvrdili približnu lokaciju telefona, ako je to dostupno. Zlonamjerne aplikacije to mogu koristiti za približno utvrđivanje vašeg položaja."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"pristup značajci SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Aplikacijama omogućuje upotrebu niskorazinskih usluga SurfaceFlinger."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Aplikaciji omogućuje izmjenu globalnih zvučnih postavki, poput glasnoće i usmjeravanja."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"snimanje zvuka"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Aplikaciji omogućuje pristup putu za snimanje zvuka."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"snimanje slika"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Aplikacijama omogućuje snimanje slika fotoaparatom. To aplikaciji omogućuje prikupljanje slika s fotoaparata u bilo kojem trenutku."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trajno onemogući tablet računalo"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"snimi fotografije i videozapise"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Aplikacijama omogućuje snimanje slika i videozapisa fotoaparatom. To aplikaciji omogućuje prikupljanje slika s fotoaparata u bilo kojem trenutku."</string>
+    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trajno onemogući tabletni uređaj"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"trajno onemogućavanje telefona"</string>
-    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Aplikaciji omogućuje trajno isključivanje cijelog tablet računala. To je veoma opasno."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Aplikaciji omogućuje trajno isključivanje cijelog tabletnog uređaja. To je veoma opasno."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Aplikaciji omogućuje trajno isključivanje cijelog telefona. To je veoma opasno."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"prisilno ponovno pokreni tablet računalo"</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"prisilno ponovno pokretanje tabletnog uređaja"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"prisilno ponovno pokretanje telefona"</string>
-    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Aplikaciji omogućuje prisilno ponovno pokretanje tablet računala."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Aplikaciji omogućuje prisilno ponovno pokretanje tabletnog uređaja."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Aplikaciji omogućuje prisilno ponovno pokretanje telefona."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"učitavanje i skidanje datotečnih sustava"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Aplikaciji omogućuje uključivanje i isključivanje sustava datoteka prijenosnih uređaja za pohranjivanje."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatiranje vanjske pohrane"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Aplikaciji omogućuje formatiranje prijenosnog uređaja za pohranjivanje."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"dobivanje informacija iz sigurnog mjesta za pohranu"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Aplikaciji omogućuje dobivanje informacija o sigurnom pohranjivanju."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"stvaranje sigurnog pohranjivanja"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Aplikaciji omogućuje stvaranje sigurno pohranjivanje."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"uništavanje sigurnog pohranjivanja"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Aplikaciji omogućuje uklanjanje prostora za sigurno pohranjivanje."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"uključivanje/isključivanje sigurnog pohranjivanja"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Aplikaciji omogućuje uključivanje/isključivanje sigurnog pohranjivanja."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"promjena naziva sigurnog pohranjivanja"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Aplikaciji omogućuje promjenu naziva za sigurno pohranjivanje."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"dohvati informacije o unutarnjoj pohrani"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Omogućuje aplikaciji dohvaćanje informacija o unutarnjoj pohrani."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"stvori unutarnju pohranu"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Aplikaciji omogućuje stvaranje unutarnjeg pohranjivanja."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"uništi unutarnju pohranu"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Aplikaciji omogućuje uništavanje unutarnjeg pohranjivanja."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"uključi/isključi unutarnju pohranu"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Aplikaciji omogućuje uključivanje/isključivanje unutarnjeg pohranjivanja."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"preimenuj unutarnju pohranu"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Aplikaciji omogućuje preimenovanje unutarnjeg pohranjivanja."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"nadzor nad vibracijom"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Aplikaciji omogućuje nadzor nad vibracijom."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"nadzor bljeskalice"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Aplikaciji omogućuje nadzor nad bljeskalicom."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"pristupi USB uređajima"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Omogućuje aplikaciji pristup USB uređajima."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"testiranje hardvera"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Aplikacijama omogućuje nadzor nad raznim vanjskim jedinicama u svrhu hardverskog testiranja."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"izravno pozivanje telefonskog broja"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Aplikaciji omogućuje pozivanje telefonskih brojeva bez vašeg znanja. Zlonamjerne aplikacije mogu uspostavljati neočekivane pozive i opteretiti telefonski račun. Napominjemo da ovime ne omogućujete aplikaciji pozivanje hitnih službi."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"izravno pozivanje bilo kojeg telefonskog broja"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Aplikacijama omogućuje pozivanje bilo kojeg telefonskog broja, uključujući brojeve hitnih službi, bez vašeg znanja. Zlonamjerne aplikacije mogu upućivati nepotrebne i nedopuštene pozive hitnim službama."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"izravno pokretanje postavke CDMA tablet računala"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"izravno pokreni postavljanje CDMA tabletnog uređaja"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"izravno pokretanje postavke CDMA telefona"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Aplikaciji omogućuje pokretanje dobivanja značajke CDMA. Zlonamjerne aplikacije mogu nepotrebno pokrenuti dobivanje značajke CDMA"</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"obavijesti o ažuriranju kontrolne lokacije"</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Aplikaciji omogućuje nadzor nad telefonskim značajkama na uređaju. Aplikacija s tim dopuštenjem može mijenjati mreže, uključivati i isključivati radio na telefonu i slične stvari bez vašeg znanja."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"čitanje stanja i identiteta računala"</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Aplikaciji omogućuje da pristupi telefonskim značajkama uređaja. Aplikacija s tim dopuštenjem može utvrditi telefonski broj i serijski broj telefona, može utvrditi je li poziv aktivan, broj pozivatelja i slične značajke."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"spriječi tablet računalo da prijeđe u stanje mirovanja"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"spriječi mirovanje tabletnog uređaja"</string>
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"sprečava telefon da prijeđe u stanje mirovanja"</string>
-    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Aplikaciji omogućuje da spriječi prelazak tablet računala u mirovanje."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Aplikaciji omogućuje da spriječi prelazak tabletnog uređaja u mirovanje."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Aplikaciji omogućuje da spriječi prelazak telefona u mirovanje."</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"uključivanje ili isključivanje tablet računala"</string>
+    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"uključivanje ili isključivanje tabletnog uređaja"</string>
     <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"uključivanje ili isključivanje telefona"</string>
-    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Aplikaciji omogućuje uključivanje ili isključivanje tablet računala."</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Aplikaciji omogućuje uključivanje i isključivanje tabletnog uređaja."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Aplikaciji omogućuje uključivanje ili isključivanje telefona."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"pokretanje u tvorničkom testnom načinu rada"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Pokrenite kao niskorazinski proizvođački test, uz omogućavanje potpunog pristupa hardveru tablet računala. Dostupno je samo ako tablet računalo radi u proizvođačkom testnom načinu rada."</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Pokrenite kao niskorazinski proizvođački test, uz omogućavanje potpunog pristupa hardveru tabletnog uređaja. Dostupno je samo ako tabletni uređaj radi u proizvođačkom testnom načinu rada."</string>
     <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Pokrenite kao niskorazinski proizvođački test, uz omogućavanje potpunog pristupa telefonskom hardveru. Dostupno je samo ako telefon radi u proizvođačkom testnom načinu rada."</string>
     <string name="permlab_setWallpaper" msgid="6627192333373465143">"postavi pozadinsku sliku"</string>
     <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Aplikaciji omogućuje postavljanje sistemske pozadinske slike."</string>
@@ -403,15 +397,15 @@
     <string name="permlab_masterClear" msgid="2315750423139697397">"poništavanje sustava na tvornički zadane postavke"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Aplikaciji omogućuje da potpuno poništi rad sustava na tvorničke postavke brisanjem svih podataka, konfiguracije i instaliranih aplikacija."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"postavljanje vremena"</string>
-    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Aplikaciji omogućuje promjenu vremena na satu tablet računala."</string>
+    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Aplikaciji omogućuje promjenu vremena na satu tabletnog uređaja."</string>
     <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Aplikaciji omogućuje promjenu vremena na satu telefona."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"postavljanje vremenske zone"</string>
-    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Aplikaciji omogućuje promjenu vremenske zone na tablet računalu."</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Aplikaciji omogućuje promjenu vremenske zone na tabletnom uređaju."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Aplikaciji omogućuje promjenu vremenske zone na telefonu."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"ima ulogu Usluge voditelja računa"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Aplikaciji omogućuje pozivanje kontrolora autentičnosti računa"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"otkrivanje poznatih računa"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Aplikaciji omogućuje dobivanje popisa računa koje poznaje tablet računalo."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Aplikaciji omogućuje dobivanje popisa računa koje tabletni uređaj poznaje."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Aplikaciji omogućuje dobivanje popisa računa koje poznaje telefon."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"ima ulogu kontrolora autentičnosti računa"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Aplikaciji omogućuje upotrebu mogućnosti za provjeru vjerodostojnosti računa koja je dio značajke AccountManager, uključujući stvaranje računa te dobivanje i postavljanje zaporki."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"omogući višenamjenski Wi-Fi prijem"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Aplikaciji omogućuje primanje paketa koji nisu izravno upućeni na vaš uređaj. To može biti korisno za otkrivanje obližnjih usluge. Koristi više energije od višenamjenskog načina rada."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"bluetooth administracija"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Aplikaciji omogućuje konfiguraciju lokalnog Bluetooth tablet računala te otkrivanje i sparivanje s udaljenim uređajima."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Aplikaciji omogućuje konfiguraciju lokalnog tabletnog uređaja s Bluetoothom te otkrivanje i sparivanje s udaljenim uređajima."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Aplikaciji omogućuje konfiguraciju lokalnog Bluetooth telefona i otkrivanje i sparivanje s udaljenim uređajima."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"stvaranje Bluetooth veza"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Aplikaciji omogućuje pregled konfiguracije lokalnog Bluetooth tablet računala i uspostavljanje i prihvaćanje veza sa sparenim uređajima."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Aplikaciji omogućuje pregled konfiguracije lokalnog Bluetooth tabletnog uređaja i uspostavljanje i prihvaćanje veza sa sparenim uređajima."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Aplikaciji omogućuje pregled konfiguracije lokalnog Bluetooth telefona i uspostavljanje i prihvaćanje veza sa sparenim uređajima."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"upravljaj beskontaktnom (NFC) komunikacijom"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Aplikaciji omogućuje komunikaciju s Near Field Communication (NFC) oznakama, karticama i čitačima."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"onemogući zaključavanje tipkovnice"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Aplikaciji omogućuje isključivanje zaključavanja tipkovnice i svih povezanih sigurnosnih zaporki. Jasan primjer toga daje isključivanje zaključavanja telefona kod primanja poziva, koje se ponovno aktivira nakon završetka poziva."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čitanje postavki sinkronizacije"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Aplikaciji omogućuje čitanje osobnih riječi, imena i izraza koje je korisnik možda spremio u korisničkom rječniku."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"pisanje u korisnički definiran rječnik"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Aplikaciji omogućuje pisanje novih riječi u korisnički rječnik."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"izmjena/brisanje sadržaja SD kartice"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"izmjeni/briši sadržaje memorije USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"izmjena/brisanje sadržaja SD kartice"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Aplikaciji omogućuje pisanje na SD karticu."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Omog. pisanje na USB memoriju."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Aplikaciji omogućuje pisanje na SD karticu."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"izmijeni/briši sadržaje unutarnjih medija pohrane"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Omogućuje aplikaciji izmjenu sadržaja pohrane unutarnjih medija."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"pristup sustavu datoteka predmemorije"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Aplikaciji omogućuje čitanje i pisanje u sustav datoteka predmemorije."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Ograniči zaporku"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Ograničite vrste zaporki koje smijete koristiti."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Prati pokušaje prijave"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Nadziri broj netočnih zaporki unesenih pri otključavanju zaslona i zaključaj tablet računalo ili izbriši sve podatke s njega ako je uneseno previše netočnih zaporki"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Nadziri broj netočnih zaporki unesenih pri otključavanju zaslona i zaključaj tablet računalo ili izbriši sve podatke s njega ako je uneseno previše netočnih zaporki"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Poništi zaporku"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Promijenite zaporku koju vam je prethodno trebao dati administrator."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Pokreni zaključavanje"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Nadzire trenutak zaključavanja uređaja, zahtijeva ponovni unos zaporke."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"zovi/primaj internetske pozive"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Aplikaciji omogućuje upotrebu SIP usluge za nazivanje/primanje internetskih poziva."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Postavi pravila zaporke"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Nadziri duljinu i znakove dopuštene u zaporci za otključavanje zaslona"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Nadgledaj pokušaje otključavanja zaslona"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Nadgledaj broj pogrešno unesenih zaporki za otključavanje zaslona i zaključaj tabletni uređaj ili izbriši sve podatke ako je uneseno previše pogrešnih zaporki"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Nadgledaj broj pogrešno unesenih zaporki za otključavanje zaslona i zaključaj telefon ili izbriši sve podatke ako je uneseno previše pogrešnih zaporki"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Promijeni zaporku za otključavanje zaslona"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Promijeni zaporku za otključavanje zaslona"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Zaključaj zaslon"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Nadziri kako se i kada zaslon zaključava"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Izbriši sve podatke"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Izbriši podatke tablet računala bez upozorenja, vraćanjem na tvorničko stanje"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Izbriši podatke tablet računala bez upozorenja, vraćanjem na tvorničko stanje"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Izbriši podatke tabletnog uređaja bez upozorenja vraćanjem u tvorničko stanje"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Izbriši podatke telefona bez upozorenja vraćanjem u tvorničko stanje"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"postavi globalni proxy uređaja"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Postavi globalni proxy uređaja za upotrebu dok su pravila omogućena. Samo prvi administrator uređaja postavlja djelotvoran globalni proxy."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Postavi istek zaporke"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Nadzirite za koliko vremena zaporka za zaključani zaslon treba biti promijenjena"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Početna"</item>
     <item msgid="869923650527136615">"Mobilni"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Poslovni dojavljivač"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Pomoćnik"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Prilagođeno"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Rođendan"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Godišnjica"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Događaj"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Drugo"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Prilagođeno"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Početna"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Posao"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Posao"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Ostalo"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Prilagođeno"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Prilagođeno"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Pomoćnik"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Brat"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Dijete"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Partner u kućanstvu"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Otac"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Prijatelj"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Voditelj"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Majka"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Roditelj"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Preporučuje"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Rođak"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Sestra"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Bračni partner"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Prilagođeno"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Početna"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Posao"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Drugo"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Unesite PIN kôd"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Unesite zaporku za otključavanje"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Unesite PIN za otključavanje"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Netočan PIN kôd!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Za otključavanje pritisnite Izbornik pa 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Broj hitne službe"</string>
@@ -646,14 +609,13 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Uzvrati poziv"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Ispravno!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Žao nam je, pokušajte ponovo"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Pokušajte ponovno"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Punjenje (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Napunjeno."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="lockscreen_low_battery" msgid="1482873981919249740">"Priključite punjač."</string>
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Nema SIM kartice."</string>
-    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"U tablet računalu nema SIM kartice."</string>
+    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"U tabletnom uređaju nema SIM kartice."</string>
     <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"U telefonu nema SIM kartice."</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Umetnite SIM karticu."</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"Samo hitni pozivi"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM kartica je zaključana."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Otključavanje SIM kartice…"</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Netočno ste iscrtali uzorak <xliff:g id="NUMBER_0">%d</xliff:g> puta. "\n\n"Pokušajte ponovo za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon još <xliff:g id="NUMBER_1">%d</xliff:g> neuspješnih pokušaja, morat ćete otključati telefon pomoću Google prijave."\n\n" Pokušajte ponovo za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Netočno ste unijeli zaporku <xliff:g id="NUMBER_0">%d</xliff:g> puta. "\n\n"Pokušajte ponovno za <xliff:g id="NUMBER_1">%d</xliff:g> sekunda."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Netočno ste unijeli PIN <xliff:g id="NUMBER_0">%d</xliff:g> puta. "\n\n"Pokušajte ponovno za <xliff:g id="NUMBER_1">%d</xliff:g> sekunda."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon još <xliff:g id="NUMBER_1">%d</xliff:g> neuspješna pokušaja, zamolit ćemo vas da otključate tabletni uređaj pomoću Google prijave."\n\n" Pokušajte ponovno za <xliff:g id="NUMBER_2">%d</xliff:g> sekunda."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon još <xliff:g id="NUMBER_1">%d</xliff:g> neuspješna pokušaja, morat ćete otključati telefon pomoću Google prijave."\n\n" Pokušajte ponovo za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Pokušajte ponovno za <xliff:g id="NUMBER">%d</xliff:g> s."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Zaboravili ste uzorak?"</string>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Želite otići s ove lokacije?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Za nastavak odaberite U redu ili da biste ostali na trenutačnoj stranici odaberite Odustani."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Potvrdi"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Savjet: Dvaput dotaknite za povećanje i smanjivanje."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"AutoFill"</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Automatsko popunjavanje"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Postavi autopop."</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"čitanje povijesti i oznaka preglednika"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Aplikaciji omogućuje čitanje svih URL-ova koje je preglednik posjetio i svih oznaka iz preglednika."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"pisanje povijesti i oznaka preglednika"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Aplikaciji omogućuje izmjenu povijesti ili oznaka preglednika koji su pohranjeni na vašem tablet računalu. Zlonamjerne aplikacije mogu to upotrijebiti za brisanje ili izmjenu podataka o pregledniku."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Aplikaciji omogućuje izmjenu povijesti ili oznaka preglednika koji su pohranjeni na vašem telefonu. Zlonamjerne aplikacije to mogu upotrijebiti za brisanje ili izmjenu podataka o pregledniku."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Aplikaciji omogućuje izmjenu povijesti ili oznaka preglednika koji su pohranjeni na vašem telefonu. Zlonamjerne aplikacije to mogu koristiti za brisanje ili izmjenu podataka o pregledniku."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"namjesti alarm na budilici"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Omogućuje aplikaciji da namjesti alarm u instaliranoj aplikaciji budilice. Neke aplikacije budilice možda neće primijeniti ovu značajku."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Izmijeni dopuštenja za geo-lociranje u pregledniku"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Aplikaciji omogućuje izmjenu dopuštenja za geolokaciju u pregledniku. Zlonamjerne aplikacije to mogu koristiti za omogućavanje slanja informacija o lokaciji na proizvoljne web-lokacije."</string>
     <string name="save_password_message" msgid="767344687139195790">"Želite li da preglednik zapamti ovu zaporku?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"Izreži"</string>
     <string name="copy" msgid="2681946229533511987">"Kopiraj"</string>
     <string name="paste" msgid="5629880836805036433">"Zalijepi"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Ništa za lijepljenje"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Kopiraj URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Odabir teksta..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Odabir teksta"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Način unosa"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Uredi tekst"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Radnje s tekstom"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Prostora ima sve manje"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Prostora za pohranjivanje na tablet računalu ima sve manje."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Prostora za pohranjivanje na tabletnom uređaju ima sve manje."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Prostora za pohranjivanje na telefonu ima sve manje."</string>
     <string name="ok" msgid="5970060430562524910">"U redu"</string>
     <string name="cancel" msgid="6442560571259935130">"Odustani"</string>
     <string name="yes" msgid="5362982303337969312">"U redu"</string>
     <string name="no" msgid="5141531044935541497">"Odustani"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Pažnja"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Učitavanje..."</string>
     <string name="capital_on" msgid="1544682755514494298">"Uključeno"</string>
     <string name="capital_off" msgid="6815870386972805832">"Isključeno"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Radnju dovrši pomoću stavke"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Prisilno zatvori"</string>
     <string name="report" msgid="4060218260984795706">"Izvješće"</string>
     <string name="wait" msgid="7147118217226317732">"Pričekaj"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Aplikacija preusmjerena"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> se izvodi sada."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> pokrenuta je prva."</string>
+    <string name="smv_application" msgid="295583804361236288">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) prekršila je svoje vlastito pravilo StrictMode."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> prekršio je svoje vlastito pravilo StrictMode."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"Izvodi se <xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Odaberite za izmjenu aplikacije"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Izmjena aplikacija?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Već se izvodi neka druga aplikacija koja se mora zaustaviti prije pokretanje nove."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Natrag na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Ne pokreći novu aplikaciju."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Pokreni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Zaustavi staru aplikaciju bez spremanja."</string>
     <string name="sendText" msgid="5132506121645618310">"Odaberite radnju za tekst"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Glasnoća zvona"</string>
     <string name="volume_music" msgid="5421651157138628171">"Glasnoća medija"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Pokaži sve"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB masovno pohranjivanje"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB povezan"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Povezali ste računalo preko USB-a. Odaberite donji gumb ako želite kopirati datoteke s jednog računala na drugi i na SD karticu Androida."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Povezali ste računalo preko USB-a. Odaberite donji gumb ako želite kopirati datoteke s jednog računala na drugi i na SD karticu Androida."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Povezali ste se s računalom putem USB-a. Dodirnite donji gumb ako želite kopirati datoteke s računala na USB memoriju svojeg Androida ili obrnuto."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Povezali ste se s računalom putem USB-a. Dodirnite donji gumb ako želite kopirati datoteke s računala na karticu SD svojeg Androida ili obrnuto."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Uključi USB pohranjivanje"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Došlo je do problema s upotrebom SD kartice za USB pohranjivanje."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Došlo je do problema s upotrebom SD kartice za USB pohranjivanje."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Došlo je do problema s upotrebom USB memorije za za masovnu pohranu putem USB-a."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Došlo je do problema s upotrebom SD kartice za USB masovnu pohranu."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB povezan"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Odaberite za kopiranje datoteka na računalo ili s računala."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Isključi USB pohranjivanje"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Odaberite za isključivanje USB pohrane."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"USB pohrana se koristi"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Prije isključivanja USB pohranjivanja, morate izvaditi (“izbaciti”) SD karticu uređaja Android iz računala."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Prije isključivanja USB pohranjivanja, morate izvaditi (“izbaciti”) USB memoriju uređaja Android iz računala."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Prije isključivanja USB pohranjivanja, morate izvaditi (“izbaciti”) SD karticu uređaja Android iz računala."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Isključi USB pohranjivanje"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Došlo je do problema kod isključivanja USB pohranjivanja. Provjerite jeste li odspojili USB host, a zatim pokušajte ponovo."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Ako uključite USB pohranjivanje, neke aplikacije koje koristite zaustavit će se i možda neće biti dostupne sve dok ne isključite USB pohranjivanje."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Rad USB-a nije uspio"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"U redu"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formatiraj SD karticu"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Format. USB memoriju"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Formatiraj SD karticu"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Jeste li sigurni da želite formatirati SD karticu? Svi podaci na kartici bit će izgubljeni."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Formatirati USB memoriju uz brisanje svih pohranjenih datoteka? Radnja se ne može poništiti!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Jeste li sigurni da želite formatirati SD karticu? Svi podaci na kartici bit će izgubljeni."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Priključen je alat za uklanjanje programske pogreške USB-a"</string>
@@ -960,28 +897,28 @@
     <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>"kandidati"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Priprema SD kartice"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Pripremanje memorije USB"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Priprema SD kartice"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Traženje pogrešaka."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Prazna SD kartica"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Prazna memorija USB"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Prazna SD kartica"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"SD kartica je prazna ili ima nepodržani sustav datoteka."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Memorija USB je prazna ili ima nepodržan sustav datoteka."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"SD kartica je prazna ili ima nepodržani sustav datoteka."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Oštećena SD kartica"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Oštećena USB memorija"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Oštećena SD kartica"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Oštećena je SD kartica. Možda biste je trebali preformatirati."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Oštećena je memorija USB. Možda biste je trebali preformatirati."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Oštećena je SD kartica. Možda biste je trebali preformatirati."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"SD kartica neočekivano je uklonjena"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Memorija USB nenadano uklonjena"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD kartica neočekivano je uklonjena"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"SD karticu isključite na siguran način prije uklanjanja kako biste izbjegli gubitak podataka."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Isključite USB memoriju na siguran način prije uklanjanja kako biste izbjegli gubitak podataka."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"SD karticu isključite na siguran način prije uklanjanja kako biste izbjegli gubitak podataka."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"SD kartica može se ukloniti na siguran način"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Sigurno uklanjanje memorije USB"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD kartica može se ukloniti na siguran način"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Možete ukloniti SD karticu na siguran način."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"USB memoriju možete sigurno ukloniti."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Možete ukloniti SD karticu na siguran način."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Uklonjena SD kartica"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Memorija USB uklonjena"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Uklonjena SD kartica"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"SD kartica je uklonjena. Umetnite novu."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Memorija USB uklonjena. Umetnite novi medij."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD kartica je uklonjena. Umetnite novu."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Nisu pronađene podudarne radnje"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"statistika o upotrebi ažurirane komponente"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Pošalji"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Dalje"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Gotovo"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Preth."</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Pokreni"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Biraj broj"\n"koristeći <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Stvori kontakt"\n"koristeći <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Unaprijed dijeljeni L2TP/IPSec VPN temeljen na ključu"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN temeljen na certifikatu"</string>
     <string name="upload_file" msgid="2897957172366730416">"Odaberite datoteku"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Nema odabranih datoteka"</string>
     <string name="reset" msgid="2448168080964209908">"Ponovo postavi"</string>
     <string name="submit" msgid="1602335572089911941">"Pošalji"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Omogućen je način rada za automobil"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Odaberite za izlaz iz načina rada za automobil."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Ograničenje ili aktivan hotspot"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Dodirnite za konfiguraciju:"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Natrag"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Dalje"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Preskoči"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Upotreba velike količine mobilnih podataka"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Dotaknite da biste saznali više o upotrebi mobilnih podataka"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Prekoračeno je ograničenje za podatke na mobilnom uređaju"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Dotaknite da biste saznali više o upotrebi mobilnih podataka"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Nema rezultata"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Pronađi na stranici"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 podudaranje"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Gotovo"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Isključivanje memorije USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Isključivanje SD kartice..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Brisanje memorije USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Brisanje SD kartice..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Brisanje memorije USB nije uspjelo."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Brisanje SD kartice nije uspjelo."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"Kartica SD uklonjena je prije isključivanja."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Memorija USB trenutačno se provjerava."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"Kartica SD trenutno se provjerava."</string>
+    <string name="media_removed" msgid="7001526905057952097">"Kartica SD uklonjena je."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"USB memoriju trenutačno upotrebljava računalo."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Karticu SD trenutačno upotrebljava računalo."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Vanjski mediji u nepoznatom stanju."</string>
+    <string name="share" msgid="1778686618230011964">"Dijeli"</string>
+    <string name="find" msgid="4808270900322985960">"Pronađi"</string>
+    <string name="websearch" msgid="4337157977400211589">"Pretraž. weba"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 017e837..3af0925 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Hangposta"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Kapcsolódási probléma vagy érvénytelen MMI-kód."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"A művelet fix hívószámokra van korlátozva."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"A szolgáltatás engedélyezésre került."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Engedélyezett szolgáltatás(ok):"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"A szolgáltatás ki van kapcsolva."</string>
@@ -126,10 +125,10 @@
     <string name="contentServiceSync" msgid="8353523060269335667">"Szinkronizálás"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Szinkronizálás"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Túl sok <xliff:g id="CONTENT_TYPE">%s</xliff:g> törlés."</string>
-    <string name="low_memory" product="tablet" msgid="2292820184396262278">"A táblagép tárhelye megtelt. Töröljön néhány fájlt."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"A táblagép tárhelye tele van. Szabadítson fel helyet néhány fájl törlésével."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"A telefon tárhelye megtelt! Hely felszabadításához töröljön néhány fájlt."</string>
     <string name="me" msgid="6545696007631404292">"Saját"</string>
-    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"A táblagép lehetőségei"</string>
+    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Táblagép beállításai"</string>
     <string name="power_dialog" product="default" msgid="1319919075463988638">"Telefonbeállítások"</string>
     <string name="silent_mode" msgid="7167703389802618663">"Néma üzemmód"</string>
     <string name="turn_on_radio" msgid="3912793092339962371">"Vezeték nélküli eszköz bekapcsolása"</string>
@@ -137,13 +136,12 @@
     <string name="screen_lock" msgid="799094655496098153">"Képernyő lezárása"</string>
     <string name="power_off" msgid="4266614107412865048">"Kikapcsolás"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Leállítás..."</string>
-    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"A táblagép le fog állni."</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"A táblagép ki fog kapcsolni."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"A telefon le fog állni."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Kikapcsolja?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Legutóbbiak"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Nincs új alkalmazás."</string>
-    <string name="global_actions" product="tablet" msgid="408477140088053665">"A táblagép lehetőségei"</string>
+    <string name="global_actions" product="tablet" msgid="408477140088053665">"Táblagép beállításait"</string>
     <string name="global_actions" product="default" msgid="2406416831541615258">"Telefonbeállítások"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Képernyő lezárása"</string>
     <string name="global_action_power_off" msgid="4471879440839879722">"Kikapcsolás"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Fejlesztői eszközök"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Csak az alkalmazásfejlesztők számára fontos funkciók."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Tárhely"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Az SD-kártya elérése."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Az USB-tár elérése."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Az SD-kártya elérése."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"állapotsor kikapcsolása vagy módosítása"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Lehetővé teszi az alkalmazás számára az állapotsor kikapcsolását és a rendszerikonok hozzáadását, illetve eltávolítását."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"állapotsor"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Lehetővé teszi az alkalmazások számára, hogy az állapotsoron legyenek."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"állapotsáv részletes- és listanézete"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Lehetővé teszi az alkalmazások számára az állapotsor lista-, illetve részletes nézete közti váltást."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"kimenő hívások elfogása"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"SMS-ek küldése"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Lehetővé teszi az alkalmazás számára SMS küldését. A rosszindulatú alkalmazások az Ön engedélye nélkül küldhetnek üzenetet, ami megnövelheti a kiadásait."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"SMS vagy MMS olvasása"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Lehetővé teszi az alkalmazás számára a táblagépen és a SIM-kártyán tárolt SMS-ek olvasását. A rosszindulatú alkalmazások elolvashatják a bizalmas üzeneteket."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Lehetővé teszi az alkalmazások számára, hogy olvassák a táblagépen vagy a SIM-kártyán lévő SMS-eket. A rosszindulatú alkalmazások elolvashatják a bizalmas üzeneteket."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Lehetővé teszi az alkalmazás számára a telefonon és a SIM-kártyán tárolt SMS-ek olvasását. A rosszindulatú alkalmazások elolvashatják a bizalmas üzeneteket."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"SMS vagy MMS szerkesztése"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Lehetővé teszi az alkalmazás számára, hogy írjon a táblagépen és a SIM-kártyán tárolt SMS-ekbe. A rosszindulatú alkalmazások törölhetik az üzeneteket."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Lehetővé teszi az alkalmazások számára, hogy írjanak a táblagépen vagy a SIM-kártyán lévő SMS-ekbe. A rosszindulatú alkalmazások törölhetik az üzeneteket."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Lehetővé teszi az alkalmazás számára, hogy írjon a telefonon és a SIM-kártyán tárolt SMS-ekbe. A rosszindulatú alkalmazások törölhetik az üzeneteket."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"WAP fogadása"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Lehetővé teszi az alkalmazás számára a WAP-üzenetek fogadását és feldolgozását. A rosszindulatú alkalmazások megfigyelhetik vagy törölhetik az üzeneteket anélkül, hogy Ön látná."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"alkalmazásváltás megakadályozása"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Megakadályozza, hogy a felhasználó másik alkalmazásra váltson."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"minden alkalmazásindítás figyelése és vezérlése"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Lehetővé teszi egy alkalmazás számára, hogy figyelje és vezérelje, hogy a rendszer hogyan indít el tevékenységeket. A rosszindulatú alkalmazások teljesen megfertőzhetik a rendszert. Ez az engedély csak fejlesztéshez szükséges, normál használathoz sosem."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Lehetővé teszi az alkalmazások számára, hogy megfigyeljék és vezéreljék, hogy a rendszer hogyan indít el tevékenységeket. A rosszindulatú alkalmazások teljesen tönkretehetik a rendszert. Ez az engedély csak fejlesztés céljára lehet szükséges, mindennapi használatra nem."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"eltávolított csomagú üzenetek küldése"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Lehetővé teszi egy alkalmazás számára, hogy üzenetet küldjön, ha egy alkalmazáscsomag eltávolításra került. A rosszindulatú alkalmazások ezáltal leállíthatnak más futó alkalmazásokat."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS alapú üzenetek küldése"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"azonosítatlan ablakok megjelenítése"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Lehetővé teszi olyan ablakok létrehozását, amelyeket a belső rendszer felhasználói felülete általi használatra szántak. A normál alkalmazások nem használják ezt."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"rendszerszintű riasztások megjelenítése"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Lehetővé teszi egy alkalmazás számára a rendszerriasztási ablakok megjelenítését. A rosszindulatú alkalmazások elfoglalhatják a teljes képernyőt."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Lehetővé teszi az alkalmazások számára rendszerriasztás-ablakok megjelenítését. A rosszindulatú alkalmazások elfoglalhatják az egész képernyőt."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"animáció általános sebességének módosítása"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Lehetővé teszi egy alkalmazás számára az animációk általános sebességének (gyorsabb vagy lassabb) módosítását."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"alkalmazástokenek kezelése"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Lehetővé teszi az alkalmazások számára saját tokenek létrehozását és kezelését, kihagyva a szokásos Z-sorrendet. A normál alkalmazásoknak erre soha nincs szüksége."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"billentyűk és gombok megnyomása"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Lehetővé teszi egy alkalmazás számára saját beviteli eseményeinek (billentyűlenyomások stb.) elküldését más alkalmazásoknak. A rosszindulatú alkalmazások átvehetik a táblagép irányítását."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Lehetővé teszi az alkalmazások számára, hogy átadják saját beviteli eseményeiket (billentyűk megnyomása stb.) más alkalmazásoknak. A rosszindulatú alkalmazások ezt felhasználhatják arra, hogy átvegyék a táblagép irányítását."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Lehetővé teszi egy alkalmazás számára saját beviteli eseményeinek (billentyűlenyomások stb.) elküldését más alkalmazásoknak. A rosszindulatú alkalmazások átvehetik a telefon irányítását."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"a lenyomott billentyűk és a végrehajtott műveletek figyelése"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Lehetővé teszi az alkalmazások számára, hogy figyeljék a lenyomott billentyűket még másik alkalmazás használata esetén is (például jelszó beírásakor). A normál alkalmazásoknak erre soha nincs szüksége."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"alkalmazások közvetlen telepítése"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Lehetővé teszi egy alkalmazás számára új vagy frissített Android-csomagok telepítését. A rosszindulatú alkalmazások ezáltal önkényesen hozzáadhatnak hatékony engedélyekkel rendelkező alkalmazásokat."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"összes alkalmazás gyorsítótár-adatainak törlése"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Lehetővé teszi egy alkalmazás számára, hogy az alkalmazás-gyorsítótár könyvtárából töröljön fájlokat a táblagép memóriájának felszabadításához. A hozzáférés erősen korlátozott, főleg rendszerfolyamatokra."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Lehetővé teszi az alkalmazások számára, hogy helyet szabadítsanak fel a táblagépen az alkalmazás-gyorsítótár könyvtárban lévő fájlok törlésével. A hozzáférés nagyon korlátozott, általában rendszerfolyamatok kapnak."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Lehetővé teszi egy alkalmazás számára, hogy az alkalmazás-gyorsítótár könyvtárából töröljön fájlokat a telefon memóriájának felszabadításához. A hozzáférés erősen korlátozott, főleg rendszerfolyamatokra."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"További alkalmazás-erőforrások"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Lehetővé teszi egy alkalmazás számára alkalmazás-erőforrások áthelyezését a belső tárolóról egy külső tárolóra, és fordítva."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"rendszernapló-fájlok olvasása"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Lehetővé teszi egy alkalmazás számára, hogy elolvassa a rendszer különböző naplófájljait. Ezáltal általános információkat kaphat arról, hogy Ön miket csinált a táblagépén, és fennáll a lehetősége, hogy személyes vagy privát adatokhoz is hozzájut."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Lehetővé teszi egy alkalmazás számára, hogy elolvassa a rendszer különböző naplófájljait. Ezáltal általános információkat kaphat arról, hogy Ön miket csinált a táblagépén, és fennáll a lehetősége, hogy személyes vagy privát adatokhoz is hozzájut."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"érzékeny naplóadatok olvasása"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Lehetővé teszi az alkalmazások számára, hogy olvassák a rendszer különböző naplófájljait. Ezáltal általános információkat deríthetnek ki arról, hogy mire használja a táblagépét, valamint személyes, magánjellegű adatokhoz is hozzájuthatnak."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Lehetővé teszi az alkalmazások számára, hogy olvassák a rendszer különböző naplófájljait. Ezáltal általános információkat deríthetnek ki arról, hogy mire használja a telefonját, valamint személyes, magánjellegű adatokhoz is hozzájuthatnak."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"a diag tulajdonában lévő erőforrások olvasása és írása"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Lehetővé teszi egy alkalmazás számára, hogy olvassa és írja a diag csoport által birtokolt erőforrásokat; például a /dev könyvtár fájljait. Ez esetleg hatással lehet a rendszer stabilitására és biztonságára. Ezt CSAK a gyártó vagy a szolgáltató használhatja hardverspecifikus hibakeresésre."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"alkalmazáskomponensek be- és kikapcsolása"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Lehetővé teszi egy alkalmazás számára annak módosítását, hogy más alkalmazások komponensei engedélyezve vannak-e vagy sem. A rosszindulatú alkalmazások ezt a táblagép fontos képességeinek kikapcsolására használhatják. Óvatosan kell eljárni az engedély megadásával, mert lehetséges, hogy a komponensek használhatatlanok, inkonzisztensek vagy instabilak lesznek."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Lehetővé teszi egy alkalmazás számára annak módosítását, hogy más alkalmazások komponensei engedélyezve vannak-e vagy sem. A rosszindulatú alkalmazások ezt a táblagép fontos képességeinek kikapcsolására használhatják. Óvatosan kell eljárni az engedély megadásával, mert lehetséges, hogy a komponensek használhatatlanok, inkonzisztensek vagy instabilak lesznek."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Lehetővé teszi az alkalmazások számára, hogy megváltoztassák azt, hogy egy másik alkalmazás összetevője engedélyezve legyen-e vagy sem. A rosszindulatú alkalmazások ezt arra használhatják fel, hogy kikapcsolják a táblagép fontos funkcióit. Ezzel az engedéllyel óvatosan kell bánni, mivel egyes alkalmazáskomponensek használhatatlanná, inkonzisztenssé vagy instabillá válhatnak."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Lehetővé teszi az alkalmazások számára, hogy megváltoztassák azt, hogy egy másik alkalmazás összetevője engedélyezve legyen-e vagy sem. A rosszindulatú alkalmazások ezt arra használhatják fel, hogy kikapcsolják a telefon fontos funkcióit. Ezzel az engedéllyel óvatosan kell bánni, mivel egyes alkalmazáskomponensek használhatatlanná, inkonzisztenssé vagy instabillá válhatnak."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"preferált alkalmazások beállítása"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Lehetővé teszi egy alkalmazás számára a preferált alkalmazások módosítását. A rosszindulatú alkalmazások ezáltal észrevétlenül megváltoztathatják a futó alkalmazásokat, személyes adatokat gyűjtve Öntől."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"rendszer globális beállításainak módosítása"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"Google-szolgáltatások térképének módosítása"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Lehetővé teszi egy alkalmazás számára, hogy módosítsa a Google-szolgáltatások térképét. A normál alkalmazások nem használják ezt."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"automatikus indítás rendszerindításkor"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Lehetővé teszi egy alkalmazás számára, hogy elindítsa magát a rendszerindítás után. Ez meghosszabbíthatja a táblagép elindításának idejét, az állandó futás miatt pedig lelassíthatja a táblagépet."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Lehetővé teszik az alkalmazások számára, hogy elindítsák magukat a rendszerindítás befejezése után. Emiatt tovább tarthat a táblagép elindulása, emellett az alkalmazás általánosságban is lelassíthatja a gépet, ha folyamatosan fut."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Lehetővé teszi egy alkalmazás számára, hogy elindítsa magát a rendszerindítás után. Ez meghosszabbíthatja a telefon elindításának idejét, az állandó futás miatt pedig lelassíthatja a telefont."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"ragadós üzenet küldése"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Lehetővé teszi egy alkalmazás számára ragadós üzenetek küldését, amelyek a sugárzás után is megmaradnak. A rosszindulatú alkalmazások lelassíthatják vagy instabillá tehetik a táblagépet a túlzott memóriahasználattal."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Lehetővé teszi egy alkalmazás számára \"ragadós üzenetek\" küldését, amelyek a sugárzás után is megmaradnak. A rosszindulatú alkalmazások lelassíthatják vagy instabillá tehetik a táblagépet a túlzott memóriahasználattal."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Lehetővé teszi egy alkalmazás számára ragadós üzenetek küldését, amelyek a sugárzás után is megmaradnak. A rosszindulatú alkalmazások lelassíthatják vagy instabillá tehetik a telefont a túlzott memóriahasználattal."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"névjegyadatok olvasása"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Lehetővé teszi egy alkalmazás számára, hogy elolvassa a táblagépen található összes felhasználói adatot (címet). A rosszindulatú alkalmazások kihasználhatják ezt arra, hogy elküldjék az adatokat másoknak."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Lehetővé teszi egy alkalmazás számára, hogy beolvassa a táblagépen tárolt összes névjegyadatot (címet). A rosszindulatú alkalmazások ezt felhasználhatják arra, hogy elküldjék adatait másoknak."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Lehetővé teszi egy alkalmazás számára, hogy elolvassa a telefonban található összes felhasználói adatot (címet). A rosszindulatú alkalmazások kihasználhatják ezt arra, hogy elküldjék az adatokat másoknak."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"névjegyadatok írása"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Lehetővé teszi egy alkalmazás számára, hogy módosítsa a táblagépen tárolt névjegy- (cím-) adatokat. A rosszindulatú alkalmazások felhasználhatják ezt a névjegyadatok törlésére vagy módosítására."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Lehetővé teszi az alkalmazások számára, hogy módosítsák a táblagépen tárolt névjegyadatokat (címeket). A rosszindulatú alkalmazások ezt felhasználhatják arra, hogy töröljék vagy módosítsák a névjegyadatokat."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Lehetővé teszi egy alkalmazás számára, hogy módosítsa a telefonon tárolt névjegy- (cím-) adatokat. A rosszindulatú alkalmazások felhasználhatják ezt a névjegyadatok törlésére vagy módosítására."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"naptári események olvasása"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Lehetővé teszi az alkalmazás számára, hogy elolvassa a táblagép naptárában lévő összes bejegyzést. A rosszindulatú alkalmazások ezt kihasználva másoknak is elküldhetik a naptárbejegyzéseket."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Lehetővé teszi az alkalmazások számára, hogy elolvassák a telefon naptárában lévő összes eseményt. A rosszindulatú alkalmazások ezt felhasználhatják arra, hogy elküldjék az eseményeket másoknak."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Lehetővé teszi az alkalmazás számára, hogy elolvassa a telefon naptárában lévő összes eseményt. A rosszindulatú alkalmazások ezt az események mások részére való elküldésére használhatják fel."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"naptári események hozzáadása vagy módosítása és e-mailek küldése vendégeknek"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Lehetővé teszi egy alkalmazás számára a naptári események hozzáadását és módosítását, valamint e-mailek küldését a vendégeknek. A rosszindulatú alkalmazások felhasználhatják ezt a naptárban levő események törlésére vagy módosítására, illetve e-mailek küldésére."</string>
@@ -321,7 +317,7 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"engedély helyszolgáltató telepítésére"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Helyforrás-utánzatok létrehozása tesztelés céljából. A rosszindulatú alkalmazások kihasználhatják ezt az olyan valódi helyforrások által megadott hely- és/vagy állapotadatok felülírására, mint a GPS vagy a mobilszolgáltatók, illetve az Ön tartózkodási helyének figyelésére és jelentésére külső forrásoknak."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"pontos (GPS) helymeghatározás"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Hozzáférés a táblagépen levő olyan pontos helyforrásokhoz, mint a GPS. A rosszindulatú alkalmazások ennek segítségével megállapíthatják az Ön tartózkodási helyét és ez a beállítás extra energiát fogyaszthat."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Hozzáfér olyan helyadat-forrásokhoz, mint a táblagépen lévő Globális helymeghatározó rendszer (ahol az elérhető). A rosszindulatú alkalmazások ezt felhasználhatják arra, hogy megállapítsák, Ön éppen hol tartózkodik, és ezáltal tovább csökkentik az akkumulátor energiáját."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Hozzáférés a telefonon levő olyan pontos helyforrásokhoz, mint a GPS. A rosszindulatú alkalmazások ennek segítségével megállapíthatják az Ön tartózkodási helyét és extra energiát fogyaszthatnak."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"becsült (hálózat alapú) helymeghatározás"</string>
     <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Hozzáférés olyan becsült helyforrásokhoz, mint például a mobilhálózati adatbázis, amellyel -- ahol elérhető -- hozzávetőlegesen meg lehet becsülni a táblagép helyzetét. A rosszindulatú alkalmazások ezáltal felbecsülhetik, hogy Ön merre jár."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Lehetővé teszi az alkalmazás számára, hogy módosítsa az általános hangbeállításokat, például a hangerőt és az útválasztást."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"hanganyag rögzítése"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Lehetővé teszi az alkalmazások számára, hogy hozzáférjenek a hangfelvétel elérési útjához."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"fotó készítése"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Lehetővé teszi az alkalmazás számára, hogy képeket készítsen a kamerával. Ezáltal bármikor készíthet felvételeket arról, amit a kamera lát."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"táblagép végleges kikapcsolása"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"fotók és videók készítése"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Lehetővé teszi az alkalmazások számára, hogy fényképeket és videókat készítsenek a kamerával, ezáltal bármikor gyűjthetnek képanyagot, ha a kamera be van kapcsolva."</string>
+    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"a táblagép végleges deaktiválása"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"telefon végleges letiltása"</string>
-    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Lehetővé teszi az alkalmazás számára a teljes táblagép végleges letiltását. Ez nagyon veszélyes."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Lehetővé teszi az alkalmazások számára, hogy teljesen deaktiválják a táblagépet. Ez nagyon veszélyes."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Lehetővé teszi az alkalmazás számára a teljes telefon végleges letiltását. Ez nagyon veszélyes."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"táblagép újraindításának kényszerítése"</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"táblagép újraindításának kikényszerítése"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"telefon újraindításának kikényszerítése"</string>
-    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Lehetővé teszi az alkalmazás számára a táblagép kényszerített újraindítását."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Lehetővé teszi az alkalmazások számára, hogy újraindítsák a táblagépet."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Lehetővé teszi az alkalmazás számára a telefon kényszerített újraindítását."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"fájlrendszerek csatolása és leválasztása"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Lehetővé teszi az alkalmazás számára a cserélhető lemezek fájlrendszereinek csatolását és leválasztását."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"külső tárhely formázása"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Lehetővé teszi az alkalmazás számára a cserélhető lemez formázását."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"információ kérése biztonságos tárolóról"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Lehetővé teszi az alkalmazás számára, hogy információkat szerezzen a biztonságos tárolóról."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"biztonságos tároló létrehozása"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Lehetővé teszi az alkalmazás számára biztonságos tárhely létrehozását."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"biztonságos tároló megsemmisítése"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Lehetővé teszi az alkalmazás számára biztonságos tárhely törlését."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"biztonságos tároló csatolása és leválasztása"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Lehetővé teszi az alkalmazás számára biztonságos tárhely csatolását és leválasztását."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"biztonságos tárhely átnevezése"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Lehetővé teszi az alkalmazás számára biztonságos tárhely átnevezését."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"információkérés a belső tárhelyről"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Lehetővé teszi az alkalmazások számára, hogy információkat kérjenek a belső tárhelyről."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"belső tárhely létrehozása"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Lehetővé teszi az alkalmazások számára, hogy létrehozzanak belső tárhelyet."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"a belső tárhely törlése"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Lehetővé teszi az alkalmazások számára, hogy töröljék a belső tárhelyet."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"belső tárhely csatlakoztatása és leválasztása"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Lehetővé teszi az alkalmazások számára, hogy csatlakoztassák/leválasszák a belső tárhelyet."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"belső tárhely átnevezése"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Lehetővé teszi az alkalmazások számára, hogy átnevezzék a belső tárhelyet."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"rezgés vezérlése"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Lehetővé teszi az alkalmazás számára a rezgés vezérlését."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"vaku vezérlése"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Lehetővé teszi az alkalmazás számára a vaku vezérlését."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"USB-eszközök elérése"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Lehetővé teszi az alkalmazások számára az USB-eszközök elérését."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"hardver tesztelése"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Lehetővé teszi az alkalmazás számára különböző perifériák vezérlését hardvertesztelés céljából."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"telefonszámok közvetlen hívása"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Lehetővé teszi az alkalmazás számára, hogy az Ön közreműködése nélkül hívjon fel telefonszámokat. A rosszindulatú alkalmazások hatására váratlan hívások jelenhetnek meg a telefonszámláján. Nem teszi lehetővé segélyhívó számok hívását."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"bármilyen telefonszám közvetlen hívása"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Lehetővé teszi az alkalmazás számára, hogy az Ön közreműködése nélkül felhívjon bármilyen telefonszámot, köztük a segélyhívó számokat is. A rosszindulatú alkalmazások felesleges és jogsértő hívásokat kezdeményezhetnek ez utóbbiakra."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMA táblagép-beállítás közvetlen elindítása"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"a táblagép CDMA-beállításának közvetlen indítása"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMA-telefonbeállítás közvetlen elindítása"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Lehetővé teszi az alkalmazás számára a CDMA-szolgáltatás indítása. A rosszindulatú alkalmazások szükségtelenül is elindíthatják a CDMA-szolgáltatást"</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"helyaktualizálási értesítések vezérlése"</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Lehetővé teszi az alkalmazás számára az eszköz telefonálási funkcióinak vezérlését. Ezzel az engedéllyel lehetséges a hálózatváltás, a rádió be- és kikapcsolása, stb. anélkül, hogy erről Ön értesítést kapna."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"telefon állapotának és azonosságának olvasása"</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Lehetővé teszi az alkalmazás számára, hogy hozzáférjen az eszköz telefonálási funkcióihoz. Az engedéllyel rendelkező alkalmazás megállapíthatja a telefon sorozat- és telefonszámát, hívás során a másik fél telefonszámát stb."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"táblagép alvó üzemmódjának megakadályozása"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"táblagép alvás üzemmódjának megakadályozása"</string>
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"telefon alvó üzemmódjának megakadályozása"</string>
-    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Lehetővé teszi egy alkalmazás számára annak megakadályozását, hogy a táblagép alvó üzemmódra váltson."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Lehetővé teszi az alkalmazások számára, hogy megakadályozzák, hogy a táblagép alvó üzemmódra váltson."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Lehetővé teszi egy alkalmazás számára annak megakadályozását, hogy a telefon alvó üzemmódra váltson."</string>
     <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"a táblagép be- és kikapcsolása"</string>
     <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"a telefon be- és kikapcsolása"</string>
-    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Lehetővé teszi az alkalmazás számára, hogy be- vagy kikapcsolja a táblagépet."</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Lehetővé teszi az alkalmazások számára a táblagép be- és kikapcsolását."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Lehetővé teszi az alkalmazás számára, hogy be- vagy kikapcsolja a telefont."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"futtatás gyári tesztüzemmódban"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Futtatás alacsony szintű gyártói tesztként, lehetővé téve a táblagép hardverének teljes körű elérését. Csak akkor érhető el, ha a táblagép gyártói tesztüzemmódban van."</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Alacsony szintű gyári tesztként fut, lehetővé téve a táblagép összes hardverének elérését. Csak akkor érhető el, ha a táblagép gyári teszt üzemmódban fut."</string>
     <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Futtatás alacsony szintű gyártói tesztként, lehetővé téve a telefon hardverének teljes körű elérését. Csak akkor érhető el, ha a telefon gyártói tesztüzemmódban van."</string>
     <string name="permlab_setWallpaper" msgid="6627192333373465143">"háttérkép beállítása"</string>
     <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Lehetővé teszi az alkalmazás számára a rendszer-háttérkép beállítását."</string>
@@ -403,15 +397,15 @@
     <string name="permlab_masterClear" msgid="2315750423139697397">"rendszer visszaállítása a gyári beállításokra"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Lehetővé teszi egy alkalmazás számára a gyári beállítások teljes visszaállítását, törölve minden adatot, beállítást és telepített alkalmazást."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"idő beállítása"</string>
-    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Lehetővé teszi egy alkalmazás számára a táblagép órájának átállítását."</string>
+    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Lehetővé teszi az alkalmazások számára hogy átállítsák a táblagép óráját."</string>
     <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Lehetővé teszi egy alkalmazás számára a telefon órájának átállítását."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"időzóna beállítása"</string>
-    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Lehetővé teszi egy alkalmazás számára a táblagép időzónájának módosítását."</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Lehetővé teszi az alkalmazások számára hogy módosítsák a táblagép időzónáját."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Lehetővé teszi egy alkalmazás számára a telefon időzónájának módosítását."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"fiókfelügyeleti szolgáltatásként szereplés"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Lehetővé teszi egy alkalmazás számára, hogy hívásokat kezdeményezzenek a fiókhitelesítők felé"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"ismert fiókok felderítése"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Lehetővé teszi egy alkalmazás számára, hogy lekérje a táblagép által ismert fiókok listáját."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Lehetővé teszi az alkalmazások számára, hogy lekérjék a táblagép által ismert fiókok listáját."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Lehetővé teszi egy alkalmazás számára, hogy lekérje a telefon által ismert fiókok listáját."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"fiókhitelesítőként szereplés"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Lehetővé teszi egy alkalmazás számára a fiókkezelő fiókhitelesítő képességeinek használatát, beleértve fiókok létrehozását, valamint a jelszavak lekérését és beállítását."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi multicast vétel engedélyezése"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Lehetővé teszi egy alkalmazás számára, hogy nem közvetlenül az eszköznek küldött csomagokat is fogadjon. Ez a közeli szolgáltatások felderítésében nyújthat segítséget. Több energiát fogyaszt, mint a nem multicast mód."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"bluetooth felügyelet"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Lehetővé teszi egy alkalmazás számára a helyi Bluetooth táblagép konfigurálását, valamint a távoli eszközök felderítését és párosítását."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Lehetővé teszi az alkalmazások számára, hogy konfigurálják a helyi Bluetooth-t, valamint felfedezzenek és párosítsanak távoli eszközöket."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Lehetővé teszi egy alkalmazás számára a helyi Bluetooth telefon konfigurálását, valamint a távoli eszközök felderítését és párosítását."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"Bluetooth kapcsolatok létrehozása"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Lehetővé teszi egy alkalmazás számára a helyi Bluetooth táblagép konfigurációjának megtekintését, valamint kapcsolatok kezdeményezését és fogadását a párosított eszközökkel."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Lehetővé teszi az alkalmazások számára, hogy megnézzék a Bluetooth beállításokat, és kapcsolatot hozzanak létre a párosított eszközökkel."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Lehetővé teszi egy alkalmazás számára a helyi Bluetooth telefon konfigurációjának megtekintését, valamint kapcsolatok kezdeményezését és fogadását a párosított eszközökkel."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"NFC technológia vezérlése"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Lehetővé teszi az alkalmazások számára, hogy NFC (Near Field Communication - kis hatósugarú vezeték nélküli kommunikáció) technológiát használó címkékkel, kártyákkal és leolvasókkal kommunikáljanak."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"billentyűzár kikapcsolása"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Lehetővé teszi egy alkalmazás számára a billentyűzár és a kapcsolódó jelszavas biztonság kikapcsolását. Ennek egy szabályos példája, amikor a telefon kikapcsolja a billentyűzárat egy beérkező hívás fogadásakor, majd a hívás befejezése után újra bekapcsolja azt."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"szinkronizálási beállítások olvasása"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Lehetővé teszi az alkalmazások számára a felhasználó által a felhasználói szótárban tárolt privát szavak, nevek és szófordulato elolvasását."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"írás a felhasználó által meghatározott könyvtárba"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Lehetővé teszi egy alkalmazás számára, hogy új szavakat írjon a felhasználó szótárába."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"az SD-kártya tartalmának módosítása és törlése"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"USB-tár tartalmának módosítása és törlése"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"az SD-kártya tartalmának módosítása és törlése"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Lehetővé teszi egy alkalmazás számára, hogy írjon az SD-kártyára."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Lehetővé teszi az alkalmazások számára, hogy írjanak az USB-tárra."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Lehetővé teszi egy alkalmazás számára, hogy írjon az SD-kártyára."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"a belső médiatároló tartalmának módosítása és törlése"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Lehetővé teszi az alkalmazások számára, hogy módosítsák a belső tárhely tartalmát."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"hozzáférés a gyorsítótár fájlrendszeréhez"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Lehetővé teszi egy alkalmazás számára a gyorsítótár fájlrendszerének olvasását és írását."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Jelszó korlátozása"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"A használható jelszótípusok korlátozása."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Bejelentkezési kísérletek figyelése"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"A helytelenül bevitt jelszavak számának figyelése a képernyő zárolásának feloldása során, és a táblagép lezárása vagy a táblagép összes adatának törlése túl sok sikertelen próbálkozás után."</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"A helytelenül bevitt jelszavak számának figyelése a képernyő zárolásának feloldása során, és a táblagép lezárása vagy a táblagép összes adatának törlése túl sok sikertelen próbálkozás után."</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Jelszó visszaállítása"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Adjon meg új értéket jelszavának, és kérje meg a rendszergazdát, hogy adja meg Önnek, mielőtt bejelentkezne."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Kényszerű lezárás"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Vezérli az eszköz lezárását, amihez újra meg kell adni a jelszót."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"internetes hívások kezdeményezése és fogadása"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Lehetővé teszi az alkalmazások számára a SIP-szolgáltatás használatát internetes hívások kezdeményezésére és fogadására."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Jelszavakkal kapcsolatos szabályok beállítása"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"A képernyőzár-feloldási jelszavakban engedélyezett karakterek és hosszúság vezérlése"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Képernyőzár-feloldási kísérletek figyelése"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Figyeli a helytelenül megadott jelszavak számát a képernyőzár feloldása során, és ha túl sok rossz jelszót adnak meg, lezárja a táblagépet vagy törli annak összes adatát."</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Figyeli a helytelenül megadott jelszavak számát a képernyőzár feloldása során, és ha túl sok rossz jelszót adnak meg, lezárja a telefont vagy törli annak összes adatát."</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"A képernyőzárat feloldó jelszó módosítása"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"A képernyőzárat feloldó jelszó módosítása"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"A képernyő zárolása"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"A képernyőzárolás módjának és idejének vezérlése"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Minden adat törlése"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"A táblagép adatainak figyelmeztetés nélkül történő törlése, a gyári adatok visszaállításával"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"A táblagép adatainak figyelmeztetés nélkül történő törlése, a gyári adatok visszaállításával"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Figyelmeztetés nélkül törli a táblagép adatait, visszaállítva a gyári adatokat"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Figyelmeztetés nélkül törli a telefon összes adatát, visszaállítva a gyári adatokat"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Az eszköz globális proxyjának beállítása"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Az eszköz globális proxyja lesz használatban, amíg az irányelv engedélyezve van. Csak az eszköz első rendszergazdája állíthatja be a tényleges globális proxyt."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Jelszó lejáratának beállítása"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Azt vezérli, mennyi időnként kell módosítani a képernyőt zároló jelszót"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Otthoni"</item>
     <item msgid="869923650527136615">"Mobil"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Munkahelyi személyhívó"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asszisztens"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Egyéni"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Születésnap"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Évforduló"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Esemény"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Egyéb"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Egyéni"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Otthoni"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Munkahelyi"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Munkahelyi"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Egyéb"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Egyéni"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Egyéni"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Asszisztens"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Fiútestvér"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Gyermek"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Élettárs"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Apa"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Ismerős"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Felettes"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Anya"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Szülő"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Ajánlotta"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Rokon"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Lánytestvér"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Házastárs"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Egyéni"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Otthoni"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Munkahely"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Egyéb"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Adja meg a PIN-kódot"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"A feloldáshoz írja be a jelszót"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Feloldáshoz írja be a PIN kódot"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Helytelen PIN-kód."</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"A feloldáshoz nyomja meg a Menü, majd a 0 gombot."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Segélyhívó szám"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Hívás folytatása"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Helyes!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Sajnáljuk, próbálja újra"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Sajnáljuk, próbálja újra"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Töltés (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Feltöltve."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"A SIM-kártya le van zárva."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM-kártya feloldása..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal rosszul rajzolta le feloldási mintáját. "\n\n"Kérjük, <xliff:g id="NUMBER_1">%d</xliff:g> másodperc múlva próbálja újra."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Helytelenül rajzolta le a feloldási mintát <xliff:g id="NUMBER_0">%d</xliff:g> alkalommal. További <xliff:g id="NUMBER_1">%d</xliff:g> sikertelen kísérlet után a Google rendszerében használt bejelentkezési adataival kell feloldania a táblagépét."\n\n"Kérjük, próbálja újra <xliff:g id="NUMBER_2">%d</xliff:g> másodperc múlva."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal helytelenül adta meg jelszavát. "\n\n"Kérjük, próbálkozzon újra <xliff:g id="NUMBER_1">%d</xliff:g> másodperc múlva."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal helytelenül adta meg PIN kódját. "\n\n"Kérjük, próbálkozzon újra <xliff:g id="NUMBER_1">%d</xliff:g> másodperc múlva."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal rosszul rajzolta be a feloldó mintát. <xliff:g id="NUMBER_1">%d</xliff:g> további sikertelen kísérlet után táblagépe zárolását a Google bejelentkezési adataival kell feloldania."\n\n" Kérjük, próbálkozzon újra <xliff:g id="NUMBER_2">%d</xliff:g> másodperc múlva."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Helytelenül rajzolta le a feloldási mintát <xliff:g id="NUMBER_0">%d</xliff:g> alkalommal. További <xliff:g id="NUMBER_1">%d</xliff:g> sikertelen kísérlet után a Google rendszerében használt bejelentkezési adataival kell feloldania a telefonját."\n\n" Kérjük, próbálja újra <xliff:g id="NUMBER_2">%d</xliff:g> másodperc múlva."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Próbálkozzon újra <xliff:g id="NUMBER">%d</xliff:g> másodperc múlva."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Elfelejtette a mintát?"</string>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Elhagyja ezt az oldalt?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"A folytatáshoz válassza az OK, a jelenlegi oldalon maradáshoz a Mégse lehetőséget."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Megerősítés"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Tipp: érintse meg kétszer a nagyításhoz és kicsinyítéshez."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Aut.kitölt"</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Automatikus kitöltés"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Autom. kitöltés"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"böngészési előzmények és könyvjelzők olvasása"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Lehetővé teszi az alkalmazás számára a böngésző által felkeresett összes URL, valamint az összes könyvjelző olvasását."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"böngészési előzmények és könyvjelzők írása"</string>
     <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Lehetővé teszi egy alkalmazás számára, hogy módosítsa a táblagépen tárolt böngészési előzményeket és könyvjelzőket. A rosszindulatú alkalmazások felhasználhatják ezt a böngésző adatainak törlésére vagy módosítására."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Lehetővé teszi egy alkalmazás számára, hogy módosítsa a telefonon tárolt böngészési előzményeket és könyvjelzőket. A rosszindulatú alkalmazások felhasználhatják ezt a böngésző adatainak törlésére vagy módosítására."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"ébresztő beállítása az ébresztőórában"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Lehetővé teszi az alkalmazások számára, hogy beállítsanak egy ébresztőt egy telepített ébresztőóra alkalmazásban. Egyes ilyen alkalmazásokban lehet, hogy nem működik ez a funkció."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"A böngésző helymeghatározási engedélyeinek módosítása"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Lehetővé teszi egy alkalmazás számára, hogy módosítsa a böngésző helymeghatározási engedélyeit. A rosszindulatú alkalmazások kihasználhatják ezt arra, hogy helyadatokat küldjenek tetszőleges webhelyeknek."</string>
     <string name="save_password_message" msgid="767344687139195790">"Szeretné, hogy a böngésző megjegyezze a jelszót?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"Kivágás"</string>
     <string name="copy" msgid="2681946229533511987">"Másolás"</string>
     <string name="paste" msgid="5629880836805036433">"Beillesztés"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Nincs mit bemásolni"</string>
     <string name="copyUrl" msgid="2538211579596067402">"URL másolása"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Szöveg kijelölése..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Szöveg kijelölése"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Beviteli mód"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Szöveg szerkesztése"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Műveletek szöveggel"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Kevés a hely"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Kevés a szabad tárhely a táblagépen."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"A táblagép tárhelye kezd elfogyni."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Kevés a szabad tárhely a telefonban."</string>
     <string name="ok" msgid="5970060430562524910">"OK"</string>
     <string name="cancel" msgid="6442560571259935130">"Mégse"</string>
     <string name="yes" msgid="5362982303337969312">"OK"</string>
     <string name="no" msgid="5141531044935541497">"Mégse"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Figyelem"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Betöltés..."</string>
     <string name="capital_on" msgid="1544682755514494298">"Be"</string>
     <string name="capital_off" msgid="6815870386972805832">"Ki"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Művelet végrehajtása a következővel:"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Bezárás most"</string>
     <string name="report" msgid="4060218260984795706">"Jelentés"</string>
     <string name="wait" msgid="7147118217226317732">"Várakozás"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Alk. átirányítva"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> éppen fut."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> volt eredetileg elindítva."</string>
+    <string name="smv_application" msgid="295583804361236288">"<xliff:g id="APPLICATION">%1$s</xliff:g> alkalmazás (<xliff:g id="PROCESS">%2$s</xliff:g> folyamat) megsértette az általa kényszerített Szigorú üzemmód irányelvet."</string>
+    <string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> folyamat megsértette az általa kényszerített Szigorú üzemmód irányelvet."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> fut"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Válassza ezt az alkalmazásra váltáshoz"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Alkalmazást vált?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Már fut egy másik alkalmazás, amelyet le kell állítania, mielőtt egy újat indíthatna el."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Visszatérés a(z) <xliff:g id="OLD_APP">%1$s</xliff:g> alkalmazáshoz"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Ne induljon el az új alkalmazás."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> indítása"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"A régi alkalmazás leállítása mentés nélkül."</string>
     <string name="sendText" msgid="5132506121645618310">"Válasszon egy műveletet"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Csengetés hangereje"</string>
     <string name="volume_music" msgid="5421651157138628171">"Média hangereje"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Az összes megjelenítése"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB-háttértár"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB-eszköz csatlakoztatva"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Telefonját USB-kábel segítségével csatlakoztatta a számítógéphez. Érintse meg az alábbi gombot, ha fájlokat szeretne másolni a számítógépe és az Android SD-kártyája között."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Telefonját USB-kábel segítségével csatlakoztatta a számítógéphez. Érintse meg az alábbi gombot, ha fájlokat szeretne másolni a számítógépe és az Android SD-kártyája között."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"USB-kapcsolaton keresztül csatlakozott a számítógéphez. Érintse meg a lenti gombot, ha fájlokat szeretne másolni a számítógép és az Android USB-tára között."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"USB-kapcsolaton keresztül csatlakozott a számítógéphez. Érintse meg a lenti gombot, ha fájlokat szeretne másolni a számítógép és az Android SD-kártyája között."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB-tár bekapcsolása"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Hiba történt az SD-kártya használata során az USB-tárban."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Hiba történt az SD-kártya használata során az USB-tárban."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Probléma van az USB-tár használatával."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Probléma van az SD-kártya használatával USB-tárként."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB-eszköz csatlakoztatva"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Válassza ezt fájlok másolásához."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB-tár kikapcsolása"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Válassza ezt az USB-tár kikapcsolásához."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-tár használatban"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Az USB-tár kikapcsolása előtt mindenképpen válassza le (\"adassa ki\") az Android SD-kártyáját a számítógépről."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Az USB-tár kikapcsolása előtt győződjön meg róla, hogy leválasztotta (\"kiadta\") az Android készülék USB-tárát a számítógépen."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Az USB-tár kikapcsolása előtt mindenképpen válassza le (\"adassa ki\") az Android SD-kártyáját a számítógépről."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB-tár kikapcsolása"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Gond volt az USB-tár kikapcsolásával. Ellenőrizze, hogy leválasztotta-e az USB-gazdagépet, majd próbálja újra."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Ha bekapcsolja az USB-tárat, egyes jelenleg használt alkalmazások leállnak és lehet, hogy nem lesznek elérhetők a tár újbóli kikapcsolásáig."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Az USB művelet sikertelen"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"SD-kártya formázása"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Az USB-tár formázása"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"SD-kártya formázása"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Biztosan megformázza az SD-kártyát? A kártyán lévő minden adat el fog veszni."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Formázza az USB-tárat, törölve az összes ott tárolt fájlt? A művelet nem vonható vissza!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Biztosan megformázza az SD-kártyát? A kártyán lévő minden adat el fog veszni."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formázás"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB hibakereső csatlakoztatva"</string>
@@ -960,28 +897,28 @@
     <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>"jelöltek"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"SD-kártya előkészítése"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Az USB-tár előkészítése"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD-kártya előkészítése"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Hibakeresés."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Üres SD-kártya"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Üres USB-tár"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Üres SD-kártya"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Az SD-kártya üres vagy nem támogatott a fájlrendszere."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Az USB-tár üres, vagy a fájlrendszere nem támogatott."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"Az SD-kártya üres vagy nem támogatott a fájlrendszere."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Az SD-kártya sérült"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Sérült USB-tár"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Az SD-kártya sérült"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Az SD-kártya megsérült. Lehet, hogy újra kell formázni."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Az USB-tár károsodott. Lehet, hogy újra kell formáznia."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Az SD-kártya megsérült. Lehet, hogy újra kell formázni."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Az SD-kártya váratlanul eltávolításra került"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB-tár váratlanul eltávolítva"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"Az SD-kártya váratlanul eltávolításra került"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Az adatvesztés elkerülése érdekében az eltávolítás előtt előbb válassza le az SD-kártyát."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Az adatvesztés elkerülése érdekében válassza le az USB-tárat, mielőtt kihúzná azt."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Az adatvesztés elkerülése érdekében az eltávolítás előtt előbb válassza le az SD-kártyát."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Az SD-kártya biztonságosan eltávolítható"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Az USB-tár biztonságosan eltávolítható"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"Az SD-kártya biztonságosan eltávolítható"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Biztonságosan eltávolíthatja az SD-kártyát."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Biztonságosan eltávolíthatja az USB-tárat."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Biztonságosan eltávolíthatja az SD-kártyát."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"SD-kártya eltávolítva"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Hiányzó USB-tár"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SD-kártya eltávolítva"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Az SD-kártya eltávolítva. Helyezzen be egy újat."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Az USB-tár eltávolítva. Helyezzen be új hordozóeszközt."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"Az SD-kártya eltávolítva. Helyezzen be egy újat."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Nincs megfelelő tevékenység"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"komponenshasználati statisztikák frissítése"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Küldés"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Tovább"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Kész"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Előző"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Végrehajtás"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Szám hívása"\n"ezzel: <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Névjegy létrehozása "\n"a(z) <xliff:g id="NUMBER">%s</xliff:g> szám használatával"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Osztott kulcs (PSK) alapú L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Tanúsítvány alapú L2TP/IPSec VPN"</string>
     <string name="upload_file" msgid="2897957172366730416">"Fájl kiválasztása"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Nincs fájl kiválasztva"</string>
     <string name="reset" msgid="2448168080964209908">"Alaphelyzet"</string>
     <string name="submit" msgid="1602335572089911941">"Elküldés"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Gépkocsi üzemmód bekapcsolva"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Válassza ezt a kilépéshez a gépkocsi üzemmódból."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Megosztás vagy aktív hotspot"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"A konfiguráláshoz érintse meg"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Vissza"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Tovább"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Kihagyás"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Nagymértékű adathasználat"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Érintse meg, ha többre kíváncsi a mobil adathasználattal kapcsolatban"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Elérte a mobil adatkorlátot"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Érintse meg, ha többre kíváncsi a mobil adathasználattal kapcsolatban"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Nincs találat"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Keresés az oldalon"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 találat"</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">"Kész"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Az USB-tár leválasztása..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"SD-kártya leválasztása..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Az USB-tár törlése..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Az SD-kártya törlése..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Nem sikerült törölni az USB-tárat."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Nem sikerült törölni az SD-kártyát."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"Az SD-kártya nem lett lecsatolva, mielőtt eltávolították."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Az USB-tár ellenőrzése folyamatban van."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"Az SD-kártya ellenőrzése folyamatban van."</string>
+    <string name="media_removed" msgid="7001526905057952097">"Az SD-kártya eltávolításra került."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Az USB-tárat jelenleg a számítógép használja."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Az SD-kártyát jelenleg a számítógép használja."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"A külső meghajtó állapota ismeretlen."</string>
+    <string name="share" msgid="1778686618230011964">"Megosztás"</string>
+    <string name="find" msgid="4808270900322985960">"Keresés"</string>
+    <string name="websearch" msgid="4337157977400211589">"Webes keresés"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index a674ff1..509e70e 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Kotak Pesan"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Masalah sambungan atau kode MMI tidak valid."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Operasi dibatasi untuk nomor panggilan tetap saja."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Layanan telah diaktifkan."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Layanan diaktifkan untuk:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Layanan telah dinonaktifkan."</string>
@@ -126,7 +125,7 @@
     <string name="contentServiceSync" msgid="8353523060269335667">"Sinkron"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkron"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Terlalu banyak <xliff:g id="CONTENT_TYPE">%s</xliff:g> penghapusan."</string>
-    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Penyimpanan pada tablet penuh! Hapus beberapa berkas agar ada tempat kosong."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Penyimpanan tablet penuh! Hapus beberapa berkas untuk menambah ruang kosong."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"Penyimpanan di ponsel penuh! Hapus sebagian berkas untuk mendapatkan ruang."</string>
     <string name="me" msgid="6545696007631404292">"Saya"</string>
     <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opsi tablet"</string>
@@ -139,8 +138,7 @@
     <string name="shutdown_progress" msgid="2281079257329981203">"Sedang mematikan..."</string>
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet Anda akan dimatikan."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Ponsel Anda akan dimatikan."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Apakah Anda ingin mematikannya?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Terbaru"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Tidak ada aplikasi terkini."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opsi tablet"</string>
@@ -160,7 +158,7 @@
     <string name="permgrouplab_messages" msgid="7521249148445456662">"Pesan Anda"</string>
     <string name="permgroupdesc_messages" msgid="7045736972019211994">"Baca dan tulis SMS, email, dan pesan lainnya."</string>
     <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Informasi pribadi Anda"</string>
-    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Akses langsung ke data kenalan dan kalender yang tersimpan pada tablet."</string>
+    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Akses langsung ke kenalan dan kalender yang disimpan di tablet."</string>
     <string name="permgroupdesc_personalInfo" product="default" msgid="5488050357388806068">"akses langsung pada data kenalan dan kalender yang tersimpan pada ponsel."</string>
     <string name="permgrouplab_location" msgid="635149742436692049">"Lokasi Anda"</string>
     <string name="permgroupdesc_location" msgid="2430258821648348660">"Monitor lokasi fisik Anda"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Peralatan pengembangan"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Fitur hanya dibutuhkan oleh pengembang aplikasi."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Penyimpanan"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Akses kartu SD."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Akses penyimpanan USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Akses kartu SD."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"nonaktifkan atau ubah bilah status"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Mengizinkan aplikasi mematikan bilah status atau menambahkan dan menghapus ikon sistem."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"bilah status"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Mengizinkan aplikasi menjadi bilah status."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"luaskan/ciutkan bilah status"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Mengizinkan aplikasi meluaskan atau menciutkan bilah status."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"cegat panggilan keluar"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"kirim pesan SMS"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Mengizinkan aplikasi mengirim pesan SMS. Aplikasi hasad dapat membebankan biaya kepada Anda dengan mengirim pesan tanpa konfirmasi dari Anda."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"baca SMS atau MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Mengizinkan aplikasi membaca pesan SMS yang tersimpan dalam tablet atau kartu SIM Anda. Aplikasi hasad dapat membaca pesan rahasia Anda."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Mengizinkan aplikasi untuk membaca pesan SMS yang disimpan di tablet atau kartu SIM. Aplikasi berbahaya dapat membaca pesan rahasia Anda."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Mengizinkan aplikasi membaca SMS yang tersimpan dalam ponsel atau kartu SIM Anda. Aplikasi hasad dapat membaca pesan rahasia Anda."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"edit SMS atau MMS"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Mengizinkan aplikasi untuk menulis pesan SMS yang tersimpan dalam tablet atau kartu SIM Anda. Aplikasi hasad dapat menghapus pesan Anda."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Mengizinkan aplikasi untuk menulis ke pesan SMS yang disimpan di tablet atau kartu SIM. Aplikasi berbahaya dapat menghapus pesan Anda."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Mengizinkan aplikasi untuk menulis pesan SMS yang tersimpan dalam ponsel atau kartu SIM Anda. Aplikasi hasad dapat menghapus pesan Anda."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"terima WAP"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Mengizinkan aplikasi menerima dan memproses pesan WAP. Aplikasi hasad dapat memonitor pesan Anda atau menghapusnya tanpa menampilkannya kepada Anda."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"cegah pergantian aplikasi"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Mencegah pengguna beralih ke aplikasi lain."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"memonitor dan mengontrol semua pengaktifan aplikasi"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Mengizinkan aplikasi memantau dan mengontrol cara sistem meluncurkan aktivitas. Aplikasi hasad dapat mengubah sistem sepenuhnya. Izin ini hanya diperlukan untuk pengembangan, tidak pernah diperlukan untuk penggunaan ponsel secara normal."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Mengizinkan aplikasi memonitor dan mengontrol cara sistem meluncurkan aktivitas. Aplikasi berbahaya dapat mengambil alih sistem sepenuhnya. Izin ini hanya diperlukan untuk pengembangan, jangan pernah digunakan untuk penggunaan normal."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"kirim siaran paket dihapus"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Mengizinkan aplikasi mengirimkan pemberitahuan bahwa paket aplikasi telah dihapus. Aplikasi hasad dapat menggunakan ini untuk menghentikan aplikasi yang sedang berjalan lainnya."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"kirim siaran SMS-diterima"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"tampilkan jendela yang tidak diizinkan"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Mengizinkan pembuatan jendela yang dimaksudkan untuk digunakan oleh antarmuka pengguna sistem internal. Bukan untuk digunakan oleh aplikasi normal."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"tampilkan lansiran tingkat sistem"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Memungkinkan suatu aplikasi menampilkan jendela peringatan sistem. Aplikasi hasad dapat mengambil alih seluruh layar."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Mengizinkan aplikasi menampilkan jendela lansiran sistem. Aplikasi berbahaya dapat mengambil alih seluruh layar."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"ubah kecepatan animasi global"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Mengizinkan aplikasi mengubah kecepatan animasi global (animasi lebih cepat atau lebih lambat) kapan saja."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"kelola token aplikasi"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Mengizinkan aplikasi untuk membuat dan mengelola tokennya sendiri, memintas pengurutan Z normalnya. Jangan pernah digunakan untuk aplikasi normal."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"tekan kunci dan tombol kontrol"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Mengizinkan aplikasi mengirimkan data masukannya sendiri (penekanan tombol, dll.) ke aplikasi lainnya. Aplikasi hasad dapat menggunakan ini untuk mengambil alih tablet."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Mengizinkan aplikasi untuk mengirim aktivitas masukan sendiri (penekanan tombol, dll.) ke aplikasi lain. Aplikasi berbahaya dapat menggunakan ini untuk mengambil alih tablet."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Mengizinkan aplikasi mengirimkan data masukannya sendiri (penekanan tombol, dll.) ke aplikasi lainnya. Aplikasi hasad dapat menggunakan ini untuk mengambil alih ponsel."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"rekam apa yang diketik dan tindakan yang dilakukan"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Mengizinkan aplikasi melihat tombol yang Anda tekan bahkan ketika berinteraksi dengan aplikasi lain (seperti memasukkan sandi). Tidak pernah diperlukan untuk aplikasi normal."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"pasang aplikasi secara langsung"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Mengizinkan aplikasi memasang paket Android baru atau yang diperbarui. Aplikasi hasad dapat menggunakan ini untuk menambahkan aplikasi dengan izin yang kuat secara sembarangan."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"hapus semua data tembolok aplikasi"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Mengizinkan aplikasi mengosongkan penyimpanan tablet dengan menghapus berkas dalam direktori tembolok aplikasi. Akses sangat terbatas, biasanya hanya untuk proses sistem."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Mengizinkan aplikasi mengosongkan penyimpanan tablet dengan menghapus berkas dalam direktori tembolok aplikasi. Akses sangat dibatasi biasannya pada proses sistem."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Mengizinkan aplikasi mengosongkan penyimpanan ponsel dengan menghapus berkas dalam direktori tembolok aplikasi. Akses sangat terbatas, biasanya pada proses sistem."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Pindahkan sumber daya aplikasi"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Mengizinkan aplikasi memindah sumber daya aplikasi dari media internal ke eksternal dan sebaliknya."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"baca berkas log sistem"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Memungkinkan aplikasi membaca dari berbagai berkas log sistem. Ini memungkinkan aplikasi menemukan informasi umum tentang apa yang Anda lakukan dengan tablet, yang mungkin meliputi informasi pribadi."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Memungkinkan aplikasi membaca dari berbagai berkas log sistem. Ini memungkinkan aplikasi menemukan informasi umum tentang apa yang Anda lakukan dengan tablet, yang mungkin meliputi informasi pribadi."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"baca data log sensitif"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Mengizinkan aplikasi membaca dari berbagai berkas log sistem. Ini memungkinkan aplikasi menemukan informasi umum tentang apa yang Anda lakukan dengan tablet, kemungkinan termasuk informasi pribadi."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Mengizinkan aplikasi membaca dari berbagai berkas log sistem. Ini memungkinkan aplikasi menemukan informasi umum tentang apa yang Anda lakukan dengan ponsel, kemungkinan termasuk informasi pribadi."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"baca/tulis ke sumber daya yang dimiliki oleh diag"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Mengizinkan aplikasi membaca dan menulis ke sumber daya yang dimiliki oleh grup diag; misalnya, berkas dalam /dev. Ini berisiko mempengaruhi kestabilan dan keamanan sistem. Ini sebaiknya HANYA digunakan untuk diagnostik khusus perangkat keras oleh pabrik atau operator."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"aktifkan atau nonaktifkan komponen aplikasi"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Mengizinkan aplikasi mengubah pengaktifan dan penonaktifan komponen aplikasi lain. Aplikasi hasad dapat menggunakan ini untuk menonaktifkan kemampuan tablet yang penting. Berhati-hatilah dan gunakan dengan izin, karena hal ini berisiko menyebabkan komponen aplikasi menjadi tidak dapat digunakan, tidak konsisten, atau tidak stabil."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Mengizinkan aplikasi mengubah pengaktifan dan penonaktifan komponen aplikasi lain. Aplikasi hasad dapat menggunakan ini untuk menonaktifkan kemampuan tablet yang penting. Berhati-hatilah dan gunakan dengan izin, karena hal ini berisiko menyebabkan komponen aplikasi menjadi tidak dapat digunakan, tidak konsisten, atau tidak stabil."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Izinkan aplikasi mengubah apakah komponen aplikasi lain diaktifkan atau tidak. Aplikasi berbahaya dapat menggunakan ini untuk menonaktifkan kemampuan tablet penting. Hati-hatilah saat menggunakan izin ini, karena komponen aplikasi tidak akan dapat digunakan, tidak konsisten, atau tidak stabil."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Izinkan aplikasi mengubah apakah komponen aplikasi lain diaktifkan atau tidak. Aplikasi berbahaya dapat menggunakan ini untuk menonaktifkan kemampuan ponsel penting. Hati-hatilah saat menggunakan izin ini, karena komponen aplikasi tidak akan dapat digunakan, tidak konsisten, atau tidak stabil."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"atur aplikasi yang disukai"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Mengizinkan aplikasi memodifikasi aplikasi yang dipilih. Ini dapat dimanfaatkan aplikasi hasad untuk diam-diam mengubah aplikasi yang sedang berjalan, spoofing aplikasi yang ada untuk mengumpulkan data pribadi dari Anda."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"ubah setelan sistem global"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"ubah peta layanan Google"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Mengizinkan aplikasi mengubah peta layanan Google. Tidak untuk digunakan oleh aplikasi normal."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"mulai secara otomatis pada saat boot"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Memungkinkan aplikasi memulai secara otomatis segera setelah sistem selesai booting. Ini dapat memperlambat proses memulai tablet dan menyebabkan aplikasi memperlambat tablet secara keseluruhan karena terus-terusan aktif."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Mengizinkan aplikasi menyala sendiri segera setelah sistem selesai booting. Hal ini dapat memperlama waktu memulai tablet dan menyebabkan aplikasi memperlambat tablet secara keseluruhan jika terus berjalan."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Mengizinkan aplikasi memulai sendiri segera setelah sistem selesai booting. Ini dapat memperlambat proses memulai ponsel dan menyebabkan aplikasi memperlambat ponsel secara keseluruhan ketika terus berjalan."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"kirim siaran memikat"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Memungkinkan aplikasi mengirimkan siaran lengket, yang tetap ada setelah siaran berakhir. Aplikasi hasad dapat memperlambat tablet atau membuatnya tidak stabil dengan menyebabkannya menggunakan terlalu banyak memori."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Mengizinkan aplikasi mengirim siaran permanen, yang tetap ada setelah siaran berakhir. Aplikasi berbahaya dapat memperlambat tablet atau tidak stabil dengan menyebabkan terlalu banyaknya memori yang digunakan."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Mengizinkan aplikasi mengirimkan siaran memikat, yang tetap ada setelah siaran berakhir. Aplikasi hasad dapat memperlambat ponsel atau membuatnya tidak stabil dengan menyebabkannya menggunakan terlalu banyak memori."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"baca data kenalan"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Memungkinkan aplikasi membaca semua data (alamat) kenalan yang tersimpan pada tablet. Aplikasi hasad dapat menggunakan ini untuk mengirimkan data Anda kepada orang lain."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Mengizinkan aplikasi membaca semua data kenalan (alamat) yang disimpan pada tablet Anda. Aplikasi berbahaya dapat menggunakan ini untuk mengirim data ke orang lain."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Mengizinkan aplikasi membaca semua data kenalan (alamat) yang tersimpan pada ponsel. Aplikasi hasad dapat menggunakan ini untuk mengirimkan data Anda ke orang lain."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"tuliskan data kenalan"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Memungkinkan aplikasi mengubah data kenalan (alamat) yang tersimpan pada tablet. Aplikasi hasad dapat menggunakan ini untuk menghapus atau mengubah data kenalan Anda."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Mengizinkan aplikasi memodifikasi data kenalan (alamat) yang disimpan pada tablet Anda. Aplikasi berbahaya dapat menggunakan ini untuk menghapus atau mengubah data kenalan."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Mengizinkan aplikasi mengubah data kenalan (alamat) yang tersimpan pada ponsel. Aplikasi hasad dapat menggunakan ini untuk menghapus atau mengubah data kenalan Anda."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"membaca acara kalender."</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Mengizinkan aplikasi membaca semua acara kalender yang tersimpan pada tablet. Aplikasi hasad dapat menggunakan ini untuk mengirimkan acara kalender Anda kepada orang lain."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Mengizinkan aplikasi membaca semua acara kalender yang disimpan pada tablet Anda. Aplikasi berbahaya dapat menggunakan ini untuk mengirim acara kalender ke orang lain."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Mengizinkan aplikasi membaca semua acara kalender yang tersimpan pada ponsel. Aplikasi hasad dapat menggunakan ini untuk mengirimkan acara kalender ke orang lain."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"Tambahkan atau modifikasi acara kalender dan kirimkan email ke tamu"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Mengizinkan aplikasi menambahkan atau mengubah acara pada kalender Anda, yang dapat mengirikan email ke tamu. Aplikasi hasad dapat menggunakan ini untuk menghapus atau mengubah acara kalender Anda atau mengirim email ke tamu."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"izin untuk memasang suatu penyedia lokasi"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Buat sumber lokasi tiruan untuk menguji. Aplikasi hasad dapat menggunakan ini untuk mengganti lokasi dan/atau status yang dikembalikan oleh sumber lokasi asli seperti GPS atau penyedia Jaringan atau memonitor dan melaporkan lokasi Anda ke sumber eksternal."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"lokasi terperinci (GPS)"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Akses sumber lokasi detail seperti GPS pada tablet, jika tersedia. Aplikasi hasad dapat menggunakan ini untuk menentukan lokasi Anda, dapat menguras daya baterai."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Sumber lokasi kualitas tinggi akses seperti Sistem Penentuan Posisi Global pada tablet, jika tersedia. Aplikasi berbahaya dapat menggunakan ini untuk menentukan perkiraan lokasi Anda, dan dapat menyedot daya baterai."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Akses sumber lokasi detail seperti GPS pada ponsel, jika tersedia. Aplikasi hasad dapat menggunakan ini untuk menentukan lokasi Anda, dapat menguras daya baterai."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"lokasi sementara (berdasarkan jaringan)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Akses sumber lokasi kasar seperti database jaringan seluler untuk menentukan perkiraan lokasi tablet terdekat, jika ada. Aplikasi hasad dapat menggunakan ini untuk memperkirakan lokasi Anda."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Sumber lokasi sementara akses seperti database jaringan seluler untuk menentukan perkiraan lokasi tablet, jika tersedia. Aplikasi berbahaya dapat menggunakan ini untuk menentukan perkiraan lokasi Anda."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Akses sumber lokasi sementara seperti database jaringan seluler untuk menentukan lokasi ponsel terdekat, jika ada. Aplikasi hasad dapat menggunakan ini untuk memperkirakan lokasi Anda."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"akses SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Izinkan aplikasi menggunakan fitur tingkat rendah SurfaceFlinger."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Mengizinkan aplikasi mengubah setelan audio global seperti volume dan perutean."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"rekam audio"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Mengizinkan aplikasi mengakses jalur rekaman audio."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"ambil foto"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Mengizinkan aplikasi mengambil foto dengan kamera. Ini memungkinkan aplikasi kapan pun juga menangkap gambar yang dilihat kamera."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"nonaktifkan tablet secara permanen"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"ambil gambar dan video"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Mengizinkan aplikasi mengambil gambar dan video dengan kamera. Ini mengizinkan aplikasi kapan pun untuk mengumpulkan gambar yang dilihat kamera."</string>
+    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"noaktifkan tablet secara permanen"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"nonaktifkan ponsel secara permanen"</string>
-    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Mengizinkan aplikasi untuk menonaktifkan seluruh tablet secara permanen. Hal ini sangat berbahaya."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Mengizinkan aplikasi menonaktifkan seluruh tablet secara permanen. Ini sangat berbahaya."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Mengizinkan aplikasi untuk menonaktifkan seluruh ponsel secara permanen. Hal ini sangat berbahaya."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"paksa reboot tablet"</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"reboot tablet secara paksa"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"paksa reboot ponsel"</string>
-    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Mengizinkan aplikasi memaksa tablet untuk melakukan reboot."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Mengizinkan aplikasi memaksa tablet dinyalakan ulang."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Mengizinkan aplikasi memaksa ponsel untuk melakukan reboot."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"pasang dan lepas filesystem"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Mengizinkan aplikasi memuat dan melepas sistem berkas untuk penyimpanan aman."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"format penyimpanan eksternal"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Mengizinkan aplikasi memformat penyimpanan aman."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"dapatkan informasi tentang penyimpanan aman"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Mengizinkan aplikasi mendapatkan informasi pada penyimpanan aman."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"buat penyimpanan aman"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Mengizinkan aplikasi membuat penyimpanan aman."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"hancurkan penyimpanan aman"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Mengizinkan aplikasi menghancurkan penyimpanan aman."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"pasang / lepas penyimpanan aman"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Mengizinkan aplikasi memuat / melepas penyimpanan aman."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"ubah nama penyimpanan aman"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Mengizinkan aplikasi mengubah nama penyimpanan aman."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"dapatkan informasi pada penyimpanan internal"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Mengizinkan aplikasi untuk mendapatkan informasi pada penyimpanan internal."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"buat penyimpanan internal"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Mengizinkan aplikasi untuk membuat penyimpanan internal."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"merusak penyimpanan internal"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Mengizinkan aplikasi untuk merusak penyimpanan internal."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"pasang / lepas penyimpanan internal"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Mengizinkan aplikasi untuk memasang / melepas penyimpanan internal."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"ubah nama penyimpanan internal"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Mengizinkan aplikasi untuk mengubah penyimpanan internal."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"mengontrol penggetar"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Mengizinkan aplikasi mengontrol penggetar."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"mengontrol lampu senter"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Mengizinkan aplikasi mengontrol lampu senter."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"akses perangkat USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Mengizinkan aplikasi untuk perangkat USB."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"uji perangkat keras"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Mengizinkan aplikasi mengontrol berbagai perangkat periferal untuk tujuan menguji perangkat keras."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"panggil nomor telepon secara langsung"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Mengizinkan aplikasi untuk memanggil nomor telepon tanpa campur tangan Anda. Aplikasi hasad dapat menyebabkan panggilan tak terduga pada tagihan ponsel Anda. Perhatikan bahwa hal ini tidak mengizinkan aplikasi tersebut memanggil nomor darurat."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"panggil nomor telepon apa pun secara langsung"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Mengizinkan aplikasi untuk memanggil nomor telepon apapun, termasuk nomor darurat, tanpa intervensi Anda. Aplikasi hasad dapat melakukan panggilan ilegal dan tidak perlu ke layanan darurat."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"mulai penyiapan tablet CDMA secara langsung"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"memulai penyiapan tablet CDMA secara langsung"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"mulai penyiapan ponsel CDMA secara langsung"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Mengizinkan aplikasi memulai penyediaan CDMA. Aplikasi hasad dapat tiba-tiba memulai penyediaan CDMA."</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"mengontrol pemberitahuan pembaruan lokasi"</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Mengizinkan aplikasi mengendalikan fitur ponsel pada perangkat. Suatu aplikasi dengan izin ini dapat beralih jaringan, menghidupkan dan mematikan radio ponsel dan semacamnya tanpa memberitahukan kepada Anda."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"baca kondisi dan identitas ponsel"</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Mengizinkan aplikasi mengakses fitur ponsel yang ada pada perangkat. Suatu aplikasi dengan izin ini dapat menentukan nomor telepon dan nomor seri telepon, apakah panggilan telah aktif, nomor yang dipanggil, dan semacamnya."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"mencegah tablet masuk mode tidur"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"cegah tablet dari tidur"</string>
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"mencegah ponsel menjadi tidak aktif"</string>
-    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Memungkinkan aplikasi mencegah tablet masuk ke mode tidur."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Izinkan aplikasi mencegah tablet tidur."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Mengizinkan aplikasi mencegah ponsel masuk ke mode tidur"</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"daya tablet hidup atau mati"</string>
+    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"hidupkan atau matikan tablet"</string>
     <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"daya ponsel hidup atau mati"</string>
-    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Memungkinkan aplikasi mematikan dan menghidupkan tablet."</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Mengizinkan aplikasi untuk menghidupkan atau mematikan tablet."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Mengizinkan aplikasi mematikan dan menghidupkan ponsel."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"jalankan pada mode uji pabrik"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Jalankan sebagai uji pabrik tingkat rendah, yang memungkinkan akses penuh pada perangkat keras tablet. Hanya tersedia ketika tablet berjalan pada mode uji pabrik."</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Menjalankan sebagai uji pabrikan tingkat rendah, mengizinkan akses lengkap ke perangkat keras tablet. Hanya tersedia jika tablet berjalan dalam mode uji pabrikan."</string>
     <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Jalankan sebagai uji pabrik tingkat rendah, yang memungkinkan akses penuh pada perangkat keras ponsel. Hanya tersedia ketika ponsel berjalan pada mode uji pabrik."</string>
     <string name="permlab_setWallpaper" msgid="6627192333373465143">"atur wallpaper"</string>
     <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Mengizinkan aplikasi mengatur wallpaper sistem."</string>
@@ -403,15 +397,15 @@
     <string name="permlab_masterClear" msgid="2315750423139697397">"setel ulang sistem ke setelan bawaan pabrik"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Mengizinkan aplikasi menyetel ulang sistem sepenuhnya ke setelan pabriknya, menghapus semua data, konfigurasi, dan aplikasi yang terpasang."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"atur waktu"</string>
-    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Mengizinkan aplikasi mengubah waktu jam tablet."</string>
+    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Izinkan aplikasi mengubah waktu jam pada tablet."</string>
     <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Mengizinkan aplikasi mengubah waktu jam ponsel."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"atur zona waktu"</string>
-    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Memungkinkan aplikasi mengubah zona waktu tablet."</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Izinkan aplikasi mengubah zona waktu pada tablet."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Mengizinkan aplikasi mengubah zona waktu ponsel."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"bertindak sebagai AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Mengizinkan aplikasi melakukan panggilan ke AccountAuthenticators"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"menemukan akun yang diketahui"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Mengizinkan aplikasi mendapatkan daftar akun yang dikenali oleh tablet."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Mengizinkan aplikasi untuk mendaftar akun yang diketahui oleh tablet."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Mengizinkan aplikasi mengubah mendapatkan daftar akun yang dikenali oleh ponsel."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"bertindak sebagai autentikator akun"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Mengizinkan aplikasi menggunakan kemampuan autentikator akun pada AccountManager, termasuk di antaranya membuat akun dan mendapatkan dan mengatur sandi."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Izinkan penerimaan Wi-Fi Multicast"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Mengizinkan aplikasi menerima paket yang tidak langsung dialamatkan ke perangkat Anda. Ini dapat bermanfaat ketika mencari perangkat yang ditawarkan di dekat Anda. Aplikasi ini menggunakan lebih banyak daya ketimbang mode selain multicast."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"Administrasi bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Memungkinkan aplikasi mengonfigurasi tablet Bluetooth lokal, serta menemukan dan menyandingkannya dengan perangkat jarak jauh."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Mengizinkan aplikasi untuk mengonfigurasi tablet Bluetooth lokal, dan menemukan serta memasang dengan perangkat jarak jauh."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Mengizinkan aplikasi mengonfigurasi ponsel Bluetooth lokal, dan menemukan dan menyandingkan perangkat jarak jauh."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"buat sambungan Bluetooth"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Mengizinkan aplikasi melihat konfigurasi tablet Bluetooth lokal, serta melakukan dan menerima panggilan dengan perangkat yang disandingkan."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Mengizinkan aplikasi melihat konfigurasi tablet Bluetooth lokal, dan melakukan dan menerima koneksi dengan perangkat terpasang."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Mengizinkan aplikasi melihat konfigurasi ponsel Bluetooth lokal, dan membuat dan menerima panggilan dengan perangkat yang disandingkan."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"kontrol NFC"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Mengizinkan aplikasi berkomunikasi dengan tag, kartu, dan pembaca Near Field Communication (NFC)."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"nonaktifkan kunci tombol"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Mengizinkan aplikasi menonaktifkan keylock dan keamanan sandi terkait mana pun. Contoh yang sah adalah ponsel menonaktifkan keylock ketika menerima panggilan telepon masuk, kemudian mengaktifkan keylock sekali lagi setelah panggilan selesai."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"baca setelan sinkron"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Mengizinkan aplikasi membaca kata, nama, dan frasa pribadi yang mungkin telah disimpan dalam kamus pengguna."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"tulis ke kamus buatan pengguna"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Mengizinkan aplikasi menuliskan kata-kata baru ke dalam kamus pengguna."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"ubah/hapus isi kartu SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"ubah/hapus konten penyimpanan USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"ubah/hapus isi kartu SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Mengizinkan aplikasi menulis ke kartu SD."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Mengizinkan aplikasi untuk menulis ke penyimpanan USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Mengizinkan aplikasi menulis ke kartu SD."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"ubah/hapus konten penyimpanan media internal"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Mengizinkan aplikasi mengubah konten penyimpanan media internal."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"akses sistem berkas tembolok."</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Mengizinkan aplikasi membaca dan menulis filesystem tembolok."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Batasi sandi"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Batasi jenis sandi yang Anda perbolehkan gunakan."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Awasi upaya masuk"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Memonitor jumlah sandi tidak benar yang dimasukkan saat membuka kunci layar, dan mengunci tablet atau menghapus semua data tablet jika sandi yang salah dimasukkan berkali-kali"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Memonitor jumlah sandi tidak benar yang dimasukkan saat membuka kunci layar, dan mengunci tablet atau menghapus semua data tablet jika sandi yang salah dimasukkan berkali-kali"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Setel ulang sandi"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Paksakan sandi ke nilai baru, administrator harus memberikannya kepada Anda sebelum dapat masuk."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Paksakan kunci"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Mengontrol ketika perangkat mengunci, Anda harus memasukkan sandi lagi."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"lakukan//terima panggilan internet"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Mengizinkan aplikasi menggunakan layanan SIP melakukan/menerima telepon internet"</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Setel aturan sandi"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Kontrol panjangnya dan karakter yang diizinkan dalam sandi pembuka layar"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Upaya pembukaan kunci layar monitor"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Monitor jumlah sandi yang salah dimasukkan ketika membuka kunci layar, dan mengunci tablet atau menghapus semua data tablet jika terlalu banyak sandi yang salah dimasukkan"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Monitor jumlah sandi yang salah dimasukkan ketika membuka kunci layar, dan mengunci ponsel atau menghapus semua data ponsel jika terlalu banyak sandi yang salah dimasukkan"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Ubah sandi pembuka kunci layar"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Ubah sandi pembuka kunci layar"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Kunci layar"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Kontrol cara dan kapan layar mengunci"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Hapus semua data"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Menghapus data tablet tanpa peringatan, dengan melakukan pengembalian ke setelan pabrik"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Menghapus data tablet tanpa peringatan, dengan melakukan pengembalian ke setelan pabrik"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Hapus data tablet tanpa peringatan, dengan menyetel ulang data pabrik"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Hapus data ponsel tanpa peringatan, dengan menyetel ulang data pabrik"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Setel proxy global perangkat"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Setel proxy global perangkat yang akandigunakan ketika kebijakan diaktifkan. Hanya admin perangkat pertama yang menyetel procy global yang berlaku."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Setel kedaluwarsa sandi"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Kontrol berapa lama sebelum sandi penguncian layar perlu diubah"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Rumah"</item>
     <item msgid="869923650527136615">"Seluler"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager Kantor"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asisten"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Ubahsuaian"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Hari Ulang Tahun"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Hari Peringatan"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Acara"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Lainnya"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Ubahsuaian"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Rumah"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Kantor"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Kantor"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Lainnya"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Ubahsuaian"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Ubahsuaian"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Asisten"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Saudara laki-laki"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Anak"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Mitra Serumah"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Ayah"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Teman"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Manajer"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Ibu"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Orang tua"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Mitra"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Dirujuk oleh"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Sanak saudara"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Saudara perempuan"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Pasangan"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Ubahsuaian"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Beranda"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Kerjaan"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Lainnya"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Masukkan kode PIN"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Masukkan sandi untuk membuka"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Masukkan PIN untuk membuka kunci"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Kode PIN salah!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Untuk membuka, tekan Menu lalu 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nomor darurat"</string>
@@ -646,14 +609,13 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Kembali ke panggilan"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Perbaiki!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Maaf, coba lagi"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Maaf, harap coba lagi"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Mengisi daya (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Terisi."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="lockscreen_low_battery" msgid="1482873981919249740">"Hubungkan pengisi daya."</string>
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Tidak ada kartu SIM."</string>
-    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Tidak ada Kartu SIM di dalam tablet."</string>
+    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Tidak ada kartu SIM dalam tablet."</string>
     <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Tidak ada Kartu SIM di dalam ponsel."</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Masukkan kartu SIM"</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"Panggilan darurat saja"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Kartu SIM terkunci."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Membuka kartu SIM…"</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Anda telah salah menggambar pola pembuka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. "\n\n"Harap coba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> detik."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Anda telah salah menggambar pola pembuka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Bila gagal lagi <xliff:g id="NUMBER_1">%d</xliff:g> kali, Anda akan diminta membuka kunci tablet menggunakan info masuk Google."\n\n" Harap coba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Anda telah salah memasukkan sandi <xliff:g id="NUMBER_0">%d</xliff:g> kali. "\n\n"Coba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> detik."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Anda telah salah memasukkan PIN <xliff:g id="NUMBER_0">%d</xliff:g> kali. "\n\n"Coba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> detik."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Anda telah salah menggambar pola pembuka kunci <xliff:g id="NUMBER_0">%d</xliff:g> kali. Setelah <xliff:g id="NUMBER_1">%d</xliff:g> upaya yang gagal, Anda akan diminta membuka kunci tablet menggunakan info masuk Google."\n\n" Harap masuk lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Anda telah salah menggambar pola pembuka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Setelah <xliff:g id="NUMBER_1">%d</xliff:g> upaya gagal lagi, Anda akan diminta membuka kunci ponsel menggunakan info masuk Google."\n\n" Harap coba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Coba lagi dalam <xliff:g id="NUMBER">%d</xliff:g> detik."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Lupa pola?"</string>
@@ -698,23 +658,17 @@
     <string name="double_tap_toast" msgid="1068216937244567247">"Kiat: ketuk dua kali untuk memperbesar dan memperkecil."</string>
     <string name="autofill_this_form" msgid="1272247532604569872">"IsiOtomatis"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Penyiapan IsiOtomatis"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"baca riwayat dan bookmark Peramban"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Izinkan aplikasi membaca semua URL yang telah dikunjungi Peramban, dam semua bookmark Peramban."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"tuliskan riwayat dan bookmark Peramban"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Memungkinkan aplikasi mengubah riwayat atau bookmark Peramban yang tersimpan pada ponsel. Aplikasi hasad dapat menggunakan ini untuk menghapus atau mengubah data Peramban."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Mengizinkan aplikasi memodifikasi riwayat atau bookmark Peramban yang disimpan pada tablet Anda. Aplikasi berbahaya dapat menggunakan ini untuk menghapus atau mengubah data Peramban."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Mengizinkan aplikasi mengubah riwayat atau bookmark Peramban yang tersimpan pada ponsel. Aplikasi hasad dapat menggunakan ini untuk menghapus atau mengubah data Peramban."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"setel alarm di jam alarm"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Perbolehkan aplikasi untuk menyetel alarm di aplikasi jam alarm yang terpasang. Beberapa aplikasi jam alarm tidak dapat menerapkan fitur ini."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Ubah izin geolokasi Peramban"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Mengizinkan aplikasi mengubah izin geolokasi Peramban. Aplikasi hasad dapat menggunakan ini untuk mengizinkan pengiriman informasi lokasi ke situs web sembarangan."</string>
     <string name="save_password_message" msgid="767344687139195790">"Apakah Anda ingin peramban menyimpan sandi ini?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"Potong"</string>
     <string name="copy" msgid="2681946229533511987">"Salin"</string>
     <string name="paste" msgid="5629880836805036433">"Tempel"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Tidak ada yang disalin"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Salin URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Pilih teks..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Pemilihan teks"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Metode masukan"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Edit teks"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Tindakan teks"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Ruang penyimpanan tinggal sedikit"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Ruang penyimpanan tablet hampir habis."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Ruang penyimpanan tablet semakin sedikit."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Ruang penyimpanan ponsel tersisa sedikit."</string>
     <string name="ok" msgid="5970060430562524910">"OK"</string>
     <string name="cancel" msgid="6442560571259935130">"Batal"</string>
     <string name="yes" msgid="5362982303337969312">"OK"</string>
     <string name="no" msgid="5141531044935541497">"Batal"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Perhatian"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Memuat..."</string>
     <string name="capital_on" msgid="1544682755514494298">"HIDUP"</string>
     <string name="capital_off" msgid="6815870386972805832">"MATI"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Tindakan lengkap menggunakan"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Tutup paksa"</string>
     <string name="report" msgid="4060218260984795706">"Laporkan sebagai"</string>
     <string name="wait" msgid="7147118217226317732">"Tunggu"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Aplikasi dialihkan"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang berjalan."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah diluncurkan aslinya."</string>
+    <string name="smv_application" msgid="295583804361236288">"Aplikasi <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) telah melanggar kebijakan StrictMode yang diberlakukan secara otomatis."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> telah melanggar kebijakan StrictMode yang diberlakukan secara otomatis."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Pilih untuk beralih ke aplikasi"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Ubah aplikasi?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Aplikasi lain sudah berjalan yang harus dihentikan sebelum Anda dapat memulai yang baru."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Kembali ke<xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Jangan memulai aplikasi baru."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Mulai <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Hentikan aplikasi lama tanpa menyimpan."</string>
     <string name="sendText" msgid="5132506121645618310">"Pilih tindakan untuk teks"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Volume dering"</string>
     <string name="volume_music" msgid="5421651157138628171">"Volume media"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Tampilkan semua"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"Penyimpanan Massal USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB terhubung"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Anda telah menyambungkan ponsel ke komputer melalui USB. Pilih tombol di bawah jika ingin menyalin berkas antar komputer dan kartu SD Android Anda."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Anda telah menyambungkan ponsel ke komputer melalui USB. Pilih tombol di bawah jika ingin menyalin berkas antar komputer dan kartu SD Android Anda."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Anda telah terhubung ke komputer melalui USB. Sentuh tombol di bawah jika Anda ingin menyalin berkas antara komputer dan penyimpanan USB Android Anda."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Anda telah terhubung ke komputer melalui USB. Sentuh tombol di bawah jika Anda ingin menyalin berkas antara komputer dan kartu SD Android Anda."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Hidupkan penyimpanan USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Ada masalah saat menggunakan kartu SD Anda untuk penyimpanan USB."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Ada masalah saat menggunakan kartu SD Anda untuk penyimpanan USB."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Tidak ada masalah menggunakan penyimpanan USB untuk penyimpanan massal USB."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Tidak ada masalah menggunakan kartu SD untuk penyimpanan massal USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB terhubung"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Pilih untuk menyalin berkas ke/dari komputer Anda."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Matikan penyimpanan USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Pilih untuk mematikan penyimpanan USB."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"Penyimpanan USB sedang digunakan"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Sebelum mematikan penyimpanan USB, pastikan bahwa Anda telah melepas (“dikeluarkan”) kartu SD Android dari komputer."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Sebelum mematikan penyimpanan USB, pastikan Anda telah melepas (“dikeluarkan”) penyimpanan USB Android Anda dari komputer."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Sebelum mematikan penyimpanan USB, pastikan bahwa Anda telah melepas (“dikeluarkan”) kartu SD Android dari komputer."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Matikan penyimpanan USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Ada masalah ketika mematikan penyimpanan USB. Periksa untuk memastikan bahwa Anda telah melepaskan inang USB, lalu coba sekali lagi."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Jika Anda menghidupkan penyimpanan USB, sebagian aplikasi yang Anda gunakan akan berhenti dan mungkin tidak tersedia sampai Anda mematikan penyimpanan USB."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Operasi USB gagal"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Format kartu SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Format penyimpanan USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Format kartu SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Apakah Anda yakin ingin memformat kartu SD? Semua data pada kartu akan hilang."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Format penyimpanan USB, menghapus semua berkas yang disimpan di sana? Tindakan tidak dapat diurungkan!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Apakah Anda yakin ingin memformat kartu SD? Semua data pada kartu akan hilang."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Debugging USB terhubung"</string>
@@ -960,28 +897,28 @@
     <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>"calon"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Menyiapkan kartu SD"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Menyiapkan penyimpanan USB"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Menyiapkan kartu SD"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Memeriksa galat."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Kartu SD kosong"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Penyimpanan USB kosong"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Kartu SD kosong"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Kartu SD kosong atau memiliki sistem berkas yang tidak didukung."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Penyimpanan USB kosong atau tidak memiliki sistem berkas yang tidak didukung."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"Kartu SD kosong atau memiliki sistem berkas yang tidak didukung."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Kartu SD rusak"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Penyimpanan USB rusak"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Kartu SD rusak"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Kartu SD rusak. Anda mungkin harus memformatnya."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Penyimpanan USB rusak. Anda mungkin perlu memformat ulang."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Kartu SD rusak. Anda mungkin harus memformatnya."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Kartu SD tiba-tiba dicabut"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Penyimpanan USB dilepas secara tidak sengaja"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"Kartu SD tiba-tiba dicabut"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Lepaskan kartu SD sebelum mencabutnya untuk mencegah hilangnya data."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Lepas penyimpanan USB sebelum menghapus untuk menghindari kehilangan data."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Lepaskan kartu SD sebelum mencabutnya untuk mencegah hilangnya data."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Kartu SD aman dicabut"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Penyimpanan USB aman untuk dilepas"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"Kartu SD aman dicabut"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Anda dapat melepaskan kartu SD dengan aman."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Anda dapat melepas penyimpanan USB dengan aman."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Anda dapat melepaskan kartu SD dengan aman."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Cabut kartu SD"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Penyimpanan USB dihapus"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Cabut kartu SD"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Kartu SD dicabut. Masukkan yang baru."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Penyimpanan USB dihapus. Masukkan media baru."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"Kartu SD dicabut. Masukkan yang baru."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Tidak ditemukan aktivitas yang sesuai"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"perbarui statistik penggunaan komponen"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Kirimkan"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Berikutnya"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Selesai"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Sebelumnya"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Lakukan"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Panggil nomor "\n"menggunakan<xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Buat kenalan "\n"menggunakan <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Kunci pra-bagi berbasis L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Sertifikat berbasis L2TP/IPSec VPN"</string>
     <string name="upload_file" msgid="2897957172366730416">"Pilih berkas"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Tidak ada berkas yang dipilih"</string>
     <string name="reset" msgid="2448168080964209908">"Setel ulang"</string>
     <string name="submit" msgid="1602335572089911941">"Kirim"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mode mobil diaktifkan"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Pilih untuk keluar mode mobil"</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering (Penambatan) atau hotspot aktif"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Sentuh untuk mengonfigurasikan"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Kembali"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Selanjutnya"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Lewati"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"penggunaan data seluler yang tinggi"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Sentuh untuk mengetahui penggunaan data seluler lebih lengkap"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Batas data seluler terlampaui"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Sentuh untuk mengetahui penggunaan data seluler lebih lengkap"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Tidak ada kecocokan"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Temukan pada laman"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 kecocokan"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> dari <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Selesai"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Melepas penyimpanan USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Melepas kartu SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Menghapus penyimpanan USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Menghapus kartu SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Gagal menghapus penyimpanan USB."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Gagal menghapus kartu SD."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"Kartu SD dihapus sebelum dilepas."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Saat ini penyimpanan USB sedang diperiksa."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"Kartu SD sedang diperiksa."</string>
+    <string name="media_removed" msgid="7001526905057952097">"Kartu SD telah dihapus."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Saat ini penyimpanan USB sedang digunakan oleh komputer."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Kartu SD sedang digunakan oleh komputer."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Media eksternal dalam status tidak diketahui."</string>
+    <string name="share" msgid="1778686618230011964">"Bagikan"</string>
+    <string name="find" msgid="4808270900322985960">"Temukan"</string>
+    <string name="websearch" msgid="4337157977400211589">"Penelusuran Web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index f472755..3f36563 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -456,7 +456,7 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Consente a un\'applicazione di leggere parole, nomi e frasi private che l\'utente potrebbe aver memorizzato nel dizionario utente."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"scrittura nel dizionario definito dall\'utente"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Consente a un\'applicazione di scrivere nuove parole nel dizionario utente."</string>
-    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"modifica/eliminaz. archivio USB"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"modifica/eliminaz. contenuti archivio USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificare/eliminare i contenuti della scheda SD"</string>
     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Consente di scrivere nell\'archivio USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Consente a un\'applicazione di scrivere sulla scheda SD."</string>
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Stato dei supporti esterni sconosciuto."</string>
     <string name="share" msgid="1778686618230011964">"Condividi"</string>
     <string name="find" msgid="4808270900322985960">"Trova"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Ricerca Web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 67a6403..6396ec1 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"דואר קולי"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"בעיה בחיבור או קוד MMI לא תקין."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"הפעולה מוגבלת למספרי חיוג קבועים בלבד."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"השירות הופעל."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"השירות הופעל עבור:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"השירות הושבת."</string>
@@ -126,7 +125,7 @@
     <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="2292820184396262278">"שטח האחסון בטבלט מלא! מחק חלק מהקבצים כדי לפנות שטח."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"שטח האחסון בטבלט מלא! מחק קבצים כדי לפנות שטח."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"שטח האחסון בטלפון מלא! מחק חלק מהקבצים כדי לפנות שטח."</string>
     <string name="me" msgid="6545696007631404292">"אני"</string>
     <string name="power_dialog" product="tablet" msgid="8545351420865202853">"אפשרויות טבלט"</string>
@@ -137,13 +136,12 @@
     <string name="screen_lock" msgid="799094655496098153">"נעילת מסך"</string>
     <string name="power_off" msgid="4266614107412865048">"כיבוי"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"מבצע כיבוי..."</string>
-    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"הטבלט שלך יכובה."</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"הטבלט שלך יכבה."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"הטלפון שלך יכובה."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"האם ברצונך לבצע כיבוי?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"אחרונות"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"לא הותקנו יישומים לאחרונה."</string>
-    <string name="global_actions" product="tablet" msgid="408477140088053665">"אפשרויות טבלט"</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>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"כלי פיתוח"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"תכונות הדרושות למפתחי יישומים בלבד."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"שטח אחסון"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"גישה לכרטיס ה-SD."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"גישה לאמצעי אחסון מסוג USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"גישה לכרטיס ה-SD."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"השבת או שנה את שורת המצב"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"מאפשר ליישום להשבית את שורת המצב או להוסיף ולהסיר סמלי מערכת."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"שורת מצב"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"מאפשר ליישום להיות שורת המצב."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"הרחב/כווץ את שורת המצב"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"מאפשר ליישום להרחיב או לכווץ את שורת המצב."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"עכב שיחות יוצאות"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"שלח הודעות SMS"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"מאפשר ליישום לשלוח הודעות SMS. יישומים זדוניים עלולים לגרום לחיובים על ידי שליחת הודעות ללא אישורך."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"קריאת SMS או MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"מאפשר ליישום לקרוא הודעות SMS המאוחסנות בטבלט או בכרטיס ה-SIM. יישומים זדוניים עלולים לקרוא את ההודעות הסודיות."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"מאפשר ליישום לקרוא הודעות SMS המאוחסנות בטבלט או בכרטיס ה-SIM. יישומים זדוניים עלולים למחוק את ההודעות שלך."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"מאפשר ליישום לקרוא הודעות SMS המאוחסנות בטלפון או בכרטיס ה-SIM. יישומים זדוניים עלולים לקרוא את ההודעות הסודיות."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"ערוך SMS או MMS"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"מאפשר ליישום לכתוב להודעות SMS המאוחסנות בטבלט או בכרטיס ה-SIM. יישומים זדוניים עלולים למחוק את ההודעות."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"מאפשר ליישום לכתוב להודעות SMS המאוחסנות בטבלט או בכרטיס ה-SIM. יישומים זדוניים עלולים למחוק את ההודעות שלך."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"מאפשר ליישום לכתוב להודעות SMS המאוחסנות בטלפון או בכרטיס ה-SIM. יישומים זדוניים עלולים למחוק את ההודעות."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"קבל WAP"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"מאפשר ליישום לקבל ולעבד הודעות WAP. יישומים זדוניים עלולים לעקוב אחר ההודעות או למחוק אותן מבלי להציג אותן לך."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"מנע החלפת יישומים"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"מונע מהמשתמש לעבור ליישום אחר."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"עקוב ושלוט בכל השקת היישומים"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"מאפשר ליישום לעקוב אחרי האופן שבו המערכת מפעילה פעילויות ולשלוט בו. יישומים זדוניים עלולים לפגוע לחלוטין במערכת. הרשאה זו דרושה רק לפיתוח, לעולם לא לשימוש רגיל."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"מאפשר ליישום לעקוב אחר האופן שבו המערכת מפעילה פעילויות ולשלוט בו. יישומים זדוניים עשויים לפגוע לגמרי במערכת. הרשאה זו דרושה רק לצורך פיתוח, לעולם לא לשימוש רגיל."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"שליחת שידור שהוסר מחבילה"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"מאפשר ליישום לשדר התראה שחבילת יישום הוסרה. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לסיים יישומים פועלים אחרים."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"שלח שידור שהתקבל ב-SMS"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"הצג חלונות לא מורשים"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"מאפשר יצירת חלונות המיועדים לשימוש של ממשק המשתמש במערכת הפנימית. לא לשימוש של יישומים רגילים."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"הצג התראות ברמת המערכת"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"מאפשר ליישום להציג חלונות התראה של המערכת. יישומים זדוניים עלולים להשתלט על המסך כולו."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"מאפשר ליישום להציג חלונות של התראות מערכת. יישומים זדוניים עלולים להשתלט על המסך כולו."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"שנה את מהירות ההנפשה הכללית"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"מאפשר ליישום לשנות את מהירות ההנפשה הכללית (הנפשות מהירות או איטיות יותר) בכל עת."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"נהל אסימוני יישום"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"מאפשר ליישומים ליצור ולנהל אסימונים משלהם, תוך עקיפת סידור ה-Z הרגיל שלהם. לא אמור להידרש לעולם ליישומים רגילים."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"לחיצה על מקשים ושליטה בלחצנים"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"מאפשר ליישום לספק אירועי קלט משלו (הקשות על מקשים וכדומה) ליישומים אחרים. יישומים זדוניים עלולים להשתמש ביכולת זו כדי להשתלט על הטבלט."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"מאפשר ליישום לספק אירועי קלט משלו (לחיצות על מקשים וכדומה) ליישומים אחרים. יישומים זדוניים עלולים להשתמש ביכולת זו כדי להשתלט על הטבלט."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"מאפשר ליישום לספק אירועי קלט משלו (הקשות על מקשים וכדומה) ליישומים אחרים. יישומים זדוניים עלולים להשתמש ביכולת זו כדי להשתלט על הטלפון."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"הקלט את מה שאתה מקליד ואת הפעולות שאתה מבצע"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"מאפשר ליישומים לצפות במקשים שעליהם אתה לוחץ בעת אינטראקציה עם יישום אחר (כגון הזנת סיסמה). לא אמור להיות דרוש לעולם ליישום רגילים."</string>
@@ -281,14 +277,14 @@
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"מאפשר ליישום לפנות שטח אחסון בטלפון על ידי מחיקת קבצים בספריית הקובץ השמור של היישום. הגישה מוגבלת מאוד בדרך כלל לתהליך מערכת."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"העבר משאבי יישום"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"מאפשר ליישום להעביר משאבי יישומים ממדיה פנימית לחיצונית ולהיפך."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"קריאת קובצי יומן מערכת"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"מאפשר ליישום לקרוא מקובצי היומן השונים של המערכת. יכולת זו מאפשרת לגלות מידע כללי על הפעולות שאתה מבצע בטבלט, שעשוי לכלול מידע אישי או פרטי."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"מאפשר ליישום לקרוא מקובצי היומן השונים של המערכת. יכולת זו מאפשרת לגלות מידע כללי על הפעולות שאתה מבצע בטבלט, שעשוי לכלול מידע אישי או פרטי."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"קרא נתונים רגישים של יומן רישום"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"מאפשר ליישום לקרוא מיומני הרישום השונים של המערכת. כך מתאפשר לו לגלות מידע כללי על הפעולות שלך בטבלט, מידע שעשוי לכלול מידע אישי או פרטי."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"מאפשר ליישום לקרוא מיומני הרישום השונים של המערכת. כך מתאפשר לו לגלות מידע כללי על הפעולות שלך בטלפון, מידע שעשוי לכלול מידע אישי או פרטי."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"קריאה/כתיבה למשאבים בבעלות diag"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"מאפשר ליישום לקרוא ולכתוב לכל משאב בבעלות קבוצת ה-diag; לדוגמה, קבצים ב-‎/dev. לפעולה זו יש פוטנציאל להשפיע על היציבות והאבטחה של המערכת. היצרן או המפעיל בלבד יכולים להשתמש ביכולת זו לצורך אבחונים ספציפיים בחומרה."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"הופך לפעיל או משבית רכיבי יישום"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"מאפשר ליישום לשנות ולקבוע אם רכיב של יישום אחר מופעל או לא. יישומים זדוניים עלולים להשתמש ביכולת זו כדי להשבית יכולות חשובות של הטבלט. יש להשתמש בזהירות בהרשאה זו, משום שהיא עלולה להעביר רכיבי יישום למצב לא שמיש, לא עקבי או לא יציב."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"מאפשר ליישום לשנות ולקבוע אם רכיב של יישום אחר מופעל או לא. יישומים זדוניים עלולים להשתמש ביכולת זו כדי להשבית יכולות חשובות של הטבלט. יש להשתמש בזהירות בהרשאה זו, משום שהיא עלולה להעביר רכיבי יישום למצב לא שמיש, לא עקבי או לא יציב."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"מאפשר ליישום להשתנות ללא קשר אם רכיב או יישום אחר מופעל או לא. יישומים זדוניים יכולים להשתמש ביכולת זו כדי להשבית יכולות חשובות של הטבלט. יש לנהוג בזהירות בהרשאה זו, כיוון שהיא עלולה להעביר רכיבי יישום למצב לא רגיל, לא עקבי או לא יציב."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"מאפשר ליישום להשתנות ללא קשר אם רכיב או יישום אחר מופעל או לא. יישומים זדוניים יכולים להשתמש ביכולת זו כדי להשבית יכולות חשובות של הטלפון. יש לנהוג בזהירות בהרשאה זו, כיוון שהיא עלולה להעביר רכיבי יישום למצב לא רגיל, לא עקבי או לא יציב."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"הגדר יישומים מועדפים"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"מאפשר ליישום לשנות את היישומים המועדפים. פעולה זו עלולה לאפשר ליישומים זדוניים לשנות באופן שקט את היישומים הפועלים, לזייף את היישומים הקיימים כדי לאסוף נתונים פרטיים ממך."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"שנה הגדרות מערכת כלליות"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"שינוי מפת השירותים של Google"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"מאפשר ליישום לשנות את מפת השירותים של Google. לא לשימוש של יישומים רגילים."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"הפעל אוטומטית באתחול"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"מאפשר ליישום להפעיל את עצמו מחדש לאחר אתחול המערכת. פעולה זו עלולה להאריך את זמן הפעלת הטבלט, ומאפשרת ליישום להאט את הפעולה הכוללת של הטבלט כאשר היא פועלת תמיד."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"מאפשר ליישום להפעיל את עצמו ברגע שהמערכת מסיימת את האתחול. מצב זה עלול להאריך את הפעלת הטבלט ולאפשר ליישום להאט את הפעולה הכללית של הטבלט אם יפעל תמיד."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"מאפשר ליישום להפעיל את עצמו מחדש לאחר אתחול המערכת. פעולה זו עלולה להאריך את הפעלת הטלפון ומאפשר ליישום להאט את הפעולה הכוללת של הטלפון אם היא פועלת תמיד."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"שלח שידור דביק"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"מאפשר ליישום לשלוח שידורים דביקים, הנשארים לאחר סיום השידור. יישומים זדוניים עלולים להאט את פעולת הטבלט או להפוך אותו ללא יציב כיוון שהם גורמים לשימוש מופרז בזיכרון."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"מאפשר ליישום לשלוח שידורים דביקים שנותרים לאחר שהשידור מסתיים. יישומים זדוניים יכולים להאט את הטבלט או להפוך אותו ללא יציב בכך שיגרמו לו להשתמש בזיכרון רב מדי."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"מאפשר ליישום לשלוח שירותים דביקים, הנשארים לאחר סיום השידור. יישומים זדוניים עלולים להאט את פעולת הטלפון או להפוך אותו ללא יציג כיוון שהם גורמים לשימוש מופרז בזיכרון."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"קרא נתונים של אנשי קשר"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"מאפשר ליישום לקרוא את כל הנתונים של אנשי הקשר (כתובות) המאוחסנים בטבלט. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לשלוח את הנתונים שלך לאנשים אחרים."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"מאפשר ליישום לקרוא את כל נתוני אנשי הקשר (כתובות) בטבלט. יישומים זדוניים יכולים להשתמש ביכולת זו כדי לשלוח את הנתונים לאחרים."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"מאפשר ליישום לקרוא את כל הנתונים של אנשי הקשר (כתובות) המאוחסנים בטלפון. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לשלוח את הנתונים שלך לאנשים אחרים."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"כתוב נתוני איש קשר"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"מאפשר ליישום לשנות את הנתונים של אנשי הקשר (כתובות) המאוחסנים בטבלט. יישומים זדוניים עלולים להשתמש ביכולת זו כדי למחוק או לשנות את הנתונים של אנשי הקשר."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"מאפשר ליישום לשנות את נתוני הקשר (כתובות) המאוחסנים בטבלט. יישומים זדוניים יכולים להשתמש ביכולת זו כדי למחוק או לשנות את נתוני אנשי הקשר."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"מאפשר ליישום לשנות את הנתונים של אנשי הקשר (כתובות) המאוחסנים בטלפון. יישומים זדוניים עלולים להשתמש ביכולת זו כדי למחוק או לשנות את הנתונים של אנשי הקשר."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"קרא אירועי לוח שנה"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"מאפשר ליישום לקרוא את כל אירועי לוח השנה המאוחסנים בטבלט. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לשלוח את אירועי לוח השנה שלך לאנשים אחרים."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"מאפשר ליישום לקרוא את כל נתוני לוח השנה המאוחסנים בטבלט. יישומים זדוניים יכולים להשתמש ביכולת זו כדי לשלוח את אירועי לוח השנה לאנשים אחרים."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"מאפשר ליישום לקרוא את כל אירועי לוח השנה המאוחסנים בטלפון. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לשלוח את אירועי לוח השנה שלך לאנשים אחרים."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"הוסף או שנה אירועי לוח השנה ושלח דוא\"ל לאורחים"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"מאפשר ליישום להוסיף או לשנות את האירועים בלוח השנה, פעולה שעשויה לשלוח דוא\"ל לאורחים. יישומים זדוניים עלולים להשתמש ביכולת זו כדי למחוק או לשנות את האירועים בלוח השנה או כדי לשלוח דוא\"ל לאורחים."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"הרשאה להתקין ספק מיקום"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"צור מקורות מיקום מדומים לצורך בדיקה. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לעקוף את המקום ו/או המצב המוחזרים על ידי מקורות המיקום האמיתיים כגון GPS או ספקי רשת או לעקוב ולדווח על המיקום שלך למקור חיצוני."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"מיקום מדויק (GPS)"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"קבל גישה למקורות מיקום מדויקים כגון מערכת מיקום גלובלית (GPS) בטבלט, כאשר הם זמינים. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לקבוע היכן אתה נמצא ולגרום לצריכת סוללה נוספת."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"קבל משאבי מיקומים מדויקים כגון \'מערכת מיקום גלובלית\' בטבלט בהתאם לזמינות. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לקבוע היכן אתה, ועשויים לצרוך כוח סוללה נוסף."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"קבל גישה למקורות מיקום מדויקים כגון מערכת מיקום גלובלית (GPS) בטלפון, כאשר הם זמינים. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לקבוע היכן אתה נמצא, ולגרום לצריכת סוללה נוספת."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"מיקום משוער (מבוסס רשת)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"קבל גישה למשאבי מיקום משוער כגון מסד הנתונים של הרשת הסלולרית כדי לקבוע את המיקום המשוער של הטבלט, כאשר הם זמינים. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לקבוע את מיקומך המשוער."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"קבל גישה למשאבי מיקום גולמיים כגון מסד הנתונים של רשת סלולרית כדי לקבוע מיקום משוער של הטבלט, כשהאפשרות זמינה. יישומים זדוניים עלולים להשתמש ביכולת זאת כדי לקבוע את מיקומך המשוער."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"קבל גישה למשאבי מיקום משוער כגון מסד הנתונים של הרשת הסלולרית כדי לקבוע את המיקום המשוער של הטלפון, כאשר ניתן. יישומים זדוניים עלולים להשתמש ביכולת זו כדי לקבוע את מיקומך המשוער."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"גישה ל-SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"מאפשר ליישומים להשתמש בתכונות SurfaceFlinger ברמה נמוכה."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"מאפשר ליישום לשנות הגדרות אודיו כלליות כגון עוצמת קול וניתוב."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"הקלט אודיו"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"מאפשר ליישום לגשת לנתיב הקלטת אודיו."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"צלם תמונות"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"מאפשר ליישום לצלם תמונות בעזרת המצלמה. כך מתאפשר ליישום לאסוף תמונות שהמצלמה רואה בכל עת."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"השבת לצמיתות את הטבלט"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"צלם תמונות וסרטונים"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"מאפשר ליישום לצלם תמונות וסרטוני וידאו באמצעות המצלמה. כך יכול היישום לאסוף בכל עת תמונות שהמצלמה רואה."</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="7379164636920817963">"מאפשר ליישום להשבית את הטבלט כולו לצמיתות. יכולת זו מסוכנת מאוד."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"מאפשר ליישום להשבית את הטבלט כולו לצמיתות."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"מאפשר ליישום להשבית את הטלפון כולו לצמיתות. יכולת זו מסוכנת מאוד."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"אלץ אתחול מחדש של הטבלט"</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="4555793623560701557">"מאפשר ליישום לאלץ את הטבלט לבצע אתחול מחדש."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"מאפשר ליישום לכפות על הטבלט לבצע אתחול מחדש."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"מאפשר ליישום לאלץ את הטלפון לבצע אתחול מחדש."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"טעינה וביטול טעינה של מערכות קבצים"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"מאפשר ליישום לטעון מערכות קבצים ולבטל את טעינתן עבור אחסון נשלף."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"פרמט אמצעי אחסון חיצוני"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"מאפשר ליישום לפרמט אחסון הניתן להסרה."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"קבלת מידע על אחסון מאובטח"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"מאפשר ליישום לקבל מידע על אחסון מאובטח."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"צור אחסון מאובטח"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"מאפשר ליישום ליצור אחסון מאובטח."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"השמד אחסון מאובטח"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"מאפשר ליישום להשמיד אחסון מאובטח."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"טען / בטל טעינה של אחסון מאובטח"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"מאפשר ליישום לטעון/להסיר טעינה של אחסון מאובטח."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"שנה את השם של אחסון מאובטח"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"מאפשר ליישום לשנות את השם של אחסון מאובטח."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"קבל מידע על אחסון פנימי"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"מאפשר ליישום לקבל מידע על אחסון פנימי."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"צור אחסון פנימי"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"מאפשר ליישום ליצור אחסון פנימי."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"השמד אחסון פנימי"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"מאפשר ליישום להשמיד אחסון פנימי."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"טען / בטל טעינה של אחסון פנימי"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"מאפשר ליישום לטעון/לבטל טעינה של אחסון פנימי."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"שנה שם של אחסון פנימי"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"מאפשר ליישום לשנות שם של אחסון פנימי."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"שליטה ברטט"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"מאפשר ליישום לשלוט ברטט."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"שליטה בפנס"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"מאפשר ליישום לשלוט בפנס."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"גישה להתקני USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"מאפשר ליישום גישה להתקני USB."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"בדוק חומרה"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"מאפשר ליישום לשלוט בציוד היקפי מסוגים שונים לצורך בדיקת חומרה."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"התקשר ישירות למספרי טלפון"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"מאפשר ליישום להתקשר למספרי טלפון ללא התערבות מצידך. יישומים זדוניים עלולים לגרום לשיחות לא צפויות בחשבון הטלפון. לתשומת ליבך, אינו מאפשר ליישום להתקשר למספרי חירום."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"התקשר ישירות למספרי טלפון"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"מאפשר ליישום להתקשר לכל מספר טלפון, כולל מספרי חירום, ללא התערבות מצידך. יישומים זדוניים עלולים לבצע שיחות מיותרות ולא חוקיות לשירותי חירום."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"הפעל ישירות התקנת טבלט מסוג CDMA"</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="6457447676108355905">"מאפשר ליישום להפעיל הקצאת CDMA. יישומים זדוניים עלולים להפעיל הקצאת CDMA ללא צורך"</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"שליטה בהתראות עדכון מיקום"</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"מאפשר ליישום לשלוט בתכונות הטלפון של המכשיר. יישום עם הרשאה זו יכול להחליף רשתות, להפעיל ולכבות את הרדיו בטלפון וכדומה מבלי להודיע לך כלל."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"קרא את המצב והזהות של הטלפון"</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"מאפשר ליישום לגשת לתכונות טלפון של המכשיר.יישום עם הרשאה זו יכול לקבוע את מספר הטלפון והמספר הסידורי של טלפון זה, אם שיחה היא פעילה, המספר שאליו מחוברת שיחה זו וכדומה."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"מנע מעבר של הטבלט למצב שינה"</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="4032181488045338551">"מאפשר ליישום למנוע מעבר של הטבלט למצב שינה."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"מאפשר ליישום למנוע מהטבלט לעבור למצב שינה."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"מאפשר ליישום למנוע מעבר של הטלפון למצב שינה."</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"הדלק או כבה את הטבלט"</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="3853773100100451905">"מאפשר ליישום לכבות ולהדליק את הטבלט."</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"מאפשר ליישום להפעיל או לכבות את הטבלט."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"מאפשר ליישום לכבות ולהדליק את הטלפון."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"הפעל במצב בדיקה של היצרן"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"הפעל כבדיקת יצרן ברמה נמוכה, המאפשרת גישה מלאה לחומרת הטבלט. זמין רק כאשר טבלט פועל במצב בדיקת יצרן."</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="6417041752170585837">"מאפשר ליישום להגדיר את טפט המערכת."</string>
@@ -411,7 +405,7 @@
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"פעל בתור ה-AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"מאפשר ליישום לבצע שיחות אל AccountAuthenticators"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"גלה חשבונות ידועים"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"מאפשר ליישום להגיע לרשימת החשבונות הידועים לטבלט."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"מאפשר ליישום לקבל רשימה של חשבונות הידועים לטבלט."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"מאפשר ליישום להגיע לרשימת החשבונות הידועים לטלפון."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"פעל כמאמת חשבון"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"מאפשר ליישום להשתמש ביכולות מאמת החשבון של מנהל החשבון, כולל יצירת חשבונות וקבלה והגדרה של הסיסמאות שלהם."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"אפשר קבלת שידורים מרובים ב-Wi-Fi"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"מאפשר ליישום לקבל חפיסות שלא ממוענות ישירות למכשיר שלך. יכולת זו שימושית בעת גילוי שירותים המוצעים בקרבת מקום. היא משתמשת במתח סוללה רב יותר לעומת מצב שאינו ריבוי שידורים."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"ניהול Bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"מאפשר ליישום להגדיר את הטבלט המקומי מסוג Bluetooth ולגלות התקנים מרוחקים ולבצע התאמה איתם."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"מאפשר ליישום להגדיר את הטבלט המקומי עם Bluetooth ולגלות ולהתאים התקנים מרוחקים."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"מאפשר ליישום להגדיר את טלפון Bluetooth המקומי, ולגלות מכשירים מרוחקים ולבצע התאמה איתם."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"צור חיבורי Bluetooth"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"מאפשר ליישום להציג תצורה של הטבלט המקומי מסוג Bluetooth וליצור ולקבל חיבורים עם מכשירים מותאמים."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"מאפשר ליישום להציג תצורה של טבלט Bluetooth מקומי וליצור ולקבל חיבורים עם התקנים מותאמים."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"מאפשר ליישום להציג תצורה של מכשיר Bluetooth המקומי, וליצור ולקבל חיבורים עם מכשירים מותאמים."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"שלוט ב-Near Field Communication"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"מאפשר ליישום לקיים תקשורת עם תגיות, כרטיסים וקוראים מסוג Near Field Communication ‏(NFC)."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"השבת נעילת מקשים"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"מאפשר ליישום להשבית את נעילת המקשים ואבטחת סיסמה משויכת. דוגמה תקפה לכך היא טלפון המשבית את נעילת המקשים בעת קבלת שיחת טלפון נכנסת, ולאחר מכן מפעיל מחדש את נעילת המקשים עם סיום השיחה."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"קרא הגדרות סנכרון"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"מאפשר ליישום לקרוא מילים, שמות וביטויים פרטיים שהמשתמש אחסן במילון המשתמש."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"כתוב למילון בהגדרת המשתמש"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"מאפשר ליישום לכתוב מילים חדשות במילון המשתמש."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"שנה/מחק את התוכן של כרטיס SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"שנה/מחק תכנים באמצעי אחסון מסוג USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"שנה/מחק את התוכן של כרטיס SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"מאפשר ליישום לכתובת לכרטיס ה-SD."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"מאפשר ליישום לכתוב לאמצעי אחסון מסוג USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"מאפשר ליישום לכתובת לכרטיס ה-SD."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"שנה/מחק תכנים של מדיית אחסון פנימית"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"מאפשר ליישום לשנות את התכנים של אחסון המדיה הפנימי."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"גישה למערכת הקבצים של הקובץ השמור"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"מאפשר ליישום לקרוא ולכתוב במערכת הקבצים של הקובץ השמור."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"הגבל סיסמה"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"הגבל את סוגי הסיסמאות שבהן מותר לך להשתמש."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"צפה בניסיונות התחברות"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"עקוב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, ונעל את הטבלט, או מחק את כל הנתונים בטבלט אם הוזנו סיסמאות שגויות רבות מדי"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"עקוב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, ונעל את הטבלט, או מחק את כל הנתונים בטבלט אם הוזנו סיסמאות שגויות רבות מדי"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"אפס סיסמה"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"אלץ את הסיסמה שלך לערך חדש, דורש שמנהל המערכת ייתן לך את הסיסמה לפני שתוכל להיכנס."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"אלץ נעילה"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"שולט במועד נעילת ההתקן, דורש הזנה חוזרת של הסיסמה שלו."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"בצע/קבל שיחות אינטרנט"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"מאפשר ליישום להשתמש בשירות SIP כדי לבצע/לקבל שיחות אינטרנט."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"הגדר כללי סיסמה"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"שלוט באורך ובמספר התווים המותרים בסיסמאות לביטול נעילת מסך"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"עקוב אחר ניסיונות לביטול נעילת מסך"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"עקוב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, ונעל את הטבלט או מחק את כל נתוני הטבלט אם הוזנו סיסמאות שגויות רבות מדי"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"עקוב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, ונעל את הטלפון או מחק את כל נתוני הטלפון אם הוזנו סיסמאות שגויות רבות מדי"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"שנה את הסיסמה לביטול נעילת המסך"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"שנה את הסיסמה לביטול נעילת המסך"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"נעל את המסך"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"שלוט באופן ובמועד של נעילות מסך"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"מחק את כל הנתונים"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"מחק את הנתונים בטבלט ללא אזהרה על ידי איפוס נתוני יצרן"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"מחק את הנתונים בטבלט ללא אזהרה על ידי איפוס נתוני יצרן"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"מחק את נתוני הטבלט ללא אזהרה על ידי ביצוע איפוס נתוני יצרן"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"מחק את נתוני הטלפון ללא אזהרה, על ידי ביצוע איפוס נתוני יצרן"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"הגדר את שרת ה-proxy הגלובלי של ההתקן"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"הגדר את שרת proxy הגלובלי של ההתקן לשימוש כאשר המדיניות מופעלת. רק מנהל ההתקן הראשון מגדיר את שרת ה-proxy הגלובלי הפעיל."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"הגדר תפוגת תוקף של סיסמה"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"שלוט בפרק הזמן הדרוש לשינוי הסיסמה של נעילת המסך"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"דף הבית"</item>
     <item msgid="869923650527136615">"נייד"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"איתורית של העבודה"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"מסייע"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"מותאם אישית"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"יום הולדת"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"יום השנה"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"אירוע"</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>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"עבודה"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"אחר"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"מותאם אישית"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <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="3731488827218876115">"הזן קוד PIN"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"הזן סיסמה לביטול הנעילה"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"הזן PIN לביטול נעילה"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"קוד PIN שגוי!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"כדי לבטל את הנעילה, לחץ על \'תפריט\' ולאחר מכן על 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"מספר חירום"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"חזרה לשיחה"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"נכון!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"מצטערים, נסה שוב"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"מצטערים, נסה שוב"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"טוען (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"נטען."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <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="3514742106066877476">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמים. "\n\n"נסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"ציירת את קו ביטול הנעילה באופן שגוי <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_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"הזנת סיסמה שגויה <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="6827749231465145590">"הזנת 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="8687762517114904651">"שרטטת באופן שגוי את קו ביטול הנעילה <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="3351013842320127827">"ציירת את קו ביטול הנעילה באופן שגוי <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_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>
@@ -698,23 +658,17 @@
     <string name="double_tap_toast" msgid="1068216937244567247">"טיפש: הקש פעמיים כדי להתקרב ולהתרחק."</string>
     <string name="autofill_this_form" msgid="1272247532604569872">"מילוי אוטומטי"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"התקן \'מילוי אוטומטי\'"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"קרא היסטוריה וסימניות של דפדפן"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"מאפשר ליישום לקרוא את כל כתובות האתרים שבהן ביקר הדפדפן, ואת כל הסימניות של הדפדפן."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"כתיבת היסטוריה וסימניות של דפדפן"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"מאפשר ליישום לשנות את ההיסטוריה או הסימניות של הדפדפן המאוחסנים בטבלט. יישומים זדוניים עלולים להשתמש ביכולת זו כדי למחוק או לשנות את נתוני הדפדפן."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"מאפשר ליישום לשנות את ההיסטוריה או הסימניות של הדפדפן המאוחסנות בטבלט. יישומים זדוניים יכולים להשתמש ביכולת זו כדי למחוק או לשנות את הנתונים בדפדפן."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"מאפשר ליישום לשנות את ההיסטוריה או הסימניות של הדפדפן המאוחסנים בטלפון. יישומים זדוניים עלולים להשתמש ביכולת זו כדי למחוק או לשנות את נתוני הדפדפן."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"הגדר התראה בשעון המעורר"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"מאפשר ליישום להגדיר התראה ביישום מותקן של שעון מעורר. חלק מיישומי השעון המעורר עשויים שלא ליישם תכונה זו."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"שנה את ההרשאות של מיקום גיאוגרפי בדפדפן"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"מאפשר ליישום לשנות את הרשאות היעד הגיאוגרפי של הדפדפן. יישומים זדוניים יכולים להשתמש ביכולת זו כדי לאפשר שליחה של פרטי מיקום לאתרי אינטרנט אקראיים."</string>
     <string name="save_password_message" msgid="767344687139195790">"האם ברצונך שהדפדפן יזכור סיסמה זו?"</string>
@@ -830,15 +784,12 @@
     <string name="cut" msgid="3092569408438626261">"גזור"</string>
     <string name="copy" msgid="2681946229533511987">"העתק"</string>
     <string name="paste" msgid="5629880836805036433">"הדבק"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"אין מה להדביק"</string>
     <string name="copyUrl" msgid="2538211579596067402">"העתק כתובת אתר"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"בחר טקסט..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"בחירת טקסט"</string>
     <string name="inputMethod" msgid="1653630062304567879">"שיטת קלט"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"ערוך טקסט"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"פעולות טקסט"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"חסר מקום"</string>
     <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"שטח האחסון בטבלט עומד להיגמר."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"שטח האחסון בטלפון עומד להיגמר."</string>
@@ -847,8 +798,7 @@
     <string name="yes" msgid="5362982303337969312">"אישור"</string>
     <string name="no" msgid="5141531044935541497">"ביטול"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"לידיעתך"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"טוען..."</string>
     <string name="capital_on" msgid="1544682755514494298">"הפעל"</string>
     <string name="capital_off" msgid="6815870386972805832">"כבוי"</string>
     <string name="whichApplication" msgid="4533185947064773386">"השלמת פעולה באמצעות"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"אלץ סגירה"</string>
     <string name="report" msgid="4060218260984795706">"דווח"</string>
     <string name="wait" msgid="7147118217226317732">"המתן"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"היישום נותב מחדש"</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="smv_application" msgid="295583804361236288">"היישום <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="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> פועל"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"בחר כדי לעבור ליישום"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"להחליף יישומים?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"יישום אחר כבר פועל ויש לעצור אותו לפני שתוכל להפעיל יישום חדש."</string>
+    <string name="old_app_action" msgid="493129172238566282">"חזרה אל <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"אל תפעיל את היישום החדש."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"הפעל את <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"הפסק את היישום הישן מבלי לשמור."</string>
     <string name="sendText" msgid="5132506121645618310">"בחר פעולה לטקסט"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"עוצמת הקול של הצלצול"</string>
     <string name="volume_music" msgid="5421651157138628171">"עוצמת קול של מדיה"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"הצג הכול"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"אחסון ב-USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB מחובר"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"חיברת את הטלפון למחשב באמצעות USB. בחר בלחצן בהמשך אם ברצונך להעתיק קבצים בין המחשב וכרטיס ה-SD של ה-Android."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"חיברת את הטלפון למחשב באמצעות USB. בחר בלחצן בהמשך אם ברצונך להעתיק קבצים בין המחשב וכרטיס ה-SD של ה-Android."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"התחברת למחשב באמצעות USB. גע בלחצן שבהמשך אם ברצונך להעתיק קבצים בין המחשב ואמצעי האחסון מסוג USB של התקן ה-Android."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"התחברת למחשב באמצעות USB. גע בלחצן שבהמשך אם ברצונך להעתיק קבצים בין המחשב וכרטיס ה-SD של התקן ה-Android."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"הפעל אחסון USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"יש בעיה בשימוש בכרטיס ה-SD שלך כאחסון USB."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"יש בעיה בשימוש בכרטיס ה-SD שלך כאחסון USB."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"קיימת בעיה בשימוש באמצעי אחסון מסוג USB לאחסון גדול ב-USB."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"יש בעיה בשימוש בכרטיס ה-SD לאחסון גדול ב-USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB מחובר"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"בחר כדי להעתיק קבצים מהמחשב/אל המחשב."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"כבה אחסון USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"בחר כדי לכבות אחסון USB."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"אחסון USB נמצא בשימוש"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"לפני כיבוי אחסון USB, ודא שהסרת (\"הוצאת\") את כרטיס ה-SD של Android מהמחשב."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"לפני כיבוי אמצעי אחסון מסוג USB, ודא שפרקת (\"הוצאת\") את אמצעי אחסון מסוג USB של Android מהמחשב."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"לפני כיבוי אחסון USB, ודא שהסרת (\"הוצאת\") את כרטיס ה-SD של Android מהמחשב."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"כבה אחסון USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"אירעה בעיה בכיבוי אחסון USB. בדוק כדי לוודא שלא ביטלת את טעינת מארח ה-USB, ולאחר מכן נסה שוב."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"אם תפעיל אחסון USB, חלק מהיישומים שבהם אתה משתמש יעצרו ולא יהיו זמינים עד שתכבה את אחסון ה-USB."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"הפעלת ה-USB נכשלה"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"אישור"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"פרמוט כרטיס SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"פרמט אמצעי אחסון מסוג USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"פרמוט כרטיס SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"האם אתה בטוח שברצונך לפרמט את כרטיס ה-SD? כל הנתונים בכרטיס יאבדו."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"לפרמט את אמצעי האחסון מסוג USB, תוך מחיקת כל הקבצים? הפעולה בלתי הפיכה!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"האם אתה בטוח שברצונך לפרמט את כרטיס ה-SD? כל הנתונים בכרטיס יאבדו."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"פורמט"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"ניקוי באגים של USB מחובר"</string>
@@ -960,28 +897,28 @@
     <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZאבגדהוזחטיכלמנסעפצקרשת"</string>
     <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ  0123456789אבגדהוזחטיכלמנסעפצקרשת"</string>
     <string name="candidates_style" msgid="4333913089637062257"><u>"מועמדים"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"מכין את כרטיס ה-SD"</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>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"כרטיס SD ריק"</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>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"כרטיס ה-SD ריק או שמערכת הקבצים שלו לא נתמכת."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"אמצעי אחסון ריק מסוג USB או עם מערכת קבצים לא נתמכת."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"כרטיס ה-SD ריק או שמערכת הקבצים שלו לא נתמכת."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"כרטיס 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>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"כרטיס ה-SD פגום. ייתכן שיהיה עליך לפרמט אותו שוב."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"אמצעי אחסון מסוג USB נפגם. ייתכן שיהיה עליך לפרמט אותו שוב."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"כרטיס ה-SD פגום. ייתכן שיהיה עליך לפרמט אותו שוב."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"כרטיס 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>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"בטל את טעינת כרטיס ה-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>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"אפשר להסיר את כרטיס ה-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>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"ניתן להסיר בבטחה את כרטיס ה-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>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"כרטיס ה-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>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"כרטיס 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="4168820609403385789">"לא נמצאו פעילויות תואמות"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"עדכון נתונים סטטיסטיים של שימוש ברכיב"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"שלח"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"הבא"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"בוצע"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"הקודם"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"בצע"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"חייג למספר"\n"באמצעות <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"צור איש קשר"\n"באמצעות <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"VPN של L2TP/IPSec המבוסס על מפתח משותף מראש"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN המבוסס על אישור"</string>
     <string name="upload_file" msgid="2897957172366730416">"בחר קובץ"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <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="668663626721675614">"בחר כדי לצאת ממצב מכונית."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"קשור או פעיל כנקודה חמה"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"גע כדי להגדיר"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <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="2609734763845705708">"גע למידע נוסף על שימוש בנתונים ניידים"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"אירעה חריגה ממגבלת הנתונים הניידים"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"גע למידע נוסף על שימוש נתונים ניידים"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"אין התאמות"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"מצא בדף"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"התאמה אחת"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> מתוך <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"בוצע"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"מבטל טעינה של אמצעי אחסון מסוג USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"מבטל טעינת כרטיס SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"מוחק אמצעי אחסון מסוג USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"מוחק כרטיס SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"נכשלה מחיקה של אמצעי אחסון מסוג USB."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"נכשלה מחיקת כרטיס 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">"כרטיס SD נמצא כעת בשימוש של מחשב."</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">"חיפוש Google"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index b94af31..ec9b578 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"外部メディアの状態は不明です。"</string>
     <string name="share" msgid="1778686618230011964">"共有"</string>
     <string name="find" msgid="4808270900322985960">"検索"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"ウェブ検索"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 9c30604..a6d93f8 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"외부 미디어가 알 수 없는 상태입니다."</string>
     <string name="share" msgid="1778686618230011964">"공유"</string>
     <string name="find" msgid="4808270900322985960">"찾기"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"웹 검색"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-land/dimens.xml b/core/res/res/values-land/dimens.xml
index b1f12b5..fbfc3bf 100644
--- a/core/res/res/values-land/dimens.xml
+++ b/core/res/res/values-land/dimens.xml
@@ -22,5 +22,6 @@
     <dimen name="password_keyboard_key_height">47dip</dimen>
     <dimen name="password_keyboard_spacebar_vertical_correction">2dip</dimen>
     <dimen name="preference_screen_side_margin">96dp</dimen>
+    <dimen name="preference_screen_side_margin_negative">-100dp</dimen>
     <dimen name="preference_widget_width">72dp</dimen>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/core/res/res/values-large/themes.xml b/core/res/res/values-large/themes.xml
index 12257a1..f5c35f6 100644
--- a/core/res/res/values-large/themes.xml
+++ b/core/res/res/values-large/themes.xml
@@ -19,9 +19,11 @@
 <resources>
     <style name="Theme.Holo.DialogWhenLarge"
             parent="@android:style/Theme.Holo.Dialog">
+        <item name="preferencePanelStyle">@style/PreferencePanel.Dialog</item>
     </style>
     <style name="Theme.Holo.DialogWhenLarge.NoActionBar"
             parent="@android:style/Theme.Holo.Dialog.NoActionBar">
+        <item name="preferencePanelStyle">@style/PreferencePanel.Dialog</item>
     </style>
     <style name="Theme.Holo.Light.DialogWhenLarge"
             parent="@android:style/Theme.Holo.Light.Dialog">
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 2414675..f866e62 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Balso paštas"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Ryšio problema arba neteisingas MMI kodas."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Operacija ribojama tik naudojant fiksuoto rinkimo numerius."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Paslauga įgalinta."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Paslauga buvo įgalinta:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Paslauga išjungta."</string>
@@ -139,8 +138,7 @@
     <string name="shutdown_progress" msgid="2281079257329981203">"Išsijungia..."</string>
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planšetinio kompiuterio veikimas bus sustabdytas."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonas bus išjungtas."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Ar norite stabdyti?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Naujos"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Nėra naujų programų."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Planšetinio kompiuterio parinktys"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Kūrėjo įrankiai"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Funkcijos reikalingos tik programos kūrėjams."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Saugykla"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Pasiekite SD kortelę."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Pasiekti USB atmintinę."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Pasiekite SD kortelę."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"išjungti ar keisti būsenos juostą"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Leidžia programai išjungti būsenos juostą arba pridėti ir pašalinti sistemos piktogramas."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"būsenos juosta"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Leidžiama programai būti būsenos juosta."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"išskleisti / sutraukti būsenos juostą"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Leidžia programai išskleisti arba sutraukti būsenos juostą."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"sulaikyti išeinančius skambučius"</string>
@@ -281,14 +277,14 @@
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Leidžia programoms atlaisvinti vietos telefono saugykloje ištrinant failus, esančius programos talpyklos kataloge. Prieiga labai ribojama, dažniausiai dėl sistemos procesų."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Perkelti programos išteklius"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Leidžia programai perkelti programos išteklius iš vidinės į išorinę mediją ir atvirkščiai."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"skaityti sistemos žurnalo failus"</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"skaityti slaptus žurnalo duomenis"</string>
     <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Leidžiama programai skaityti iš įvairių sistemos žurnalų failų. Taip galima atrasti bendrą informaciją apie tai, ką darote naudodami planšetinį kompiuterį, galimai įtraukiant asmeninę ar privačią informaciją."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Leidžiama programai skaityti iš įvairių sistemos žurnalų failų. Taip galima atrasti bendrą informaciją apie tai, ką darote naudodami planšetinį kompiuterį, galimai įtraukiant asmeninę ar privačią informaciją."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Leidžiama programai skaityti iš įvairių sistemos žurnalų failų. Taip galima atrasti bendrą informaciją apie tai, ką darote telefonu, galimai įtraukiant asmeninę ar privačią informaciją."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"skaityti / rašyti ištekliuose, priklausančiuose diagnostikai"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Leidžia programai skaityti ir rašyti visuose diagnostikos grupei priklausančiuose ištekliuose, pvz., failuose, esančiuose /dev. Tai gali paveikti sistemos stabilumą ir saugą. Tai turėtų būti naudojama TIK aparatinės įrangos diagnostikai, atliekamai gamintojo ar operatoriaus."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"įgalinti ar išjungti programos komponentus"</string>
     <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Leidžiama programai keisti, ar įgalintas kitos programos komponentas, ar ne. Kenkėjiškos programos tai gali naudoti, kad neleistų svarbių planšetinio kompiuterio funkcijų. Priežiūros darbai turi būti atliekami tik gavus šį leidimą, nes programos komponentai gali būti paversti nenaudojamais, nenuosekliais ar nestabiliais."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Leidžiama programai keisti, ar įgalintas kitos programos komponentas, ar ne. Kenkėjiškos programos tai gali naudoti, kad neleistų svarbių planšetinio kompiuterio funkcijų. Priežiūros darbai turi būti atliekami tik gavus šį leidimą, nes programos komponentai gali būti paversti nenaudojamais, nenuosekliais ar nestabiliais."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Leidžiama programai keisti, ar įgalintas kitos programos komponentas, ar ne. Kenkėjiškos programos tai gali naudoti, kad neleistų svarbių telefono funkcijų. Priežiūros darbai turi būti atliekami tik gavus šį leidimą, nes programos komponentai gali būti paversti nenaudojamais, nenuosekliais ar nestabiliais."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"nustatyti pageidaujamas programas"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Leidžia programai keisti pageidaujamas programas. Tai gali leisti kenkėjiškoms programoms tyliai keisti paleistas programas, apsimetant, kad esamos jūsų programos renka duomenis iš jūsų."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"keisti visuotinius sistemos nustatymus"</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"leidimas įdiegti vietos teikimo įrankį"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Kurti imituojančius vietos šaltinius bandymui. Kenkėjiškos programos gali tai naudoti, kad panaikintų vietą ir (arba) būseną, kurią pateikė tikrieji vietos šaltiniai, pvz., GPS ar tinklo paslaugų teikėjai, ar stebėtų ir praneštų jūsų vietą išoriniam šaltiniui."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"išsami (GPS) vieta"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Pasiekite išsamius vietos šaltinius, pvz., pasaulinę pozicijos nustatymo sistemą, naudodami planšetinį kompiuterį, jei pasiekiama. Kenkėjiškos programos gali tai naudoti, kad nustatytų, kur jūs esate, ir tai gali naudoti papildomą akumuliatoriaus energiją."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Pasiekite išsamius vietos šaltinius, pvz., pasaulinę pozicijos nustatymo sistemą, naudodami planšetinį kompiuterį, jei pasiekiama. Kenkėjiškos programos gali tai naudoti, kad nustatytų, kur jūs esate, ir tai gali eikvoti papildomą akumuliatoriaus energiją."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Pasiekite išsamius vietos šaltinius, pvz., pasaulinę pozicijos nustatymo sistemą, telefone, jei galima. Kenkėjiškos programos gali tai naudoti, kad nustatytų, kur jūs esate, ir tai gali naudoti papildomą akumuliatoriaus energiją."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"apytikslė (pagrįsta pagal tinklą) vieta"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Pasiekite apytikslius vietos šaltinius, pvz., korinio tinklo duomenis, kad nustatytumėte apytikslę planšetinio kompiuterio vietą, jei pasiekiama. Kenkėjiškos programos gali tai naudoti, kad apytiksliai nustatytų, kur jūs esate."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Pasiekite apytikslius vietos šaltinius, pvz., korinio tinklo duomenis, kad nustatytumėte apytikslę planšetinio kompiuterio vietą, jei įmanoma. Kenkėjiškos programos gali tai naudoti, kad apytiksliai nustatytų, kur jūs esate."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Pasiekite apytikslius vietos šaltinius, pvz., korinio tinklo duomenys, kad nustatytumėte apytikslę telefono vietą, jei įmanoma. Kenkėjiškos programos gali tai naudoti, kad apytiksliai nustatytų, kur jūs esate."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"pasiekti „SurfaceFlinger“"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Leidžia programai naudoti „SurfaceFlinger“ žemo lygio funkcijose."</string>
@@ -334,8 +330,8 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Leidžia programai keisti visus garso nustatymus, pvz., garsumą ir kelvadą."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"įrašyti garsą"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Leidžia programai pasiekti garso įrašo kelią."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"fotografuoti"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Leidžia programai fotografuoti fotoaparatu. Tai leidžia programai bet kuriuo metu rinkti vaizdus, kurie matomi fotoaparate."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"fotografuoti ir filmuoti"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Leidžiama programai fotografuoti ir filmuoti naudojant fotoaparatą. Taip programa gali bet kada rinkti fotoaparate pateikiamus vaizdus."</string>
     <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"visam laikui neleisti planšetinio kompiuterio"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"visam laikui išjungti telefoną"</string>
     <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Leidžiama programai visam laikui neleisti viso planšetinio kompiuterio. Tai labai pavojinga."</string>
@@ -348,24 +344,22 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Leidžia programai montuoti ir pašalinti keičiamos saugyklos failų sistemas."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatuoti išorinę saugyklą"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Leidžia programai formatuoti keičiamą saugyklą."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"gauti informacijos apie saugią saugyklą"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Leidžia programai gauti informacijos apie saugią saugyklą."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"kurti saugią saugyklą"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Leidžia programai sukurti saugią saugyklą."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"naikinti saugią saugyklą"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Leidžia programai naikinti saugią saugyklą."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"montuoti / pašalinti saugią saugyklą"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Leidžia programai montuoti / pašalinti saugią saugyklą."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"pervadinti saugią saugyklą"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Leidžia programai iš naujo pavadinti saugią saugyklą."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"gauti informacijos apie vidinę atmintinę"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Leidžiama programai gauti informacijos apie vidinę atmintinę."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"kurti vidinę atmintinę"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Leidžiama programai sukurti vidinę atmintinę."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"sunaikinti vidinę atmintinę"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Leidžiama programai sunaikinti vidinę atmintinę."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"prijungti / atjungti vidinę atmintinę"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Leidžiama programai prijungti / atjungti vidinę atmintinę."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"iš naujo pavadinti vidinę atmintinę"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Leidžiama programai iš naujo pavadinti vidinę atmintinę."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"valdyti vibratorių"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Leidžia programai valdyti vibratorių."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"valdyti šviesos signalą"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Leidžia programai valdyti šviesos signalą."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"pasiekti USB įrenginius"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Leidžiama programai pasiekti USB įrenginius."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"bandyti aparatinę įrangą"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Leidžia programai valdyti įvairius išorinius įrenginius aparatinės įrangos bandymo tikslais."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"skambinti tiesiogiai telefono numeriais"</string>
@@ -443,10 +437,8 @@
     <string name="permlab_bluetooth" msgid="8361038707857018732">"kurti „Bluetooth“ ryšius"</string>
     <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Leidžiama programai žiūrėti vietinio „Bluetooth“ planšetinio kompiuterio konfigūraciją ir užmegzti bei priimti susietų įrenginių ryšius."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Leidžia programai žiūrėti vietinio „Bluetooth“ telefono konfigūraciją ir užmegzti bei priimti susietų įrenginių ryšius."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"valdyti artimo lauko perdavimą (angl. „Near Field Communication“)"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Leidžiama programai perduoti artimo lauko perdavimo (angl. „Near Field Communication“, NFC) žymas, korteles ir skaitymo programas."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"išjungti užraktą"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Leidžia programai išjungti užraktą ir visą susijusią slaptažodžio apsaugą. Patikimas pavyzdys būtų užrakto išjungimas telefone gaunant įeinantį skambutį ir įgalinant jį vėl, kai skambutis baigtas."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"skaityti sinchronizavimo nustatymus"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Leidžia programai skaityti privačius žodžius, vardus ir frazes, kuriuos naudotojai išsaugojo naudotojo žodyne."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"rašyti naudotojo nustatytame žodyne"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Leidžia programai rašyti naujus žodžius į naudotojo žodyną."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"keisti / ištrinti SD kortelės turinį"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"keisti / ištrinti USB atmintinės turinį"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"keisti / ištrinti SD kortelės turinį"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Leidžia programai rašyti į SD kortelę."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Leidžiama programai įrašyti į USB atmintinę."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Leidžia programai rašyti į SD kortelę."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"keisti / ištrinti vidinės medijos atmintinės turinį"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Leidžiama programai keisti vidinės medijos atmintinės turinį."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"pasiekti talpyklos failų sistemą"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Leidžia programai skaityti ir rašyti į talpyklos failų sistemą."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Riboti slaptažodį"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Apriboti slaptažodžių tipus, kuriuos galite naudoti."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Žiūrėti bandymus prisijungti"</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"skambinti / priimti skambučius internetu"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Leidžiama programai naudoti SIP paslaugą norint skambinti / priimti skambučius internetu."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Nustatyti slaptažodžio taisykles"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Valdyti leidžiamą ekrano atrakinimo slaptažodžių ilgį ir juose leidžiamus naudoti simbolius"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Stebėti bandymus atrakinti ekraną"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Stebėti neteisingų slaptažodžių, įvestų atrakinant ekraną, skaičių ir, jei daug kartų įvedami neteisingi slaptažodžiai, užrakinti planšetinį kompiuterį ar ištrinti visus jo duomenis"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Stebėti neteisingų slaptažodžių, įvestų atrakinant ekraną, skaičių ir, jei daug kartų įvedami neteisingi slaptažodžiai, užrakinti planšetinį kompiuterį ar ištrinti visus jo duomenis"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Iš naujo nustatyti slaptažodį"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Pakeiskite slaptažodį į naują vertę, prašydami, kad administratorius suteiktų jums ją prieš prisijungiant."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Užrakinti"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Valdyti, kada įrenginys užsirakina, pareikalavęs iš naujo įvesti jo slaptažodį."</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Stebėti neteisingų slaptažodžių, įvestų atrakinant ekraną, skaičių ir, jei daug kartų įvedami neteisingi slaptažodžiai, užrakinti telefoną ar ištrinti visus jo duomenis"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Pakeisti ekrano užrakinimo slaptažodį"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Pakeisti ekrano užrakinimo slaptažodį"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Užrakinti ekraną"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Valdyti, kaip ir kada užrakinamas ekranas"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Trinti visus duomenis"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Be įspėjimo ištrinti planšetinio kompiuterio duomenis iš naujo nustatant gamyklinius duomenis"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Be įspėjimo ištrinti planšetinio kompiuterio duomenis iš naujo nustatant gamyklinius duomenis"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Be įspėjimo ištrinti telefono duomenis iš naujo nustatant gamyklinius duomenis"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Nustatyti įrenginio bendrąjį tarpinį serverį"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Nustatyti įrenginio bendrąjį tarpinį serverį, kad būtų naudojamas, kol įgalinta politika. Tik pirmasis įrenginio administratorius nustato efektyvų bendrąjį tarpinį serverį."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Nust. slaptaž. galiojimo pab."</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Valdyti, per kiek laiko iki ekrano užrakinimo turi būti pakeistas slaptažodis"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Pagrindinis"</item>
     <item msgid="869923650527136615">"Mobilusis"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Darbo pranešimų gaviklis"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistentas"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Priskirtas"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Gimimo diena"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Sukaktis"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Įvykis"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Kita"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Priskirtas"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Pagrindinis"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Darbo"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Darbo"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Kita"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Priskirtas"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Priskirtas"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistentas (-ė)"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Brolis"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Vaikas"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Civilinis partneris"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Tėvas"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Draugas (-ė)"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Vadovas (-ė)"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Motina"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Vienas iš tėvų"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Partneris (-ė)"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Rekomendavo"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Giminaitis (-ė)"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Sesuo"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Sutuoktinis (-ė)"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Priskirtas"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Pagrindinis"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Darbas"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Kita"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Įveskite PIN kodą"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Įveskite slaptažodį, kad atrakintumėte"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Jei norite atrakinti, įveskite PIN kodą"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Neteisingas PIN kodas!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Jei norite atrakinti, paspauskite „Meniu“ ir 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Pagalbos numeris"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"grįžti prie skambučio"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Teisingai!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Apgailestaujame, bandykite dar kartą"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Apgailestaujame, bandykite dar kartą"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Įkraunama (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Įkrauta."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM kortelė užrakinta."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Atrakinama SD kortelė..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Neteisingai apibrėžėte atrakinimo modelį <xliff:g id="NUMBER_0">%d</xliff:g> kartus (-ų)."\n\n"Bandykite dar kartą po <xliff:g id="NUMBER_1">%d</xliff:g> sek."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g> k. neteisingai nubrėžėte atrakinimo šabloną. Dar po <xliff:g id="NUMBER_1">%d</xliff:g> nesėkm. band. būsite paprašyti atrakinti planšetinį kompiuterį naudodami „Google“ prisijungimo duomenis."\n\n" Po <xliff:g id="NUMBER_2">%d</xliff:g> sek. bandykite dar kartą."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"<xliff:g id="NUMBER_0">%d</xliff:g> k. netinkamai įvedėte slaptažodį. "\n\n"Po <xliff:g id="NUMBER_1">%d</xliff:g> sek. bandykite dar kartą."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"<xliff:g id="NUMBER_0">%d</xliff:g> k. netinkamai įvedėte PIN kodą. "\n\n"Po <xliff:g id="NUMBER_1">%d</xliff:g> sek. bandykite dar kartą."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g> k. neteisingai nubrėžėte atrakinimo šabloną. Dar po <xliff:g id="NUMBER_1">%d</xliff:g> nesėkmingų (-o) bandymų (-o) būsite paprašyti atrakinti planšetinį kompiuterį naudodami „Google“ prisijungimo duomenis."\n\n" Po <xliff:g id="NUMBER_2">%d</xliff:g> sek. bandykite dar kartą."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Neteisingai nurodėte savo atrakinimo modelį <xliff:g id="NUMBER_0">%d</xliff:g> kartus (-ų). Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkmingų bandymų būsite paprašyti atrakinti telefoną naudojant „Google“ prisijungimo duomenis."\n\n" Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Bandyti dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sek."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Pamiršote modelį?"</string>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Išeiti iš šio puslapio?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Pasirinkite „Gerai“, jei norite tęsti, arba pasirinkite Atšaukti“, jei norite likti dabartiniame puslapyje."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Patvirtinti"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Patarimas: bakstelėkite du kartus, kad padidintumėte ar sumažintumėte mastelį."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Automatinis užpildymas"</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Automatinis pildymas"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Aut. pild. sąr."</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"skaityti naršyklės istoriją ir žymes"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Leidžia programai skaityti visus URL, kuriuose apsilankė naršyklė, ir visas naršyklės žymas."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"rašyti naršyklės istoriją ir žymes"</string>
     <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Leidžiama programai keisti naršyklės istoriją ar žymes, išsaugotas planšetiniame kompiuteryje. Kenkėjiškos programos gali tai naudoti, kad ištrintų ar keistų naršyklės duomenis."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Leidžia programai keisti naršyklės istoriją ar žymes, išsaugotus jūsų telefone. Kenkėjiškos programos gali tai naudoti, kad ištrintų ar keistų naršyklės duomenis."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"nustatyti žadintuvo signalą"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Leidžiama programai nustatyti signalą įdiegtoje žadintuvo programoje. Kai kuriose žadintuvo programose šios funkcijos gali nebūti."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Keisti naršyklės geografinės vietovės leidimus"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Leidžia programai keisti geografinių naršyklės vietų leidimus. Kenkėjiškos programos tai gali naudoti siunčiant vietos informaciją atsitiktinėms svetainėms."</string>
     <string name="save_password_message" msgid="767344687139195790">"Ar norite, kad naršyklė atsimintų šį slaptažodį?"</string>
@@ -830,15 +784,12 @@
     <string name="cut" msgid="3092569408438626261">"Iškirpti"</string>
     <string name="copy" msgid="2681946229533511987">"Kopijuoti"</string>
     <string name="paste" msgid="5629880836805036433">"Įklijuoti"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Nėra, ką įklijuoti"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Kopijuoti URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Pasirinkti tekstą..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Teksto pasirinkimas"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Įvesties būdas"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Redaguoti tekstą"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Teksto veiksmai"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mažai vietos"</string>
     <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Mažėja planšetinio kompiuterio atmintinės vietos."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Sparčiai mažėja vietos telefono saugykloje."</string>
@@ -847,8 +798,7 @@
     <string name="yes" msgid="5362982303337969312">"Gerai"</string>
     <string name="no" msgid="5141531044935541497">"Atšaukti"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Dėmesio"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Įkeliama..."</string>
     <string name="capital_on" msgid="1544682755514494298">"ĮJUNGTA"</string>
     <string name="capital_off" msgid="6815870386972805832">"IŠJUNGTA"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Užbaigti veiksmą naudojant"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Uždaryti"</string>
     <string name="report" msgid="4060218260984795706">"Ataskaita"</string>
     <string name="wait" msgid="7147118217226317732">"Palaukti"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Programa nukreipta"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ dabar vykdoma."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ buvo iš pradžių paleista."</string>
+    <string name="smv_application" msgid="295583804361236288">"Programa „<xliff:g id="APPLICATION">%1$s</xliff:g>“ (procesas „<xliff:g id="PROCESS">%2$s</xliff:g>“) pažeidė savo vykdomą „StrictMode“ politiką."</string>
+    <string name="smv_process" msgid="5120397012047462446">"„<xliff:g id="PROCESS">%1$s</xliff:g>“ procesas pažeidė savo vykdomą „StrictMode“ politiką."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"Vykdoma „<xliff:g id="APP">%1$s</xliff:g>“"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Pasirinkti perjungti į programą"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Perjungti programas?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Jau vykdoma kita programa, kurią reikia sustabdyti prieš paleidžiant naują."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Grįžti į <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Nepaleisti naujos programos."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Paleisti „<xliff:g id="OLD_APP">%1$s</xliff:g>“"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Sustabdyti seną programą neišsaugant."</string>
     <string name="sendText" msgid="5132506121645618310">"Pasirinkite teksto veiksmą"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Skambučio garsumas"</string>
     <string name="volume_music" msgid="5421651157138628171">"Medijos garsumas"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Rodyti viską"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB nuolatinė saugykla"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB prijungtas"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Naudodami USB, prijungėte savo telefoną prie kompiuterio. Pasirinkite toliau pateiktą mygtuką, jei norite kopijuoti failus iš kompiuterio į „Android“ SD kortelę ir atvirkščiai."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Naudodami USB, prijungėte savo telefoną prie kompiuterio. Pasirinkite toliau pateiktą mygtuką, jei norite kopijuoti failus iš kompiuterio į „Android“ SD kortelę ir atvirkščiai."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Prisijungėte prie kompiuterio per USB. Jei norite kopijuoti failus iš kompiuterio į „Android“ USB atmintinę ir atvirkščiai, palieskite toliau pateiktą mygtuką."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Prisijungėte prie kompiuterio per USB. Jei norite kopijuoti failus iš kompiuterio į „Android“ SD kortelę ir atvirkščiai, palieskite toliau pateiktą mygtuką."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Įjungti USB saugyklą"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Iškilo problema naudojant SD kortelę USB saugojimui."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Iškilo problema naudojant SD kortelę USB saugojimui."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Naudojant USB atmintinę didelės talpos USB atmintinei iškilo problema."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Naudojant SD kortelę didelės talpos USB atmintinei iškilo problema."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB prijungtas"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Pasirinkite į / iš kompiuterio kopijuojamus failus."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Išjungti USB saugyklą"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Pasirinkite, kad išjungtumėte USB saugyklą."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"Naudojama USB saugykla"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Prieš išjungiant USB saugyklą, įsitikinkite, kad pašalinote („išstūmėte“) „Android“ SD kortelę iš kompiuterio."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Prieš išjungdami USB atmintinę, įsitikinkite, kad atjungėte („išstūmėte“) „Android“ USB atmintinę iš kompiuterio."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Prieš išjungiant USB saugyklą, įsitikinkite, kad pašalinote („išstūmėte“) „Android“ SD kortelę iš kompiuterio."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Išjungti USB saugyklą"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Išjungiant USB saugyklą iškilo problemų. Įsitikinkite, kad pašalinote USB prieglobą ir bandykite dar kartą."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Jei įjungiate USB saugyklą, kai kurios naudojamos programos sustos ir gali būti negalimos, kol išjungsite USB saugyklą."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"USB operacija nepavyko"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"Gerai"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formatuoti SD kortelę"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Format. USB atmint."</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Formatuoti SD kortelę"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Ar tikrai norite formatuoti SD kortelę? Bus prarasti visi kortelės duomenys."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Formatuoti USB atmintinę ištrinant visus joje saugomus failus? Veiksmo nebus galima atšaukti!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Ar tikrai norite formatuoti SD kortelę? Bus prarasti visi kortelės duomenys."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatuoti"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB derinimas prijungtas"</string>
@@ -960,28 +897,28 @@
     <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
     <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
     <string name="candidates_style" msgid="4333913089637062257"><u>"kandidatai"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Ruošiama SD kortelė"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Ruošiama USB atmintinė"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Ruošiama SD kortelė"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Tikrinama, ar nėra klaidų."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Tuščia SD kortelė"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Tuščia USB atmintinė"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Tuščia SD kortelė"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"SD kortelė tuščia arba joje yra nepalaikoma failų sistema."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"USB atmintinė tuščia arba yra nepalaikoma failų sistema."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"SD kortelė tuščia arba joje yra nepalaikoma failų sistema."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Pažeista SD kortelė"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Sugadinta USB atmintinė"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Pažeista SD kortelė"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"SD kortelė pažeista. Gali reikėti ją formatuoti iš naujo."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"USB atmintinė sugadinta. Gali reikėti iš naujo ją suformatuoti."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"SD kortelė pažeista. Gali reikėti ją formatuoti iš naujo."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"SD kortelė netikėtai pašalinta"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB atmintinė netikėtai pašal."</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD kortelė netikėtai pašalinta"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Išimti SD kortelę prieš pašalinant, kad nebūtų prarasti duomenys."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Kad neprarastumėte duomenų, prieš pašalindami atjunkite USB atmintinę."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Išimti SD kortelę prieš pašalinant, kad nebūtų prarasti duomenys."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Saugu pašalinti SD kortelę"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Galima pašalinti USB atmintinę"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"Saugu pašalinti SD kortelę"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Galite saugiai pašalinti SD kortelę."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Galite saugiau pašalinti USB atmintinę."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Galite saugiai pašalinti SD kortelę."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Pašalinta SD kortelė"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Pašalinta USB atmintinė"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Pašalinta SD kortelė"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"SD kortelė pašalinta. Įdėkite naują."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB atmintinė pašalinta. Įdėti naują mediją."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD kortelė pašalinta. Įdėkite naują."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Nerasta atitinkančios veiklos"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"atnaujinti komponento naudojimo statistiką"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Siųsti"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Kitas"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Atlikta"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Perž."</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Vykdyti"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Rinkti numerį "\n"naudojant <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Sukurti adresatą"\n"naudojant <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Iš anksto bendrinamas raktas, pagrįstas L2TP/IPSec VPT"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Sertifikatas pagrįstas L2TP/IPSec VPT"</string>
     <string name="upload_file" msgid="2897957172366730416">"Pasirinkti failą"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Nepasirinktas joks failas"</string>
     <string name="reset" msgid="2448168080964209908">"Atstatyti"</string>
     <string name="submit" msgid="1602335572089911941">"Pateikti"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Įgalintas automobilio režimas"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Pasirinkite, kad išeitumėte iš automobilio režimo."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Susietas ar aktyvus"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Palieskite, kad galėtumėte konfigūruoti"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Atgal"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Kitas"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Praleisti"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Didelis mobiliųjų duomenų naudojimas"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Palieskite, kad sužinotumėte daugiau apie mobilių duomenų naudojimą"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Viršyta mobilių duomenų riba"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Palieskite, kad sužinotumėte daugiau apie mobilių duomenų naudojimą"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Nėra atitikčių"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Ieškoti puslapyje"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 atitiktis"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> iš <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Atlikta"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Atjungiama USB atmintinė..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Atjungiama SD kortelė..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Ištrinama USB atmintinė..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Ištrinama SD kortelė..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Nepavyko ištrinti USB atmintinės."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Nepavyko ištrinti SD kortelės."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"SD kortelė buvo pašalinta jos neatjungus."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Šiuo metu USB atmintinė tikrinama."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"Šiuo metu SD kortelė tikrinama."</string>
+    <string name="media_removed" msgid="7001526905057952097">"SD kortelė pašalinta."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Šiuo metu USB atmintinė naudojama kompiuteryje."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Šiuo metu SD kortelė naudojama kompiuteryje."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Nežinomos būsenos išorinė medija."</string>
+    <string name="share" msgid="1778686618230011964">"Bendrinti"</string>
+    <string name="find" msgid="4808270900322985960">"Ieškoti"</string>
+    <string name="websearch" msgid="4337157977400211589">"Žiniat. paieška"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index dbe7180..39962b0 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Balss pasts"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Savienojuma problēma vai nederīgs MMI kods."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Darbība ir atļauta tikai fiksēto numuru sastādīšanai."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Pakalpojums tika iespējots."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Pakalpojums tika iespējots šādai pakalpojumu klasei:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Pakalpojums ir atspējots."</string>
@@ -126,7 +125,7 @@
     <string name="contentServiceSync" msgid="8353523060269335667">"Sinhronizācija"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinhronizācija"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Pārāk daudz <xliff:g id="CONTENT_TYPE">%s</xliff:g> dzēsto vienumu."</string>
-    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Planšetdatora atmiņa ir pilna. Dzēsiet dažus failus, lai atbrīvotu vietu."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Planšetdatora krātuve ir pilna! Dzēsiet dažus failus, lai atbrīvotu vietu."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"tālruņa krātuve ir pilna! Dzēsiet dažus failus, lai atbrīvotu vietu."</string>
     <string name="me" msgid="6545696007631404292">"Man"</string>
     <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Planšetdatora opcijas"</string>
@@ -137,10 +136,9 @@
     <string name="screen_lock" msgid="799094655496098153">"Bloķēt ekrānu"</string>
     <string name="power_off" msgid="4266614107412865048">"Strāvas padeve ir izslēgta."</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Notiek izslēgšana..."</string>
-    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planšetdators tiks izslēgts."</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planšetdators tiks beidzēts."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Tālrunis tiks izslēgts."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Vai vēlaties beidzēt?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nesens"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Nav nesen izmantotu lietojumprogrammu."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Planšetdatora opcijas"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Izstrādes rīki"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Tikai lietojumprogrammu izstrādātājiem vajadzīgas funkcijas."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Krātuve"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Piekļūstiet SD kartei."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Piekļūst USB krātuvei."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Piekļūstiet SD kartei."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"atspējot vai pārveidot statusa joslu"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Ļauj lietojumprogrammai atspējot statusa joslu vai pievienot un noņemt sistēmas ikonas."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"statusa josla"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Ļauj lietojumprogrammai būt par statusa joslu."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"izvērst/sakļaut statusa joslu"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Ļauj lietojumprogrammai izvērst vai sakļaut statusa joslu."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"pārtvert izejošos zvanus"</string>
@@ -196,7 +192,7 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"sūtīt īsziņas"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Ļauj lietojumprogrammai sūtīt īsziņas. Ļaunprātīgas lietojumprogrammas var radīt jums izmaksas, bez apstiprinājuma sūtot īsziņas."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"lasīt īsziņu vai multiziņu"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Ļauj lietojumprogrammai lasīt planšetdatorā vai SIM kartē saglabātās īsziņas. Ļaunprātīgas lietojumprogrammas var lasīt jūsu konfidenciālos ziņojumus."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Ļauj lietojumprogrammai lasīt īsziņas, kas ir saglabātas planšetdatorā vai SIM kartē. Ļaunprātīgas lietojumprogrammas var lasīt jūsu konfidenciālos ziņojumus."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Ļauj lietojumprogrammai lasīt īsziņas, kas ir saglabātas jūsu tālrunī vai SIM kartē. Ļaunprātīgas lietojumprogrammas var lasīt konfidenciālos ziņojumus."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"rediģēt īsziņu vai multiziņu"</string>
     <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Ļauj lietojumprogrammai rakstīt īsziņās, kas ir saglabātas planšetdatorā vai SIM kartē. Ļaunprātīgas lietojumprogrammas var dzēst jūsu ziņojumus."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"novērst lietojumprogrammu pārslēgšanu"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Neļauj lietotājam pārslēgties uz citu lietojumprogrammu."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"pārraudzīt un kontrolēt visu lietojumprogrammu palaišanu"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Ļauj lietojumprogrammai pārraudzīt un kontrolēt to, kā sistēma uzsāk darbības. Ļaunprātīgas lietojumprogrammas var pilnībā apdraudēt sistēmu. Šī atļauja ir nepieciešama tikai izstrādei (taču ne parastai ierīces lietošanai)."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Ļauj lietojumprogrammai pārraudzīt un kontrolēt, kā sistēma palaiž darbības. Ļaunprātīgas lietojumprogrammas var pilnībā uzlauzt sistēmu. Šī atļauja ir nepieciešama tikai izstrādei, bet ne parastai lietošanai."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"sūtīt apraidi par pakotnes noņemšanu"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Ļauj lietojumprogrammai raidīt paziņojumu, ka lietojumprogrammas pakotne ir noņemta. Ļaunprātīgas lietojumprogrammas var to izmantot, lai pārtrauktu jebkuras citas aktīvas lietojumprogrammas darbību."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"sūtīt īsziņā saņemtu apraidi"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"attēlot neautorizētus logus"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Ļauj izveidot logus, kas ir paredzēti izmantošanai iekšējās sistēmas lietotāja saskarnē. Nav paredzēts izmantošanai parastajās lietojumprogrammās."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"rādīt sistēmas līmeņa brīdinājumus"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Ļauj lietojumprogrammai rādīt sistēmas brīdinājumu logus. Ļaunprātīgas lietojumprogrammas var pārņemt visu planšetdatora ekrānu."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Ļauj lietojumprogrammai rādīt sistēmas brīdinājuma logus. Ļaunprātīgas lietojumprogrammas var pārņemt vadību pār visu ekrānu."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"pārveidot globālo animācijas ātrumu"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Ļauj lietojumprogrammai jebkurā brīdī mainīt globālo animācijas ātrumu (ātrākas vai lēnākas animācijas)."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"pārvaldīt lietojumprogrammas pilnvaras"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Ļauj lietojumprogrammām izveidot un pārvaldīt savas pilnvaras, apejot parasto Z secību. Nav nepieciešams parastajām lietojumprogrammām."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"nospiest taustiņus un vadības pogas"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Ļauj lietojumprogrammai piegādāt savus ievades notikumus (taustiņu spiedienus u.c.) citām lietojumprogrammām. Ļaunprātīgas lietojumprogrammas var to izmantot, lai pārņemtu vadību pār planšetdatoru."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Ļauj lietojumprogrammai rādīt savas ievades notikumus (nospiestos taustiņus u.tml.) citās lietojumprogrammās. Ļaunprātīgas lietojumprogrammas var to izmantot, lai pārņemtu planšetdatora vadību."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Ļauj lietojumprogrammai piegādāt savus ievades notikumus (taustiņu spiedienus u.c.) citām lietojumprogrammām. Ļaunprātīgas lietojumprogrammas var to izmantot, lai pārņemtu tālruni."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"reģistrēt rakstīto un veiktās darbības"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Ļauj lietojumprogrammām sekot līdzi nospiestajiem taustiņiem, mijiedarbojoties ar citu lietojumprogrammu (piemēram, ievadot paroli). Parastajām lietojumprogrammām nekad nav nepieciešama."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"tieši instalēt lietojumprogrammas"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Ļauj lietojumprogrammai instalēt jaunas vai atjauninātas Android pakotnes. Ļaunprātīgas lietojumprogrammas var to izmantot, lai pievienotu jaunas lietojumprogrammas ar nejauši jaudīgām atļaujām."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"dzēst visus lietojumprogrammas kešatmiņas datus"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Ļauj lietojumprogrammai atbrīvot vietu planšetdatora atmiņā, dzēšot failus lietojumprogrammas kešatmiņas katalogā. Piekļuve parasti ir pieejama tikai sistēmas procesā."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Ļauj lietojumprogrammai atbrīvot vietu planšetdatora krātuvē, dzēšot failus lietojumprogrammas kešatmiņas katalogā. Piekļuve parasti ir atļauta tikai sistēmas procesam."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Ļauj lietojumprogrammai atbrīvot vietu tālruņa krātuvē, dzēšot failus lietojumprogrammas kešatmiņas katalogā. Piekļuve parasti ir pieejama tikai sistēmas procesam."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Pārvietot lietojumprogrammas resursus"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Ļauj lietojumprogrammai pārvietot lietojumprogrammas resursus no iekšējā datu nesēja uz ārējo un otrādi."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"lasīt sistēmas žurnālfailus"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Ļauj lietojumprogrammai lasīt informāciju no dažādiem sistēmas žurnālfailiem. Tādējādi tā var atklāt vispārīgu informāciju par to, kādas darbības tiek veiktas ar planšetdatoru, iespējams, arī personas vai privātu informāciju."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Ļauj lietojumprogrammai lasīt informāciju no dažādiem sistēmas žurnālfailiem. Tādējādi tā var atklāt vispārīgu informāciju par to, kādas darbības tiek veiktas ar planšetdatoru, iespējams, arī personas vai privātu informāciju."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"lasīt sensitīvus žurnāla datus"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Ļauj lietojumprogrammai lasīt no sistēmas dažādiem žurnālfailiem. Šādi lietojumprogramma var atrast vispārīgu informāciju par jūsu darbībām planšetdatorā, tostarp, iespējams, arī personisku vai privātu informāciju."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Ļauj lietojumprogrammai lasīt no sistēmas dažādiem žurnālfailiem. Šādi lietojumprogramma var atrast vispārīgu informāciju par jūsu darbībām tālrunī, tostarp, iespējams, arī personisku vai privātu informāciju."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"lasīt grupas “diag” resursus un rakstīt tajos"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Ļauj lietojumprogrammai lasīt jebkuru resursu, kas pieder grupai “diag”, un rakstīt tajos; piemēram, failus direktorijā /dev. Tas var ietekmēt sistēmas stabilitāti un drošību. Tas ir jāizmanto TIKAI aparatūrai specifiskas diagnostikas veikšanai, ko izpilda ražotājs vai operators."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"iespējot vai atspējot lietojumprogrammas komponentus"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Ļauj lietojumprogrammai mainīt to, vai citas lietojumprogrammas komponents ir iespējots vai ne. Ļaunprātīgas lietojumprogrammas var to izmantot, lai atspējotu svarīgas planšetdatora iespējas. Atļauja ir jāizmanto uzmanīgi, jo pastāv iespēja, ka lietojumprogrammas komponenti būs neizmantojamā, nepastāvīgā vai nestabilā stāvoklī."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Ļauj lietojumprogrammai mainīt to, vai citas lietojumprogrammas komponents ir iespējots vai ne. Ļaunprātīgas lietojumprogrammas var to izmantot, lai atspējotu svarīgas planšetdatora iespējas. Atļauja ir jāizmanto uzmanīgi, jo pastāv iespēja, ka lietojumprogrammas komponenti būs neizmantojamā, nepastāvīgā vai nestabilā stāvoklī."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Ļauj lietojumprogrammai mainīt, vai tiek iespējots citas lietojumprogrammas komponents. Ļaunprātīgas lietojumprogrammas var to izmantot, lai atspējotu svarīgas planšetdatora iespējas. Izmantojiet šo atļauju uzmanīgi, jo pastāv iespēja, ka lietojumprogrammas komponentu stāvoklis kļūs neizmantojams, nekonsekvents vai nestabils."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Ļauj lietojumprogrammai mainīt to, vai tiek iespējots citas lietojumprogrammas komponents. Ļaunprātīgas lietojumprogrammas var to izmantot, lai atspējotu svarīgas tālruņa iespējas. Izmantojiet šo atļauju uzmanīgi, jo pastāv iespēja, ka lietojumprogrammas komponentu stāvoklis kļūs neizmantojams, nekonsekvents vai nestabils."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"iestatīt vēlamās lietojumprogrammas"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Ļauj lietojumprogrammai pārveidot vēlamās lietojumprogrammas. Šādi ļaunprātīgajām lietojumprogrammā var tikt atļauts nemanāmi mainīt darbinātās lietojumprogrammas, izmānot datus no esošajām lietojumprogrammām, lai apkopotu jūsu privātos datus."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"pārveidot globālos sistēmas iestatījumus"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"pārveidot Google pakalpojumu karti"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Ļauj lietojumprogrammai pārveidot Google pakalpojumu karti. Nav paredzēts izmantošanai parastajās lietojumprogrammās."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"automātiski sākt pēc palaišanas"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Ļauj startēt lietojumprogrammu, tiklīdz sistēma ir pabeigusi palaišanu. Tādējādi planšetdatora startēšanai var būt nepieciešams vairāk laika un lietojumprogrammai var tikt atļauts palēnināt vispārējo planšetdatora darbību."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Ļauj lietojumprogrammai startēt sevi, tiklīdz sistēma ir pabeigusi sāknēšanu. Šādi planšetdatoram var būt nepieciešams ilgāks startēšanas laiks, un var tikt atļauts lietojumprogrammai palēnināt vispārējo planšetdatora darbību, vienmēr darbojoties."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Ļauj startēt lietojumprogrammu, sevi tiklīdz sistēma ir pabeigusi palaišanu. Šādi tālruņa startēšana var būt ilgāka un lietojumprogrammai var tikt atļauts palēnināt vispārējo tālruņa darbību, vienmēr darbojoties."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"sūtīt piesaistošu apraidi"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Ļauj lietojumprogrammai sūtīt piesaistošās apraides, kas saglabājas pēc apraides pabeigšanas. Ļaunprātīgas lietojumprogrammas var palēnināt planšetdatora darbību vai padarīt to nestabilu, tādējādi liekot izmantot pārāk daudz atmiņas."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Ļauj lietojumprogrammai sūtīt piesaistošas apraides, kas saglabājas pēc apraides beigām. Ļaunprātīgas lietojumprogrammas var palēnināt planšetdatora darbību vai padarīt tā darbību nestabilu, liekot izmantot pārāk daudz atmiņas."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Ļauj lietojumprogrammai sūtīt piesaistošās apraides, kas saglabājas pēc apraides pabeigšanas. Ļaunprātīgas lietojumprogrammas var palēnināt tālruņa darbību vai padarīt to nestabilu, tādējādi liekot izmantot pārāk daudz atmiņas."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"lasīt kontaktpersonu datus"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Ļauj lietojumprogrammai lasīt visus planšetdatorā saglabāto kontaktpersonu (adrešu) datus. Ļaunprātīgas lietojumprogrammas var to izmantot, lai sūtītu jūsu datus citām personām."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Ļauj lietojumprogrammai lasīt visu planšetdatorā saglabāto kontaktpersonu (adrešu) datus. Ļaunprātīgas lietojumprogrammas var to izmantot, lai sūtītu jūsu datus citām personām."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Ļauj lietojumprogrammai lasīt visus jūsu tālrunī saglabāto kontaktpersonu (adrešu) datus. Ļaunprātīgas lietojumprogrammas var to izmantot, lai sūtītu jūsu datus citām personām."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"rakstīt kontaktpersonu datus"</string>
     <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Ļauj lietojumprogrammai pārveidot planšetdatorā saglabātos kontaktpersonu (adrešu) datus. Ļaunprātīgas lietojumprogrammas var to izmantot, lai dzēstu vai pārveidotu jūsu kontaktpersonu datus."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Ļauj lietojumprogrammai pārveidot tālrunī saglabātos kontaktpersonu (adrešu) datus. Ļaunprātīgas lietojumprogrammas var to izmantot, lai dzēstu vai pārveidotu jūsu kontaktpersonu datus."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"lasīt kalendāra pasākumus"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Ļauj lietojumprogrammai lasīt visus planšetdatorā saglabātos kalendāra notikumus. Ļaunprātīgas lietojumprogrammas var to izmantot, lai sūtītu kalendāra notikumus citām personām."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Ļauj lietojumprogrammai lasīt visus planšetdatorā saglabātos kalendāra notikumus. Ļaunprātīgas lietojumprogrammas var to izmantot, lai sūtītu jūsu kalendāra notikumus citām personām."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Ļauj lietojumprogrammai lasīt visus tālrunī saglabātos kalendāra pasākumus. Ļaunprātīgas lietojumprogrammas var to izmantot, lai sūtītu kalendāra pasākumus citām personām."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"pievienot vai pārveidot kalendāra pasākumus un sūtīt e-pasta ziņojumus viesiem"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Ļauj lietojumprogrammai pievienot vai mainīt pasākumus jūsu kalendārā, kas var sūtīt e-pasta ziņojumus viesiem. Ļaunprātīgas lietojumprogrammas var to izmantot, lai dzēstu vai pārveidotu jūsu kalendāra pasākumus vai sūtītu e-pasta ziņojumus viesiem."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"atļauja instalēt atrašanās vietas sniedzēju"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Izveidojiet imitētas atrašanās vietas avotus pārbaudīšanai. Ļaunprātīgas lietojumprogrammas var to izmantot, lai ignorētu atrašanās vietu un/vai statusu, ko atgriež reālās atrašanās vietas avoti, piemēram, GPS vai tīkla nodrošinātāji, vai pārraudzītu un ziņotu par jūsu atrašanās vietu ārējam avotam."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"noteikt precīzu (GPS) atrašanās vietu"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Piekļūt precīziem atrašanās vietas avotiem, piemēram, globālās pozicionēšanas sistēmai planšetdatorā (ja pieejams). Ļaunprātīgas lietojumprogrammas var to izmantot, lai noteiktu jūsu atrašanās vietu, un var patērēt papildu akumulatora jaudu."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Piekļūst labas kvalitātes atrašanās vietas avotiem, piemēram, globālās pozicionēšanas sistēmai planšetdatorā, ja tā ir pieejama. Ļaunprātīgas lietojumprogrammas var to izmantot, lai noteiktu jūsu atrašanās vietu, un patērēt papildu akumulatora jaudu."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Piekļūstiet precīziem atrašanās vietas avotiem, piemēram, globālās pozicionēšanas sistēmai tālrunī (ja pieejams). Ļaunprātīgas lietojumprogrammas var to izmantot, lai noteiktu, kur jūs atrodaties, un var patērēt papildu akumulatora jaudu."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"noteikt aptuvenu (uz tīklu balstītu) atrašanās vietu"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Piekļūt tādiem zemas kvalitātes atrašanās vietas avotiem kā mobilā tīkla datu bāze, lai noteiktu aptuvenu planšetdatora atrašanās vietu (ja pieejams). Ļaunprātīgas lietojumprogrammas var to izmantot, lai noteiktu jūsu aptuveno atrašanās vietu."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Piekļūst zemas kvalitātes atrašanās vietas avotiem, piemēram, šūnu tīkla datu bāzei, lai noteiktu aptuvenu planšetdatora atrašanās vietu, ja tā ir pieejama. Ļaunprātīgas lietojumprogrammas var to izmantot, lai noteiktu aptuvenu jūsu atrašanās vietu."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Piekļūstiet tādiem zemas kvalitātes atrašanās vietas avotiem kā mobilā tīkla datu bāzei, lai noteiktu aptuvenu tālruņa atrašanās vietu (ja pieejams). Ļaunprātīgas lietojumprogrammas var to izmantot, lai noteiktu jūsu aptuveno atrašanās vietu."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"piekļūt SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Ļauj lietojumprogrammai izmantot SurfaceFlinger zemā līmeņa funkcijas."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Ļauj lietojumprogrammai pārveidot globālos audio iestatījumus, piemēram, skaļumu un maršrutēšanu."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"ierakstīt audio"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Ļauj lietojumprogrammai piekļūt audio ieraksta ceļam."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"uzņemt attēlus"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Ļauj lietojumprogrammai uzņemt attēlus ar kameru. Šādi lietojumprogramma jebkurā brīdī var apkopot attēlus, kas ir redzami ar kameru."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"neatgriezeniska planšetdatora atspējošana"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"uzņemt attēlus un videoklipus"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Ļauj lietojumprogrammai uzņemt attēlus un videoklipus ar kameru. Šādi lietojumprogramma jebkurā laikā var apkopot ar kameru redzamos attēlus."</string>
+    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"neatgriezeniski atspējot planšetdatoru"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"neatgriezeniski atspējot tālruni"</string>
-    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Ļauj lietojumprogrammai neatgriezeniski atspējot visu planšetdatoru. Šāda darbība ir bīstama."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Ļauj lietojumprogrammai neatgriezeniski atspējot visu planšetdatoru. Tas ir ļoti bīstami."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Ļauj lietojumprogrammai neatgriezeniski atspējot visu tālruni. Tas ir ļoti bīstami."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"planšetdatora piespiedu atsāknēšana"</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"forsēt planšetdatora atsāknēšanu"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"atsāknēt tālruni"</string>
-    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Ļauj lietojumprogrammai atsāknēt planšetdatoru."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Ļauj lietojumprogrammai forsēt planšetdatora atsāknēšanu."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Ļauj lietojumprogrammai atsāknēt tālruni."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"uzlikt un noņemt failu sistēmas"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Ļauj lietojumprogrammai noņemt vai uzlikt noņemamu krātuvju failu sistēmas."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatēt ārējo krātuvi"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Ļauj lietojumprogrammai formatēt noņemamo krātuvi."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"iegūt informāciju par drošo krātuvi"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Ļauj lietojumprogrammai iegūt informāciju par drošu krātuvi."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"izveidot drošu krātuvi"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Ļauj lietojumprogrammai izveidot drošu krātuvi."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"likvidēt drošo krātuvi"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Ļauj lietojumprogrammai likvidēt drošo krātuvi."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"uzlikt/noņemt drošo krātuvi"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Ļauj lietojumprogrammai uzlikt/noņemt drošu krātuvi."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"pārdēvēt drošo krātuvi"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Ļauj lietojumprogrammai pārdēvēt drošo krātuvi."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"iegūt informāciju par iekšējo krātuvi"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Ļauj lietojumprogrammai iegūt informāciju par iekšējo krātuvi."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"izveidot iekšēju krātuvi"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Ļauj lietojumprogrammai izveidot iekšējo krātuvi."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"likvidēt iekšējo krātuvi"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Ļauj lietojumprogrammai iznīcināt iekšējo krātuvi."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"uzstādīt/atvienot iekšējo krātuvi"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Ļauj lietojumprogrammai uzstādīt/atvienot iekšējo krātuvi."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"pārdēvēt iekšējo krātuvi"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Ļauj lietojumprogrammai pārdēvēt iekšējo krātuvi."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"kontrolēt vibrozvanu"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Ļauj lietojumprogrammai kontrolēt vibrozvanu."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"kontrolēt uzliesmojumu"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Ļauj lietojumprogrammai kontrolēt uzliesmojumu."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"piekļuve USB ierīcēm"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Ļauj lietojumprogrammai piekļūt USB ierīcēm."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"pārbaudīt aparatūru"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Ļauj lietojumprogrammai kontrolēt dažādas perifērijas ierīces aparatūras pārbaudīšanas nolūkos."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"tieši zvanīt uz tālruņa numuriem"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Ļauj lietojumprogrammai zvanīt uz tālruņa numuriem bez jūsu iejaukšanās. Ļaunprātīgas lietojumprogrammas var radīt neparedzētu zvanu parādīšanos jūsu tālruņa rēķinā. Ņemiet vērā, ka lietojumprogramma nevar zvanīt uz ārkārtas numuriem."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"tieši zvanīt uz jebkuriem tālruņa numuriem"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Ļauj lietojumprogrammai zvanīt uz jebkuru tālruņa numuru, tostarp ārkārtas numuriem, bez jūsu iejaukšanās. Ļaunprātīgas lietojumprogrammas var veikt nevajadzīgus un pretlikumīgus zvanus uz ārkārtas pakalpojumiem."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"tiešā veidā sākt CDMA planšetdatora iestatīšanu"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"tieši sākt CDMA planšetdatora iestatīšanu"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"tiešā veidā sākt CDMA tālruņa iestatīšanu"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Ļauj lietojumprogrammai sākt CDMA nodrošināšanu. Ļaunprātīgas lietojumprogrammas var nevajadzīgi sākt CDMA nodrošināšanu."</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"kontrolēt atrašanās vietas atjauninājumu paziņojumus"</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Ļauj lietojumprogrammai kontrolēt ierīces tālruņa funkcijas. Lietojumprogramma ar šo atļauju var pārslēgt tīklus, ieslēgt un izslēgt tālruņa radio un veikt līdzīgas darbības, neinformējot par to jūs."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"lasīt tālruņa stāvokli un identitāti"</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Ļauj lietojumprogrammai piekļūt ierīces tālruņa funkcijām. Lietojumprogramma ar šo atļauju var noteikt tālruņa numuru un šī tālruņa sērijas numuru, to, vai zvans ir aktīvs, numuru, ar kuru zvans ir savienots u.tml."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"planšetdatora pāriešanas miega režīmā novēršana"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"novērst planšetdatora pāriešanu miega režīmā"</string>
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"novērst tālruņa pāriešanu miega režīmā"</string>
     <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Ļauj lietojumprogrammai novērst planšetdatora pāriešanu miega režīmā."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Ļauj lietojumprogrammai novērst tālruņa pāriešanu miega režīmā."</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"planšetdatora ieslēgšana vai izslēgšana"</string>
+    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"ieslēgt vai izslēgt planšetdatoru"</string>
     <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"ieslēgt vai izslēgt tālruni"</string>
     <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Ļauj lietojumprogrammai ieslēgt vai izslēgt planšetdatoru."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Ļauj lietojumprogrammai ieslēgt vai izslēgt tālruni."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"darbināt rūpnīcas pārbaudes režīmā"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Tiek palaista kā zema līmeņa ražotāja pārbaude, atļaujot pilnīgu piekļuvi tālruņa aparatūrai. Pieejama tikai tad, ja planšetdators darbojas ražotāja pārbaudes režīmā."</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Darbina kā zema līmeņa ražotāja testu, atļaujot pilnīgu piekļuvi planšetdatora aparatūrai. Pieejama tikai tad, ja planšetdators darbojas ražotāja testa režīmā."</string>
     <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Darbiniet kā zema līmeņa ražotāja pārbaudi, atļaujot pilnīgu piekļuvi tālruņa aparatūrai. Pieejams tikai tad, ja tālrunis darbojas ražotāja pārbaudes režīmā."</string>
     <string name="permlab_setWallpaper" msgid="6627192333373465143">"iestatīt tapeti"</string>
     <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Ļauj lietojumprogrammai iestatīt sistēmas tapeti."</string>
@@ -411,7 +405,7 @@
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"darboties kā AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Ļauj lietojumprogrammai veikt zvanus uz AccountAuthenticators"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"atklāt zināmus kontus"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Ļauj lietojumprogrammai iegūt ar planšetdatoru saistīto kontu sarakstu."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Ļauj lietojumprogrammai iegūt planšetdatoram zināmo kontu sarakstu."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Ļauj lietojumprogrammai iegūt tālrunim zināmo kontu sarakstu."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"darboties kā konta autentificētājam"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Ļauj lietojumprogrammai izmantot AccountManager konta autentificētāja iespējas, tostarp kontu izveidi un to paroļu iegūšanu un iestatīšanu."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"atļaut Wi-Fi multiraides uztveršanu"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Ļauj lietojumprogrammai saņemt paketes, kas nav tieši adresētas ierīcei. Tas var būt noderīgi, atklājot pakalpojumus, kas tiek piedāvāti tuvākajā apkārtnē. Tas izmanto vairāk jaudas nekā režīmā, kas nav multiraides režīms."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"Bluetooth administrēšana"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Ļauj lietojumprogrammai konfigurēt vietējo Bluetooth planšetdatoru, kā arī atklāt attālās ierīces un savienot tās pārī."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Ļauj lietojumprogrammai konfigurēt vietējo Bluetooth planšetdatoru, kā arī atklāt attālas ierīces un savienot tās pārī."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Ļauj lietojumprogrammai konfigurēt vietējo Bluetooth tālruni un atklāt attālās ierīces, un izveidot pāri ar tām."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"izveidot Bluetooth savienojumus"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Ļauj lietojumprogrammai skatīt vietējā Bluetooth planšetdatora konfigurāciju, kā arī veidot un pieņemt savienojumus ar pārī savienotām ierīcēm."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Ļauj lietojumprogrammai skatīt vietējā Bluetooth planšetdatora konfigurāciju un veidot savienojumus ar pārī savienotām ierīcēm."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Ļauj lietojumprogrammai skatīt vietējā Bluetooth tālruņa konfigurāciju, kā arī veidot un pieņemt savienojumus ar pārī savienotām ierīcēm."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"kontrolē tuvlauka saziņu"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Ļauj lietojumprogrammai sazināties ar tuvlauka saziņas (Near Field Communication — NFC) atzīmēm, kartēm un lasītājiem."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"atspējot atslēgas slēgu"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Ļauj lietojumprogrammai atspējot atslēgas slēgu un jebkādu saistīto paroles drošību. Atbilstošs tā piemērs: tālrunis atspējo atslēgas slēgu, saņemot ienākošu tālruņa zvanu, pēc tam atkārtoti iespējo atslēgas slēgu, kad saruna ir pabeigta."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lasīt sinhronizācijas iestatījumus"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Ļauj lietojumprogrammai lasīt jebkādus privātos vārdus, nosaukumus un frāzes, ko lietotājs, iespējams, ir saglabājis lietotāja vārdnīcā."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"rakstīt lietotāja definētajā vārdnīcā"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Ļauj lietojumprogrammai rakstīt jaunus vārdus lietotāja vārdnīcā."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"pārveidot/dzēst SD kartes saturu"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"pārveidot/dzēst USB kr. sat."</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"pārveidot/dzēst SD kartes saturu"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Ļauj lietojumprogrammai rakstīt SD kartē."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Ļauj lietoj. rakstīt USB kr."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Ļauj lietojumprogrammai rakstīt SD kartē."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"pārveidot/dzēst datu nesēja iekšējās krātuves saturu"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Ļauj lietojumprogrammai pārveidot iekšējas datu nesēja krātuves saturu."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"piekļūt kešatmiņas failu sistēmai"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Ļauj lietojumprogrammai lasīt kešatmiņas failu sistēmu un rakstīt tajā."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Paroles ierobežošana"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Ierobežojiet izmantojamo paroļu veidus."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Pieteikšanās mēģinājumu vērošana"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Tiek pārraudzīts nepareizi ievadīto paroļu skaits, atbloķējot ekrānu, un tiek bloķēts planšetdators vai dzēsti visi planšetdatora dati, ja tiek ievadīts pārāk daudz nepareizu paroļu."</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Tiek pārraudzīts nepareizi ievadīto paroļu skaits, atbloķējot ekrānu, un tiek bloķēts planšetdators vai dzēsti visi planšetdatora dati, ja tiek ievadīts pārāk daudz nepareizu paroļu."</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Atiestatīt paroli"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Piespiedu kārtā mainīt paroli uz jaunu vērtību, pieprasot administratoram to jums piešķirt, lai varētu pieteikties."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Piespiedu bloķēšana"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Kontrolējiet, kad ierīce tiek bloķēta, pieprasot atkārtoti ievadīt tās paroli."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"veikt/saņemt interneta zvanus"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Ļauj lietojumprogrammai izmantot SIP pakalpojumu, vai veiktu/saņemtu interneta zvanus."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Paroles kārtulu iestatīšana"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Kontrolē ekrāna atbloķēšanas parolē atļautās rakstzīmes un garumu"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Ekrāna atbloķēšanas mēģinājumu pārraudzīšana"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Pārrauga nepareizi ievadīto paroļu skaitu, atbloķējot ekrānu, un bloķē planšetdatoru vai dzēš visus planšetdatora datus, ja tiek ievadīts pārāk daudz nepareizu paroļu"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Pārrauga nepareizi ievadīto paroļu skaitu, atbloķējot ekrānu, un bloķē tālruni vai dzēš visus tālruņa datus, ja tiek ievadīts pārāk daudz nepareizu paroļu"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Ekrāna atbloķēšanas paroles maiņa"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Ekrāna atbloķēšanas paroles maiņa"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Ekrāna bloķēšana"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Kontrolē, kā un kur ekrāns tiek bloķēts"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Dzēst visus datus"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Atiestatot rūpnīcas datus, bez brīdinājuma tiek dzēsti visi planšetdatora dati"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Atiestatot rūpnīcas datus, bez brīdinājuma tiek dzēsti visi planšetdatora dati"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Dzēš planšetdatora datus bez brīdinājuma, veicot rūpnīcas datu atiestatīšanu"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Dzēš tālruņa datus bez brīdinājuma, veicot rūpnīcas datu atiestatīšanu"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Iestatīt ierīces globālo starpniekserveri"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Iestatiet izmantojamo ierīces globālo starpniekserveri, kad ir iespējota politika. Spēkā esošo globālo starpniekserveri iestata tikai pirmās ierīces administrators."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Paroles termiņa izb. iest."</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Kontrolē ekrāna bloķēšanas paroles maiņas intervālu"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Mājas"</item>
     <item msgid="869923650527136615">"Mobilais"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Peidžera numurs darbā"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Palīgs"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"Multiziņa"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Pielāgoti"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Dzimšanas diena"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Jubileja"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Pasākums"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Citi"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Pielāgots"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Mājas"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Darbā"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Darbā"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Cits"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Pielāgots"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Pielāgotas"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Palīgs"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Brālis"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Bērns"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Vietējais partneris"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Tēvs"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Draugs"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Pārvaldnieks"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Māte"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Vecāki"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Partneris"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Norādīja:"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Radinieks"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Māsa"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Laul. draugs/draudz."</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Pielāgotas"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Mājās"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Darbs"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Cits"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ievadiet PIN kodu"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Lai atbloķētu, ievadiet paroli."</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Lai atbloķētu, ievadiet PIN"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN kods nav pareizs."</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Lai atbloķētu, nospiediet Izvēlne, pēc tam 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Ārkārtas numurs"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Atpakaļ pie zvana"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Pareizi!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Neizdevās. Mēģiniet vēlreiz."</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Mēģiniet vēlreiz"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Notiek uzlāde (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Uzlādēts."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM karte ir bloķēta."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Notiek SIM kartes atbloķēšana..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Atbloķēšanas kombinācija tika nepareizi uzzīmēta <xliff:g id="NUMBER_0">%d</xliff:g> reizes. "\n\n"Lūdzu, mēģiniet vēlreiz pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundes(-ēm)."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Atbloķēšanas kombinācija tika nepareizi izveidota <xliff:g id="NUMBER_0">%d</xliff:g> reizi(-es). Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem planšetdators būs jāatbloķē, pierakstoties Google kontā."\n\n"Lūdzu, mēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundes(-ēm)."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Parole tika nepareizi ievadīta <xliff:g id="NUMBER_0">%d</xliff:g> reizes. "\n\n"Lūdzu, mēģiniet vēlreiz pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundēm."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"PIN tika nepareizi ievadīts <xliff:g id="NUMBER_0">%d</xliff:g> reizes. "\n\n"Lūdzu, mēģiniet vēlreiz pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundēm."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Atbloķēšanas shēma tika nepareizi uzzīmēta <xliff:g id="NUMBER_0">%d</xliff:g> reizes. Vēl pēc <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem tiks pieprasīts, lai atbloķējat planšetdatoru, izmantojot Google pierakstīšanos."\n\n" Lūdzu, mēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundēm."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Atbloķēšanas kombinācija tika nepareizi uzzīmēta <xliff:g id="NUMBER_0">%d</xliff:g> reizi(-es). Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem tālrunis būs jāatbloķē, izmantojot Google pierakstīšanos."\n\n" Lūdzu, mēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundes(-ēm)."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundes(-ēm)."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Vai aizmirsāt kombināciju?"</string>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Vai doties prom no šīs lapas?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Atlasiet Labi, lai turpinātu, vai Atcelt, lai paliktu pašreizējā lapā."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Apstiprināt"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Padoms: divreiz pieskarieties, lai tuvinātu un tālinātu."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Aut. aizp."</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Aizpildīt automātiski"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Iest. aut. aizp."</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"lasīt pārlūkprogrammas vēsturi un grāmatzīmes"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Ļauj lietojumprogrammai lasīt visus URL, kas ir apmeklēti pārlūkprogrammā, un visas pārlūkprogrammas grāmatzīmes."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"rakstīt pārlūkprogrammas vēsturi un grāmatzīmes"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Ļauj lietojumprogrammai pārveidot planšetdatorā saglabāto pārlūkprogrammas vēsturi un grāmatzīmes. Ļaunprātīgas lietojumprogrammas var to izmantot, lai dzēstu vai pārveidotu pārlūkprogrammas datus."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Ļauj lietojumprogrammai pārveidot planšetdatorā saglabāto pārlūkprogrammas vēsturi vai grāmatzīmes. Ļaunprātīgas lietojumprogrammas var to izmantot, lai dzēstu vai pārveidotu jūsu pārlūkprogrammas datus."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Ļauj lietojumprogrammai pārveidot tālrunī saglabāto pārlūkprogrammas vēsturi un grāmatzīmes. Ļaunprātīgas lietojumprogrammas var to izmantot, lai dzēstu vai pārveidotu pārlūkprogrammas datus."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"iestatīt trauksmi modinātājpulkstenī"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Ļauj lietojumprogrammai iestatīt trauksmi instalētajā modinātājpulksteņa lietojumprogrammā. Dažās modinātājpulksteņu lietojumprogrammās šī funkcija var nebūt īstenojama."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Pārveidot pārlūkprogrammas ģeogrāfiskās atrašanās vietas atļaujas"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Ļauj lietojumprogrammai pārveidot pārlūkprogrammas ģeogrāfiskās atrašanās vietas atļaujas. Ļaunprātīgas lietojumprogrammas var to izmantot, lai atļautu atrašanās vietas informācijas sūtīšanu uz citām vietnēm."</string>
     <string name="save_password_message" msgid="767344687139195790">"Vai vēlaties, lai pārlūkprogrammā tiktu saglabāta šī parole?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"Izgriezt"</string>
     <string name="copy" msgid="2681946229533511987">"Kopēt"</string>
     <string name="paste" msgid="5629880836805036433">"Ielīmēt"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Nav ielīmējamu vien."</string>
     <string name="copyUrl" msgid="2538211579596067402">"Kopēt URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Atlasīt tekstu..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Teksta atlase"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Ievades metode"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Rediģēt tekstu"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Teksta darbības"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Maz brīvas vietas"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Planšetdatora atmiņa ir gandrīz pilna."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Planšetdatora krātuve ir gandrīz pilna."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Tālruņa krātuvē kļūst maz vietas."</string>
     <string name="ok" msgid="5970060430562524910">"Labi"</string>
     <string name="cancel" msgid="6442560571259935130">"Atcelt"</string>
     <string name="yes" msgid="5362982303337969312">"Labi"</string>
     <string name="no" msgid="5141531044935541497">"Atcelt"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Uzmanību!"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Notiek ielāde..."</string>
     <string name="capital_on" msgid="1544682755514494298">"IESLĒGT"</string>
     <string name="capital_off" msgid="6815870386972805832">"IZSLĒGT"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Pabeigt darbību, izmantojot"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"aizvērt"</string>
     <string name="report" msgid="4060218260984795706">"Pārskats"</string>
     <string name="wait" msgid="7147118217226317732">"Gaidīt"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Lietojumpr. ir novirzīta"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> tagad darbojas."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"Sākotnēji tika palaista lietojumprogramma <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+    <string name="smv_application" msgid="295583804361236288">"Lietojumprogramma <xliff:g id="APPLICATION">%1$s</xliff:g> (process <xliff:g id="PROCESS">%2$s</xliff:g>) ir pārkāpusi savu pašieviesto StrictMode politiku."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Process <xliff:g id="PROCESS">%1$s</xliff:g> ir pārkāpis savu pašieviesto StrictMode politiku."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> darbojas"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Atlasiet, lai pārietu uz lietojumprogrammu"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Vai pārslēgt lietojumprogrammas?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Jau darbojas cita lietojumprogramma. Tās darbība ir jāaptur, lai varētu startēt citu lietojumprogrammu."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Atgriezties: <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Nestartējiet jauno lietojumprogrammu."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Startēt: <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Aptur veco lietojumprogrammu, nesaglabājot."</string>
     <string name="sendText" msgid="5132506121645618310">"Atlasiet darbību tekstam"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Zvanītāja skaļums"</string>
     <string name="volume_music" msgid="5421651157138628171">"Multivides skaļums"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Rādīt visu"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB lielapjoma krātuve"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB ir pievienots."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Tālrunis ir pievienots datoram, izmantojot USB. Atlasiet tālāk norādīto pogu, ja vēlaties kopēt failus no datora uz Android SD karti vai otrādi."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Tālrunis ir pievienots datoram, izmantojot USB. Atlasiet tālāk norādīto pogu, ja vēlaties kopēt failus no datora uz Android SD karti vai otrādi."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Ir izveidots savienojums ar datoru, izmantojot USB. Pieskarieties tālāk esošajai pogai, ja vēlaties kopēt failus no datora Android USB atmiņā vai otrādi."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Ir izveidots savienojums ar datoru, izmantojot USB. Pieskarieties tālāk esošajai pogai, ja vēlaties kopēt failus no datora Android SD kartē vai otrādi."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Ieslēgt USB krātuvi"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Izmantojot SD karti kā USB krātuvi, rodas problēma."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Izmantojot SD karti kā USB krātuvi, rodas problēma."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Radās problēma, izmantojot USB krātuvi lielapjoma uzglabāšanai USB."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Radās problēma, izmantojot SD karti lielapjoma uzglabāšanai USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB ir pievienots."</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Atlasiet, lai kopētu failus datorā/no datora."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB krātuves izslēgšana"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Atlasiet, lai izslēgtu USB krātuvi."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"USB krātuve tiek izmantota"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Pirms USB krātuves izslēgšanas pārliecinieties, ka datorā ir noņemta (“izstumta”) Android SD karte."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Pirms USB krātuves izslēgšanas atvienojiet Android USB krātuvi no datora (tai jābūt “izstumtai”)."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Pirms USB krātuves izslēgšanas pārliecinieties, ka datorā ir noņemta (“izstumta”) Android SD karte."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Izslēgt USB krātuvi"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Izslēdzot USB krātuvi, radās problēma. Pārliecinieties, ka USB saimniekdators ir noņemts, pēc tam mēģiniet vēlreiz."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Ja ieslēgsiet USB krātuvi, dažu joprojām lietoto lietojumprogrammu darbība tiks apturēta un tās, iespējams, nebūs pieejamas līdz brīdim, kad USB krātuve tiks izslēgta."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"USB darbība neizdevās."</string>
     <string name="dlg_ok" msgid="7376953167039865701">"Labi"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"SD kartes formatēšana"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"USB kr. formatēšana"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"SD kartes formatēšana"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Vai tiešām vēlaties formatēt SD karti? Visi kartē esošie dati tiks zaudēti."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Vai formatēt USB krātuvi, dzēšot visus tajā saglabātos failus? Šo darbību nevar atcelt."</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Vai tiešām vēlaties formatēt SD karti? Visi kartē esošie dati tiks zaudēti."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatēt"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"USB atkļūdošana ir pievienota."</string>
@@ -960,28 +897,28 @@
     <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
     <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
     <string name="candidates_style" msgid="4333913089637062257"><u>"kandidāti"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"SD kartes sagatavošana"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Notiek USB kr. sagatavošana"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SD kartes sagatavošana"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Notiek kļūdu meklēšana."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Tukša SD karte"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Tukša USB krātuve"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Tukša SD karte"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"SD karte ir tukša vai arī tajā ir neatbalstīta failu sistēma."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"USB krātuve ir tukša vai arī tajā ir neatbalstīta failu sistēma."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"SD karte ir tukša vai arī tajā ir neatbalstīta failu sistēma."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Bojāta SD karte"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Bojāta USB krātuve"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Bojāta SD karte"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"SD karte ir bojāta. Iespējams, tā būs atkārtoti jāformatē."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"USB krātuve ir bojāta. Iespējams, tā būs atkārtoti jāformatē."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"SD karte ir bojāta. Iespējams, tā būs atkārtoti jāformatē."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"SD karte tika negaidīti izņemta."</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"USB kr. tika negaidīti noņemta"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"SD karte tika negaidīti izņemta."</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Demontēt SD karti pirms tās izņemšanas, lai netiktu zaudēti dati."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Pirms noņemšanas atvienojiet USB krātuvi, lai nezaudētu datus."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Demontēt SD karti pirms tās izņemšanas, lai netiktu zaudēti dati."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"SD karti var droši noņemt."</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB krātuvi var droši noņemt"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"SD karti var droši noņemt."</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Varat droši noņemt SD karti."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Varat droši noņemt USB krātuvi."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Varat droši noņemt SD karti."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Izņemta SD karte"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Noņemta USB krātuve"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Izņemta SD karte"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"SD karte ir izņemta. Ievietojiet citu karti."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USB krātuve ir noņemta. Ievietojiet jaunu datu nesēju."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SD karte ir izņemta. Ievietojiet citu karti."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Nav atrasta neviena atbilstoša darbība"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"atjaunināt komponenta lietojuma statistiku"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Sūtīt"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Tālāk"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Gatavs"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Iepr."</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Izpildīt"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Sastādiet numuru,"\n"izmantojot <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Izveidot kontaktpersonu,"\n"izmantojot šo numuru: <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Uz iepriekš koplietotas atslēgas balstīts L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Uz sertifikātu balstīts L2TP/IPSec VPN"</string>
     <string name="upload_file" msgid="2897957172366730416">"Izvēlēties failu"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Neviens fails nav izvēlēts"</string>
     <string name="reset" msgid="2448168080964209908">"Atiestatīt"</string>
     <string name="submit" msgid="1602335572089911941">"Iesniegt"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Automobiļa režīms ir iespējots."</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Atlasiet, lai izietu no automobiļa režīma."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Piesaiste vai tīklājs ir aktīvs."</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Pieskarieties, lai konfigurētu"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Atpakaļ"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Tālāk"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Izlaist"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Augsts mobilo datu lietojums"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Pieskarieties, lai uzzinātu vairāk par mobilo datu izmantošanu."</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Ir pārsniegts mobilo datu ierobežojums."</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Pieskarieties, lai uzzinātu vairāk par mobilo datu izmantošanu."</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Nav atbilstību"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Atrast lapā"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 atbilstība"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> no <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Gatavs"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Notiek USB krātuves atvienošana..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Notiek SD kartes atvienošana..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Notiek USB krātuves dzēšana..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Notiek SD kartes dzēšana..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Neizdevās dzēst USB krātuvi."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Neizdevās dzēst SD karti."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"SD karte pirms atvienošanas tika noņemta."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"USB atmiņa pašlaik tiek pārbaudīta."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"SD karte pašlaik tiek pārbaudīta."</string>
+    <string name="media_removed" msgid="7001526905057952097">"SD karte ir noņemta."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"USB krātuve pašlaik tiek izmantota datorā."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"SD karte pašlaik tiek izmantota datorā."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Ārējais datu nesējs ir nezināmā stāvoklī."</string>
+    <string name="share" msgid="1778686618230011964">"Kopīgot"</string>
+    <string name="find" msgid="4808270900322985960">"Atrast"</string>
+    <string name="websearch" msgid="4337157977400211589">"Meklēt tīmeklī"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 21a977d..357d5ef 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Eksternt medium har ukjent tilstand."</string>
     <string name="share" msgid="1778686618230011964">"Del"</string>
     <string name="find" msgid="4808270900322985960">"Finn"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Nettsøk"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index be59831..7810900 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Extern medium heeft onbekende status."</string>
     <string name="share" msgid="1778686618230011964">"Delen"</string>
     <string name="find" msgid="4808270900322985960">"Vinden"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Online zoeken"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 567ef08..50a46a7 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Nośnik zewnętrzny jest w nieznanym stanie."</string>
     <string name="share" msgid="1778686618230011964">"Udostępnij"</string>
     <string name="find" msgid="4808270900322985960">"Znajdź"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Wyszukiwarka"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 5756e96..84bf0d0 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Suporte de dados externo em estado desconhecido."</string>
     <string name="share" msgid="1778686618230011964">"Partilhar"</string>
     <string name="find" msgid="4808270900322985960">"Localizar"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Pesquisar na Web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index fa4d6aa..31d4b16 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Mídia externa em estado desconhecido."</string>
     <string name="share" msgid="1778686618230011964">"Compartilhar"</string>
     <string name="find" msgid="4808270900322985960">"Localizar"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Pesquisa na web do Google"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 679e2ee..cec239c 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -1067,4 +1067,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 19e300f..f2a9aca 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Mesaj vocal"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Problemă de conexiune sau cod MMI nevalid."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Operaţia este limitată la numerele cu apelări restricţionate."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Serviciul a fost activat."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Serviciul a fost activat pentru:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Serviciul a fost dezactivat."</string>
@@ -126,10 +125,10 @@
     <string name="contentServiceSync" msgid="8353523060269335667">"Sincronizare"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronizare"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Prea multe ştergeri <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
-    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Spaţiul de stocare al tabletei este plin! Ştergeţi fişiere pentru a elibera spaţiu."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Stocarea pe tabletă este plină! Ştergeţi câteva fişiere pentru a elibera spaţiul."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"Spaţiul de stocare al telefonului este plin! Ştergeţi fişiere pentru a elibera spaţiu."</string>
     <string name="me" msgid="6545696007631404292">"Eu"</string>
-    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opţiuni pentru tabletă"</string>
+    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opţiuni tablet PC"</string>
     <string name="power_dialog" product="default" msgid="1319919075463988638">"Opţiuni telefon"</string>
     <string name="silent_mode" msgid="7167703389802618663">"Mod Silenţios"</string>
     <string name="turn_on_radio" msgid="3912793092339962371">"Activaţi funcţia wireless"</string>
@@ -137,13 +136,12 @@
     <string name="screen_lock" msgid="799094655496098153">"Blocaţi ecranul"</string>
     <string name="power_off" msgid="4266614107412865048">"Opriţi alimentarea"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Se închide..."</string>
-    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tableta se va închide."</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Computerul dvs. tablet PC se va închide."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonul dvs. se va închide."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Doriţi să închideţi?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Nicio aplicaţie recentă."</string>
-    <string name="global_actions" product="tablet" msgid="408477140088053665">"Opţiuni pentru tabletă"</string>
+    <string name="global_actions" product="tablet" msgid="408477140088053665">"Opţiuni tablet PC"</string>
     <string name="global_actions" product="default" msgid="2406416831541615258">"Opţiuni telefon"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Blocaţi ecranul"</string>
     <string name="global_action_power_off" msgid="4471879440839879722">"Opriţi alimentarea"</string>
@@ -160,7 +158,7 @@
     <string name="permgrouplab_messages" msgid="7521249148445456662">"Mesajele dvs."</string>
     <string name="permgroupdesc_messages" msgid="7045736972019211994">"Citire şi scriere mesaje SMS, e-mailuri şi alte mesaje."</string>
     <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Informaţiile dvs. personale"</string>
-    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Acces direct la agenda şi la calendarul stocate pe tabletă."</string>
+    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Acces direct la agenda şi la calendarul stocate pe computerul dvs. tablet PC."</string>
     <string name="permgroupdesc_personalInfo" product="default" msgid="5488050357388806068">"Acces direct la agenda şi la calendarul stocate pe telefonul dvs."</string>
     <string name="permgrouplab_location" msgid="635149742436692049">"Locaţia dvs."</string>
     <string name="permgroupdesc_location" msgid="2430258821648348660">"Monitorizare locaţie fizică"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Instrumente de dezvoltare"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Funcţii necesare doar pentru dezvoltatorii de aplicaţii."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Stocare"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Accesează cardul SD."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Accesează stocarea USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Accesează cardul SD."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"dezactivare sau modificare bare de stare"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Permite aplicaţiei să dezactiveze bara de stare sau să adauge şi să elimine pictograme de sistem."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"bară de stare"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Permite aplicaţiei să fie bară de stare."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"extindere/restrângere bară de stare"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Permite aplicaţiei să extindă sau să restrângă bara de stare."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"interceptare apeluri trimise"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"trimitere mesaje SMS"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Permite aplicaţiei să trimită mesaje SMS. Aplicaţiile rău-intenţionate ar putea să vă genereze costuri, deoarece trimit mesaje fără confirmarea dvs."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"citire mesaje SMS sau MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Permite aplicaţiei să citească mesajele SMS stocate pe tabletă sau pe cardul SIM. Aplicaţiile rău-intenţionate ar putea să vă citească mesajele confidenţiale."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Permite aplicaţiei să citească mesajele SMS stocate pe computerul tablet PC sau pe cardul SIM. Aplicaţiile rău-intenţionate ar putea să vă citească mesajele confidenţiale."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Permite aplicaţiei să citească mesajele SMS stocate pe telefon sau pe cardul SIM. Aplicaţiile rău-intenţionate ar putea să vă citească mesajele confidenţiale."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"editare SMS sau MMS"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Permite aplicaţiei să scrie în mesajele SMS stocate pe tabletă sau pe cardul SIM. Aplicaţiile rău-intenţionate ar putea să vă şteargă mesajele."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Permite aplicaţiei să scrie în mesajele SMS stocate pe computerul tablet PC sau pe cardul SIM. Aplicaţiile rău-intenţionate ar putea să vă şteargă mesajele."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Permite aplicaţiei să scrie în mesajele SMS stocate pe telefon sau pe cardul SIM. Aplicaţiile rău-intenţionate ar putea să vă şteargă mesajele."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"primire WAP"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Permite unei aplicaţii să primească şi să proceseze mesaje WAP. Aplicaţiile rău-intenţionate ar putea să monitorizeze mesajele sau să le şteargă fără să vi le arate."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"împiedicare comutare între aplicaţii"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Împiedică trecerea utilizatorului la o altă aplicaţie."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"monitorizare şi control al lansării tuturor aplicaţiilor"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Permite unei aplicaţii să monitorizeze şi să controleze modul în care sistemul lansează activităţi. Aplicaţiile rău-intenţionate ar putea să compromită sistemul în întregime. Această permisiune este necesară doar pentru dezvoltare. Nu este niciodată necesară pentru utilizarea normală."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Permite unei aplicaţii să monitorizeze şi să controleze modul în care sistemul lansează activităţi. Aplicaţiile rău-intenţionate ar putea să compromită sistemul în întregime. Această permisiune este necesară numai pentru dezvoltare şi nu este niciodată necesară pentru utilizarea normală a telefonului."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"trimitere mesaj difuzat privind extragerea din pachet"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Permite unei aplicaţii să difuzeze o notificare de eliminare a unui pachet al aplicaţiei. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a opri alte aplicaţii în derulare."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"trimitere mesaj difuzat primit prin SMS"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"afişare ferestre neautorizate"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite crearea de ferestre menite să fie utilizate de interfaţa utilizatorului a sistemului intern. Nu se utilizează de aplicaţiile obişnuite."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"afişare alerte la nivel de sistem"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Permite unei aplicaţii să afişeze ferestre de alertă de sistem. Aplicaţiile rău-intenţionate ar putea să preia controlul asupra întregului ecran."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Permite unei aplicaţii să afişeze ferestre de alertă de sistem. Aplicaţiile rău-intenţionate ar putea să preia controlul asupra întregului ecran al telefonului."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"modificare viteză de animaţie globală"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Permite unei aplicaţii să modifice oricând viteza globală de animaţie (animaţii mai rapide sau mai lente)."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"gestionare simboluri aplicaţii"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Permite aplicaţiilor să creeze şi să gestioneze propriile simboluri, evitând ordinea lor Z normală. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"apăsare taste şi control butoane"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Permite unei aplicaţii să furnizeze propriile evenimente de intrare (apăsări de taste etc.) către alte aplicaţii. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a prelua controlul asupra tabletei."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Permite unei aplicaţii să furnizeze propriile evenimente (apăsări de taste etc.) către alte aplicaţii. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a prelua controlul asupra computerului tablet PC."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Permite unei aplicaţii să furnizeze propriile evenimente (apăsări de taste etc.) către alte aplicaţii. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a prelua controlul asupra telefonului."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"înregistrare a ceea ce tastaţi şi a operaţiunilor efectuate"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Permite unei aplicaţii să monitorizeze tastele pe care le apăsaţi când interacţionaţi cu o altă aplicaţie (cum ar fi introducerea unei parole). Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"instalare directă a aplicaţiilor"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Permite unei aplicaţii să instaleze pachete Android noi sau actualizate. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a adăuga aplicaţii noi cu permisiuni puternice alese la întâmplare."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"ştergere integrală date din cache ale aplicaţiei"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Permite unei aplicaţii să elibereze spaţiu de stocare pe tabletă, prin ştergerea fişierelor din directorul cache al aplicaţiei. De regulă, accesul este strict restricţionat la procesul de sistem."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Permite unei aplicaţii să golească stocarea pe computerul tablet PC prin ştergerea fişierelor din directorul cache al aplicaţiei. De regulă, accesul este strict restricţionat la procesul de sistem."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Permite unei aplicaţii să stocheze gratuit pe telefon, prin ştergerea fişierelor din directorul cache al aplicaţiei. De regulă, accesul este strict restricţionat la procesul de sistem."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"mutare resurse aplicaţie"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Permite unei aplicaţii să mute resursele aplicaţiei de pe suporturile fizice interne pe cele externe şi invers."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"citire fişiere din jurnalul sistemului"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Permite unei aplicaţii să citească din diverse fişiere jurnal ale sistemului. În acest mod poate descoperi informaţii generale cu privire la utilizarea tabletei de către dvs., incluzând potenţial informaţii personale sau confidenţiale."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Permite unei aplicaţii să citească din diverse fişiere jurnal ale sistemului. În acest mod poate descoperi informaţii generale cu privire la utilizarea tabletei de către dvs., incluzând potenţial informaţii personale sau confidenţiale."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"citire date de jurnal problematice"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Permite unei aplicaţii să citească din diverse fişiere jurnal ale sistemului. În acest mod poate descoperi informaţii generale cu privire la utilizarea computerului tablet PC de către dvs., şi probabil informaţii personale sau confidenţiale."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Permite unei aplicaţii să citească din diverse fişiere jurnal ale sistemului. În acest mod poate descoperi informaţii generale cu privire la utilizarea telefonului de către dvs., dar nu şi informaţii personale sau confidenţiale."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"citire/scriere în resursele deţinute de diag"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Permite unei aplicaţii să citească şi să scrie în orice resursă deţinută de grupul diag, de ex., fişierele din /dev. Această permisiune ar putea să afecteze stabilitatea şi securitatea sistemului. Permisiunea trebuie utilizată DOAR de producător sau de operator pentru diagnostice specifice pentru hardware."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"activare sau dezactivare a componentelor aplicaţiei"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permite unei aplicaţii să modifice starea (activată sau dezactivată) a unei componente a altei aplicaţii. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a dezactiva funcţii importante ale tabletei. Este necesar să utilizaţi cu atenţie această permisiune, deoarece este posibil să aduceţi componentele aplicaţiei într-o stare inutilizabilă, inconsecventă sau instabilă."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite unei aplicaţii să modifice starea (activată sau dezactivată) a unei componente a altei aplicaţii. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a dezactiva funcţii importante ale tabletei. Este necesar să utilizaţi cu atenţie această permisiune, deoarece este posibil să aduceţi componentele aplicaţiei într-o stare inutilizabilă, inconsecventă sau instabilă."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permite unei aplicaţii să modifice starea (activată sau dezactivată) a unei componente a altei aplicaţii. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a dezactiva funcţii importante ale computerului tablet PC. Este necesar să utilizaţi cu atenţie această permisiune, deoarece este posibil să aduceţi componentele aplicaţiei într-o stare inutilizabilă, inconsecventă sau instabilă."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite unei aplicaţii să modifice starea (activată sau dezactivată) a unei componente a altei aplicaţii. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a dezactiva funcţii importante ale telefonului. Este necesar să utilizaţi cu atenţie această permisiune, deoarece este posibil să aduceţi componentele aplicaţiei într-o stare inutilizabilă, inconsecventă sau instabilă."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"setare aplicaţii preferate"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Permite unei aplicaţii să modifice aplicaţiile dvs. preferate. Astfel li se poate permite aplicaţiilor rău-intenţionate să modifice fără a vă înştiinţa aplicaţiile care rulează, păcălind aplicaţiile existente să colecteze date confidenţiale de la dvs."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"modificare setări sistem globale"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"modificare hartă servicii Google"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Permite unei aplicaţii să modifice harta serviciilor Google. Nu se utilizează de aplicaţiile obişnuite."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"pornire automată la deschidere"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Permite unei aplicaţii să pornească imediat ce s-a terminat încărcarea sistemului. Din acest motiv, pornirea tabletei poate dura mai mult timp, iar rularea continuă a aplicaţiei poate încetini dispozitivul."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Permite unei aplicaţii să pornească imediat ce s-a terminat încărcarea sistemului. Din acest motiv, pornirea computerului tablet PC poate dura mai mult timp, iar rularea continuă a aplicaţiei îl poate încetini."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Permite unei aplicaţii să pornească imediat ce s-a terminat încărcarea sistemului. Din acest motiv, pornirea telefonului poate dura mai mult timp, iar rularea continuă a aplicaţiei poate încetini telefonul."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"trimitere mesaj difuzat persistent"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Permite unei aplicaţii să trimită mesaje difuzate persistente, care rămân după terminarea mesajului difuzat. Aplicaţiile rău-intenţionate ar putea să încetinească sau să destabilizeze tableta, determinând-o să utilizeze prea multă memorie."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Permite unei aplicaţii să trimită mesaje difuzate persistente, care rămân după terminarea mesajului difuzat. Aplicaţiile rău-intenţionate ar putea să încetinească sau să destabilizeze computerul tablet PC, determinându-l să utilizeze prea multă memorie."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Permite unei aplicaţii să trimită mesaje difuzate persistente, care rămân după terminarea mesajului difuzat. Aplicaţiile rău-intenţionate ar putea să încetinească sau să destabilizeze telefonul, determinându-l să utilizeze prea multă memorie."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"citire date de contact"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Permite unei aplicaţii să citească toate datele din agendă (adrese) stocate pe tabletă. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a trimite datele din agenda dvs. către alte persoane."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Permite unei aplicaţii să citească toate datele de contact (adrese) stocate pe computerul tablet PC. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a trimite datele dvs. către alte persoane."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Permite unei aplicaţii să citească toate datele de contact (adrese) stocate pe telefon. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a trimite datele dvs. către alte persoane."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"scriere date de contact"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Permite unei aplicaţii să modifice datele din agendă (adresele) stocate pe tabletă. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a şterge sau a modifica datele din agenda dvs."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Permite unei aplicaţii să modifice datele de contact (adresele) stocate pe computerul tablet PC. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a şterge sau a modifica datele dvs. de contact."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Permite unei aplicaţii să modifice datele de contact (adresele) stocate pe telefon. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a şterge sau a modifica datele dvs. de contact."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"citire evenimente din calendar"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Permite unei aplicaţii să citească toate evenimentele din calendar stocate pe tabletă. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a trimite evenimentele din calendar către alte persoane."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Permite unei aplicaţii să citească toate evenimentele din calendar stocate pe computerul tablet PC. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a trimite evenimentele din calendar către alte persoane."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Permite unei aplicaţii să citească toate evenimentele din calendar stocate pe telefon. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a trimite evenimentele din calendar către alte persoane."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"adăugare sau modificare de evenimente în calendar şi trimitere e-mailuri către invitaţi"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Permite unei aplicaţii să adauge sau să modifice evenimentele din calendar, prin care se pot trimite mesaje de e-mail către invitaţi. Aplicaţiile rău-intenţionate ar putea să utilizeze această aplicaţie pentru a şterge sau a modifica evenimentele din calendar ori pentru a trimite mesaje de e-mail către invitaţi."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"permisiune pentru instalarea unui furnizor de locaţii"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Creează surse de locaţii pentru testare. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a înlocui locaţia şi/sau starea returnată de sursele de locaţii reale, cum ar fi cele ale furnizorilor GPS sau de reţea, ori ar putea să monitorizeze şi să raporteze locaţia dvs. către o sursă externă."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"locaţie exactă (GPS)"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Accesează de pe tabletă surse de localizare exacte, cum ar fi cele ale sistemului Global Positioning System, dacă este disponibil. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a stabili locul în care vă aflaţi. De asemenea, ar putea să consume mai multă energie a bateriei."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Accesează de pe computerul tablet PC surse de locaţii exacte, cum ar fi cele ale sistemului Global Positioning System, dacă este disponibil. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a stabili locul în care vă aflaţi. De asemenea, ar putea să consume mai multă energie a bateriei."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Accesează de pe telefon surse de locaţii exacte, cum ar fi cele ale sistemului Global Positioning System, dacă este disponibil. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a stabili locul în care vă aflaţi. De asemenea, ar putea să consume mai multă energie a bateriei."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"locaţie imprecisă (bazată pe reţea)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Accesează surse de locaţii imprecise, cum ar fi baza de date de telefonie mobilă, pentru a stabili cu aproximaţie locaţia tabletei, dacă acest lucru este disponibil. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a stabili cu aproximaţie locul unde vă aflaţi."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Accesează surse de locaţii imprecise, cum ar fi baza de date de telefonie mobilă, pentru a stabili cu aproximaţie locaţia computerului tablet PC, dacă acest lucru este disponibil. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a stabili cu aproximaţie locul unde vă aflaţi."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Accesează surse de locaţii imprecise, cum ar fi baza de date de telefonie mobilă, pentru a stabili cu aproximaţie locaţia telefonului, dacă acest lucru este disponibil. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a stabili cu aproximaţie locul unde vă aflaţi."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"accesare SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Permite unei aplicaţii să utilizeze funcţiile de nivel redus SurfaceFlinger."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Permite aplicaţiei să modifice setările audio globale, cum ar fi volumul sau rutarea."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"înregistrare audio"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Permite aplicaţiei să acceseze calea către înregistrarea audio."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"fotografiere"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Permite unei aplicaţii să facă fotografii cu ajutorul camerei foto. Astfel i se permite aplicaţiei să colecteze oricând imaginile văzute de camera foto."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"dezactivare definitivă tabletă"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"realizarea de fotografii şi videoclipuri"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Permite unei aplicaţii să facă fotografii cu ajutorul camerei foto. Astfel i se permite aplicaţiei să colecteze oricând imaginile văzute de camera foto."</string>
+    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"dezactivarea permanentă a computerului tablet PC"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"dezactivare permanentă a telefonului"</string>
-    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Permite aplicaţiei să dezactiveze definitiv întreaga tabletă. Acest lucru este foarte periculos."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Permite aplicaţiei să dezactiveze definitiv întregul computer tablet PC. Acest lucru este foarte periculos."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Permite aplicaţiei să dezactiveze definitiv întregul telefon. Acest lucru este foarte periculos."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"forţare repornire tabletă"</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"forţare repornire computer tablet PC"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"forţare repornire telefon"</string>
-    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Permite aplicaţiei să forţeze repornirea tabletei."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Permite aplicaţiei să forţeze repornirea computerului tablet PC."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Permite aplicaţiei să forţeze repornirea telefonului."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"montare şi demontare sisteme de fişiere"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Permite unei aplicaţii să monteze şi să demonteze sisteme de fişiere pentru stocarea pe suporturi amovibile."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatare stocare externă"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Permite aplicaţiei să formateze stocarea pe suporturi amovibile."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"obţinere informaţii referitoare la stocarea securizată"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Permite unei aplicaţii să obţină informaţii referitoare la stocarea securizată."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"creare stocare securizată"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Permite aplicaţiei să creeze stocări securizate."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"distrugere stocare securizată"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Permite aplicaţiei să distrugă stocarea securizată."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"montare/demontare stocare securizată"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Permite aplicaţiei să monteze/demonteze stocarea securizată."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"redenumire stocare securizată"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Permite aplicaţiei să redenumească stocarea securizată."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"descărcare informaţii pe stocarea internă"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Permite aplicaţiei să primească informaţii pe stocarea internă."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"creare stocare internă"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Permite aplicaţiei să creeze stocare internă."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"distrugerea stocării interne"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Permite aplicaţiei să distrugă stocarea internă."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"montare/demontare stocare internă"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Permite aplicaţiei să monteze/demonteze stocarea internă."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"redenumire stocare internă"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Permite aplicaţiei să redenumească stocarea internă."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"controlare mecanism de vibrare"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Permite aplicaţiei să controleze mecanismul de vibrare."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"control lanternă"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Permite aplicaţiei să controleze lanterna."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"accesare dispozitive USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Permite aplicaţiei să acceseze dispozitive USB."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"testare hardware"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Permite aplicaţiei să controleze diverse periferice în scopul testării componentelor hardware."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"apelare directă numere de telefon"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Permite aplicaţiei să apeleze numere de telefon fără intervenţia dvs. Aplicaţiile rău-intenţionate ar putea să adauge apeluri neaşteptate pe factura dvs. de telefon. Reţineţi că această permisiune nu permite aplicaţiei să apeleze numere de urgenţă."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"apelare directă a oricărui număr de telefon"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Permite aplicaţiei să apeleze orice număr de telefon, inclusiv numere de urgenţă, fără intervenţia dvs. Aplicaţiile rău-intenţionate ar putea să efectueze apeluri inutile şi ilegale către serviciile de urgenţă."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"pornire directă a configuraţiei CDMA a tabletei"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"pornire directă a configurării computerului tablet PC pentru CDMA"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"pornire directă a configuraţiei CDMA a telefonului"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Permite aplicaţiei să pornească asigurarea accesului la CDMA. Aplicaţiile rău-intenţionate ar putea să pornească asigurarea accesului la CDMA, fără ca aceasta să fie necesară."</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"controlare notificări de actualizare a locaţiei"</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Permite aplicaţiei să controleze funcţiile de telefon ale dispozitivului. O aplicaţie cu această permisiune poate să comute reţelele, să închidă şi să deschidă radioul şi să efectueze alte acţiuni similare, fără să vă înştiinţeze."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"citire stare şi identitate telefon"</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Permite aplicaţiei să acceseze funcţiile de telefon ale dispozitivului. O aplicaţie cu această permisiune poate regăsi numărul de telefon şi numărul serial al telefonului, dacă un apel este activ, numărul la care este conectat apelul şi alte aspecte similare."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"împiedicare intrare tabletă în repaus"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"împiedicarea computerului tablet PC să intre în repaus"</string>
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"împiedicare intrare telefon în repaus"</string>
-    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Permite unei aplicaţii să împiedice intrarea tabletei în starea de repaus."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Permite unei aplicaţii să împiedice intrarea computerului tablet PC în stare de repaus."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Permite unei aplicaţii să împiedice intrarea telefonului în stare de repaus."</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"pornire/oprire tabletă"</string>
+    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"pornire sau oprire computer tablet PC"</string>
     <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"telefon pornit sau oprit"</string>
-    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Permite aplicaţiei să activeze sau să dezactiveze tableta."</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Permite aplicaţiei să pornească sau să oprească computerul tablet PC."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Permite aplicaţiei să activeze sau să dezactiveze telefonul."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"rulare în mod test de fabrică"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Rulează ca testare de producător la nivel redus, permiţând accesul complet la hardware-ul tabletei. Permisiune disponibilă doar când tableta rulează în modul de testare de producător."</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Rulează ca test de nivel redus setat de producător, permiţând accesul complet la sistemul hardware al computerului tablet PC. Permisiune disponibilă doar când acesta rulează în modul de testare setat de producător."</string>
     <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Rulează ca testare de nivel redus al producătorului, permiţând accesul complet la hardware-ul telefonului. Permisiune disponibilă doar când telefonul rulează în modul de testare a producător."</string>
     <string name="permlab_setWallpaper" msgid="6627192333373465143">"setare imagine de fundal"</string>
     <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Permite aplicaţiei să seteze imaginea de fundal a sistemului."</string>
@@ -403,15 +397,15 @@
     <string name="permlab_masterClear" msgid="2315750423139697397">"resetare sistem la setările prestabilite din fabrică"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Permite unei aplicaţii să reseteze complet sistemul la setările din fabrică, ştergând toate datele, configurările şi aplicaţiile instalate."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"setare dată/oră"</string>
-    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Permite unei aplicaţii să modifice ora tabletei."</string>
+    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Permite unei aplicaţii să schimbe ora computerului tablet PC."</string>
     <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Permite unei aplicaţii să modifice ora telefonului."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"setare fus orar"</string>
-    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Permite unei aplicaţii să modifice fusul orar al tabletei."</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Permite unei aplicaţii să schimbe fusul orar al computerului tablet PC."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Permite unei aplicaţii să modifice fusul orar al telefonului."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"efectuare ca AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Permite unei aplicaţii să efectueze apeluri către AccountAuthenticators"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"descoperire conturi cunoscute"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Permite unei aplicaţii să obţină lista conturilor cunoscute de tabletă."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Permite unei aplicaţii să obţină lista conturilor cunoscute de computerul tablet PC."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Permite unei aplicaţii să obţină lista conturilor cunoscute de telefon."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"acţionare ca autentificator de cont"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Permite unei aplicaţii să utilizeze capacitatea autentificatorului de cont de către AccountManager, incluzând crearea conturilor şi obţinerea şi setarea parolelor."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"permitere recepţionare difuzare multiplă Wi-Fi"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Permite unei aplicaţii să primească pachete care nu sunt direct adresate dispozitivului dvs. Această permisiune poate fi utilă la descoperirea serviciilor oferite în apropiere. Consumă mai multă energie decât modul fără difuzare multiplă."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"administrare bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Permite unei aplicaţii să configureze tableta Bluetooth local, să descopere şi să se asocieze cu dispozitive la distanţă."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Permite unei aplicaţii să configureze computerul tablet PC Bluetooth local, să descopere şi să se asocieze cu dispozitive la distanţă."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Permite unei aplicaţii să configureze telefonul Bluetooth local, să descopere şi să se asocieze cu dispozitive la distanţă."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"creare conexiuni Bluetooth"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Permite unei aplicaţii să vizualizeze configuraţia tabletei Bluetooth local, să efectueze şi să accepte conexiuni cu dispozitive pereche."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Permite unei aplicaţii să vizualizeze configuraţia computerului tablet PC Bluetooth local, să efectueze şi să accepte conexiuni cu dispozitive pereche."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Permite unei aplicaţii să vizualizeze configuraţia telefonului Bluetooth local, să efectueze şi să accepte conexiuni cu dispozitive pereche."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"controlare schimb de date prin Near Field Communication"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Permite unei aplicaţii să comunice cu etichetele, cardurile şi cititoarele NFC (Near Field Communication)."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"dezactivare blocare taste"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Permite unei aplicaţii să dezactiveze blocarea tastelor şi orice modalitate asociată de securitate a parolelor. Un bun exemplu este deblocarea tastelor de către telefon atunci când se primeşte un apel şi reactivarea blocării tastelor la terminarea apelului."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"citire setări sincronizare"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Permite unei aplicaţii să citească cuvinte, nume şi expresii private stocate de utilizator în dicţionarul utilizatorului."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"scriere în dicţionarul definit de utilizator"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permite unei aplicaţii să scrie cuvinte noi în dicţionarul utilizatorului."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"modificare/ştergere conţinut card SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"modificare/ştergere a conţinutului stocării USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificare/ştergere conţinut card SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Permite unei aplicaţii să scrie pe cardul SD."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Permite unei apl. să scrie în stoc. USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Permite unei aplicaţii să scrie pe cardul SD."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modificare/ştergere a conţinutului din stocarea media internă"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permite unei aplicaţii să modifice conţinutul stocării media interne."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"accesare sistem de fişiere cache"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite unei aplicaţii să scrie şi să citească sistemul de fişiere cache."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Limitare parolă"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Restricţionează tipurile de parole pe care aveţi permisiunea să le utilizaţi."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Supraveghere încercări de conectare"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Monitorizaţi numărul de parole incorecte introduse la deblocarea ecranului şi blocaţi tableta sau ştergeţi datele acesteia dacă sunt introduse prea multe parole incorecte"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Monitorizaţi numărul de parole incorecte introduse la deblocarea ecranului şi blocaţi tableta sau ştergeţi datele acesteia dacă sunt introduse prea multe parole incorecte"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Resetare parolă"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Forţaţi o nouă valoare pentru parola dvs., obligându-l pe administrator să v-o comunice înainte de a vă conecta."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Forţare blocare"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Controlarea momentului în care dispozitivul se blochează, solicitând reintroducerea parolei."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"efectuare/primire apeluri prin internet"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Permite unei aplicaţii să utilizeze serviciul SIP pentru a efectua/primi apeluri prin internet."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Setaţi reguli pentru parolă"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Controlarea lungimii şi a tipului de caractere permise în parolele pentru deblocarea ecranului."</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Monitorizaţi încercările de deblocare a ecranului"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Monitorizaţi numărul parolelor incorecte introduse la deblocarea ecranului şi blocaţi computerul tablet PC sau ştergeţi toate datele stocate în acesta dacă au fost introduse prea multe parole incorecte"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Monitorizaţi numărul parolelor incorecte introduse la deblocarea ecranului şi blocaţi telefonul sau ştergeţi toate datele stocate în acesta dacă au fost introduse prea multe parole incorecte"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Editaţi parola de deblocare a ecranului"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Editaţi parola de deblocare a ecranului"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Blocaţi ecranul"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Controlarea modului şi a timpului în care se blochează ecranul"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Ştergere integrală date"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Ştergeţi datele tabletei fără avertisment, realizând o resetare la configuraţia din fabrică"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Ştergeţi datele tabletei fără avertisment, realizând o resetare la configuraţia din fabrică"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Ştergerea datelor de pe computerul tablet PC fără avertisment, efectuând resetarea configurării din fabrică"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Ştergeţi datele din telefon fără avertisment, efectuând resetarea configurării din fabrică"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Setaţi serverul proxy global pentru dispozitiv"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Setaţi serverul proxy global pentru dispozitiv care să fie utilizat cât timp politica este activă. Numai primul administrator al dispozitivului poate seta serverul proxy global activ."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Setaţi expirarea parolei"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Controlarea duratei până când parola de blocare a ecranului trebuie modificată"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Domiciliu"</item>
     <item msgid="869923650527136615">"Mobil"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager serviciu"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistent"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizate"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Zi de naştere"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Zi aniversară"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Eveniment"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Altul"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Personalizat"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Domiciliu"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Serviciu"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Serviciu"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Altele"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Personalizat"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizată"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistent"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Frate"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Copil"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Partener domestic"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Tată"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Prieten"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Manager"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Mamă"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Părinte"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Partener"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Denumit după"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Rudă"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Soră"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Soţ/Soţie"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizată"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Ecran pornire"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Serviciu"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Altul"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Introduceţi codul PIN"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Introduceţi parola pentru a debloca"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Introduceţi PIN pentru deblocare"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Cod PIN incorect!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Pentru a debloca, apăsaţi Meniu, apoi 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Număr de urgenţă"</string>
@@ -646,14 +609,13 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Reveniţi la apel"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Corect!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Ne pare rău, încercaţi din nou"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Ne pare rău, încercaţi din nou"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Se încarcă (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Încărcată."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="lockscreen_low_battery" msgid="1482873981919249740">"Conectaţi încărcătorul."</string>
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Niciun card SIM."</string>
-    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Tableta nu are card SIM."</string>
+    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Nu există card SIM în computerul tablet PC."</string>
     <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Telefonul nu are card SIM."</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Introduceţi un card SIM."</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"Numai apeluri de urgenţă"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Cardul SIM este blocat."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Se deblochează cardul SIM..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> ori. "\n\n"Încercaţi din nou în <xliff:g id="NUMBER_1">%d</xliff:g> (de) secunde."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> ori. După alte <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi tableta cu ajutorul datelor de conectare la Google."\n\n"Încercaţi din nou peste <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Aţi introdus în mod incorect parola de <xliff:g id="NUMBER_0">%d</xliff:g> (de) ori. "\n\n"Încercaţi din nou peste <xliff:g id="NUMBER_1">%d</xliff:g> (de) secunde."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Aţi introdus în mod incorect codul PIN de <xliff:g id="NUMBER_0">%d</xliff:g> (de) ori. "\n\n"Încercaţi din nou peste <xliff:g id="NUMBER_1">%d</xliff:g> (de) secunde."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> (de) ori. După încă <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi computerul tablet PC cu ajutorul datelor de conectare la Google."\n\n" Încercaţi din nou peste <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> de ori. După <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi telefonul cu ajutorul datelor de conectare la Google."\n\n" Încercaţi din nou în <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Încercaţi din nou peste <xliff:g id="NUMBER">%d</xliff:g> (de) secunde."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Aţi uitat modelul?"</string>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Doriţi să părăsiţi această pagini?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Selectaţi OK pentru a continua sau Anulaţi pentru a rămâne pe pagina curentă."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Confirmaţi"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Sfat: apăsaţi de două ori pentru a mări şi a micşora."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Com.aut."</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Completare automată"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Complet. autom."</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"citire istoric şi marcaje în browser"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permite aplicaţiei să citească toate adresele URL vizitate din browser şi toate marcajele din acesta."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"citire istoric şi marcaje în browser"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Permite unei aplicaţii să modifice istoricul sau marcajele din browser stocate pe tabletă. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a şterge sau a modifica datele din browser."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Permite unei aplicaţii să modifice istoricul şi marcajele din browser, stocate pe computerul dvs. tablet PC. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a şterge sau a modifica datele din browser."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Permite unei aplicaţii să modifice istoricul şi marcajele din browser, stocate pe telefonul dvs. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a şterge sau a modifica datele din browser."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"setare alarmă pentru ceasul cu alarmă"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Permite aplicaţiei să seteze o alarmă într-o aplicaţie de ceas de alarmă instalată. Este posibil ca unele aplicaţii de ceas de alarmă să nu implementeze această funcţie."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modificare permisiuni pentru locaţia geografică a browserului"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Permite unei aplicaţii să modifice permisiunile privind locaţia geografică a browserului. Aplicaţiile rău-intenţionate ar putea să utilizeze această permisiune pentru a permite trimiterea informaţiilor privind locaţia către site-uri Web arbitrare."</string>
     <string name="save_password_message" msgid="767344687139195790">"Doriţi ca browserul să reţină această parolă?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"Decupaţi"</string>
     <string name="copy" msgid="2681946229533511987">"Copiaţi"</string>
     <string name="paste" msgid="5629880836805036433">"Inseraţi"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Nimic de inserat"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Copiaţi adresa URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Selectaţi text..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selectare text"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Metodă de intrare"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Editaţi text"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Acţiuni pentru text"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Spaţiu de stocare redus"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Spaţiul de stocare a tabletei se reduce."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Spaţiul de stocare de pe tabletă este scăzut."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Spaţiul de stocare a telefonului se reduce."</string>
     <string name="ok" msgid="5970060430562524910">"OK"</string>
     <string name="cancel" msgid="6442560571259935130">"Anulaţi"</string>
     <string name="yes" msgid="5362982303337969312">"OK"</string>
     <string name="no" msgid="5141531044935541497">"Anulaţi"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Atenţie"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Se încarcă..."</string>
     <string name="capital_on" msgid="1544682755514494298">"ACTIVAT"</string>
     <string name="capital_off" msgid="6815870386972805832">"DEZACTIVAT"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Finalizare acţiune utilizând"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Forţaţi închiderea"</string>
     <string name="report" msgid="4060218260984795706">"Raportaţi"</string>
     <string name="wait" msgid="7147118217226317732">"Aşteptaţi"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Aplicaţie redirecţionată"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> funcţionează acum."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> a fost lansată iniţial."</string>
+    <string name="smv_application" msgid="295583804361236288">"Aplicaţia <xliff:g id="APPLICATION">%1$s</xliff:g> (procesul <xliff:g id="PROCESS">%2$s</xliff:g>) a încălcat propria politică StrictMode."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Procesul <xliff:g id="PROCESS">%1$s</xliff:g> a încălcat propria politică StrictMode."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"Rulează <xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Selectaţi comutarea aplicaţiei"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Comutaţi între aplicaţii?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"O altă aplicaţie rulează deja şi trebuie oprită înainte a putea porni o aplicaţie nouă."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Reveniţi la <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Nu porniţi aplicaţia nouă."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Porniţi <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Opriţi vechea aplicaţie fără să salvaţi."</string>
     <string name="sendText" msgid="5132506121645618310">"Selectaţi o acţiune pentru text"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Volum sonerie"</string>
     <string name="volume_music" msgid="5421651157138628171">"Volum media"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Afişaţi-le pe toate"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"Stocare masivă USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB conectat"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"V-aţi conectat telefonul la computer prin USB. Selectaţi butonul de mai jos dacă doriţi să copiaţi fişiere între computer şi cardul SD Android."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"V-aţi conectat telefonul la computer prin USB. Selectaţi butonul de mai jos dacă doriţi să copiaţi fişiere între computer şi cardul SD Android."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"V-aţi conectat la computer prin USB. Atingeţi butonul de mai jos dacă doriţi să copiaţi fişiere de pe computer pe stocarea USB Android sau invers."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"V-aţi conectat la computer prin USB. Atingeţi butonul de mai jos dacă doriţi să copiaţi fişiere de pe computer pe cardul SD Android sau invers."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Activaţi stocarea USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"A apărut o problemă la utilizarea cardului SD pentru stocarea USB."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"A apărut o problemă la utilizarea cardului SD pentru stocarea USB."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"A apărut o problemă la utilizarea stocării USB pentru stocarea masivă USB."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"A apărut o problemă la utilizarea cardului SD pentru stocarea masivă USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB conectat"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Selectaţi pentru a copia fişiere în/din computerul dvs."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Dezactivaţi stocarea USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Selectaţi dezactivarea stocării pe USB."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"Stocarea USB este în curs de utilizare"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Înainte de a dezactiva stocarea USB, asiguraţi-vă că aţi demontat („aţi extras”) din computer cardul SD Android."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Înainte de a dezactiva stocarea USB, asiguraţi-vă că aţi demontat („aţi extras”) din computer stocarea USB Android."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Înainte de a dezactiva stocarea USB, asiguraţi-vă că aţi demontat („aţi extras”) din computer cardul SD Android."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Dezactivaţi stocarea USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Problemă la dezactivarea stocării pe USB. Verificaţi pentru a vă asigura că aţi demontat dispozitivul gazdă USB, apoi încercaţi din nou."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Dacă activaţi stocarea USB, unele aplicaţii pe care le utilizaţi în prezent se vor opri şi ar putea să nu fie disponibile până când dezactivaţi stocarea USB."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Operaţie USB nereuşită"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formataţi cardul SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formataţi stoc. USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Formataţi cardul SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Sigur doriţi să formataţi cardul SD? Veţi pierde toate datele de pe card."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Formataţi stocarea USB, ştergând toate fişierele stocate aici? Acţiunea nu poate fi anulată!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Sigur doriţi să formataţi cardul SD? Veţi pierde toate datele de pe card."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formataţi"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Depanarea USB este conectată"</string>
@@ -960,28 +897,28 @@
     <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>"candidaţi"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Se pregăteşte cardul SD"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Se pregăteşte stocarea USB"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Se pregăteşte cardul SD"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Se verifică erorile."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Card SD gol"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Stocare USB goală"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Card SD gol"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Card SD gol sau cu un sistem de fişiere neacceptat."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Stocarea USB este goală sau are un sistem de fişiere neacceptat."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"Card SD gol sau cu un sistem de fişiere neacceptat."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Card SD deteriorat"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Stocare USB deteriorată"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Card SD deteriorat"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Card SD deteriorat. Este posibil să fie necesară reformatarea sa."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Stocarea USB a fost deteriorată. Probabil este necesară reformatarea acesteia."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Card SD deteriorat. Este posibil să fie necesară reformatarea sa."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Card SD eliminat în mod neaşteptat"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Stoc. USB elim. în mod neaşt."</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"Card SD eliminat în mod neaşteptat"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Pentru a evita pierderea datelor, demontaţi cardul SD înainte de a-l extrage."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Demontaţi stocarea USB înaintea eliminării, pentru a evita pierderea datelor."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Pentru a evita pierderea datelor, demontaţi cardul SD înainte de a-l extrage."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Se poate extrage cardul SD"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Puteţi elim. în sig. stoc. USB"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"Se poate extrage cardul SD"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Puteţi extrage cardul SD în siguranţă."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Puteţi elimina în siguranţă stocarea USB."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Puteţi extrage cardul SD în siguranţă."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Card SD extras"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Stocarea USB a fost eliminată"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Card SD extras"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Card SD extras. Inseraţi un card nou."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Stocarea USB a fost eliminată. Inseraţi mediu de stocare nou."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"Card SD extras. Inseraţi un card nou."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Nu s-a găsit nicio activitate potrivită"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"actualizare statistici referitoare la utilizarea componentelor"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Trimiteţi"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Înainte"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Terminat"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Înapoi"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Executaţi"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Formaţi numărul"\n"utilizând <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Creaţi contactul"\n"utilizând <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"VPN L2TP/IPSec bazat pe cheie prepartajată"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"VPN L2TP/IPSec bazat pe certificat"</string>
     <string name="upload_file" msgid="2897957172366730416">"Alegeţi un fişier"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Nu au fost găsite fişiere"</string>
     <string name="reset" msgid="2448168080964209908">"Resetaţi"</string>
     <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="668663626721675614">"Selectaţ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_message" msgid="3067108323903048927">"Atingeţi pentru a configura"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Înapoi"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Înainte"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Omiteţi"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Utilizare intensivă de date"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Atingeţi pentru a afla mai multe despre utilizarea datelor mobile"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"S-a depăşit limita de date pentru telefonul mobil"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Atingeţi pentru a afla mai multe despre utilizarea datelor mobile"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Nicio potrivire"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Găsiţi pe pagină"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 potrivire"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> din <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Terminat"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Se demontează stocarea USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Se demontează cardul SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Se şterge stocarea USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Se şterge cardul SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Ştergerea stocării USB a eşuat."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Ştergerea cardului SD a eşuat."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"Cardul SD a fost eliminat înainte de a fi demontat."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Stocarea USB este în curs de verificare."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"Cardul SD este în curs de verificare."</string>
+    <string name="media_removed" msgid="7001526905057952097">"Cardul SD a fost eliminat."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Stocarea USB este utilizată în prezent de un computer."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Cardul SD este utilizat în prezent de un computer."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Media externă în stare necunoscută."</string>
+    <string name="share" msgid="1778686618230011964">"Distribuiţi"</string>
+    <string name="find" msgid="4808270900322985960">"Găsiţi"</string>
+    <string name="websearch" msgid="4337157977400211589">"Căutare pe web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index dcf2e7a..daed822 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Неизвестно состояние внешнего носителя."</string>
     <string name="share" msgid="1778686618230011964">"Отправить"</string>
     <string name="find" msgid="4808270900322985960">"Найти"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Веб-поиск"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 1d5a276..11323f6 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Hlasová schránka"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Problém s pripojením alebo neplatný kód MMI."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Operácia je obmedzená len na režim čísla pevného vytáčania."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Služba bola povolená."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Služba bola povolená pre:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Služba bola zakázaná."</string>
@@ -139,8 +138,7 @@
     <string name="shutdown_progress" msgid="2281079257329981203">"Prebieha vypínanie..."</string>
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Váš tablet bude vypnutý."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Váš telefón bude vypnutý."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Chcete zariadenie vypnúť?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Najnovšie"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Žiadne nedávno použité aplikácie."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Možnosti tabletu"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Nástroje pre vývoj"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Funkcie len pre vývojárov aplikácií."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Ukladací priestor"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Prístup na kartu SD."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Prístup do ukl. priestoru USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Prístup na kartu SD."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"zakázanie alebo zmeny stavového riadka"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Umožňuje aplikácii zakázať stavový riadok alebo pridať alebo odstrániť systémové ikony."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"stavový riadok"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Umožňuje aplikácii fungovať ako stavový riadok."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"rozbalenie a zbalenie stavového riadka"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Umožňuje aplikácii rozbaliť alebo zbaliť stavový riadok."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"zachytenie odchádzajúcich hovorov"</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"zabrániť prepínaniu aplikácií"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Zabráni používateľovi prepnúť na inú aplikáciu."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"sledovanie a ovládanie spúšťania všetkých aplikácií"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Umožňuje aplikácii sledovať a ovládať spúšťanie činností systémom. Škodlivé aplikácie môžu úplne ovládnuť systém. Toto povolenie je potrebné len na účely vývoja, nikdy nie na bežné používanie tabletu."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Umožňuje aplikácii sledovať a ovládať spúšťanie činností systémom. Škodlivé aplikácie môžu úplne ovládnuť systém. Toto oprávnenie je potrebné len na účely vývoja, nikdy nie na bežné používanie."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"odoslanie vysielania o odstránení balíčka"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Umožňuje aplikácii vysielať upozornenia o odstránení balíčka aplikácie. Škodlivé aplikácie môžu pomocou tohto nastavenia ukončiť ľubovoľnú ďalšiu spustenú aplikáciu."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"odoslanie vysielania o prijatej správe SMS"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"zobrazenie neoprávnených okien"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Umožňuje vytvorenie okien, ktoré majú byť použité interným systémom používateľského rozhrania. Bežné aplikácie toto nastavenie nepoužívajú."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"zobrazenie upozornení systémovej úrovne"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Umožňuje aplikácii zobraziť okná s výstrahami systému. Škodlivé aplikácie môžu prevziať kontrolu nad celou obrazovkou tabletu."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Umožňuje aplikácii zobraziť okná s výstrahami systému. Škodlivé aplikácie môžu prevziať kontrolu nad celou obrazovkou."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"globálne zmeny rýchlosti animácie"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Umožňuje aplikácii kedykoľvek globálne zmeniť rýchlosť animácie (rýchlejšia alebo pomalšia animácia)."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"správa tokenov aplikácií"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Umožňuje aplikácii vytvoriť a spravovať svoje vlastné tokeny a obísť ich obvyklé zoradenie typu Z. Bežné aplikácie by toto nastavenie vôbec nemali využívať."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"používanie kláves a tlačidiel"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Umožňuje aplikácii dodať svoje vlastné vstupné udalosti (stlačenia tlačidiel a pod.) ďalším aplikáciám. Škodlivé aplikácie môžu pomocou tohto nastavenia prevziať kontrolu nad tabletom."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Umožňuje aplikácii doručiť svoje vlastné vstupné udalosti (stlačenia tlačidiel a pod.) ďalším aplikáciám. Škodlivé aplikácie môžu pomocou tohto nastavenia prevziať kontrolu nad tabletom."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Umožňuje aplikácii doručiť svoje vlastné vstupné udalosti (stlačenia tlačidiel a pod.) ďalším aplikáciám. Škodlivé aplikácie môžu pomocou tohto nastavenia prevziať kontrolu nad telefónom."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"zaznamenanie písaného textu a realizovaných akcií"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Umožňuje aplikáciám sledovať, ktoré klávesy používate, a to aj pri práci s inými aplikáciami (napríklad pri zadávaní hesla). Bežné aplikácie by toto nastavenie nemali vôbec využívať."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"priama inštalácia aplikácií"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Umožňuje aplikácii nainštalovať nové alebo aktualizované balíčky systému Android. Škodlivé aplikácie môžu pomocou tohto nastavenia pridať nové aplikácie s ľubovoľnými oprávneniami."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"odstránenie všetkých údajov vo vyrovnávacej pamäti aplikácie"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Umožňuje aplikácii uvoľniť ukladací priestor tabletu odstránením súborov v adresári vyrovnávacej pamäte aplikácie. Prístup je veľmi obmedzený, väčšinou len pre systémové procesy."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Umožňuje aplikácii uvoľniť pamäť tabletu odstránením súborov v adresári vyrovnávacej pamäte aplikácie. Prístup je veľmi obmedzený, väčšinou len pre systémové procesy."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Umožňuje aplikácii uvoľniť pamäť telefónu odstránením súborov v adresári vyrovnávacej pamäte aplikácie. Prístup je veľmi obmedzený, väčšinou len pre systémové procesy."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Presun zdrojov aplikácie"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Umožňuje aplikácii presunúť svoje zdroje z internej pamäte na externé médium a naopak."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"čítanie systémových súborov denníka"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Umožňuje aplikácii čítať rôzne systémové súbory denníkov. Toto nastavenie aplikácie umožňuje získať všeobecné informácie o činnostiach s tabletom, nemali by však obsahovať žiadne osobné ani súkromné informácie."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Umožňuje aplikácii čítať rôzne systémové súbory denníkov. Toto nastavenie aplikácie umožňuje získať všeobecné informácie o činnostiach s tabletom, nemali by však obsahovať žiadne osobné ani súkromné informácie."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"čítať citlivé údaje denníkov"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Umožňuje aplikácii čítať rôzne systémové súbory denníkov. Toto nastavenie aplikácie umožňuje získať všeobecné informácie o činnostiach s tabletom, ktoré by mohli obsahovať osobné alebo súkromné informácie."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Umožňuje aplikácii čítať rôzne systémové súbory denníkov. Toto nastavenie aplikácii umožňuje získať všeobecné informácie o činnostiach s telefónom, ktoré by mohli obsahovať osobné alebo súkromné informácie."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"čítanie alebo zápis do prostriedkov funkcie diag"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Umožňuje aplikácii čítať ľubovoľné prostriedky v skupine diag, napr. súbory v priečinku /dev, a zapisovať do nich. Môže dôjsť k ovplyvneniu stability a bezpečnosti systému. Toto nastavenie by mal používať IBA výrobca či operátor na diagnostiku hardvéru."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"povolenie a zakázanie súčastí aplikácií"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Umožňuje aplikácii zmeniť, či je súčasť inej aplikácie povolená alebo nie. Škodlivé aplikácie môžu pomocou tohto nastavenia zakázať dôležité funkcie tabletu. V rámci tohto povolenia treba postupovať opatrne, pretože tu hrozí možnosť spôsobenia nepoužiteľnosti, nekonzistentnosti či nestability súčastí aplikácie."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Umožňuje aplikácii zmeniť, či je súčasť inej aplikácie povolená alebo nie. Škodlivé aplikácie môžu pomocou tohto nastavenia zakázať dôležité funkcie tabletu. V rámci tohto povolenia treba postupovať opatrne, pretože tu hrozí možnosť spôsobenia nepoužiteľnosti, nekonzistentnosti či nestability súčastí aplikácie."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Umožňuje aplikácii zmeniť, či je súčasť inej aplikácie povolená alebo nie. Škodlivé aplikácie môžu pomocou tohto nastavenia zakázať dôležité funkcie tabletu. Treba postupovať opatrne, pretože tu hrozí možnosť spôsobenia nepoužiteľnosti, nekonzistentnosti či nestability súčastí aplikácie."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Umožňuje aplikácii zmeniť povolenia súčastí iných aplikácií. Škodlivé aplikácie môžu pomocou tohto nastavenia zakázať dôležité funkcie telefónu. Je nutné postupovať opatrne, pretože tu hrozí možnosť spôsobenia nefunkčnosti, nekonzistentnosti či nestability súčastí aplikácie."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"nastavenie uprednostňovaných aplikácií"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Umožňuje aplikácii zmeniť vaše preferované aplikácie. Toto nastavenie môže škodlivým aplikáciám umožniť nepozorovane zmeniť spustené aplikácie a oklamať vaše existujúce aplikácie tak, aby zhromažďovali vaše súkromné údaje."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"zmeny globálnych nastavení systému"</string>
@@ -298,7 +294,7 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"zmeny mapy služieb Google"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Umožňuje aplikácii zmeniť mapu služieb Google. Bežné aplikácie toto nastavenie nevyužívajú."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"automatické spustenie pri štarte"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Umožňuje aplikácii spustenie hneď po spustení systému. Toto nastavenie môže spomaliť spustenie tabletu a umožniť aplikácii celkovo spomaliť tablet, pretože bude neustále spustená."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Umožňuje aplikácii spustiť sa hneď po spustení systému. Toto nastavenie môže spomaliť spustenie tabletu a ako aj celkový výkon tabletu, pretože bude neustále spustená."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Umožňuje aplikácii spustenie hneď po spustení systému. Toto nastavenie môže spomaliť spustenie telefónu a umožniť aplikácii celkovo spomaliť telefón, pretože bude neustále spustená."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"odoslanie trvalého vysielania"</string>
     <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Umožňuje aplikácii odosielať trvalé vysielania, ktoré pretrvávajú aj po skončení vysielania. Škodlivé aplikácie môžu tablet spomaliť alebo spôsobiť jeho nestabilitu, pretože bude používať príliš veľa pamäte."</string>
@@ -324,7 +320,7 @@
     <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Umožňuje aplikácii prístup k zdrojom presnej polohy v tablete, ako je napríklad systém GPS (ak je k dispozícii). Škodlivé aplikácie môžu pomocou tohto nastavenia zistiť vašu polohu a môžu zvýšiť spotrebu batérie."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Umožňuje aplikácii prístup k zdrojom presnej polohy v telefóne, ako je napríklad systém GPS (ak je k dispozícii). Škodlivé aplikácie môžu pomocou tohto nastavenia zistiť vašu polohu a môžu zvýšiť spotrebu batérie."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"približná poloha (pomocou siete)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Umožňuje pristupovať k zdrojom približnej polohy, ako je napríklad databáza mobilnej siete (ak je k dispozícii), a určiť približnú polohu tabletu. Škodlivé aplikácie takto môžu zistiť, kde sa približne nachádzate."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Umožňuje pristupovať k zdrojom približnej polohy, ako je napríklad databáza mobilnej siete (pokiaľ je k dispozícii), a určiť približnú polohu tabletu. Škodlivé aplikácie takto môžu zistiť, kde sa približne nachádzate."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Umožňuje pristupovať k zdrojom približnej polohy, ako je napríklad databáza mobilnej siete (pokiaľ je k dispozícii), a určiť približnú polohu telefónu. Škodlivé aplikácie takto môžu zistiť, kde sa približne nachádzate."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"prístup k službe SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Umožňuje aplikácii používať nízkoúrovňové funkcie SurfaceFlinger."</string>
@@ -334,8 +330,8 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Umožňuje aplikácii zmeniť globálne nastavenie zvuku, napríklad hlasitosť alebo smerovanie."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"záznam zvuku"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Umožňuje aplikácii pristupovať k zaznamenávaniu zvuku."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"fotografovanie"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Umožňuje aplikácii fotografovať pomocou fotoaparátu. Toto nastavenie aplikácie umožní zhromažďovať fotografie vecí, na ktoré je práve fotoaparát namierený."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"snímanie fotografií a natáčanie videí"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Umožňuje aplikácii fotografovať a natáčať videá pomocou fotoaparátu. Toto nastavenie aplikácie umožní zhromažďovať fotografie vecí, na ktoré je práve fotoaparát namierený."</string>
     <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trvalé zakázanie tabletu"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"trvalé vypnutie telefónu"</string>
     <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Umožňuje aplikácii natrvalo vypnúť celý tablet. Toto je veľmi nebezpečné nastavenie."</string>
@@ -348,24 +344,22 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Umožňuje aplikácii pripojiť a odpojiť súborové systémy vo vymeniteľných ukladacích priestoroch."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formátovať externý ukladací priestor"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Umožňuje aplikácii formátovať vymeniteľný ukladací priestor."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"získať informácie o zabezpečenom ukladacom priestore"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Umožňuje aplikácii získať informácie o zabezpečenom ukladacom priestore."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"vytvoriť zabezpečený ukladací priestor"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Umožňuje aplikácii vytvoriť zabezpečený ukladací priestor."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"zničiť zabezpečený ukladací priestor"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Umožňuje aplikácii zničiť zabezpečený ukladací priestor."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"pripojiť alebo odpojiť zabezpečený ukladací priestor"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Umožňuje aplikácii pripojiť alebo odpojiť zabezpečený ukladací priestor."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"premenovať zabezpečený ukladací priestor"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Umožňuje aplikácii premenovať zabezpečený ukladací priestor."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"získať informácie o internom ukladacom priestore"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Umožňuje aplikácii získať informácie o internom ukladacom priestore."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"vytvoriť interný ukladací priestor"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Umožňuje aplikácii vytvoriť interný ukladací priestor"</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"zničiť interný ukladací priestor"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Umožňuje aplikácii zničiť interný ukladací priestor."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"pripojiť alebo odpojiť interný ukladací priestor"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Umožňuje aplikácii pripojiť alebo odpojiť interný ukladací priestor."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"premenovať interný ukladací priestor"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Umožňuje aplikácii premenovať interný ukladací priestor."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"ovládanie vibrácií"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Umožňuje aplikácii ovládať vibrácie."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"ovládanie kontrolky"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Umožňuje aplikácii ovládať kontrolku."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"prístup k zariadeniam USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Umožní aplikácii prístup k zariadeniam USB."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"testovanie hardvéru"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Umožňuje aplikácii ovládať rôzne periférie na účely testovania hardvéru."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"priame volanie na telefónne čísla"</string>
@@ -441,12 +435,10 @@
     <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Umožňuje aplikácii konfigurovať miestny tablet s rozhraním Bluetooth a vyhľadávať a párovať vzdialené zariadenia."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Umožňuje aplikácii konfigurovať miestny telefón s rozhraním Bluetooth a vyhľadávať a párovať vzdialené zariadenia."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"vytvorenie pripojenia Bluetooth"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Umožňuje aplikácii zobraziť konfiguráciu miestneho tabletu s rozhraním Bluetooth, vytvárať pripojenia k spárovaným zariadeniam a prijímať tieto pripojenia."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Umožňuje aplikácii zobraziť konfiguráciu miestneho tabletu s rozhraním Bluetooth, vytvárať pripojenie na spárované zariadenia a prijímať tieto pripojenia."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Umožňuje aplikácii zobraziť konfiguráciu miestneho telefónu s rozhraním Bluetooth, vytvárať pripojenie na spárované zariadenia a prijímať tieto pripojenia."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"ovládať technológiu Near Field Communication"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Umožňuje aplikácii komunikovať so štítkami, kartami a čítačkami s podporou technológie Near Field Communication (NFC)."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"zakázanie uzamknutia klávesnice"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Umožňuje aplikácii vypnúť uzamknutie klávesnice a súvisiace zabezpečenie heslom. Príkladom oprávneného použitia tejto funkcie je vypnutie uzamknutia klávesnice pri prichádzajúcom hovore a jej opätovné zapnutie po skončení hovoru."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čítanie nastavení synchronizácie"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Umožní aplikácii čítať súkromné slová, mená a frázy, ktoré mohol používateľ uložiť do svojho slovníka."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"zapisovať do slovníka definovaného používateľom"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Umožňuje aplikácii zapisovať nové slová do používateľského slovníka."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"Zmeniť/odstrániť obsah karty SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"upraviť/odstrániť obsah ukl. pr. USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"Zmeniť/odstrániť obsah karty SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Umožňuje aplikácii zápis na kartu SD."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Umožní zápis do ukl. priestoru USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Umožňuje aplikácii zápis na kartu SD."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"úprava alebo odstránenie obsahu interného ukladacieho priestoru média"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Umožňuje aplikácii upraviť obsah interného ukladacieho priestoru média."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"pristupovať do súborového systému vyrovnávacej pamäte"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Umožňuje aplikácii čítať a zapisovať do súborového systému vyrovnávacej pamäte."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Obmedzenie hesla"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Obmedzuje typ hesiel, ktoré je možné použiť."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Sledovanie pokusov o prihlásenie"</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"uskutočňovať a prijímať internetové hovory"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Umožňuje aplikácii uskutočniť a prijímať internetové hovory pomocou služby SIP."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Nastaviť pravidlá pre heslo"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Ovládať dĺžku hesiel pre odomknutie obrazovky a v nich používané znaky"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Sledovať pokusy o odomknutie obrazovky"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Sledovať počet nesprávnych hesiel zadaných pri odomykaní obrazovky a uzamknúť tablet alebo odstrániť všetky údaje tabletu v prípade príliš veľkého počtu neplatných pokusov o zadanie hesla"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Sledovať počet nesprávnych hesiel zadaných pri odomykaní obrazovky a uzamknúť tablet alebo odstrániť všetky údaje tabletu v prípade príliš veľkého počtu neplatných pokusov o zadanie hesla"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Obnovenie hesla"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Vynúti nastavenie hesla na novú hodnotu, ktorú vám pred prihlásením musí oznámiť správca."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Vynútenie uzamknutia"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Určuje, kedy sa zariadenie uzamkne a bude vyžiadané opätovné zadanie hesla."</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Sledovať počet nesprávnych hesiel zadaných pri odomykaní obrazovky a uzamknúť telefón alebo odstrániť všetky údaje telefónu v prípade príliš veľkého počtu neplatných pokusov o zadanie hesla"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Zmeniť heslo na odomknutie obrazovky"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Zmeniť heslo na odomknutie obrazovky"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Uzamknúť obrazovku"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Ovládať podmienky a spôsob uzamknutia obrazovky"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Vymazanie všetkých údajov"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Bez predchádzajúceho upozornenia zmazať všetky údaje tým, že sa obnovia továrenské nastavenia tabletu"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Bez predchádzajúceho upozornenia zmazať všetky údaje tým, že sa obnovia továrenské nastavenia tabletu"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Bez predchádzajúceho upozornenia zmazať všetky údaje tým, že sa obnovia továrenské nastavenia telefónu"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Nastaviť globálny server proxy zariadenia"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Vyberte globálny server proxy, ktorý sa bude používať po aktivácii pravidiel. Platný globálny server proxy nastavuje iba prvý správca zariadenia."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Nastav. koniec platnosti hesla"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Ovládanie doby, po uplynutí ktorej treba zmeniť heslo na odomknutie obrazovky"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Domovská stránka"</item>
     <item msgid="869923650527136615">"Mobil"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pracovný pager"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistent"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Vlastné"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Narodeniny"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Výročie"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Udalosť"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Iné"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Vlastné"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Domovská stránka"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Práca"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Práca"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Iné"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Vlastné"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Vlastné"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistent"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Brat"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Dieťa"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Domáci partner"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Otec"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Priateľ"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Manažér"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Matka"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Rodič"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Partner(-ka)"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Referencie od"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Príbuzný(-á)"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Sestra"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Manžel(-ka)"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Vlastné"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Domovská stránka"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Práca"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Iné"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Zadajte kód PIN"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Zadajte heslo pre odomknutie"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Zadajte kód PIN pre odomknutie"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Nesprávny kód PIN"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Ak chcete telefón odomknúť, stlačte Menu a následne 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Číslo tiesňového volania"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Zavolať späť"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Správne!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Je nám ľúto, skúste to znova"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Je nám ľúto, skúste to znova"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Nabíjanie (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Nabité."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Karta SIM je uzamknutá."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Prebieha odomykanie karty SIM..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste použili nesprávny bezpečnostný vzor. "\n\n"Skúste to znova o <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po ďalších neúspešných pokusoch (<xliff:g id="NUMBER_1">%d</xliff:g>) budete požiadaní o odblokovanie tabletu pomocou prihlásenia do služby Google."\n\n"Skúste to znova o niekoľko sekúnd (<xliff:g id="NUMBER_2">%d</xliff:g>)."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne zadali heslo. "\n\n"Skúste to znova o <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne zadali kód PIN. "\n\n"Skúste to znova o <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po ďalších neúspešných pokusoch (<xliff:g id="NUMBER_1">%d</xliff:g>) budete požiadaní o odblokovanie tabletu pomocou prihlásenia do služby Google."\n\n" Skúste to znova o <xliff:g id="NUMBER_2">%d</xliff:g> sekúnd."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po ďalších neúspešných pokusoch (<xliff:g id="NUMBER_1">%d</xliff:g>) budete požiadaní o odblokovanie telefónu pomocou prihlásenia do služby Google."\n\n" Skúste to znova o niekoľko sekúnd (<xliff:g id="NUMBER_2">%d</xliff:g>)."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Počet sekúnd zostávajúcich do ďalšieho pokusu: <xliff:g id="NUMBER">%d</xliff:g>."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Zabudli ste vzor?"</string>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Chcete opustiť túto stránku?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Ak chcete pokračovať, vyberte OK. Ak chcete zostať na stránke, vyberte Zrušiť."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Potvrdiť"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Tip: Dvojitým klepnutím môžete zobrazenie priblížiť alebo oddialiť."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Aut. dop."</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Automatické dopĺňanie"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Nast. Auto. dopĺň."</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"Čítanie histórie a záložiek prehliadača"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Umožňuje aplikácii čítať všetky adresy URL navštívené prehliadačom a záložky prehliadača."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"Zapisovať históriu a záložky prehliadača"</string>
     <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Umožňuje aplikácii zmeniť históriu prehliadača alebo záložky uložené v tablete. Škodlivé aplikácie môžu pomocou tohto nastavenia vymazať alebo pozmeniť údaje prehliadača."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Umožňuje aplikácii zmeniť históriu prehliadača alebo záložky uložené v telefóne. Škodlivé aplikácie môžu pomocou tohto nastavenia vymazať alebo pozmeniť údaje prehliadača."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"nastaviť budík"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Umožní aplikácii nastaviť budík v nainštalovanej aplikácii budíka. Niektoré aplikácie budíka nemusia túto funkciu obsahovať."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Zmeniť oprávnenia prehliadača poskytovať informácie o zemepisnej polohe"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Umožňuje aplikácii zmeniť oprávnenie prehliadača poskytovať informácie o zemepisnej polohe. Škodlivé aplikácie môžu toto nastavenie použiť na odosielanie informácií o umiestnení na ľubovoľné webové stránky."</string>
     <string name="save_password_message" msgid="767344687139195790">"Chcete, aby si prehliadač zapamätal toto heslo?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"Vystrihnúť"</string>
     <string name="copy" msgid="2681946229533511987">"Kopírovať"</string>
     <string name="paste" msgid="5629880836805036433">"Prilepiť"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Nie je čo vložiť"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Skopírovať adresu URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Vybrať text..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Výber textu"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Metóda vstupu"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Upraviť text"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Operácie s textom"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Nedostatok pamäte"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"V tablete je málo miesta na ukladanie údajov."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"V ukladacom priestore tabletu je málo miesta."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"V telefóne je málo miesta na ukladanie údajov."</string>
     <string name="ok" msgid="5970060430562524910">"OK"</string>
     <string name="cancel" msgid="6442560571259935130">"Zrušiť"</string>
     <string name="yes" msgid="5362982303337969312">"OK"</string>
     <string name="no" msgid="5141531044935541497">"Zrušiť"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Pozor"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Prebieha načítavanie..."</string>
     <string name="capital_on" msgid="1544682755514494298">"ZAPNUTÉ"</string>
     <string name="capital_off" msgid="6815870386972805832">"VYPNUTÉ"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Dokončiť akciu pomocou aplikácie"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Vynútenie zavretia"</string>
     <string name="report" msgid="4060218260984795706">"Prehľad"</string>
     <string name="wait" msgid="7147118217226317732">"Čakajte"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Aplikácia bola presmerov."</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"Je spustená aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"Pôvodne bola spustená aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+    <string name="smv_application" msgid="295583804361236288">"Aplikácia <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) porušila svoje vlastné vynútené pravidlá StrictMode."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> porušil svoje vlastné vynútené pravidlá StrictMode."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"Spustená aplikácia: <xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Túto možnosť vyberte, ak chcete prepnúť na aplikáciu."</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Prepnúť medzi aplikáciami?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Pred spustením novej aplikácie treba zastaviť inú spustenú aplikáciu."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Návrat k <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Nespúšťať novú aplikáciu."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Spustiť <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Zastaviť starú aplikáciu bez uloženia."</string>
     <string name="sendText" msgid="5132506121645618310">"Vyberte akciu pre text"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Hlasitosť vyzváňania"</string>
     <string name="volume_music" msgid="5421651157138628171">"Hlasitosť médií"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Zobraziť všetky"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"Ukladací priestor USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Zariadenie USB pripojené"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Svoj telefón ste pripojili k počítaču pomocou USB. Ak chcete kopírovať súbory z počítača na kartu SD v zariadení so systémom Android alebo obrátene, vyberte nasledujúce tlačidlo."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Svoj telefón ste pripojili k počítaču pomocou USB. Ak chcete kopírovať súbory z počítača na kartu SD v zariadení so systémom Android alebo obrátene, vyberte nasledujúce tlačidlo."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Zariadenie ste pripojili k počítaču pomocou USB. Ak chcete kopírovať súbory z počítača do ukladacieho priestoru USB v zariadení so systémom Android alebo naopak, dotknite sa nasledujúceho tlačidla."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Zariadenie ste pripojili k počítaču pomocou USB. Ak chcete kopírovať súbory z počítača na kartu SD v zariadení so systémom Android alebo naopak, dotknite sa nasledujúceho tlačidla."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Zapnúť ukladací priestor USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Pri používaní vašej karty SD ako ukladacieho priestoru USB sa vyskytol problém."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Pri používaní vašej karty SD ako ukladacieho priestoru USB sa vyskytol problém."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Pri používaní vášho ukladacieho priestoru USB ako veľkokapacitného ukladacieho priestoru USB sa vyskytol problém."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Pri používaní vašej karty SD ako veľkokapacitného ukladacieho priestoru USB sa vyskytol problém."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Zariadenie USB pripojené"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Vyberte, ak chcete kopírovať súbory do/z počítača."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Vypnúť ukladací priestor USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Vyberte, ak chcete vypnúť ukladací priestor USB."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"Ukladací priestor USB sa používa"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Pred vypnutím ukladacieho priestoru USB skontrolujte, či ste odpojili („vysunuli“) kartu SD zariadenia Android z počítača."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Pred vypnutím ukladacieho priestoru USB skontrolujte, či ste ho odpojili („vysunuli“) od počítača."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Pred vypnutím ukladacieho priestoru USB skontrolujte, či ste odpojili („vysunuli“) kartu SD zariadenia Android z počítača."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Vypnúť ukladací priestor USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Pri vypínaní ukladacieho priestoru USB sa vyskytol problém. Skontrolujte, či bol hostiteľ USB odpojený, a skúste to znova."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Ak zapnete ukladací priestor USB, dôjde k zastaveniu niektorých používaných aplikácií. Tieto aplikácie pravdepodobne nebudú k dispozícii až do vypnutia ukladacieho priestoru USB."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Chyba operácie na rozhraní USB"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formátovať kartu SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formát. ukl. priestor USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Formátovať kartu SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Naozaj chcete naformátovať kartu SD? Stratíte všetky údaje na karte."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Chcete ukladací priestor USB naformátovať a vymazať tak všetky súbory, ktoré sú v ňom uložené? Túto akciu nie je možné vrátiť späť."</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Naozaj chcete naformátovať kartu SD? Stratíte všetky údaje na karte."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formát"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez rozhranie USB pripojené"</string>
@@ -960,28 +897,28 @@
     <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁÄBCČDĎDZDŽEÉFGHCHIÍJKLĽMNŇOÓÔPRŔSŠTŤUÚVWXYÝZŽ"</string>
     <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style" msgid="4333913089637062257"><u>"kandidáti"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Príprava karty SD"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Príprava uklad. priestoru USB"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Príprava karty SD"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Kontrola chýb."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Prázdna karta SD"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Prázdny ukladací priestor USB"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Prázdna karta SD"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Karta SD je prázdna alebo obsahuje nepodporovaný systém súborov."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Ukladací priestor USB je prázdny alebo obsahuje nepodporovaný systém súborov."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"Karta SD je prázdna alebo obsahuje nepodporovaný systém súborov."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Poškodená karta SD"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Ukl. priestor USB je poškodený"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Poškodená karta SD"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Karta SD je poškodená. Pravdepodobne ju bude treba znova naformátovať."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Ukladací priestor USB je poškodený. Pravdepodobne ho bude treba znova naformátovať."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Karta SD je poškodená. Pravdepodobne ju bude treba znova naformátovať."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Karta SD bola neočakávane odobraná"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Ukl. priestor USB nečakane odstránený"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"Karta SD bola neočakávane odobraná"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Ak chcete zabrániť strate údajov, kartu SD pred odobratím odpojte."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Ak chcete zabrániť strate údajov, ukladací priestor USB pred odobratím odpojte."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Ak chcete zabrániť strate údajov, kartu SD pred odobratím odpojte."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Kartu SD je možné bezpečne odobrať"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Ukl. priestor USB môžete odobrať"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"Kartu SD je možné bezpečne odobrať"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Kartu SD je možné bezpečne odobrať."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Ukladací priestor USB môžete bezpečne odstrániť."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Kartu SD je možné bezpečne odobrať."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Karta SD bola odobraná"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Ukl. priestor USB odstránený"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Karta SD bola odobraná"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Karta SD bola odobraná. Vložte novú kartu."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Ukladací priestor USB odstránený. Vložte nové médium."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"Karta SD bola odobraná. Vložte novú kartu."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Neboli nájdené žiadne zodpovedajúce činnosti."</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"aktualizovať štatistiku použitia súčastí"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Odoslať"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Ďalej"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Hotovo"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Predch."</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Vykonať"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Vytočiť číslo"\n" <xliff:g id="NUMBER">%s</xliff:g>."</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Vytvoriť kontakt"\n"pre <xliff:g id="NUMBER">%s</xliff:g>."</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Sieť VPN L2TP/IPSec s vopred zdieľaným kľúčom"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Sieť VPN L2TP/IPSec s certifikátom"</string>
     <string name="upload_file" msgid="2897957172366730416">"Zvoliť súbor"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Nie je vybratý žiadny súbor"</string>
     <string name="reset" msgid="2448168080964209908">"Obnoviť"</string>
     <string name="submit" msgid="1602335572089911941">"Odoslať"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Aktivovaný režim V aute"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Vyberte, ak chcete ukončiť režim V aute."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Tethering alebo prístupový bod je aktívny"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Dotykom spustíte konfiguráciu"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Späť"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Ďalej"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Preskočiť"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Vysoké využitie mobilných údajov"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Dotykom zobrazíte viac informácií o využití mobilných údajov"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Bol prekročený limit mobilných údajov"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Dotykom zobrazíte viac informácií o využití mobilných údajov"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Žiadne zhody"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Vyhľadať na stránke"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"Počet zhôd: 1"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Hotovo"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Odpájanie ukladacieho priestoru USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Odpájanie karty SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Prebieha vymazávanie ukladacieho priestoru USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Prebieha vymazávanie karty SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Vymazanie ukladacieho priestoru USB zlyhalo."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Vymazanie karty SD zlyhalo."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"Karta SD nebola pred odstránením odpojená."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Prebieha kontrola ukladacieho priestoru USB."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"Prebieha kontrola karty SD."</string>
+    <string name="media_removed" msgid="7001526905057952097">"Karta SD bola odstránená."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Ukladací priestor USB je momentálne používaný počítačom."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Karta SD sa momentálne používa počítačom."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Neznámy stav externého média."</string>
+    <string name="share" msgid="1778686618230011964">"Zdieľať"</string>
+    <string name="find" msgid="4808270900322985960">"Nájsť"</string>
+    <string name="websearch" msgid="4337157977400211589">"Hľadať na webe"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 43993d4..0cbd8bf 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Glasovna pošta"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Težava s povezavo ali neveljavna koda MMI."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Operacija je omejena na dovoljene telefonske številke, za katere ne velja zapora odhodnega klica."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Storitev je omogočena."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Storitev je bila omogočena za:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Storitev je onemogočena."</string>
@@ -126,7 +125,7 @@
     <string name="contentServiceSync" msgid="8353523060269335667">"Sinhronizacija"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinhronizacija"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Preveč izbrisov vsebine <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
-    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Pomnilnik tabličnega računalnika je poln. Izbrišite nekaj datotek, da sprostite prostor."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Shramba tabličnega računalnika je polna. Izbrišite nekaj datotek, da sprostite prostor."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"Pomnilnik telefona je poln. Izbrišite nekaj datotek, da sprostite prostor."</string>
     <string name="me" msgid="6545696007631404292">"Jaz"</string>
     <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Možnosti tabličnega računalnika"</string>
@@ -137,10 +136,9 @@
     <string name="screen_lock" msgid="799094655496098153">"Zaklep zaslona"</string>
     <string name="power_off" msgid="4266614107412865048">"Izklopi"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Se zaustavlja ..."</string>
-    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablični računalnik bo zaustavljen."</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablični računalnik se bo zaustavil."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon bo zaustavljen."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Ali želite izklopiti telefon?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavno"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Ni nedavnih programov."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Možnosti tabličnega računalnika"</string>
@@ -160,7 +158,7 @@
     <string name="permgrouplab_messages" msgid="7521249148445456662">"Vaša sporočila"</string>
     <string name="permgroupdesc_messages" msgid="7045736972019211994">"Pisanje in branje sporočil SMS, e-pošte in drugih sporočil."</string>
     <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Osebni podatki"</string>
-    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Neposreden dostop do stikov in koledarja, shranjenih v tabličnem računalniku."</string>
+    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Neposreden dostop do stikov in koledarskih vnosov, shranjenih v tabličnem računalniku."</string>
     <string name="permgroupdesc_personalInfo" product="default" msgid="5488050357388806068">"Neposreden dostop do stikov in koledarja, shranjenega v telefonu."</string>
     <string name="permgrouplab_location" msgid="635149742436692049">"Vaša lokacija"</string>
     <string name="permgroupdesc_location" msgid="2430258821648348660">"Spremljanje fizične lokacije"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Razvojna orodja"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Funkcije, ki jih potrebujejo le razvijalci programa."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Prostor za shranjevanje"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Dostop do kartice SD."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Dostop do pomnilnika USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Dostop do kartice SD."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"onemogočanje ali spreminjanje vrstice stanja"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Programom dovoljuje onemogočenje vrstice stanja ali dodajanje in odstranjevanje ikone sistema."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"vrstica stanja"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Programu omogoča, da postane vrstica stanja."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"razširjanje/strnjevanje vrstice stanja"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Programu dovoljuje razširjanje ali strjevanje vrstice stanja."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"prestrezanje odhodnih klicev"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"pošiljanje sporočil SMS"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Programom dovoljuje pošiljanje sporočil SMS. Zlonamerni programi lahko pošiljajo sporočila brez vaše potrditve, kar vas lahko drago stane."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"branje sporočil SMS ali MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Programu dovoljuje branje sporočil SMS, shranjenih v tabličnem računalniku ali na kartici SIM. Zlonamerni programi lahko berejo vaša zaupna sporočila."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Programu omogoča branje sporočil SMS, shranjenih v tabličnem računalniku ali na kartici SIM. Zlonamerni programi lahko preberejo vaša zaupna sporočila."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Programu dovoljuje branje sporočil SMS, shranjenih v telefonu ali na kartici SIM. Zlonamerni programi lahko berejo vaša zaupna sporočila."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"urejanje sporočil SMS ali MMS"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Programu dovoljuje pisanje v sporočila SMS, shranjena v tabličnem računalniku ali na kartici SIM. Zlonamerni programi lahko izbrišejo sporočila."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Programu omogoča zapisovanje v sporočila SMS, shranjena v tabličnem računalniku ali na kartici SIM. Zlonamerni programi lahko izbrišejo vaša sporočila."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Programu dovoljuje pisanje v sporočila SMS, shranjena v telefonu ali na kartici SIM. Zlonamerni programi lahko izbrišejo sporočila."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"prejemanje sporočil WAP"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Programom dovoljuje sprejemanje in obdelavo sporočil WAP. Zlonamerni programi lahko spremljajo vaša sporočila ali jih izbrišejo, ne da bi vam jih pokazali."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"preprečevanje preklopa programov"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Uporabniku preprečuje preklop v drug program."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"spremljanje in nadzor vseh zagonov programov"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Programu dovoljuje, da nadzira, kako sistem zaganja dejavnosti. Zlonamerni programi lahko ogrozijo celotno varnost sistema. To dovoljenje je potrebno le pri razvoju, nikoli pri navadni rabi."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Programu omogoča spremljanje in nadziranje načina, kako sistem zažene dejavnosti. Zlonamerni programi lahko v celoti ogrozijo varnost sistema. To dovoljenje je potrebno samo za razvoj, vendar ne za običajno uporabo."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"pošiljanje oddaje brez paketa"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Programu dovoljuje oddajanje obvestila, da je bil paket programa odstranjen. Zlonamerni programi lahko to uporabijo za zaustavitev morebitnih drugih programov, ki se izvajajo."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"pošiljanje oddaje, prejete prek SMS-a"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"prikazovanje nepooblaščenih oken"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Dovoljuje ustvarjanje oken, ki jih bo uporabljal uporabniški vmesnik notranjega sistema. Ni za uporabo z navadnimi programi."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"prikaz opozoril na ravni sistema"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Programu dovoljuje, da pokaže okna z opozorili sistema. Zlonamerni programi lahko prevzamejo celoten zaslon."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Programu omogoča prikaz oken s sistemskimi opozorili. Zlonamerni programi lahko zavzamejo celoten zaslon."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"spreminjanje splošne hitrosti animacij"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Dovoljuje, da program kadar koli spremeni splošno hitrost animacije (hitrejše ali počasnejše animacije)."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"upravljanje žetonov programa"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Dovoljuje, da programi ustvarijo in upravljajo svoje žetone ter obidejo navadno razvrščanje Z. Tega nikoli ni treba uporabiti za navadne programe."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"pritiskanje tipk in gumbov za nadzor"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Programu dovoljuje, da svoje dogodke vnosa (pritiske tipk ipd.) dostavi drugim programom. Zlonamerni programi lahko s tem prevzamejo nadzor nad tabličnim računalnikom."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Programu omogoča pošiljanje lastnih vnosov, na primer pritisnjene tipke in podobno, drugim programom. Zlonamerni program lahko s tem dovoljenjem prevzame nadzor nad tabličnim računalnikom."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Dovoljuje, da programi svoje dogodke vnosa (pritiske tipk ipd.) dostavijo drugim programom. Zlonamerni programi lahko s tem prevzamejo nadzor nad telefonom."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"snemanje vnesenega besedila in dejanj, ki jih izvedete"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Programu dovoljuje spremljanje tipk, ki jih pritisnete med interakcijo z drugim programom (na primer vnos gesla). Navadni programi tega nikoli ne potrebujejo."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"neposredno nameščanje programov"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Programu dovoljuje namestitev novih ali posodobljenih paketov sistema Android. Zlonamerni programi lahko to uporabijo za dodajanje novih programov s poljubnimi zmogljivimi dovoljenji."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"brisanje vseh podatkov predpomnilnika programa"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Programu dovoljuje sproščanje pomnilnika tabličnega računalnika z brisanjem datotek v imeniku predpomnilnika telefona. Dostop je zelo omejen, navadno le na sistemske procese."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Programu omogoča sprostitev shrambe tabličnega računalnika, tako da izbriše datoteke v predpomnilniškem imeniku programa. Dostop je običajno omejen na sistemske procese."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Programu dovoljuje sproščanje pomnilnika telefona z brisanjem datotek v imeniku predpomnilnika telefona. Dostop je zelo omejen, navadno le na sistemske procese."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Premikanje sredstev programa"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Dovoljuje, da programi sredstva programov z notranjih premaknejo na zunanje medije in obratno."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"branje dnevniških datotek sistema"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Programu dovoljuje branje iz različnih dnevniških datotek sistema. Tako lahko odkrije splošne informacije o tem, kaj počnete s tabličnim računalnikom, kar lahko vključuje tudi osebne ali zasebne informacije."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Programu dovoljuje branje iz različnih dnevniških datotek sistema. Tako lahko odkrije splošne informacije o tem, kaj počnete s tabličnim računalnikom, kar lahko vključuje tudi osebne ali zasebne informacije."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"branje občutljivih dnevniških podatkov"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Programu omogoča branje različnih sistemskih dnevniških datotek. To mu omogoča dostop do splošnih podatkov v tabličnem računalniku, lahko tudi do osebnih podatkov."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Programu omogoča branje različnih sistemskih dnevniških datotek. To mu omogoča dostop do splošnih podatkov v telefonu, lahko tudi do osebnih podatkov."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"branje/pisanje v sredstva, ki so v lasti skupine za diagnostiko"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Programu dovoljuje branje in pisanje na poljuben vir, ki je v lasti skupine za diagnostiko; na primer datoteke v mapi /dev. To lahko vpliva na stabilnost in varnost sistema. To naj uporablja SAMO izdelovalec ali operater za diagnostiko, specifično za strojno opremo."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"omogočanje ali onemogočanje komponent programa"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Programu dovoljuje, da spremeni, ali je komponenta drugega programa omogočena ali ne. Zlonamerni programi lahko to uporabijo za onemogočanje pomembnih zmožnosti tabličnega računalnika. Pri dodeljevanju dovoljenja je treba biti previden, saj lahko komponente programa nastavite tako, da jih ni mogoče uporabiti, da niso dosledne ali pa da postanejo nestabilne."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Programu dovoljuje, da spremeni, ali je komponenta drugega programa omogočena ali ne. Zlonamerni programi lahko to uporabijo za onemogočanje pomembnih zmožnosti tabličnega računalnika. Pri dodeljevanju dovoljenja je treba biti previden, saj lahko komponente programa nastavite tako, da jih ni mogoče uporabiti, da niso dosledne ali pa da postanejo nestabilne."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Omogoča, da program spremeni, ali je komponenta drugega programa omogočena ali ne. Zlonamerni programi lahko s tem dovoljenjem onemogočijo pomembne telefonske funkcije. To dovoljenje uporabljajte previdno, ker lahko programske komponente postanejo neuporabne, nedosledne ali nestabilne."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Omogoča, da program spremeni, ali je komponenta drugega programa omogočena ali ne. Zlonamerni programi lahko s tem dovoljenjem onemogočijo pomembne telefonske funkcije. To dovoljenje uporabljajte previdno, ker lahko programske komponente postanejo neuporabne, nedosledne ali nestabilne."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"nastavitev prednostnih programov"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Programom dovoljuje spreminjanje priljubljenih programov. Zlonamerni programi lahko s tem neopazno spremenijo programe, ki se izvajajo, tako da se izdajajo za obstoječe programe in zbirajo osebne podatke."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"spreminjanje splošnih nastavitev sistema"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"spreminjanje zemljevidov Googlovih storitev"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Programu dovoljuje spreminjanje zemljevidov Googlovih storitev. Ni za uporabo z navadnimi programi."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"samodejni začetek pri zagonu"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Programu dovoljuje, da se zažene takoj, ko sistem dokonča zagon. Zaradi tega lahko zagon tabličnega računalnika traja nekoliko dlje, program pa lahko upočasni splošno delovanje tabličnega računalnika, ker se vedno izvaja."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Omogoča, da se program samodejno zažene po zagonu sistema. To lahko povzroči daljši zagon tabličnega računalnika in programu omogoči, da s stalnim izvajanjem upočasni delovanje tabličnega računalnika."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Dovoljuje, da se program zažene takoj, ko sistem dokonča zagon. Zaradi tega lahko zagon telefona traja nekoliko dlje, program pa lahko upočasni splošno delovanje telefona, ker se vedno izvaja."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"pošiljanje fiksne oddaje"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Programu dovoljuje hitro pošiljanje fiksnih oddaj, ki ostanejo po koncu oddajanja. Zaradi zlonamernih programov je delovanje tabličnega računalnika lahko počasno ali nestabilno ali tablični računalnik zaradi njih porabi preveč pomnilnika."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Programu omogoča pošiljanje fiksnih oddaj, ki ostanejo po koncu oddajanja. Zlonamerni programi lahko upočasnijo ali oslabijo delovanje računalnika, tako da zasedejo preveč pomnilnika."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Programu dovoljuje hitro pošiljanje fiksnih oddaj, ki ostanejo po koncu oddajanja. Zaradi zlonamernih programov je delovanje telefona lahko počasno ali nestabilno ali telefon zaradi njih porabi preveč pomnilnika."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"branje podatkov stika"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Programu dovoljuje branje vseh podatkov stika (naslov), shranjenih v tabličnem računalniku. Zlonamerni programi lahko to uporabijo za pošiljanje podatkov drugim osebam."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Programu omogoča branje vseh podatkov (naslovov) o stikih, shranjenih v tabličnem računalniku. Zlonamerni programi lahko s tem dovoljenjem pošljejo vaše podatke drugim uporabnikom."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Programu dovoljuje branje vseh podatkov stika (naslov), shranjenih v telefonu. Zlonamerni programi lahko to uporabijo za pošiljanje podatkov drugim osebam."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"pisanje podatkov stika"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Programu dovoljuje spreminjanje podatkov stika (naslov), shranjenih v tabličnem računalniku. Zlonamerni programi lahko to uporabijo za brisanje ali spreminjanje podatkov stika."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Programu omogoča spreminjanje podatkov (naslovov), shranjenih v tabličnem računalniku. Zlonamerni programi lahko s tem dovoljenjem izbrišejo ali spremenijo podatke o stikih."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Programu dovoljuje spreminjanje podatkov stika (naslov), shranjenih v telefonu. Zlonamerni programi lahko to uporabijo za brisanje ali spreminjanje podatkov stika."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"branje koledarskih dogodkov"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Programu dovoljuje branje vseh dogodkov koledarja, shranjenih v tabličnem računalniku. Zlonamerni programi lahko to uporabijo za pošiljanje dogodkov koledarja drugim osebam."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Programu omogoča branje vseh koledarskih vnosov, shranjenih v tabličnem računalniku. Zlonamerni programi lahko s tem dovoljenjem pošljejo vnose drugim uporabnikom."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Programu dovoljuje branje vseh dogodkov koledarja, shranjenih v telefonu. Zlonamerni programi lahko to uporabijo za pošiljanje dogodkov koledarja drugim osebam."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"dodajanje ali spreminjanje koledarskih dogodkov in pošiljanje e-pošte gostom"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Dovoljuje, da program doda ali spremeni dogodke v koledarju, s čimer bodo gostom morda poslana e-poštna sporočila. Zlonamerni programi lahko to uporabijo za brisanje ali spreminjanje koledarskih dogodkov ali pošiljanje e-pošte gostom."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"dovoljenje za namestitev ponudnika lokacije"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Ustvarjanje simuliranih virov lokacije za preskušanje. Zlonamerni programi lahko to uporabijo za preglasitev lokacije in/ali stanja, ki ga vrnejo pravi viri lokacije, kot je GPS ali ponudniki omrežja, ali za spremljanje in pošiljanje vaše lokacije zunanjemu viru."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"natančna lokacija (GPS)"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Dostopa do podrobnih virov lokacije, kot je sistem GPS v tabličnem računalniku, kjer so na voljo. Zlonamerni programi lahko s tem določijo, kje ste, in še dodatno porabijo baterijo."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Dostop do virov natančne lokacije, kot je sistem GPS, v tabličnem računalniku. Zlonamerni programi lahko s tem dovoljenjem ugotovijo vašo lokacijo in dodatno porabljajo baterijo."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Dostopa do podrobnih virov lokacije, kot je sistem GPS v telefonu, kjer so na voljo. Zlonamerni programi lahko s tem dovoljenjem določijo, kje ste, in še dodatno porabijo baterijo."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"groba ocena lokacije (temelječa na omrežju)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Dostopa do grobih virov lokacij, kot je zbirka podatkov brezžičnega omrežja, s katerimi je mogoče določiti približno lokacijo tabličnega računalnika, kjer so na voljo. Zlonamerni programi lahko s tem določijo, kje približno ste."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Dostop do virov grobe lokacije, kot je zbirka podatkov brezžičnega omrežja, s katerimi je mogoče določiti približno lokacijo tabličnega računalnika. Zlonamerni programi lahko s tem dovoljenjem določijo vašo približno lokacijo."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Dostop do grobih virov lokacij, kot je zbirka podatkov brezžičnega omrežja, s katerimi je mogoče določiti približno lokacijo telefona, kjer je na voljo. Zlonamerni programi lahko s tem določijo, kje približno ste."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"dostop do storitve SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Programu dovoljuje uporabo funkcij nizke ravni SurfaceFlinger."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Programu dovoljuje spreminjanje splošnih zvočnih nastavitev, kot sta glasnost in usmerjanje."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"snemanje zvoka"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Programu dovoljuje dostop do poti zvočnega posnetka."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"ustvarjanje slik"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Programu dovoljuje ustvarjanje slik s fotoaparatom. To pomeni, da lahko program kadar koli posname sliko, ki je v objektivu fotoaparata."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"fotografiranje in snemanje videoposnetkov"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Programu omogoča snemanje slik in videoposnetkov, tako lahko program kadar koli posname slike, ki jih zajame fotoaparat."</string>
     <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trajno onemogočenje tabličnega računalnika"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"trajno onemogočenje telefona"</string>
-    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Programu dovoljuje, da trajno onemogoči celoten tablični računalnik. To je zelo nevarno."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Programu omogoča trajno onemogočenje celotnega tabličnega računalnika. To je zelo nevarno dejanje."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Programu dovoljuje trajno onemogočenje celotnega telefona. To je zelo nevarno."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"vsiljen vnovičen zagon tabličnega računalnika"</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"vsiljeni vnovični zagon"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"vsiljevanje vnovičnega zagona telefona"</string>
-    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Programu dovoljuje, da vsili vnovični zagon tabličnega računalnika."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Programu omogoča vsiljenje vnovičnega zagona tabličnega računalnika."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Dovoljuje, da program vsili vnovični zagon telefona."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"vpenjanje in izpenjanje datotečnih sistemov"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Programu dovoljuje vpenjanje in izpenjanje datotečnih sistemov za izmenljive shrambe."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatiranje zunanje shrambe"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Programu dovoljuje formatiranje izmenljive shrambe."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"pridobivanje informacij o varni shrambi"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Programu dovoljuje pridobivanje informacij o varni shrambi."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"ustvarjanje varne shrambe"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Programu dovoljuje ustvarjanje varne shrambe."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"uničenje varne shrambe"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Dovoljuje, da program uniči varno shrambo."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"vpenjanje/izpenjanje varne shrambe"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Programu dovoljuje vpenjanje/izpenjanje varne shrambe."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"preimenovanje varne shrambe"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Programu dovoljuje preimenovanje varne shrambe."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"informacije o notranjem pomnilniku"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Programu omogoča pridobivanje podatkov o notranji shrambi."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"ustvarjanje notranje shrambe"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Programu omogoča ustvarjanje notranje shrambe."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"uničenje notranje shrambe"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Programu omogoča uničenje notranje shrambe."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"vpenjanje in izpenjanje notranjega pomnilnika"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Programu omogoča vpenjanje in izpenjanje notranje shrambe."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"preimenovanje notranje shrambe"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Programu omogoča preimenovanje notranje shrambe."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"nadzor vibriranja"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Programu dovoljuje nadzor vibriranja."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"nadzor svetilke"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Programu dovoljuje nadzor svetilke."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"dostop do naprav USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Programu omogoča dostop do naprav USB."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"preskušanje strojne opreme"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Programu dovoljuje nadzor različnih zunanjih naprav za preskušanje strojne opreme."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"neposredno klicanje telefonskih številk"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Dovoljuje, da program brez vašega posredovanja kliče telefonske številke. Zaradi zlonamernih programov so na vašem telefonskem računu lahko nepričakovani klici. Programu to ne dovoljuje opravljanja klicev v sili."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"neposredno klicanje poljubnih telefonskih številk"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Dovoljuje, da program brez vašega posredovanja pokliče poljubno telefonsko številko, vključno s klici v sili. Zlonamerni programi lahko opravljajo nepotrebne in nezakonite klice v sili."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"neposredni zagon nastavitve tabličnega računalnika CDMA"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"neposredni zagon namestitve tabličnega računalnika CDMA"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"neposredni zagon nastavitve telefona CDMA"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Programu dovoljuje zagon omogočanja uporabe CDMA. Zlonamerni programi lahko po nepotrebnem zaženejo omogočanje uporabe CDMA"</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"nadzor obvestil o posodobitvi lokacije"</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Programu dovoljuje nadzor telefonskih funkcij naprave. Program lahko s tem dovoljenjem brez obvestila preklaplja omrežja, vklopi in izklopi radio telefona in podobno."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"branje stanja in identitete telefona"</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Programu dovoljuje dostop do funkcij telefona v napravi. Program lahko s tem dovoljenjem določi telefonsko številko in serijsko številko tega telefona, določi lahko tudi, ali je klic aktiven, številko, s katero je klic povezan, in podobno."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"preprečevanje, da bi tablični računalnik prešel v stanje pripravljenosti"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"preprečitev prehoda tabličnega računalnika v stanje pripravljenosti"</string>
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"preprečevanje prehod v stanje pripravljenosti telefona"</string>
-    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Programu dovoljuje, da tabličnemu računalniku prepreči prehod v stanje pripravljenosti."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Omogoča, da program prepreči prehod tabličnega računalnika v stanje pripravljenosti."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Dovoljuje, da program telefonu prepreči prehod v stanje pripravljenosti."</string>
     <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"vklop ali izklop tabličnega računalnika"</string>
     <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"vklop ali izklop telefona"</string>
-    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Programu dovoljuje vklop ali izklop tabličnega računalnika."</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Programu omogoča vklop ali izklop tabličnega računalnika."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Programu dovoljuje vklop ali izklop telefona."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"izvajanje v preskusnem načinu delovanja"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Se izvaja kot preskus izdelovalca nizke ravni, ki dovoljuje popoln dostop do strojne opreme tabličnega računalnika. Na voljo le, ko tablični računalnik deluje v načinu preskusa izdelovalca."</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Izvajanje kot proizvajalčev preskus na najnižjem nivoju, kar omogoča popoln dostop do strojne opreme tabličnega računalnika. Dovoljenje je na voljo, samo če se tablični računalnik izvaja v načinu proizvajalčevega preskusa."</string>
     <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Se izvaja kot preskus izdelovalca nizke ravni, ki dovoljuje popoln dostop do strojne opreme telefona. Na voljo le, ko se telefon izvaja v načinu preskusa izdelovalca."</string>
     <string name="permlab_setWallpaper" msgid="6627192333373465143">"nastavljanje ozadja"</string>
     <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Programu dovoljuje nastavitev ozadja sistema."</string>
@@ -403,15 +397,15 @@
     <string name="permlab_masterClear" msgid="2315750423139697397">"ponastavitev sistema na privzete tovarniške nastavitve"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Dovoljuje, da program v celoti ponastavi sistem na tovarniške nastavitve, izbriše vse podatke, konfiguracijo in nameščene programe."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"nastavljanje ure"</string>
-    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Programu dovoljuje spremembo ure tabličnega računalnika."</string>
+    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Programu omogoča spreminjanje ure v tabličnem računalniku."</string>
     <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Programu dovoljuje spremembo ure telefona."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"nastavitev časovnega pasu"</string>
-    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Programu dovoljuje spreminjanje časovnega pasu tabličnega računalnika."</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Programu omogoča spreminjanje časovnega pasu v tabličnem računalniku."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Programu dovoljuje spreminjanje časovnega pasu telefona."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"opravljanje vloge AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Programu dovoljuje klicanje AccountAuthenticators"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"odkrivanje znanih računov"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Programu dovoljuje pridobivanje seznama računov, ki jih pozna tablični računalnik."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Programu omogoča dostop do seznama računov, ki jih pozna tablični računalnik."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Programu dovoljuje pridobivanje seznama računov, ki jih pozna telefon."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"opravlja vlogo overovitelja računa"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Dovoljuje, da program uporabi zmožnosti overovitelja računa storitve AccountManager, vključno z ustvarjanjem računov ter s pridobivanjem in nastavljanjem njihovih gesel."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"dovoljevanje sprejema večvrstnega brezžičnega oddajanja"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Programu dovoljuje prejemanje paketov, ki niso naslovljeni neposredno na vašo napravo. To je lahko uporabno, ko odkrivate storitve, ki so dane na voljo v bližini. Poraba je večja od načina delovanja brez večvrstnega oddajanja."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"skrbništvo storitve Bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Programu dovoljuje konfiguriranje lokalnega tabličnega računalnika s tehnologijo Bluetooth ter odkrivanje oddaljenih naprav in povezovanje z njimi."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Programu omogoča konfiguriranje lokalnega tabličnega računalnika Bluetooth ter zaznavanje oddaljenih naprav in združevanje z njimi."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Programu dovoljuje konfiguriranje lokalnega telefona s tehnologijo Bluetooth ter odkrivanje oddaljenih naprav in povezovanje z njimi."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"ustvarjanje povezav Bluetooth"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Programu dovoljuje ogled konfiguracije lokalnega tabličnega računalnika s tehnologijo Bluetooth ter ustvarjanje in sprejemanje povezave s povezanimi napravami."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Programu omogoča ogled konfiguracije lokalnega tabličnega računalnika Bluetooth ter vzpostavljanje in sprejemanje povezave z združenimi napravami."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Programom dovoljuje ogled konfiguracije lokalnega telefona Bluetooth ter ustvarjanje in sprejemanje povezave s povezanimi napravami."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"nadzor nad komunikacijo s tehnologijo bližnjega polja"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Podpira komunikacijo med računalnikom in oznakami, karticami in bralniki komunikacije s tehnologijo bližnjega polja."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"onemogočanje zaklepa tipkovnice"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Dovoljuje, da program onemogoči zaklep tipk in morebitno povezano varnostno geslo. Legitimen primer je onemogočenje zaklepa tipkovnice pri dohodnem klicu ter vnovičnem omogočanju zaklepa, ko je klic dokončan."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"branje nastavitev sinhronizacije"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Programu dovoljuje branje morebitnih zasebnih besed, imen in izrazov, ki jih je uporabnik shranil v uporabniški slovar."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"pisanje v uporabniško določen slovar"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Programu dovoljuje pisanje nove besede v uporabniški slovar."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"spreminjanje/brisanje vsebine kartice SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"spreminjanje vsebine pomnilnika USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"spreminjanje/brisanje vsebine kartice SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Programu dovoljuje pisanje na kartico SD."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Programu omogoča zapisovanje na pomnilnik USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Programu dovoljuje pisanje na kartico SD."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"spreminjanje/brisanje vsebine notranje shrambe nosilca podatkov"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Programu omogoča spreminjanje vsebine notranje shrambe nosilca podatkov."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"dostop do datotečnega sistema predpomnilnika"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Programu dovoljuje branje in pisanje v datotečni sistem predpomnilnika."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Omejevanje gesla"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Omejevanje vrste gesel, ki jih lahko uporabite."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Spremljanje poskusov prijave"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Nadzoruje število nepravilno vnesenih gesel pri odklepanju zaslona in zaklene tablični računalnik ali izbriše vse podatke na njem, če je vnesenih preveč nepravilnih gesel"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Nadzoruje število nepravilno vnesenih gesel pri odklepanju zaslona in zaklene tablični računalnik ali izbriše vse podatke na njem, če je vnesenih preveč nepravilnih gesel"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Ponastavitev gesla"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Vsilite novo vrednost za geslo. Pred prijavo vam jo mora dati skrbnik."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Vsiljen zaklep"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Nadzor časa zaklepa naprave, pri tem morate znova vnesti geslo."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"opravljanje/sprejemanje internetnih klicev"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Programu omogoča uporabo storitve SIP za opravljanje in sprejemanje internetnih klicev."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Nastavitev pravil za geslo"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Nadzor nad dolžino in znaki, ki so dovoljeni v geslih za odklepanje zaslona"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"nadzor nad poskusi odklepanja zaslona"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Spremljajte število vnesenih napačnih gesel, s katerimi želite odkleniti zaslon. Če je teh vnosov preveč, zaklenite tablični računalnik ali izbrišite vse podatke v njem."</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Spremljajte število vnesenih napačnih gesel, s katerimi želite odkleniti zaslon. Če je teh vnosov preveč, zaklenite telefon ali izbrišite vse podatke v njem"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Spreminjanje gesla za odklepanje zaslona"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Spreminjanje gesla za odklepanje zaslona"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Zaklepanje zaslona"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Nadzor nad načinom in trenutkom zaklepa zaslona"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Brisanje vseh podatkov"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Brez opozorila zbriše podatke v tabličnem računalniku in obnovi tovarniške nastavitve"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Brez opozorila zbriše podatke v tabličnem računalniku in obnovi tovarniške nastavitve"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Brisanje (s tovarniško ponastavitvijo) vseh podatkov v tabličnem računalniku brez opozorila"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Brisanje (s tovarniško ponastavitvijo) vseh podatkov v telefonu brez opozorila"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Nastavitev globalnega strežnika proxy za napravo"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Nastavite globalni strežnik proxy naprave, ki bo v uporabi, ko je pravilnik omogočen. Samo skrbnik prve naprave lahko nastavi veljaven globalni strežnik proxy."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Nastavitev poteka gesla"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Nastavite, koliko časa prej je treba spremeniti geslo za odklepanje zaslona"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Začetna stran"</item>
     <item msgid="869923650527136615">"Mobilni"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Službeni pozivnik"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Pomočnik"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Po meri"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Rojstni dan"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Obletnica"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Dogodek"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Drugo"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Po meri"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Začetna stran"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Služba"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Služba"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Drugo"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Po meri"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Po meri"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Pomočnik"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Brat"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Otrok"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Domači partner"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Oče"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Prijatelj"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Vodja"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Mati"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Starši"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Predlagatelj:"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Sorodnik"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Sestra"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Zakonski partner"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Po meri"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Domov"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Služba"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Drugo"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Vnesite kodo PIN"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Vnesite geslo za odklop"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Vnesite PIN za odklepanje"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Nepravilna koda PIN."</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Če želite telefon odkleniti, pritisnite meni in nato 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Številka za klic v sili"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Nazaj na klic"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Pravilno."</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Poskusite znova"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Poskusite znova"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Polnjenje (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Napolnjeno."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Kartica SIM je zaklenjena."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Odklepanje kartice SIM ..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Vzorec za odklepanje ste nepravilno narisali <xliff:g id="NUMBER_0">%d</xliff:g>-krat. "\n\n"Poskusite znova čez <xliff:g id="NUMBER_1">%d</xliff:g> sekund."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%d</xliff:g>-krat nepravilno vnesli. Po še <xliff:g id="NUMBER_1">%d</xliff:g> neuspešnih poskusih boste pozvani, da odklenete telefon z Googlovimi podatki za prijavo."\n\n" Poskusite znova čez <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"<xliff:g id="NUMBER_0">%d</xliff:g>-krat ste vnesli napačno geslo. "\n\n"Poskusite znova čez <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"<xliff:g id="NUMBER_0">%d</xliff:g>-krat ste vnesli napačen PIN. "\n\n"Poskusite znova čez <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g>-krat ste narisali napačen vzorec za odklepanje. Če vam tudi v <xliff:g id="NUMBER_1">%d</xliff:g>. ne uspe, boste tablični računalnik morali odkleniti s podatki za prijavo v Google."\n\n" Poskusite znova čez <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Vzorec za odklepanje ste nepravilno vnesli <xliff:g id="NUMBER_0">%d</xliff:g>-krat. Po <xliff:g id="NUMBER_1">%d</xliff:g> neuspešnih poskusih boste pozvani, da odklenete telefon z Googlovimi podatki za prijavo."\n\n" Poskusite znova čez <xliff:g id="NUMBER_2">%d</xliff:g> sekund."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekund."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Ali ste pozabili vzorec?"</string>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Ali se želite premakniti s te strani?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Če želite nadaljevati, izberite V redu, če želite ostati na trenutni strani, izberite Prekliči."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Potrdi"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Namig: tapnite dvakrat, če želite povečati ali pomanjšati."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Samodejno izpolnjevanje"</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Samozapolni"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Nam. sam. izpoln."</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"branje zgodovine in zaznamkov brskalnika"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Programu dovoljuje branje vseh URL-jev, ki jih je brskalnik obiskal, in vseh brskalnikovih zaznamkov."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"pisanje zgodovine in zaznamkov brskalnika"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Programu dovoljuje spreminjanje zgodovine brskalnika ali zaznamkov, shranjenih v tabličnem računalniku. Zlonamerni programi lahko to uporabijo za brisanje ali spreminjanje podatkov brskalnika."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Programu omogoča spreminjanje brskalnikove zgodovine ali zaznamkov, shranjenih v tabličnem računalniku. Zlonamerni programi lahko s tem dovoljenjem izbrišejo ali spremenijo podatke brskalnika."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Programu dovoljuje spreminjanje zgodovine brskalnika ali zaznamkov, shranjenih v telefonu. Zlonamerni programi lahko to uporabijo za brisanje ali spreminjanje podatkov brskalnika."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"nastavitev alarma budilke"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Programu omogoča nastavitev alarma v nameščeni budilki. Nekatere budilke morda ne bodo uporabile te funkcije."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Spreminjanje dovoljenj za geolokacijo brskalnika"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Programu dovoljuje spreminjanje dovoljenja brskalnika za geografske lokacije. Zlonamerni programi lahko s tem dovoljenjem dovolijo pošiljanje podatkov o lokaciji poljubnim spletnim mestom."</string>
     <string name="save_password_message" msgid="767344687139195790">"Ali želite, da si brskalnik zapomni to geslo?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"Izreži"</string>
     <string name="copy" msgid="2681946229533511987">"Kopiraj"</string>
     <string name="paste" msgid="5629880836805036433">"Prilepi"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Ni elementov za lepljenje"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Kopiraj URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Izbiranje besedila ..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Izbrano besedilo"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Način vnosa"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Uredi besedilo"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Besedilna dejanja"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Zmanjkuje pomnilnika"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Primanjkuje pomnilnika tabličnega računalnika."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Pomanjkanje prostora v shrambi tabličnega računalnika."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Primanjkuje pomnilnika telefona."</string>
     <string name="ok" msgid="5970060430562524910">"V redu"</string>
     <string name="cancel" msgid="6442560571259935130">"Prekliči"</string>
     <string name="yes" msgid="5362982303337969312">"V redu"</string>
     <string name="no" msgid="5141531044935541497">"Prekliči"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Pozor"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Nalaganje ..."</string>
     <string name="capital_on" msgid="1544682755514494298">"VKLOPLJENO"</string>
     <string name="capital_off" msgid="6815870386972805832">"IZKLOPLJEN"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Dokončanje dejanja z"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Vsili zapiranje"</string>
     <string name="report" msgid="4060218260984795706">"Poročaj"</string>
     <string name="wait" msgid="7147118217226317732">"Čakaj"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Preusmeritev programa"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> se izvaja."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"Prvotno je bil zagnan program <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+    <string name="smv_application" msgid="295583804361236288">"Program <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) krši svoj samoizvedljivi pravilnik o strogem načinu."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> krši svoj samoizvedljivi pravilnik o strogem načinu."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> se izvaja"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Izberite za preklop na program"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Ali želite preklopiti program?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Preden zaženete nov program, ustavite izvajanega."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Vrni se na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Ne zaženite novega programa."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Začni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Ustavi prejšnji program brez shranjevanja."</string>
     <string name="sendText" msgid="5132506121645618310">"Izbiranje dejanja za besedilo"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Glasnost zvonjenja"</string>
     <string name="volume_music" msgid="5421651157138628171">"Glasnost predstavnosti"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Pokaži vse"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"Masovni pomnilnik USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Povezava USB je vzpostavljena"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Telefon ste z računalnikom povezali s kablom USB. Če želite kopirati datoteke med računalnikom in kartico SD sistema Android, izberite spodnji gumb."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Telefon ste z računalnikom povezali s kablom USB. Če želite kopirati datoteke med računalnikom in kartico SD sistema Android, izberite spodnji gumb."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Z računalnikom ste vzpostavili povezavo prek povezave USB. Dotaknite se gumba spodaj, če želite kopirati datoteke med računalnikom in pomnilnikom USB za Android."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Z računalnikom ste vzpostavili povezavo prek povezave USB. Dotaknite se gumba spodaj, če želite kopirati datoteke med računalnikom in kartico SD za Android."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Vklop shrambe USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Pri uporabi kartice SD za shrambo USB je prišlo do napake."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Pri uporabi kartice SD za shrambo USB je prišlo do napake."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Težava z uporabo pomnilnika USB kot masovni pomnilnik USB."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Težava z uporabo kartice SD kot masovni pomnilnik USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Povezava USB je vzpostavljena"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Izberite, če želite kopirati datoteke v/iz računalnika."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Izklopi shrambo USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Izberite, če želite izklopiti shrambo USB."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"Shramba USB je v uporabi"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Pred izklopom shrambe USB preverite, ali ste iz računalnika izpeli kartico SD sistema Android."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Preden izklopite pomnilnik USB, obvezno izpnite pomnilnik USB za Android iz računalnika."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Pred izklopom shrambe USB preverite, ali ste iz računalnika izpeli kartico SD sistema Android."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Izklopi shrambo USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Pri izklopu shrambe USB je prišlo do napake. Preverite, ali ste izpeli gostitelja USB, in poskusite znova."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Če vklopite shrambo USB, bodo nekateri programi, ki jih uporabljate, ustavljeni in morda ne bodo na voljo, dokler je ne izklopite."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Operacija USB ni uspela"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"V redu"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formatiraj kartico SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formatiranje pomnilnika USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Formatiraj kartico SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Ali ste prepričani, da želite formatirati kartico SD? Vsi podatki na kartici bodo izgubljeni."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Ali želite formatirati pomnilnik USB in izbrisati vse datoteke, shranjene na njem? Dejanje je dokončno."</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Ali ste prepričani, da želite formatirati kartico SD? Vsi podatki na kartici bodo izgubljeni."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatiraj"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"iskanje in odpravljanje napak USB je povezano"</string>
@@ -960,28 +897,28 @@
     <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>"kandidati"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Priprava kartice SD"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Pripravljanje pomnilnika USB"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Priprava kartice SD"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Iskanje napak."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Prazna kartica SD"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Prazen pomnilnik USB"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Prazna kartica SD"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Kartica SD je prazna ali ima nepodprt datotečni sistem."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Pomnilnik USB je prazen ali uporablja nepodprt datotečni sistem."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"Kartica SD je prazna ali ima nepodprt datotečni sistem."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Poškodovana kartica SD"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Pomnilnik USB je poškodovan"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Poškodovana kartica SD"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Kartica SD je poškodovana. Morda jo boste morali znova formatirati."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Pomnilnik USB je poškodovan. Morda ga boste morali formatirati."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Kartica SD je poškodovana. Morda jo boste morali znova formatirati."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Kartica SD je bila nepričakovano odstranjena"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Pomnilnik USB je bil nepričakovano odstranjen"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"Kartica SD je bila nepričakovano odstranjena"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Če se želite izogniti izgubi podatkov, pred odstranjevanjem izpnite kartico SD."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Pomnilnik USB najprej izpnite in šele nato odstranite, da ne pride do izgube podatkov."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Če se želite izogniti izgubi podatkov, pred odstranjevanjem izpnite kartico SD."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Kartico SD lahko varno odstranite"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Zdaj lahko varno odstranite pomnilnik USB"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"Kartico SD lahko varno odstranite"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Kartico SD lahko varno odstranite."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Zdaj lahko varno odstranite pomnilnik USB."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Kartico SD lahko varno odstranite."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Kartica SD je odstranjena"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Ni pomnilnika USB"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Kartica SD je odstranjena"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Kartica SD je odstranjena. Vstavite novo."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Pomnilnik USB je odstranjen. Vstavite drug nosilec podatkov."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"Kartica SD je odstranjena. Vstavite novo."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Ni bilo mogoče najti ujemajočih se dejavnosti"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"posodobitev statističnih podatkov uporabe komponent"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Pošlji"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Naprej"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Dokončano"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Nazaj"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Izvedi"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Pokliči številko"\n"s številko <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Ustvari stik"\n"s številko <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,62 +955,42 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"L2TP/IPSec VPN, ki temelji na ključu v vnaprejšnji skupni rabi"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN, ki temelji na potrdilu"</string>
     <string name="upload_file" msgid="2897957172366730416">"Izberi datoteko"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Nobena datoteka ni izbrana"</string>
     <string name="reset" msgid="2448168080964209908">"Ponastavi"</string>
     <string name="submit" msgid="1602335572089911941">"Pošlji"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Način delovanja za avtomobil je omogočen"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Izberite, če želite zapreti način za avtomobil."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Aktivna povezava z internetom ali dostopna točka sta aktivni"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Dotaknite se, če želite konfigurirati"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Nazaj"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Naprej"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Preskoči"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Velika uporaba podatkov v mobilni napravi"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Dotaknite se, če želite izvedeti več o uporabi podatkov v mobilni napravi."</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Omejitev za podatke v mobilni napravi je presežena"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Dotaknite se, če želite izvedeti več o uporabi podatkov v mobilni napravi."</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Ni ujemanj"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Najdi na strani"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 ujemanje"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Končano"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Izpenjanje pomnilnika USB ..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Izpenjanje kartice SD ..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Brisanje pomnilnika USB ..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Brisanje kartice SD ..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Brisanje pomnilnika USB ni uspelo."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Brisanje kartice SD ni uspelo."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"Kartica SD je bila odstranjena, preden je bila izpeta."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Trenutno poteka preverjanje pomnilnika USB."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"Poteka preverjanje kartice SD."</string>
+    <string name="media_removed" msgid="7001526905057952097">"Kartica SD je odstranjena."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Pomnilnik USB trenutno uporablja računalnik."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Kartico SD trenutno uporablja računalnik."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Neznano stanje zunanjih nosilcev podatkov."</string>
+    <string name="share" msgid="1778686618230011964">"Deli z dr."</string>
+    <string name="find" msgid="4808270900322985960">"Najdi"</string>
     <!-- no translation found for websearch (4337157977400211589) -->
     <skip />
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
@@ -1087,4 +1003,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 6eaf100..08ea8ed 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Гласовна пошта"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Проблеми са везом или неважећи MMI кôд."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Рад је ограничен само на бројеве фиксног бирања."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Услуга је омогућена."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Услуга је омогућена за:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Услуга је онемогућена."</string>
@@ -129,7 +128,7 @@
     <string name="low_memory" product="tablet" msgid="2292820184396262278">"Меморија таблета је пуна! Избришите неке датотеке да бисте ослободили простор."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"Складиште телефона је пуно! Избришите неке датотеке како бисте ослободили простор."</string>
     <string name="me" msgid="6545696007631404292">"Ја"</string>
-    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Опције таблета"</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>
@@ -139,11 +138,10 @@
     <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>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Желите ли да искључите телефон?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Недавно"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Нема недавно коришћених апликација."</string>
-    <string name="global_actions" product="tablet" msgid="408477140088053665">"Опције таблета"</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>
@@ -160,7 +158,7 @@
     <string name="permgrouplab_messages" msgid="7521249148445456662">"Поруке"</string>
     <string name="permgroupdesc_messages" msgid="7045736972019211994">"Читање и писање SMS порука, порука е-поште и осталих типова порука."</string>
     <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Личне информације"</string>
-    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Директан приступ контактима и календару сачуваним на таблету."</string>
+    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Директни приступ контактима и календарима сачуваним на таблету."</string>
     <string name="permgroupdesc_personalInfo" product="default" msgid="5488050357388806068">"Директни приступ контактима и календару сачуваним на телефону."</string>
     <string name="permgrouplab_location" msgid="635149742436692049">"Локација"</string>
     <string name="permgroupdesc_location" msgid="2430258821648348660">"Надгледа физичку локацију"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Алатке за програмирање"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Функције потребне само програмерима апликација."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Складиште"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Приступ SD картици."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Приступите USB меморији."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Приступ SD картици."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"онемогућавање или измена статусне траке"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Омогућава да апликација онемогући статусну траку или да додаје и уклања системске иконе."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"статусна трака"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Омогућава апликацији да функционише као статусна трака."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"проширење/скупљање статусне траке"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Омогућава да апликација прошири или скупи статусну траку."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"пресретање одлазних позива"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"слање SMS порука"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Омогућава да апликација шаље SMS поруке. Злонамерне апликације могу да шаљу поруке без ваше потврде, што ће вам створити трошкове."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"читање SMS или MMS порука"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Омогућава да апликација чита SMS поруке сачуване на таблету или SIM картици. Злонамерне апликације могу да читају поверљиве поруке."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Омогућава апликацији да чита SMS поруке сачуване на таблету или SIM картици. Злонамерне апликације могу да читају ваше поверљиве поруке."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Омогућава да апликација чита SMS поруке сачуване на телефону или SIM картици. Злонамерне апликације могу да читају поверљиву преписку."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"измена SMS или MMS порука"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Омогућава да апликација уписује податке у SMS поруке сачуване на таблету или SIM картици. Злонамерне апликације могу да избришу поруке."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Омогућава апликацији да мења садржај SMS порука сачуваних на таблету или SIM картици. Злонамерне апликације могу да избришу ваше поруке."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Омогућава да апликација уписује податке у SMS поруке сачуване на телефону или SIM картици. Злонамерне апликације могу да избришу поруке."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"пријем преко WAP-а"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Омогућава да апликација прима и обрађује WAP поруке. Злонамерне апликације могу да надгледају поруке или да их бришу, а да вам их не прикажу."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"спречавање пребацивања са једне апликације на другу"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Спречава корисника да се пребаци на другу апликацију."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"надгледање и контрола покретања свих апликација"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Омогућава да апликација надгледа и контролише на који начин систем покреће активности. Злонамерне апликације могу у потпуности да угрозе систем. Ова дозвола је потребна само за програмирање, а никада за уобичајено коришћење."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Омогућава апликацији да надгледа и контролише начин на који систем покреће активности. Злонамерне апликације могу у потпуности да угрозе систем. Ова дозвола је потребна само за развој, а никада за стандардно коришћење."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"слање емитовања уклоњеног пакета"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Омогућава да апликација емитује обавештење да је пакет апликација уклоњен. Злонамерне апликације могу на тај начин да искључе све друге покренуте апликације."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"слање емитовања примљених путем SMS порука"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"приказ неовлашћених прозора"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Омогућава прављење прозора који су осмишљени за коришћење у корисничком интерфејсу интерног система. Не користе је обичне апликације."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"приказ упозорења на нивоу система"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Омогућава да апликација прикаже прозоре са системским упозорењима. Злонамерне апликације на тај начин могу да преузму цео екран."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Омогућава апликацији да приказује прозоре са системским упозорењима. Злонамерне апликације могу да преузму цео екран."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"измена глобалне брзине анимација"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Омогућава да апликација у сваком тренутку промени глобалну брзину анимација (брже или спорије анимације)."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"управљање токенима апликација"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Омогућава да апликације праве сопствене токене и управљају њима, заобилазећи уобичајени распоред по Z оси. Обичне апликације никада не би требало да је користе."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"притисци на тастере и контролну дугмад"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Омогућава да апликација испоручи сопствене догађаје уноса (притисци тастера итд.) другим апликацијама. Злонамерне апликације на тај начин могу да преузму контролу над таблетом."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Омогућава апликацији да другим апликацијама испоручи сопствене улазне догађаје (притисак на тастере итд.). Злонамерне апликације на тај начин могу да преузму контролу над таблетом."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Омогућава да апликација испоручи сопствене догађаје уноса (притисци тастера итд.) другим апликацијама. Злонамерне апликације на тај начин могу да преузму контролу над телефоном."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"снимање садржаја који куцате и радњи које предузимате"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Омогућава да апликације виде које тастере притискате чак и док радите у некој другој апликацији (нпр. када уносите лозинку). Нормалне апликације никада не би требало да је користе."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"директно инсталирање апликација"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Омогућава да апликација инсталира нове или ажуриране пакете оперативног система Android. Злонамерне апликације на тај начин могу да додају нове апликације са потенцијално моћним дозволама."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"брисање свих података из кеша апликације"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Омогућава да апликација ослободи меморију таблета брисањем датотека у каталогу кеша апликације. Приступ је обично строго ограничен само на системски процес."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Омогућава апликацији да ослободи меморију таблета брисањем датотека у директоријуму кеша апликације. Приступ је обично строго ограничен само на системске процесе."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Омогућава да апликација приступи бесплатном складишту телефона брисањем датотека у директоријуму кеша апликације. Приступ је обично строго ограничен само за системски процес."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Премештање ресурса апликације"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Омогућава да апликација премести ресурсе апликације са интерног на екстерни медијум и обратно."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"читање системских датотека евиденције"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Омогућава да апликација чита разне системске датотеке евиденције. То јој омогућава увид у опште информације о начину на који користите таблет, при чему могу да буду обухваћене личне или приватне информације."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Омогућава да апликација чита разне системске датотеке евиденције. То јој омогућава увид у опште информације о начину на који користите таблет, при чему могу да буду обухваћене личне или приватне информације."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"читање поверљивих података из евиденције"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Омогућава апликацији да чита разноврсне датотеке евиденције система. Захваљујући томе може да открије опште информације о томе за шта користите таблет, укључујући евентуално и личне или приватне информације."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Омогућава апликацији да чита разноврсне датотеке евиденције система. Захваљујући томе може да открије опште информације о томе за шта користите телефон, укључујући евентуално и личне или приватне информације."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"читање ресурса у власништву дијагностике и уписивање података у њих"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Омогућава да апликација чита и уписује податке у било који ресурс у власништву групе за дијагностиковање, на пример, датотеке у /dev. То може да угрози стабилност и безбедност система и треба да је користе САМО произвођач или оператер у сврхе дијагностиковање хардвера."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"омогућавање или онемогућавање компоненти апликација"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Омогућава да апликација промени да ли је компонента друге апликације омогућена или онемогућена. Злонамерне апликације могу то да искористе да онемогуће важне функције таблета. Треба бити опрезан при додељивању ове дозволе, јер компоненте апликација могу постати неупотребљиве, непоуздане или нестабилне."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Омогућава да апликација промени да ли је компонента друге апликације омогућена или онемогућена. Злонамерне апликације могу то да искористе да онемогуће важне функције таблета. Треба бити опрезан при додељивању ове дозволе, јер компоненте апликација могу постати неупотребљиве, непоуздане или нестабилне."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Омогућава апликацији да омогући или онемогући компоненту друге апликације. Злонамерне апликације то могу да злоупотребе и онемогуће важне функције таблета. Треба бити пажљив при додели ове дозволе јер постоји могућност да ће компоненте апликације постати неупотребљиве, неусаглашене или непостојане."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Омогућава апликацији да омогући или онемогући компоненту друге апликације. Злонамерне апликације то могу да злоупотребе и онемогуће важне функције телефона. Треба бити пажљив при додели ове дозволе јер постоји могућност да ће компоненте апликације постати неупотребљиве, неусаглашене или непостојане."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"подешавање жељених апликација"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Омогућава да апликација измени омиљене апликације. Услед тога злонамерне апликације могу кришом да промене апликације које су покренуте и да преко њих прикупљају ваше приватне податке."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"измена глобалних подешавања система"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"измена мапе Google услуга"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Омогућава да апликација измени мапу Google услуга. Не користе је обичне апликације."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"аутоматско покретање при покретању система"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Омогућава да се апликација покрене по довршетку покретања система. То може да успори укључивање таблета, при чему ова апликација може да успори целокупан рад таблета тиме што ће увек бити активна."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Омогућава апликацији да се покрене истовремено са системом. То може да услови спорије покретање таблета и омогући апликацији да успори целокупан рад уређаја тиме што ће увек бити активна."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Омогућава да се апликација покрене по довршетку покретања система. То може да успори укључивање телефона, при чему ова апликација може да успори целокупан рад телефона тиме што ће увек бити активна."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"слање пријемчивих емитовања"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Омогућава да апликација шаље пријемчиве преносе, који остају по завршетку емитовања. Злонамерне апликације могу да успоре или дестабилизују таблет тиме што ће трошити превише меморије."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Омогућава апликацији да шаље пријемчива емитовања, која остају и по завршетку емитовања. Злонамерне апликације могу да успоре таблет или да га учине нестабилним тиме што ће користити превише меморије."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Омогућава да апликација шаље пријемчиве преносе, који остају по завршетку емитовања. Злонамерне апликације на тај начин могу да успоравају и дестабилизују телефон тиме што ће трошити превише меморије."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"читање података о контактима"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Омогућава да апликација чита све податке о контактима (адресама) сачуване на таблету. Злонамерне апликације могу то да искористе за слање података другим особама."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Омогућава апликацији да чита све податке о контактима (адресама) сачуване на таблету. Злонамерне апликације то могу да злоупотребе и пошаљу ваше податке другим особама."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Омогућава да апликација чита све податке о контактима (адресама) сачуване на телефону. Злонамерне апликације могу то да искористе за слање ваших података другим особама."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"уписивање података о контактима"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Омогућава да апликација измени податке о контакту (адреси) сачуване на таблету. Злонамерне апликације могу то да искористе да би избрисале или измениле податке о контакту."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Омогућава апликацији да измени податке о контакту (адресу) сачуване на таблету. Злонамерне апликације на тај начин могу да избришу или измене податке о контакту."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Омогућава да апликација измени податке о контакту (адреси) сачуване на телефону. Злонамерне апликације могу то да злоупотребе и да избришу или измене податке о контакту."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"читање догађаја из календара"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Омогућава да апликација чита све догађаје из календара сачуване на таблету. Злонамерне апликације могу то да искористе за слање догађаја из календара другим људима."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Омогућава апликацији да чита све догађаје из календара сачуване на таблету. Злонамерне апликације то могу да злоупотребе и пошаљу ваше догађаје из календара другим особама."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Омогућава да апликација чита све догађаје из календара сачуване на телефону. Злонамерне апликације могу то да злоупотребе и искористе за слање догађаја из календара другим људима."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"додавање и измена догађаја из календара и слање порука е-поште гостима"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Омогућава да апликација додаје или мења догађаје у календару, услед чега гостима могу да се шаљу поруке е-поште. Злонамерне апликације могу на основу тога да избришу или измене догађаје из календара или да шаљу поруке е-поште гостима."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"дозвола за инсталирање добављача локације"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Прави лажне изворе локације у сврхе тестирања. Злонамерне апликације могу на основу тога да замене локацију и/или статус који пријављују прави извори локација, као што су GPS или добављачи мреже, односно да надгледају и пријављују локацију спољном извору."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"прецизна (GPS) локација"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Приступ изворима прецизне локације, као што је систем глобалног позиционирања на таблету, уколико је то доступно. Злонамерне апликације могу на основу тога да утврде вашу локацију и додатно троше батерију."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Приступ прецизним изворима информација, као што је глобални систем за позиционирање (Global Positioning System – GPS) на таблету, када су доступни. Злонамерне апликације то могу да злоупотребе како би утврдиле вашу локацију и на тај начин потроше додатно напајање батерије."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Приступ изворима прецизне локације, као што је систем глобалног позиционирања на телефону, уколико је то доступно. Злонамерне апликације могу на основу тога да утврде вашу локацију и да додатно троше батерију."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"оквирна локација (заснована на мрежи)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Приступ изворима оквирне локације, као што је база података мобилне мреже, ради утврђивања приближне локације таблета, уколико је то доступно. Злонамерне апликације могу на основу тога да утврде вашу приближну локацију."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Приступ непрецизним изворима локација, попут базе података мреже мобилне телефоније, ради одређивања приближне локације таблета, у случају да су доступни. Злонамерне апликације на тај начин могу да утврде вашу приближну локацију."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Приступ изворима оквирне локације, као што је база података мобилне мреже ради утврђивања приближне локације телефона, уколико је то доступно. Злонамерне апликације могу то да искористе за утврђивање ваше приближне локације."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"приступ функцији SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Омогућава да апликација користи SurfaceFlinger функције ниског нивоа."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Омогућава да апликација измени глобалне поставке за аудио записе, попут јачине звука и усмеравања."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"снимање аудио записа"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Омогућава да апликација приступи путањи аудио записа."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"снимање фотографија"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Омогућава да апликација снима фотографије помоћу камере. То омогућава да апликација у сваком тренутку прикупља слике које су у кадру."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"снимање фотографија и видео снимака"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Омогућава апликацији да снима фотографије и видео снимке преко камере. Захваљујући томе апликација може у сваком тренутку да прикупи слике приказане у склопу камере."</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="7379164636920817963">"Омогућава да апликација трајно онемогући цео таблет. Ово је веома опасно."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Омогућава апликацији да трајно онемогући цео таблет, што је веома опасно."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Омогућава да апликација трајно онемогући цео телефон. То је веома опасно."</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="4555793623560701557">"Омогућава да апликација принудно поновно покрене таблет."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Омогућава апликацији да принудно поново покрене таблет."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Омогућава да апликација принудно поновно покрене телефон."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"прикључивање и искључивање система датотека"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Омогућава да апликација прикључи и искључи системе датотека преносивог складишта."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"форматирање екстерног складишта"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Омогућава да апликација форматира преносиво складиште."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"преузимање информација у безбедно складиште"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Омогућава да апликација преузме информације о безбедном складишту."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"прављење безбедног складишта"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Омогућава да апликација направи безбедно складиште."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"уништавање безбедног складишта"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Омогућава да апликација уништи безбедно складиште."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"прикључивање/искључивање безбедног складишта"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Омогућава да апликација прикључи/искључи безбедно складиште."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"преименовање безбедног складишта"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Омогућава да апликација преименује безбедно складиште."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"увид у информације о интерној меморији"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Омогућава апликацији увид у информације о интерној меморији."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"прављење интерне меморије"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Омогућава апликацији да направи интерну меморију."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"уништавање интерне меморије"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Омогућава апликацији да уништи интерну меморију."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"прикључивање/искључивање интерне меморије"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Омогућава апликацији да прикључи/искључи интерну меморију."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"преименовање интерне меморије"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Омогућава апликацији да преименује интерну меморију."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"контрола вибрације"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Омогућава да апликација контролише вибрације."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"контрола осветљења"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Омогућава да апликација контролише осветљење."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"приступ USB уређајима"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Омогућава апликацији приступ USB уређајима."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"тестирање хардвера"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Омогућава да апликација контролише разноврсне периферне уређаје у сврхе тестирања хардвера."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"директно позивање бројева телефона"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Омогућава да апликација позива бројеве телефона не тражећи дозволу од вас. Злонамерне апликације на тај начин могу да задуже ваш телефонски рачун упућивањем непланираних позива. Имајте у виду да се апликацијама тиме не омогућава позивање бројева за хитне случајеве."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"директно позивање било ког броја телефона"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Омогућава да апликација позове било који број телефона, укључујући бројеве за хитне случајеве, не тражећи дозволу од вас. Злонамерне апликације на тај начин могу да упућују непотребне и забрањене позиве услугама за хитне случајеве."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"директно покретање подешавања CDMA таблета"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"директно покретање подешавања кодираног вишеструког приступа за таблет (Code Division Multiple Access – CDMA)"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"директно покретање подешавања CDMA телефона"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Омогућава да апликација покрене прибављање кодираног вишеструког приступа (CDMA). Злонамерне апликације могу без стварне потребе да покрену овај поступак."</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"контрола обавештења о ажурирању локације"</string>
@@ -387,14 +381,14 @@
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Омогућава да апликација приступа функцијама телефона које уређај подржава. Ова дозвола омогућава да апликација утврди број телефона и серијски број телефона, те да ли је позив активан, са којим бројем је успостављена веза и слично."</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="4032181488045338551">"Омогућава да апликација спречи прелазак таблета у стање спавања."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Омогућава апликацији да спречи таблет да пређе у стање спавања."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Омогућава да апликација спречи прелазак телефона у стање спавања."</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="3853773100100451905">"Омогућава да апликација укључи или искључи таблет."</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Омогућава апликацији да укључи или искључи таблет."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Омогућава да апликација укључи и искључи телефон."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"покретање у режиму фабричког тестирања"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Покретање теста ниског нивоа који спроводи произвођач, који омогућава потпуни приступ хардверу таблета. Доступан је само када је таблет покренут у режиму тестирања које спроводи произвођач."</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="6417041752170585837">"Омогућава да апликација постави системску позадину."</string>
@@ -403,15 +397,15 @@
     <string name="permlab_masterClear" msgid="2315750423139697397">"поновно постављање фабричких подразумеваних подешавања"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Омогућава да апликација поново постави комплетна фабричка подешавања система и тиме избрише све податке, конфигурацију и инсталиране апликације."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"подешавање времена"</string>
-    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Омогућава да апликација промени време на сату таблета."</string>
+    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Омогућава апликацији да промени време приказано на сату таблета."</string>
     <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Омогућава да апликација промени време на сату телефона."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"подешавање временске зоне"</string>
-    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Омогућава да апликација промени временску зону таблета."</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Омогућава апликацији да промени временску зону таблета."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Омогућава да апликација промени временску зону телефона."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"улога услуге управљања налогом"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Омогућава да апликација упућује позиве особама које издају потврду идентитета налога"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"откривање познатих налога"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Омогућава да апликација преузме листу налога за које постоје подаци на таблету."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Омогућава апликацији да преузме листу налога познатих таблету."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Омогућава да апликација преузме листу налога за које постоје подаци на телефону."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"улога потврде идентитета налога"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Омогућава да апликација користи могућности менаџера налога за потврду идентитета налога, укључујући отварање налога, као и преузимање и подешавање лозинки за њих."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"омогућавање пријема вишесмерног Wi-Fi саобраћаја"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Омогућава да апликација прима пакете који нису директно намењени вашем уређају. То може бити корисно при откривању услуга које се нуде у вашој близини. Користи више напајања од режима једносмерног саобраћаја."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"администрирање преко bluetooth-а"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Омогућава да апликација конфигурише локални Bluetooth таблет, као и да открије удаљене уређаје и упари се са њима."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Омогућава апликацији да конфигурише локални Bluetooth таблет, као и да открије даљинске уређаје и упари се са њима."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Омогућава да апликација конфигурише локални Bluetooth телефон, као и да открије удаљене уређаје и упари се са њима."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"креирање Bluetooth веза"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Омогућава да апликација види конфигурацију локалног Bluetooth таблета, као и да успоставља и прихвата везе са упареним уређајима."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Омогућава апликацији увид у конфигурацију локалног Bluetooth таблета, као и да успоставља и прихвата везе са упареним уређајима."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Омогућава да апликација види конфигурацију локалног Bluetooth телефона, као и да успоставља и прихвата везе са упареним уређајима."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"контрола комуникације у ужем пољу (Near Field Communication)"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Омогућава апликацији да комуницира са ознакама, картицама и читачима комуникације у ужем пољу (Near Field Communication – NFC)."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"онемогућавање закључавања тастатуре"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Омогућава да апликација онемогући закључавање тастатуре и свих безбедносних мера успостављених на основу лозинке. У оправдане примере додељивања такве дозволе спада онемогућавање закључавања тастатуре при пријему долазећег телефонског позива и поновно омогућавање тастатуре по његовом завршетку."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"читање подешавања синхронизације"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Омогућава да апликација чита све приватне речи, називе и фразе које је корисник сачувао у корисничком речнику."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"уписивање у речник који је корисник дефинисао"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Омогућава да апликација уписује нове речи у речник корисника."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"измена/брисање садржаја SD картице"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"измена/брисање садржаја USB меморије"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"измена/брисање садржаја SD картице"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Омогућава да апликација уписује податке на SD картицу."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Омогућава апликацији да уписује податке у USB меморију."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Омогућава да апликација уписује податке на SD картицу."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"измена/брисање интерне меморије медија"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Омогућава апликацији да мења садржај интерне медијске меморије."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"приступ систему датотека кеша"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Омогућава да апликација чита систем датотека кеша и уписује податке у њега."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Ограничење за лозинку"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Ограничава врсте лозинки које можете да користите."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Надгледање покушаја пријављивања"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Надгледање броја унетих нетачних лозинки приликом откључавања екрана и закључавање таблета или брисање свих података са њега уколико је унет превелики број нетачних лозинки"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Надгледање броја унетих нетачних лозинки приликом откључавања екрана и закључавање таблета или брисање свих података са њега уколико је унет превелики број нетачних лозинки"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Поновно постављање лозинке"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Принудна промена вредности лозинке, након чега ћете морати да затражите од администратора да вам је додели како бисте могли да се пријавите."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Принудно закључавање"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Контролисање закључавања телефона које захтева поновни унос лозинке."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"упућивање/пријем Интернет позива"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Омогућава апликацији да користи SIP услугу за упућивање/пријем Интернет позива."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Подешавање правила за лозинку"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Контрола дужине и знакова дозвољених у лозинкама за откључавање лозинки"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Надгледање покушаја откључавања екрана"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Надгледање броја нетачних лозинки унетих приликом откључавања екрана и закључавање таблета или брисање свих података на њему ако је превише пута унета нетачна лозинка"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Надгледање броја нетачних лозинки унетих приликом откључавања екрана и закључавање телефона или брисање свих података на њему ако је превише пута унета нетачна лозинка"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Промена лозинке за откључавање екрана"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Промена лозинке за откључавање екрана"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Закључавање екрана"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Контрола начина и времена закључавања екрана"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Брисање свих података"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Брисање података са таблета без упозорења враћањем фабричких података"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Брисање података са таблета без упозорења враћањем фабричких података"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Брисање података на таблету без упозорења враћањем фабричких података"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Брисање података на телефону без упозорења враћањем фабричких података"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Подесите глобални прокси сервер уређаја"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Подесите глобални прокси сервер уређаја који ће се користити док су омогућене смернице. Само први администратор уређаја поставља ефективни глобални прокси сервер."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Подеси време истека лозинке"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Контролишите време када лозинка за закључавање екрана треба да се промени"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Кућа"</item>
     <item msgid="869923650527136615">"Мобилни"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Пословни пејџер"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Помоћник"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Прилагођено"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Рођендан"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Годишњица"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Догађај"</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>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Посао"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Друго"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Прилагођено"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <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="3731488827218876115">"Унесите PIN кôд"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Унесите лозинку за откључавање"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Унесите PIN да бисте откључали тастатуру"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN кôд је нетачан!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Да бисте откључали, притисните „Мени“, а затим 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Број за хитне случајеве"</string>
@@ -646,14 +609,13 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Назад на позив"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Тачно!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Жао нам је, покушајте поново"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Покушајте поново"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Пуњење (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Батерија је напуњена."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<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="7381499217732227295">"Нема SIM картице."</string>
-    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"У таблет није уметнута 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="8874620818937719067">"Уметните SIM картицу."</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"Само хитни позиви"</string>
@@ -663,11 +625,9 @@
     <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="3514742106066877476">"<xliff:g id="NUMBER_0">%d</xliff:g> пута сте нетачно унели шаблон за откључавање. "\n\n"Покушајте поново за <xliff:g id="NUMBER_1">%d</xliff:g> секунде(и)."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"<xliff:g id="NUMBER_0">%d</xliff:g> пута сте нетачно унели шаблон за откључавање. Након још "\n" неуспешна покушаја, од вас ће бити затражено да откључате таблет помоћу података за пријављивање на Google.<xliff:g id="NUMBER_2">%d</xliff:g><xliff:g id="NUMBER_1">%d</xliff:g>Покушајте поново за "\n" секунде(и)."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Унели сте нетачну лозинку <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="6827749231465145590">"Унели сте нетачни 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="8687762517114904651">"<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="3351013842320127827">"<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_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>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Желите ли да напустите ову страницу?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Изаберите „Потврди“ ако желите да наставите или „Откажи“ да бисте остали на страници на којој сте тренутно."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Потврда"</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Савет: Додирните двапут да бисте увећали и умањили приказ."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Аут. поп."</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Аутоматски попуни"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Подеси аут. поп."</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"читање историје и обележивача у прегледачу"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Омогућава да апликација чита све URL адресе које су посећене у прегледачу, као и све обележиваче у њему."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"уписивање историје и обележивача из прегледача"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Омогућава да апликација измени историју или обележиваче прегледача сачуване на таблету. Злонамерне апликације могу то да искористе да би избрисале или измениле податке у прегледачу."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Омогућава апликацији да измени историју или обележиваче у прегледачу сачуване на таблету. Злонамерне апликације на тај начин могу да избришу или измене податке у прегледачу."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Омогућава да апликација измени историју и обележиваче у прегледачу сачуване на телефону. Злонамерне апликације могу то да злоупотребе и да избришу или измене податке у прегледачу."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"подешавање аларма у будилнику"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Дозвољава да апликација подеси аларм у инсталираној апликацији будилника. Неке апликације будилника можда не примењују ову функцију."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Измена дозвола за географске локације прегледача"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Омогућава да апликација измени дозволе за утврђивање географске локације у прегледачу. Злонамерне апликације то могу да злоупотребе и искористе за слање информација о локацији насумичним веб сајтовима."</string>
     <string name="save_password_message" msgid="767344687139195790">"Желите ли да прегледач запамти ову лозинку?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"Исеци"</string>
     <string name="copy" msgid="2681946229533511987">"Копирај"</string>
     <string name="paste" msgid="5629880836805036433">"Налепи"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Ништа није копирано"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Копирај URL адресу"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Изабери текст..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Избор текста"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Метод уноса"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Измени текст"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Радње у вези са текстом"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Мало простора"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Понестаје простора за складиштење на таблету."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Меморијски простор таблета је скоро попуњен."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Понестаје простора за складиштење на телефону."</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>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Учитавање..."</string>
     <string name="capital_on" msgid="1544682755514494298">"УКЉУЧЕНО"</string>
     <string name="capital_off" msgid="6815870386972805832">"ИСКЉУЧЕНО"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Довршавање радње помоћу"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Принудно затвори"</string>
     <string name="report" msgid="4060218260984795706">"Пријави"</string>
     <string name="wait" msgid="7147118217226317732">"Сачекај"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Апликација је преусмерена"</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="smv_application" msgid="295583804361236288">"Апликација <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="heavy_weight_notification" msgid="9087063985776626166">"Апликација <xliff:g id="APP">%1$s</xliff:g> је покренута"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Пребаците се на апликацију"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Желите ли да се пребаците са једне апликације на другу?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Већ је покренута друга апликација која мора бити заустављена да бисте могли да покренете нову."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Врати се у <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Не покрећи нову апликацију."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Покрени <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Заустави стару апликацију без чувања."</string>
     <string name="sendText" msgid="5132506121645618310">"Избор радње за слање текста"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Јачина звука звона"</string>
     <string name="volume_music" msgid="5421651157138628171">"Јачина звука медија"</string>
@@ -923,7 +860,7 @@
     <string name="sms_control_yes" msgid="2532062172402615953">"Потврди"</string>
     <string name="sms_control_no" msgid="1715320703137199869">"Откажи"</string>
     <string name="time_picker_dialog_title" msgid="8349362623068819295">"Подешавање времена"</string>
-    <string name="date_picker_dialog_title" msgid="5879450659453782278">"Подеси датум"</string>
+    <string name="date_picker_dialog_title" msgid="5879450659453782278">"Подешавање датума"</string>
     <string name="date_time_set" msgid="5777075614321087758">"Подеси"</string>
     <string name="default_permission_group" msgid="2690160991405646128">"Подразумевано"</string>
     <string name="no_permissions" msgid="7283357728219338112">"Није потребна ниједна дозвола"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Прикажи све"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB великог капацитета"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB је повезан"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Повезали сте телефон са рачунаром преко USB порта. Кликните на дугме у наставку ако желите да копирате датотеке са рачунара на SD картицу оперативног система Android и обратно."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Повезали сте телефон са рачунаром преко USB порта. Кликните на дугме у наставку ако желите да копирате датотеке са рачунара на SD картицу оперативног система Android и обратно."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Повезали сте рачунар преко USB-а. Додирните дугме испод ако желите да копирате датотеке са рачунара у Android USB меморију и обрнуто."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Ако сте свој рачунар повезали преко USB-а. Додирните дугме испод ако желите да копирате датотеке између датотеке између свог рачунара и Android SD картице."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Укључи USB меморију"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Дошло је до проблема у коришћењу SD картице за USB складиште."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Дошло је до проблема у коришћењу SD картице за USB складиште."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Дошло је до проблема приликом коришћења USB меморије за USB масовно меморисање."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Дошло је до проблема приликом коришћења SD картице за USB масовно меморисање."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB је повезан"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Изаберите да бисте копирали датотеке са рачунара или на њега."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Искључивање USB складиште"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Изаберите да бисте искључили USB складиште."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"USB складиште је у употреби"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Пре него што искључите USB складиште, уверите се да сте из рачунара уклонили („избацили“) SD картицу оперативног система Android."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Пре него што искључите USB меморију, уверите се да сте на рачунару искључили („избацили“) Android USB меморију."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Пре него што искључите USB складиште, уверите се да сте из рачунара уклонили („избацили“) SD картицу оперативног система Android."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Искључи USB складиште"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Дошло је до проблема приликом искључивања USB складишта. Уверите се да сте уклонили USB хост, а затим покушајте поново."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Ако укључите USB складиште, поједине апликације које користите престаће да раде и могу да постану недоступне док га поново не укључите."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Грешка са USB складиштем"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"Потврди"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Форматирање SD картице"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Форматирање USB меморије"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Форматирање SD картице"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Желите ли заиста да форматирате SD картицу? Сви подаци сачувани на њој биће избрисани."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Желите да форматирате USB меморију и избришете све датотеке у њој? Ову радњу није могуће опозвати!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Желите ли заиста да форматирате SD картицу? Сви подаци сачувани на њој биће избрисани."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Формат"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Отклањање грешака са USB-а је успостављено"</string>
@@ -960,28 +897,28 @@
     <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>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Припрема SD картице"</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>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Празна SD картица"</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>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"SD картица је празна или садржи систем датотека који није подржан."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"USB меморија је празна или садржи неподржани систем датотека."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"SD картица је празна или садржи систем датотека који није подржан."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Оштећена 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>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"SD картица је оштећена. Можда ћете морати поново да је форматирате."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"USB меморија је оштећена. Можда ћете морати да је поново форматирате."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"SD картица је оштећена. Можда ћете морати поново да је форматирате."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"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>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Искључите 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>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"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>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Можете безбедно да уклоните 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>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"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>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"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="4168820609403385789">"Није пронађена ниједна подударна активност"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"ажурирање статистике о коришћењу компоненти"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Пошаљи"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Следеће"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Готово"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Претходно"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Изврши"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Бирај број"\n"користећи <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Креирајте контакт"\n"користећи <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Унапред дељени кључ заснован на протоколу L2TP/IPSec за VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Сертификат заснован на протоколу L2TP/IPSec за VPN"</string>
     <string name="upload_file" msgid="2897957172366730416">"Одабери датотеку"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <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="668663626721675614">"Изаберите да бисте изашли из режима рада у аутомобилу."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Активно повезивање са Интернетом преко мобилног уређаја или врућа тачка"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Додирните да бисте конфигурисали"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Назад"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Next"</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="2609734763845705708">"Додирните да бисте сазнали више о коришћењу података са мобилног уређаја"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Прекорачено је ограничење преноса података за мобилне уређаје"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Додирните да бисте сазнали више о коришћењу података са мобилног уређаја"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <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="INDEX">%d</xliff:g> од <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Done"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Искључивање USB меморије..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"У току је искључивање SD картице..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Брисање USB меморије је у току..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Брисање SD картице је у току..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Брисање USB меморије није успело."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Брисање 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">"SD картица се тренутно користи на рачунару."</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>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index fb00acf..e4c3eb8 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Externa media i okänt tillstånd."</string>
     <string name="share" msgid="1778686618230011964">"Dela"</string>
     <string name="find" msgid="4808270900322985960">"Sök efter"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Webbsökning"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 4a7a632..418c104 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"ข้อความเสียง"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"ปัญหาการเชื่อมต่อหรือรหัส MMI ไม่ถูกต้อง"</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"การดำเนินการถูกจำกัดไว้ที่การจำกัดหมายเลขโทรออกเท่านั้น"</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"เปิดใช้งานบริการแล้ว"</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"เปิดการใช้งานบริการสำหรับ:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"ปิดใช้งานบริการไว้"</string>
@@ -126,7 +125,7 @@
     <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="2292820184396262278">"ที่เก็บข้อมูลแท็บเล็ตเต็ม! ลบบางไฟล์เพื่อเพิ่มที่ว่าง"</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"ที่เก็บข้อมูลของแท็บเล็ตเต็ม โปรดลบไฟล์บางไฟล์เพื่อเพิ่มพื้นที่ว่าง"</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"ที่เก็บข้อมูลโทรศัพท์เต็ม! ลบบางไฟล์เพื่อเพิ่มที่ว่าง"</string>
     <string name="me" msgid="6545696007631404292">"ฉัน"</string>
     <string name="power_dialog" product="tablet" msgid="8545351420865202853">"ตัวเลือกของแท็บเล็ต"</string>
@@ -137,10 +136,9 @@
     <string name="screen_lock" msgid="799094655496098153">"ล็อกหน้าจอ"</string>
     <string name="power_off" msgid="4266614107412865048">"ปิดเครื่อง"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"กำลังปิดระบบ..."</string>
-    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"แท็บเล็ตของคุณจะปิดเครื่อง"</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"แท็บเล็ตของคุณจะปิดการทำงาน"</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"โทรศัพท์ของคุณจะปิดเครื่อง"</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"คุณต้องการปิดการทำงานหรือไม่"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"เมื่อเร็วๆ นี้"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"ไม่มีแอปพลิเคชันล่าสุด"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"ตัวเลือกของแท็บเล็ต"</string>
@@ -160,7 +158,7 @@
     <string name="permgrouplab_messages" msgid="7521249148445456662">"ข้อความของคุณ"</string>
     <string name="permgroupdesc_messages" msgid="7045736972019211994">"อ่านและเขียน SMS อีเมล และข้อความอื่นๆ ของคุณ"</string>
     <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"ข้อมูลส่วนบุคคลของคุณ"</string>
-    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"เข้าถึงที่อยู่ติดต่อและปฏิทินของที่จัดเก็บบนแท็บเล็ตโดยตรง"</string>
+    <string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"การเข้าถึงสมุดโทรศัพท์และปฏิทินที่จัดเก็บอยู่บนแท็บเล็ตโดยตรง"</string>
     <string name="permgroupdesc_personalInfo" product="default" msgid="5488050357388806068">"เข้าถึงที่อยู่ติดต่อและปฏิทินของที่จัดเก็บบนโทรศัพท์โดยตรง"</string>
     <string name="permgrouplab_location" msgid="635149742436692049">"ตำแหน่งของคุณ"</string>
     <string name="permgroupdesc_location" msgid="2430258821648348660">"ตรวจดูตำแหน่งทางกายภาพของคุณ"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"เครื่องมือในการพัฒนา"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"คุณลักษณะที่จำเป็นสำหรับผู้พัฒนาแอปพลิเคชันเท่านั้น"</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"พื้นที่เก็บข้อมูล"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"เข้าถึงการ์ด SD"</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"เข้าถึงที่เก็บข้อมูล USB"</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"เข้าถึงการ์ด SD"</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"ปิดการใช้งานหรือแก้ไขแถบสถานะ"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"อนุญาตให้แอปพลิเคชันปิดการใช้งานแถบสถานะหรือเพิ่มและนำไอคอนระบบออก"</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"แถบสถานะ"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"อนุญาตให้แอปพลิเคชันเป็นแถบสถานะ"</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"ขยาย/ยุบแถบสถานะ"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"อนุญาตให้แอปพลิเคชันขยายหรือยุบแถบสถานะ"</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"ดักสายโทรออก"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"ส่งข้อความ SMS"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"อนุญาตให้แอปพลิเคชันส่งข้อความ SMS แอปพลิเคชันที่เป็นอันตรายอาจทำให้คุณเสียค่าใช้จ่ายโดยการส่งข้อความโดยไม่ขอการยืนยันจากคุณ"</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"อ่าน SMS หรือ MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"อนุญาตให้แอปพลิเคชันอ่านข้อความ SMS ที่จัดเก็บในแท็บเล็ตหรือซิมการ์ดของคุณ แอปพลิเคชันที่เป็นอันตรายอาจอ่านข้อความลับของคุณได้"</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"อนุญาตให้แอปพลิเคชันอ่านข้อความ SMS ที่จัดเก็บอยู่บนแท็บเล็ตหรือซิมการ์ดของคุณ แอปพลิเคชันที่เป็นอันตรายอาจอ่านข้อความที่เป็นความลับของคุณได้"</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"อนุญาตให้แอปพลิเคชันอ่านข้อความ SMS ที่จัดเก็บในโทรศัพท์หรือซิมการ์ดของคุณ แอปพลิเคชันที่เป็นอันตรายอาจอ่านข้อความลับของคุณได้"</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"แก้ไข SMS หรือ MMS"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"อนุญาตให้แอปพลิเคชันเขียนลงบนข้อความ SMS ที่จัดเก็บในแท็บเล็ตหรือซิมการ์ดของคุณ แอปพลิเคชันที่เป็นอันตรายอาจลบข้อความของคุณได้"</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"อนุญาตให้แอปพลิเคชันเขียนไปยังข้อความ SMS ที่จัดเก็บอยู่บนแท็บเล็ตหรือซิมการ์ดของคุณ แอปพลิเคชันที่เป็นอันตรายอาจลบข้อความของคุณได้"</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"อนุญาตให้แอปพลิเคชันเขียนลงบนข้อความ SMS ที่จัดเก็บในโทรศัพท์หรือซิมการ์ดของคุณ แอปพลิเคชันที่เป็นอันตรายอาจลบข้อความของคุณได้"</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"ได้รับ WAP"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"อนุญาตให้แอปพลิเคชันรับและประมวลผลข้อความ WAP แอปพลิเคชันที่เป็นอันตรายอาจตรวจสอบหรือลบข้อความของคุณโดยไม่แสดงให้คุณเห็น"</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"ป้องกันการเปลี่ยนแอปพลิเคชัน"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"ป้องกันไม่ให้ผู้ใช้เปลี่ยนไปที่แอปพลิเคชันอื่น"</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"ตรวจดูและควบคุมการเริ่มใช้งานแอปพลิเคชันทั้งหมด"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"อนุญาตให้แอปพลิเคชันตรวจดูและควบคุมวิธีเรียกใช้งานกิจกรรมต่างๆ ของระบบ แอปพลิเคชันที่เป็นอันตรายอาจทำให้ระบบอยู่ในความเสี่ยง การอนุญาตนี้จำเป็นสำหรับการพัฒนาเท่านั้น ไม่ใช่สำหรับการใช้งานทั่วไป"</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"อนุญาตให้แอปพลิเคชันตรวจสอบและควบคุมวิธีการที่ระบบเริ่มต้นกิจกรรม แอปพลิเคชันที่เป็นอันตรายอาจทำให้ระบบโดยรวมเสียหาย การอนุญาตนี้จำเป็นสำหรับการพัฒนาเท่านั้น แต่ไม่จำเป็นสำหรับการใช้งานปกติ"</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"ส่งการกระจายข้อมูลว่ามีการนำแพคเกจออก"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"อนุญาตให้แอปพลิเคชันกระจายข้อมูลแจ้งเตือนว่ามีการนำแพ็คเก็จของแอปพลิเคชันออกแล้ว แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้จบการทำงานแอปพลิเคชันอื่นที่ทำงานอยู่"</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"ส่งการกระจายข้อมูลว่าได้รับ SMS"</string>
@@ -250,7 +246,7 @@
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"จัดการโทเค็นของแอปพลิเคชัน"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"อนุญาตให้แอปพลิเคชันสร้างและจัดการโทเค็นของตนเอง โดยข้ามการจัดลำดับ Z ปกติไป ไม่ควรต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"กดปุ่มต่างๆ และปุ่ม Ctrl"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"อนุญาตให้แอปพลิเคชันส่งกิจกรรมป้อนข้อมูลของตนเอง (การกดปุ่ม ฯลฯ) ไปยังแอปพลิเคชันอื่น แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ควบคุมแท็บเล็ต"</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"อนุญาตให้แอปพลิเคชันส่งกิจกรรมการป้อนข้อมูลของตนเอง (การกดแป้น ฯลฯ) ไปยังแอปพลิเคชันอื่น แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้เข้าควบคุมแท็บเล็ตได้"</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"อนุญาตให้แอปพลิเคชันส่งกิจกรรมป้อนข้อมูลของตนเอง (การกดปุ่ม ฯลฯ) ไปยังแอปพลิเคชันอื่น แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ควบคุมโทรศัพท์"</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"บันทึกสิ่งที่คุณพิมพ์และการทำงานของคุณ"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"อนุญาตให้แอปพลิเคชันดูปุ่มที่คุณกดแม้ในระหว่างที่ทำงานร่วมกับแอปพลิเคชันอื่น (เช่น ป้อนรหัสผ่าน) ไม่ควรต้องใช้สำหรับแอปพลิเคชันทั่วไป"</string>
@@ -281,14 +277,14 @@
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"อนุญาตให้แอปพลิเคชันเพิ่มพื้นที่ว่างให้โทรศัพท์โดยการลบไฟล์ในไดเรกทอรีที่เก็บแคชของแอปพลิเคชัน โดยทั่วไปการเข้าถึงกระบวนการของระบบจะถูกจำกัดอย่างเข้มงวด"</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"ย้ายแอปพลิเคชันรีซอร์ส"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"อนุญาตให้แอปพลิเคชันย้ายแอปพลิเคชันรีซอร์สจากสื่อภายในเป็นสื่อภายนอกและกลับกัน"</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"อ่านไฟล์บันทึกระบบ"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"อนุญาตให้แอปพลิเคชันอ่านไฟล์บันทึกหลายไฟล์ของระบบ เพื่อค้นหาข้อมูลทั่วไปเกี่ยวกับสิ่งที่คุณกำลังทำกับแท็บเล็ต ซึ่งอาจรวมถึงข้อมูลส่วนบุคคลหรือข้อมูลความลับใดๆ"</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"อนุญาตให้แอปพลิเคชันอ่านไฟล์บันทึกหลายไฟล์ของระบบ เพื่อค้นหาข้อมูลทั่วไปเกี่ยวกับสิ่งที่คุณกำลังทำกับแท็บเล็ต ซึ่งอาจรวมถึงข้อมูลส่วนบุคคลหรือข้อมูลความลับใดๆ"</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"อ่านข้อมูลบันทึกที่สำคัญ"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"อนุญาตให้แอปพลิเคชันอ่านจากไฟล์บันทึกต่างๆ ของระบบ เพื่อค้นหาข้อมูลทั่วไปเกี่ยวกับสิ่งที่คุณกำลังทำอยู่กับแท็บเล็ต ซึ่งอาจรวมไปถึงข้อมูลส่วนบุคคลหรือส่วนตัว"</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"อนุญาตให้แอปพลิเคชันอ่านจากไฟล์บันทึกต่างๆ ของระบบ เพื่อค้นหาข้อมูลทั่วไปเกี่ยวกับสิ่งที่คุณกำลังทำอยู่กับโทรศัพท์ ซึ่งอาจรวมไปถึงข้อมูลส่วนบุคคลหรือส่วนตัว"</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"อ่าน/เขียนไปยังรีซอร์สที่เป็นเจ้าของโดยกลุ่มวินิจฉัย"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"อนุญาตให้แอปพลิเคชันอ่านและเขียนไปยังรีซอร์สที่เป็นของกลุ่มวินิจฉัย เช่น ไฟล์ใน /dev การทำเช่นนี้อาจส่งผลต่อความเสถียรและความปลอดภัยของระบบ และควรใช้สำหรับการวินิจฉัยเกี่ยวกับฮาร์ดแวร์โดยเฉพาะที่ทำโดยผู้ผลิตหรือผู้ให้บริการเท่านั้น"</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"เปิดหรือปิดการใช้งานส่วนประกอบของแอปพลิเคชัน"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"อนุญาตให้แอปพลิเคชันเปลี่ยนว่าจะเปิดใช้งานส่วนประกอบของแอปพลิเคชันอื่นหรือไม่ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ปิดการใช้งานฟังก์ชันสำคัญของแท็บเล็ต การอนุญาตจึงต้องทำอย่างระมัดระวัง เพราะอาจทำให้ส่วนประกอบของแอปพลิเคชันอยู่ในสถานะใช้งานไม่ได้ ทำงานไม่คงที่ หรือไม่เสถียรได้"</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"อนุญาตให้แอปพลิเคชันเปลี่ยนว่าจะเปิดใช้งานส่วนประกอบของแอปพลิเคชันอื่นหรือไม่ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ปิดการใช้งานฟังก์ชันสำคัญของแท็บเล็ต การอนุญาตจึงต้องทำอย่างระมัดระวัง เพราะอาจทำให้ส่วนประกอบของแอปพลิเคชันอยู่ในสถานะใช้งานไม่ได้ ทำงานไม่คงที่ หรือไม่เสถียรได้"</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"อนุญาตให้แอปพลิเคชันเปลี่ยนว่าจะเปิดการใช้งานคอมโพเนนต์หรือแอปพลิเคชันอื่นหรือไม่ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้เพื่อปิดการใช้งานคุณสมบัติที่สำคัญของแท็บเล็ตได้ ต้องใช้ความระมัดระวังเกี่ยวกับการอนุญาตนี้เพราะอาจทำให้คอมโพเนนต์ของแอปพลิเคชันเข้าสู่สถานะที่ไม่สามารถใช้งานได้ ไม่คงที่ หรือไม่เสถียร"</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"อนุญาตให้แอปพลิเคชันเปลี่ยนว่าจะเปิดใช้งานส่วนประกอบหรือแอปพลิเคชันอื่นหรือไม่ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้เพื่อปิดการใช้งานคุณสมบัติที่สำคัญของโทรศัพท์ได้ การอนุญาตจึงต้องทำอย่างระมัดระวัง เพราะอาจทำให้ส่วนประกอบของแอปพลิเคชันอยู่ในสถานะใช้งานไม่ได้ ทำงานไม่คงที่ หรือไม่เสถียรได้"</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"ตั้งค่าแอปพลิเคชันที่เหมาะสม"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"อนุญาตให้แอปพลิเคชันแก้ไขแอปพลิเคชันที่คุณต้องการ วิธีนี้อาจทำให้แอปพลิเคชันที่เป็นอันตรายแอบเปลี่ยนแอปพลิเคชันที่มีการเรียกใช้งาน โดยการปลอมแปลงแอปพลิเคชันที่มีอยู่ของคุณเพื่อเก็บข้อมูลส่วนบุคคลจากคุณ"</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"แก้ไขการตั้งค่าระบบสากล"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"แก้ไขแผนที่ของบริการ Google"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"อนุญาตให้แอปพลิเคชันแก้ไขแผนที่บริการของ Google ห้ามใช้โดยแอปพลิเคชันทั่วไป"</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"เริ่มต้นอัตโนมัติเมื่อบูต"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"อนุญาตให้แอปพลิเคชันเริ่มการทำงานเองทันทีที่ระบบบูตเสร็จ วิธีนี้อาจทำให้การเริ่มการทำงานของแท็บเล็ตใช้เวลานานขึ้น และทำให้แอปพลิเคชันชะลอการทำงานโดยรวมของแท็บเล็ตด้วยการทำงานตลอดเวลา"</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"อนุญาตให้แอปพลิเคชันเริ่มการทำงานเองทันทีที่ระบบบูตเสร็จ วิธีนี้อาจทำให้ใช้เวลานานขึ้นในการเริ่มการทำงานของแท็บเล็ต และทำให้แอปพลิเคชันชะลอการทำงานโดยรวมของแท็บเล็ตด้วยการทำงานตลอดเวลา"</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"อนุญาตให้แอปพลิเคชันเริ่มการทำงานเองทันทีที่ระบบบูตเสร็จ วิธีนี้อาจทำให้การเริ่มการทำงานของโทรศัพท์ใช้เวลานานขึ้น และทำให้แอปพลิเคชันชะลอการทำงานโดยรวมของโทรศัพท์ด้วยการทำงานตลอดเวลา"</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"ส่งการกระจายข้อมูลที่ติดหนึบ"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"อนุญาตให้แอปพลิเคชันส่งการกระจายข้อมูลที่ติดหนึบ ซึ่งจะยังคงอยู่หลังจากการกระจายข้อมูลจบไปแล้ว แอปพลิเคชันที่เป็นอันตรายอาจทำให้แท็บเล็ตทำงานช้าลงหรือไม่เสถียรโดยการใช้หน่วยความจำมากเกินไป"</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"อนุญาตให้แอปพลิเคชันส่งการกระจายข้อมูลที่ติดหนึบ ซึ่งจะยังคงอยู่หลังจากการกระจายข้อมูลจบไปแล้ว แอปพลิเคชันที่เป็นอันตรายอาจทำให้โทรศัพท์ทำงานช้าลงหรือไม่เสถียรเนื่องจากการใช้หน่วยความจำมากเกินไป"</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"อนุญาตให้แอปพลิเคชันส่งการกระจายข้อมูลที่ติดหนึบ ซึ่งจะยังคงอยู่หลังจากการกระจายข้อมูลจบไปแล้ว แอปพลิเคชันที่เป็นอันตรายอาจทำให้โทรศัพท์ทำงานช้าลงหรือไม่เสถียรโดยการใช้หน่วยความจำมากเกินไป"</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"อ่านข้อมูลที่อยู่ติดต่อแล้ว"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"อนุญาตให้แอปพลิเคชันอ่านข้อมูลรายชื่อติดต่อ (ที่อยู่) ทั้งหมดที่จัดเก็บบนแท็บเล็ตของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ส่งข้อมูลของคุณไปหาผู้อื่นได้"</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"อนุญาตให้แอปพลิเคชันอ่านข้อมูลรายชื่อติดต่อ (ที่อยู่) ทั้งหมดที่จัดเก็บอยู่บนแท็บเล็ตของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ส่งข้อมูลของคุณให้แก่ผู้อื่นได้"</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"อนุญาตให้แอปพลิเคชันอ่านข้อมูลที่อยู่ติดต่อ (ที่อยู่) ทั้งหมดที่จัดเก็บบนโทรศัพท์ของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ส่งข้อมูลของคุณไปหาผู้อื่นได้"</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"เขียนข้อมูลที่อยู่ติดต่อ"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"อนุญาตให้แอปพลิเคชันแก้ไขข้อมูลรายชื่อติดต่อ (ที่อยู่) ที่จัดเก็บบนแท็บเล็ตของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ลบหรือแก้ไขข้อมูลรายชื่อติดต่อของคุณได้"</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"อนุญาตให้แอปพลิเคชันแก้ไขข้อมูลรายชื่อติดต่อ (ที่อยู่) ที่จัดเก็บอยู่บนแท็บเล็ตของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ลบหรือแก้ไขข้อมูลรายชื่อติดต่อของคุณได้"</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"อนุญาตให้แอปพลิเคชันแก้ไขข้อมูลที่อยู่ติดต่อ (ที่อยู่) ที่จัดเก็บบนโทรศัพท์ของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ลบหรือแก้ไขข้อมูลที่อยู่ติดต่อของคุณได้"</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"อ่านกิจกรรมบนปฏิทิน"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"อนุญาตให้แอปพลิเคชันอ่านกิจกรรมบนปฏิทินทั้งหมดที่จัดเก็บบนแท็บเล็ตของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ส่งกิจกรรมบนปฏิทินไปหาผู้อื่นได้"</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"อนุญาตให้แอปพลิเคชันอ่านกิจกรรมในปฏิทินทั้งหมดที่จัดเก็บอยู่บนแท็บเล็ตของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ส่งกิจกรรมในปฏิทินของคุณให้แก่ผู้อื่นได้"</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"อนุญาตให้แอปพลิเคชันอ่านกิจกรรมบนปฏิทินทั้งหมดที่จัดเก็บบนโทรศัพท์ของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ส่งกิจกรรมบนปฏิทินไปหาผู้อื่นได้"</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"เพิ่มหรือแก้ไขกิจกรรมบนปฏิทินและส่งอีเมลไปที่แขก"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"อนุญาตให้แอปพลิเคชันเพิ่มหรือเปลี่ยนกิจกรรมบนปฏิทิน ซึ่งอาจมีการส่งอีเมลไปหาแขก แอปพลิเคชันที่เป็นอันตรายสามารถใช้วิธีนี้เพื่อลบหรือแก้ไขกิจกรรมบนปฏิทินหรือส่งอีเมลไปหาแขกได้"</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"การอนุญาตให้ติดตั้งโปรแกรมแจ้งตำแหน่ง"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"สร้างที่มาของตำแหน่งจำลองเพื่อทดสอบ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้เขียนทับตำแหน่งและ/หรือสถานะที่ที่ส่งคืนมาจากที่มาของตำแหน่งจริง เช่น GPS หรือผู้ให้บริการเครือข่าย หรือตรวจดูและรายงานตำแหน่งของคุณให้ที่มาภายนอกทราบ"</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"ตำแหน่ง (GPS) โดยละเอียด"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"เข้าถึงที่มาของตำแหน่งโดยละเอียด เช่น GPS บนแท็บเล็ตในกรณีที่ใช้งานได้ แอปพลิเคชันที่เป็นอันตรายสามารถใช้วิธีนี้ระบุตำแหน่งของคุณและอาจใช้พลังงานแบตเตอรี่มากกว่าปกติ"</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"เข้าถึงที่มาของตำแหน่งโดยละเอียด เช่น ระบบกำหนดตำแหน่งบนพื้นโลก (Global Positioning System) บนแท็บเล็ตในกรณีที่ใช้งานได้ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ในการระบุตำแหน่งของคุณและอาจต้องใช้พลังงานแบตเตอรี่มากกว่าปกติ"</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"เข้าถึงที่มาของตำแหน่งโดยละเอียด เช่น GPS บนโทรศัพท์ในกรณีที่ใช้งานได้ แอปพลิเคชันที่เป็นอันตรายสามารถใช้วิธีนี้กำหนดตำแหน่งของคุณและอาจใช้พลังงานแบตเตอรี่มากกว่าปกติ"</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"ตำแหน่งโดยประมาณ (ตามเครือข่าย)"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"เข้าถึงที่มาของตำแหน่งคร่าวๆ เช่น ฐานข้อมูลเครือข่ายสถานีเพื่อกำหนดตำแหน่งโดยประมาณของแท็บเลตถ้าทำได้ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้กำหนดตำแหน่งโดยสังเขปของคุณได้"</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"เข้าถึงที่มาของตำแหน่งคร่าวๆ เช่น ฐานข้อมูลเครือข่ายโทรศัพท์เคลื่อนที่เพื่อระบุตำแหน่งโดยประมาณของแท็บเล็ตถ้าทำได้ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ระบุตำแหน่งคร่าวๆ ของคุณได้"</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"เข้าถึงที่มาของตำแหน่งคร่าวๆ เช่น ฐานข้อมูลเครือข่ายสถานีเพื่อกำหนดตำแหน่งโดยประมาณของโทรศัพท์ถ้าทำได้ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้กำหนดตำแหน่งโดยสังเขปของคุณได้"</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"เข้าถึง SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"อนุญาตให้แอปพลิเคชันใช้คุณลักษณะระดับต่ำของ SurfaceFlinger"</string>
@@ -334,38 +330,36 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"อนุญาตให้แอปพลิเคชันแก้ไขการตั้งค่าเสียงสากล เช่น ระดับเสียงและการกำหนดเส้นทาง"</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"บันทึกเสียง"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"อนุญาตให้แอปพลิเคชันเข้าถึงเส้นทางการบันทึกเสียง"</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"ถ่ายภาพ"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"อนุญาตให้แอปพลิเคชันถ่ายภาพด้วยกล้องถ่ายรูป การทำงานนี้จะทำให้แอปพลิเคชันเก็บภาพที่กล้องเห็นเมื่อใดก็ได้"</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"ปิดใช้งานแท็บเล็ตถาวร"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"ถ่ายภาพและวิดีโอ"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"อนุญาตให้แอปพลิเคชันถ่ายภาพและวิดีโอด้วยกล้องถ่ายรูป ซึ่งจะทำให้แอปพลิเคชันสามารถรวบรวมภาพที่กล้องมองเห็นได้ตลอดเวลา"</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="7379164636920817963">"อนุญาตให้แอปพลิเคชันปิดใช้งานแท็บเล็ตทั้งหมดอย่างถาวร การทำเช่นนี้ถือว่าอันตรายมาก"</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"อนุญาตให้แอปพลิเคชันปิดการใช้งานแท็บเล็ตทั้งเครื่องอย่างถาวร การดำเนินการนี้เป็นอันตรายอย่างยิ่ง"</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"อนุญาตให้แอปพลิเคชันปิดใช้งานโทรศัพท์ทั้งหมดอย่างถาวร การทำเช่นนี้ถือว่าอันตรายมาก"</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"บังคับแท็บเล็ตให้รีบูต"</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="4555793623560701557">"อนุญาตให้แอปพลิเคชันบังคับแท็บเล็ตให้รีบูต"</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"อนุญาตให้แอปพลิเคชันบังคับให้แท็บเล็ตรีบูต"</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"อนุญาตให้แอปพลิเคชันบังคับโทรศัพท์ให้รีบูต"</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"ต่อเชื่อมและยกเลิกการต่อเชื่อมระบบไฟล์"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"อนุญาตให้แอปพลิเคชันต่อเชื่อมและยกเลิกการต่อเชื่อมระบบไฟล์สำหรับที่เก็บข้อมูลแบบถอดได้"</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"ฟอร์แมตที่จัดเก็บข้อมูลภายนอก"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"อนุญาตให้แอปพลิเคชันฟอร์แมตที่เก็บข้อมูลแบบถอดได้"</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"รับข้อมูลบนที่จัดเก็บข้อมูลเพื่อความปลอดภัย"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"อนุญาตให้แอปพลิเคชันรับข้อมูลบนที่จัดเก็บข้อมูลเพื่อความปลอดภัย"</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"สร้างที่เก็บข้อมูลเพื่อความปลอดภัย"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"อนุญาตให้แอปพลิเคชันสร้างที่จัดเก็บข้อมูลเพื่อความปลอดภัย"</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"ทำลายที่เก็บข้อมูลเพื่อความปลอดภัย"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"อนุญาตให้แอปพลิเคชันทำลายที่จัดเก็บข้อมูลเพื่อความปลอดภัย"</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"ต่อเชื่อม/ยกเลิกการต่อเชื่อมที่จัดเก็บข้อมูลเพื่อความปลอดภัย"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"อนุญาตให้แอปพลิเคชันต่อเชื่อม/ยกเลิกการต่อเชื่อมที่เก็บข้อมูลเพื่อความปลอดภัย"</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"เปลี่ยนชื่อที่จัดเก็บข้อมูลเพื่อความปลอดภัย"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"อนุญาตให้แอปพลิเคชันเปลี่ยนชื่อที่จัดเก็บข้อมูลเพื่อความปลอดภัย"</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"รับข้อมูลบนที่เก็บข้อมูลภายใน"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"อนุญาตให้แอปพลิเคชันรับข้อมูลบนที่เก็บข้อมูลภายใน"</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"สร้างที่เก็บข้อมูลภายใน"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"อนุญาตให้แอปพลิเคชันสร้างที่เก็บข้อมูลภายใน"</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"ทำลายที่เก็บข้อมูลภายใน"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"อนุญาตให้แอปพลิเคชันทำลายที่เก็บข้อมูลภายใน"</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"ต่อเชื่อม/ยกเลิกการต่อเชื่อมที่เก็บข้อมูลภายใน"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"อนุญาตให้แอปพลิเคชันต่อเชื่อม/ยกเลิกการต่อเชื่อมที่เก็บข้อมูลภายใน"</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"เปลี่ยนชื่อที่เก็บข้อมูลภายใน"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"อนุญาตให้แอปพลิเคชันเปลี่ยนชื่อที่เก็บข้อมูลภายใน"</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"ควบคุมการสั่นเตือน"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"อนุญาตให้แอปพลิเคชันควบคุมการสั่นเตือน"</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"ควบคุมไฟฉาย"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"อนุญาตให้แอปพลิเคชันควบคุมไฟฉาย"</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"เข้าถึงอุปกรณ์ USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"อนุญาตให้แอปพลิเคชันเข้าถึงอุปกรณ์ USB"</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"ทดสอบฮาร์ดแวร์"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"อนุญาตให้แอปพลิเคชันควบคุมอุปกรณ์ต่อพ่วงหลายอย่างเพื่อการทดสอบฮาร์ดแวร์"</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"โทรติดต่อหมายเลขโทรศัพท์โดยตรง"</string>
@@ -389,9 +383,9 @@
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"ป้องกันไม่ให้โทรศัพท์เข้าโหมดสลีป"</string>
     <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"อนุญาตให้แอปพลิเคชันป้องกันไม่ให้แท็บเล็ตเข้าสู่โหมดสลีป"</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"อนุญาตให้แอปพลิเคชันป้องกันไม่ให้โทรศัพท์เข้าสู่โหมดสลีป"</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"เปิดหรือปิดแท็บเล็ต"</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="3853773100100451905">"อนุญาตให้แอปพลิเคชันปิดหรือเปิดแท็บเล็ต"</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"อนุญาตให้แอปพลิเคชันเปิดหรือปิดแท็บเล็ต"</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"อนุญาตให้แอปพลิเคชันปิดหรือเปิดโทรศัพท์"</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"เรียกใช้ในโหมดการทดสอบจากโรงงาน"</string>
     <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"เรียกใช้การทดสอบจากผู้ผลิตในระดับต่ำ โดยอนุญาตให้เข้าถึงฮาร์ดแวร์แท็บเล็ตอย่างสมบูรณ์ ใช้ได้เฉพาะช่วงที่แท็บเล็ตทำงานในโหมดการทดสอบจากผู้ผลิตเท่านั้น"</string>
@@ -411,7 +405,7 @@
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"ทำหน้าที่เป็น AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"อนุญาตให้แอปพลิเคชันโทรไปยัง AccountAuthenticators"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"พบบัญชีที่ไม่รู้จัก"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"อนุญาตให้แอปพลิเคชันเรียกรายชื่อบัญชีที่แท็บเล็ตรู้จัก"</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"อนุญาตให้แอปพลิเคชันรับรายการบัญชีที่แท็บเล็ตรู้จัก"</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"อนุญาตให้แอปพลิเคชันเรียกรายชื่อบัญชีที่โทรศัพท์รู้จัก"</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"ทำหน้าที่เป็นตัวตรวจสอบสิทธิ์บัญชี"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"อนุญาตให้แอปพลิเคชันใช้ตัวตรวจสอบสิทธิ์บัญชีของ AccountManager รวมถึงการสร้างบัญชีและรับและตั้งค่ารหัสผ่าน"</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"อนุญาตให้รับมัลติแคสต์ผ่าน Wi-Fi"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"อนุญาตให้แอปพลิเคชันรับแพ็คเก็ตที่ไม่ได้ส่งถึงอุปกรณ์ของคุณโดยตรง วิธีนี้อาจเป็นประโยชน์เมื่อพบบริการที่นำเสนออยู่ใกล้ๆ แต่จะใช้พลังงานมากกว่าโหมดที่ไม่ใช่มัลติแคสต์"</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"การใช้บลูทูธ"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"อนุญาตให้แอปพลิเคชันกำหนดค่าแท็บเล็ตบลูทูธในพื้นที่ ตลอดจนค้นหาและจับคู่กับอุปกรณ์ที่อยู่ระยะไกล"</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"อนุญาตให้แอปพลิเคชันกำหนดค่าแท็บเล็ตบลูทูธในพื้นที่ รวมทั้งค้นหาและจับคู่กับอุปกรณ์รีโมต"</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"อนุญาตให้แอปพลิเคชันกำหนดค่าโทรศัพท์บลูทูธในพื้นที่ ตลอดจนค้นหาและจับคู่กับอุปกรณ์ที่อยู่ระยะไกล"</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"สร้างการเชื่อมต่อบลูทูธ"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"อนุญาตให้แอปพลิเคชันดูการกำหนดค่าของแท็บเล็ตบลูทูธในพื้นที่ ตลอดจนเชื่อมต่อและยอมรับการเชื่อมต่อด้วยอุปกรณ์ที่จับคู่ไว้"</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"อนุญาตให้แอปพลิเคชันดูการกำหนดค่าของแท็บเล็ตบลูทูธในพื้นที่ แล้วทำการเชื่อมต่อและยอมรับการเชื่อมต่อกับอุปกรณ์ที่จับคู่"</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"อนุญาตให้แอปพลิเคชันดูการกำหนดค่าของโทรศัพท์บลูทูธในพื้นที่ ตลอดจนเชื่อมต่อและยอมรับการเชื่อมต่อด้วยอุปกรณ์ที่จับคู่ไว้"</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"ควบคุม Near Field Communication"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"อนุญาตให้แอปพลิเคชันสื่อสารกับแท็ก Near Field Communication (NFC) การ์ด และโปรแกรมอ่าน"</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"ปิดการใช้งานการล็อกปุ่มกด"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"อนุญาตให้แอปพลิเคชันปิดการใช้งานการล็อกปุ่มและการรักษาความปลอดภัยรหัสผ่านที่เกี่ยวข้องใดๆ ตัวอย่างการใช้งานของกรณีนี้คือ โทรศัพท์ปิดการใช้งานการล็อกปุ่มกดเมื่อมีสายเรียกเข้า จากนั้นจึงเปิดการใช้งานการล็อกปุ่มกดใหม่เมื่อวางสายแล้ว"</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"อ่านการตั้งค่าการซิงค์แล้ว"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"อนุญาตให้แอปพลิเคชันอ่านคำ ชื่อ และวลีส่วนบุคคลที่ผู้ใช้อาจจัดเก็บไว้ในพจนานุกรมผู้ใช้"</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"เขียนลงพจนานุกรมที่ผู้ใช้กำหนด"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"อนุญาตให้แอปพลิเคชันเขียนคำใหม่ลงในพจนานุกรมของผู้ใช้"</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"แก้ไข/ลบข้อมูลการ์ด SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"แก้ไข/ลบเนื้อหาของที่เก็บข้อมูล USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"แก้ไข/ลบข้อมูลการ์ด SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"อนุญาตให้แอปพลิเคชันเขียนลงบนการ์ด SD"</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"อนุญาตให้แอปพลิเคชันเขียนไปยังที่เก็บข้อมูล USB"</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"อนุญาตให้แอปพลิเคชันเขียนลงบนการ์ด SD"</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"แก้ไข/ลบเนื้อหาของที่เก็บข้อมูลสื่อภายใน"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"อนุญาตให้แอปพลิเคชันแก้ไขเนื้อหาของที่เก็บข้อมูลสื่อภายใน"</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"เข้าถึงระบบไฟล์แคช"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"อนุญาตให้แอปพลิเคชันอ่านและเขียนระบบไฟล์แคช"</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"จำกัดรหัสผ่าน"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"จำกัดประเภทรหัสผ่านที่อนุญาตให้คุณใช้"</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"ดูจำนวนครั้งที่พยายามเข้าสู่ระบบ"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"ตรวจสอบจำนวนรหัสผ่านที่ป้อนผิดทั้งหมดเมื่อปลดล็อกหน้าจอ และล็อกแท็บเล็ตหรือลบข้อมูลแท็บเล็ตทั้งหมด หากมีการป้อนรหัสผิดมากครั้งเกินไป"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"ตรวจสอบจำนวนรหัสผ่านที่ป้อนผิดทั้งหมดเมื่อปลดล็อกหน้าจอ และล็อกแท็บเล็ตหรือลบข้อมูลแท็บเล็ตทั้งหมด หากมีการป้อนรหัสผิดมากครั้งเกินไป"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"รีเซ็ตรหัสผ่าน"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"เปลี่ยนรหัสผ่านของคุณลงเป็นค่าใหม่ ซึ่งต้องให้ผู้ดูแลระบบมอบรหัสผ่านให้ก่อนคุณจึงจะสามารถลงชื่อเข้าใช้ได้"</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"บังคับล็อก"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"การควบคุมเมื่ออุปกรณ์ล็อกซึ่งต้องให้คุณป้อนรหัสผ่านซ้ำอีกครั้ง"</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"โทรออก/รับสายอินเทอร์เน็ต"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"อนุญาตให้แอปพลิเคชันใช้บริการ SIP เพื่อโทรออก/รับสายอินเทอร์เน็ต"</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"ตั้งค่ากฎรหัสผ่าน"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"ควบคุมความยาวและอักขระที่อนุญาตให้ใช้ในรหัสผ่านการปลดล็อกหน้าจอ"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"ตรวจสอบความพยายามในการปลดล็อกหน้าจอ"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"ตรวจสอบจำนวนรหัสผ่านที่ป้อนไม่ถูกต้องเมื่อปลดล็อกหน้าจอ และล็อกแท็บเล็ตหรือลบข้อมูลทั้งหมดของแท็บเล็ตในกรณีที่ป้อนรหัสผ่านไม่ถูกต้องหลายครั้งเกินไป"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"ตรวจสอบจำนวนรหัสผ่านที่ป้อนไม่ถูกต้องเมื่อปลดล็อกหน้าจอ และล็อกโทรศัพท์หรือลบข้อมูลทั้งหมดของโทรศัพท์ในกรณีที่ป้อนรหัสผ่านไม่ถูกต้องหลายครั้งเกินไป"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"เปลี่ยนรหัสผ่านการปลดล็อกหน้าจอ"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"เปลี่ยนรหัสผ่านการปลดล็อกหน้าจอ"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"ล็อกหน้าจอ"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"ควบคุมว่าหน้าจอจะล็อกอย่างไรและเมื่อใด"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"ลบข้อมูลทั้งหมด"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"ลบข้อมูลในแท็บเล็ตโดยไม่มีการเตือนโดยการรีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"ลบข้อมูลในแท็บเล็ตโดยไม่มีการเตือนโดยการรีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"ลบข้อมูลของแท็บเล็ตโดยไม่มีการเตือน ด้วยการดำเนินการรีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"ลบข้อมูลของโทรศัพท์โดยไม่มีการเตือน ด้วยการดำเนินการรีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"ตั้งค่าพร็อกซีส่วนกลางของอุปกรณ์"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"ตั้งค่าพร็อกซีส่วนกลางของอุปกรณ์ที่จะใช้ขณะเปิดการใช้งานนโยบาย เฉพาะผู้ดูแลอุปกรณ์คนแรกเท่านั้นที่ตั้งค่าพร็อกซีส่วนกลางที่มีผลบังคับ"</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"ตั้งค่าการหมดอายุของรหัสผ่าน"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"ควบคุมระยะเวลาก่อนที่จะต้องเปลี่ยนรหัสผ่านการล็อกหน้าจอ"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"บ้าน"</item>
     <item msgid="869923650527136615">"มือถือ"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"เพจเจอร์ที่ทำงาน"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"ผู้ช่วย"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"กำหนดเอง"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"วันเกิด"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"วันครบรอบ"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"กิจกรรม"</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>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"ที่ทำงาน"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"อื่นๆ"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"กำหนดเอง"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <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="3731488827218876115">"ป้อนรหัส PIN"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"ป้อนรหัสผ่านเพื่อปลดล็อก"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"ป้อน PIN เพื่อปลดล็อก"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"รหัส PIN ไม่ถูกต้อง!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"หากต้องการปลดล็อก กด เมนู ตามด้วย 0"</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"หมายเลขฉุกเฉิน"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"กลับสู่การโทร"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ถูกต้อง!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"ขออภัย โปรดลองอีกครั้ง"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"ขออภัย โปรดลองอีกครั้ง"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"กำลังชาร์จ (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"ชาร์จแล้ว"</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"ซิมการ์ดถูกล็อก"</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"กำลังปลดล็อกซิมการ์ด…"</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%d</xliff:g> ครั้ง"\n\n"โปรดลองอีกครั้งในอีก <xliff:g id="NUMBER_1">%d</xliff:g> วินาที"</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <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_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"คุณป้อนรหัสผ่านไม่ถูกต้อง <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="6827749231465145590">"คุณป้อน 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="8687762517114904651">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <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="3351013842320127827">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <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_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>
@@ -698,23 +658,17 @@
     <string name="double_tap_toast" msgid="1068216937244567247">"เคล็ดลับ: แตะสองครั้งเพื่อขยายและย่อ"</string>
     <string name="autofill_this_form" msgid="1272247532604569872">"ป้อนอัตโนมัติ"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"ตั้งค่าการป้อนอัตโนมัติ"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"อ่านประวัติและบุ๊กมาร์กของเบราว์เซอร์"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"อนุญาตให้แอปพลิเคชันอ่าน URL ทั้งหมดที่เบราว์เซอร์เคยเข้าชมและบุ๊กมาร์กของเบราว์เซอร์ทั้งหมด"</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"เขียนประวัติและบุ๊กมาร์กของเบราว์เซอร์"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"อนุญาตให้แอปพลิเคชันแก้ไขประวัติหรือบุ๊กมาร์กของเบราว์เซอร์ที่จัดเก็บบนแท็บเล็ตของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ลบหรือแก้ไขข้อมูลเบราว์เซอร์ของคุณได้"</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"อนุญาตให้แอปพลิเคชันแก้ไขประวัติหรือบุ๊กมาร์กของเบราว์เซอร์ที่จัดเก็บอยู่บนแท็บเล็ตของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ในการลบหรือแก้ไขข้อมูลเบราว์เซอร์ของคุณได้"</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"อนุญาตให้แอปพลิเคชันแก้ไขประวัติหรือบุ๊กมาร์กของเบราว์เซอร์ที่จัดเก็บบนโทรศัพท์ของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้ลบหรือแก้ไขข้อมูลเบราว์เซอร์ของคุณได้"</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"ตั้งเวลาปลุกในนาฬิกาปลุก"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"อนุญาตให้แอปพลิเคชันนี้ตั้งเวลาปลุกในแอปพลิเคชันนาฬิกาปลุกที่ติดตั้งไว้ แอปพลิเคชันนาฬิกาปลุกบางประเภทอาจไม่ใช้คุณลักษณะนี้"</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"แก้ไขการอนุญาตเกี่ยวกับการระบุตำแหน่งทางภูมิศาสตร์ของเบราว์เซอร์"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"อนุญาตให้แอปพลิเคชันแก้ไขการอนุญาตเกี่ยวกับการระบุตำแหน่งทางภูมิศาสตร์ของเบราว์เซอร์ แอปพลิเคชันที่เป็นอันตรายอาจใช้วิธีนี้อนุญาตให้ส่งข้อมูลตำแหน่งไปที่เว็บไซต์อื่นได้โดยพลการ"</string>
     <string name="save_password_message" msgid="767344687139195790">"คุณต้องการให้เบราว์เซอร์จำรหัสผ่านนี้หรือไม่"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"ตัด"</string>
     <string name="copy" msgid="2681946229533511987">"คัดลอก"</string>
     <string name="paste" msgid="5629880836805036433">"วาง"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"ไม่มีสิ่งที่จะวาง"</string>
     <string name="copyUrl" msgid="2538211579596067402">"คัดลอก URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"เลือกข้อความ..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"การเลือกข้อความ"</string>
     <string name="inputMethod" msgid="1653630062304567879">"วิธีป้อนข้อมูล"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"แก้ไขข้อความ"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"การทำงานของข้อความ"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"เหลือที่ว่างน้อย"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"พื้นที่เก็บข้อมูลบนแท็บเล็ตเหลือน้อย"</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"ที่เก็บข้อมูลแท็บเล็ตมีพื้นที่เหลือน้อย"</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"พื้นที่เก็บข้อมูลบนโทรศัพท์เหลือน้อย"</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>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"กำลังโหลด..."</string>
     <string name="capital_on" msgid="1544682755514494298">"ในวันที่"</string>
     <string name="capital_off" msgid="6815870386972805832">"ปิด"</string>
     <string name="whichApplication" msgid="4533185947064773386">"ทำงานให้เสร็จโดยใช้"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"บังคับปิด"</string>
     <string name="report" msgid="4060218260984795706">"รายงาน"</string>
     <string name="wait" msgid="7147118217226317732">"รอ"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"เปลี่ยนเส้นทางแอปพลิเคชัน"</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="smv_application" msgid="295583804361236288">"แอปพลิเคชัน <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="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> กำลังทำงาน"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"เลือกเพื่อสลับแอปพลิเคชัน"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"สลับแอปพลิเคชันหรือไม่"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"มีแอปพลิเคชันอื่นที่กำลังทำงานอยู่แล้ว ซึ่งต้องหยุดทำงานก่อนที่คุณจะเริ่มแอปพลิเคชันใหม่ได้"</string>
+    <string name="old_app_action" msgid="493129172238566282">"กลับสู่ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"อย่าเริ่มแอปพลิเคชันใหม่"</string>
+    <string name="new_app_action" msgid="5472756926945440706">"เริ่มต้น <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"หยุดการทำงานของแอปพลิเคชันเก่าโดยไม่บันทึก"</string>
     <string name="sendText" msgid="5132506121645618310">"เลือกการทำงานของข้อความ"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"ระดับความดังเสียงเรียกเข้า"</string>
     <string name="volume_music" msgid="5421651157138628171">"ระดับเสียงของสื่อ"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"แสดงทั้งหมด"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"พื้นที่เก็บข้อมูลขนาดใหญ่ USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"เชื่อมต่อ USB แล้ว"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"คุณได้เชื่อมต่อโทรศัพท์เข้ากับคอมพิวเตอร์ผ่าน USB เลือกปุ่มด้านล่างนี้หากคุณต้องการคัดลอกไฟล์ระหว่างคอมพิวเตอร์และการ์ด SD ของ Android"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"คุณได้เชื่อมต่อโทรศัพท์เข้ากับคอมพิวเตอร์ผ่าน USB เลือกปุ่มด้านล่างนี้หากคุณต้องการคัดลอกไฟล์ระหว่างคอมพิวเตอร์และการ์ด SD ของ Android"</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"คุณได้เชื่อมต่อกับคอมพิวเตอร์ผ่าน USB แล้ว แตะปุ่มด้านล่างถ้าคุณต้องการคัดลอกไฟล์ระหว่างคอมพิวเตอร์กับที่เก็บข้อมูล USB ของ Android"</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"คุณได้เชื่อมต่อกับคอมพิวเตอร์ผ่าน USB แล้ว แตะปุ่มด้านล่างถ้าต้องการคัดลอกไฟล์ระหว่างคอมพิวเตอร์กับการ์ด SD ของ Android"</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"เปิดที่เก็บข้อมูล USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"พบปัญหาในการใช้การ์ด SD สำหรับที่จัดเก็บข้อมูล USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"พบปัญหาในการใช้การ์ด SD สำหรับที่จัดเก็บข้อมูล USB"</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"เกิดปัญหาในการใช้ที่เก็บข้อมูล USB ของคุณเพื่อเก็บข้อมูลจำนวนมากแบบ USB"</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"เกิดปัญหาในการใช้การ์ด SD เพื่อเก็บข้อมูลจำนวนมากแบบ USB"</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"เชื่อมต่อ USB แล้ว"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"เลือกเพื่อคัดลอกไฟล์ไปยัง/จากคอมพิวเตอร์ของคุณ"</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"ปิดที่เก็บข้อมูล USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"เลือกเพื่อปิดที่เก็บข้อมูล USB"</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"ใช้การจัดเก็บใน USB"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"ก่อนปิดที่จัดเก็บข้อมูล USB ตรวจดูให้แน่ใจว่าคุณได้ยกเลิกการต่อเชื่อม (\"นำออก\") การ์ด SD ของ Android จากคอมพิวเตอร์แล้ว"</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"ก่อนปิดที่เก็บข้อมูล USB ตรวจสอบให้แน่ใจว่าคุณได้ยกเลิกการต่อเชื่อม (“นำออก”) ที่เก็บข้อมูล USB ของ Android จากคอมพิวเตอร์แล้ว"</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"ก่อนปิดที่จัดเก็บข้อมูล USB ตรวจดูให้แน่ใจว่าคุณได้ยกเลิกการต่อเชื่อม (\"นำออก\") การ์ด SD ของ Android จากคอมพิวเตอร์แล้ว"</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"ปิดที่เก็บข้อมูล USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"พบปัญหาในการปิดที่เก็บข้อมูล USB ตรวจสอบให้แน่ใจว่าคุณได้ยกเลิกการต่อเชื่อมโฮสต์ USB แล้ว จากนั้นลองใหม่อีกครั้ง"</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"หากคุณเปิดที่จัดเก็บข้อมูล USB แอปพลิเคชันบางอย่างที่คุณใช้อยู่จะหยุดและอาจใช้งานไม่ได้จนกว่าคุณจะปิดที่จัดเก็บข้อมูล USB"</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"การปฏิบัติงานของ USB ล้มเหลว"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"ตกลง"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"ฟอร์แมตการ์ด SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"ฟอร์แมตที่เก็บข้อมูล USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"ฟอร์แมตการ์ด SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"คุณแน่ใจหรือไม่ว่าต้องการฟอร์แมตการ์ด SD ข้อมูลทั้งหมดบนการ์ดจะหายไป"</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"ฟอร์แมตที่เก็บข้อมูล USB โดยลบไฟล์ทั้งหมดที่จัดเก็บอยู่ในนั้นหรือไม่ การทำงานนี้ไม่สามารถย้อนกลับได้"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"คุณแน่ใจหรือไม่ว่าต้องการฟอร์แมตการ์ด SD ข้อมูลทั้งหมดบนการ์ดจะหายไป"</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"รูปแบบ"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"เชื่อมต่อการแก้ไขข้อบกพร่อง USB แล้ว"</string>
@@ -960,28 +897,28 @@
     <string name="fast_scroll_alphabet" msgid="5433275485499039199">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
     <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
     <string name="candidates_style" msgid="4333913089637062257"><u>"ตัวเลือก"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"กำลังเตรียมการ์ด SD"</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>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"การ์ด SD ว่างเปล่า"</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>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"การ์ด SD ว่างเปล่าหรือมีระบบไฟล์ที่ไม่ได้รับการสนับสนุน"</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"ที่เก็บข้อมูล USB ว่างเปล่าหรือมีระบบไฟล์ที่ไม่ได้รับการสนับสนุน"</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"การ์ด SD ว่างเปล่าหรือมีระบบไฟล์ที่ไม่ได้รับการสนับสนุน"</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"การ์ด 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>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"การ์ด SD เสียหาย คุณอาจต้องฟอร์แมตซ้ำ"</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"ที่เก็บข้อมูล USB เสียหาย คุณอาจต้องฟอร์แมตใหม่"</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"การ์ด SD เสียหาย คุณอาจต้องฟอร์แมตซ้ำ"</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"การ์ด 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>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"ยกเลิกการต่อเชื่อมการ์ด 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>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"นำการ์ด 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>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"คุณสามารถนำการ์ด 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>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"นำการ์ด 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>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"การ์ด 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="4168820609403385789">"ไม่พบกิจกรรมที่ตรงกัน"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"อัปเดตสถิติการใช้ส่วนประกอบ"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"ส่ง"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"ถัดไป"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"เสร็จสิ้น"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"ก่อนหน้า"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"ปฏิบัติ"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"หมุนหมายเลข "\n" โดยใช้ <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"สร้างที่อยู่ติดต่อ "\n"โดยใช้ <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"L2TP/IPSec VPN ตามคีย์ที่ให้ใช้ร่วมกันล่วงหน้า"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/ VPN ตามใบรับรอง"</string>
     <string name="upload_file" msgid="2897957172366730416">"เลือกไฟล์"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <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="668663626721675614">"เลือกเพื่อออกจากโหมดใช้ในรถยนต์"</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"การปล่อยสัญญาณหรือฮอตสปอตทำงานอยู่"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"แตะเพื่อกำหนดค่า"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <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="2609734763845705708">"แตะเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการใช้ข้อมูลมือถือ"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"เกินจำนวนสูงสุดของข้อมูลมือถือ"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"แตะเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการใช้ข้อมูลมือถือ"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <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="INDEX">%d</xliff:g> จาก <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"เสร็จสิ้น"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"กำลังยกเลิกการต่อเชื่อมที่เก็บข้อมูล USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"กำลังยกเลิกการต่อเชื่อมการ์ด SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"กำลังลบที่เก็บข้อมูล USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"กำลังลบการ์ด SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"ลบที่เก็บข้อมูล USB ไม่สำเร็จ"</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"ลบการ์ด 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">"ขณะนี้การ์ด SD มีการใช้งานอยู่โดยคอมพิวเตอร์"</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>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 6dee767..7165a73 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Voicemail"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Problema sa koneksyon o di-wastong MMI code."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Pinaghihigpitan ang pagpapatakbo sa mga fixed dialing number lang."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Pinagana ang serbisyo."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Pinagana ang serbisyo para sa:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Hindi pinagana ang serbisyo."</string>
@@ -126,10 +125,10 @@
     <string name="contentServiceSync" msgid="8353523060269335667">"I-sync"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"I-sync"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Masyadong maraming pagtanggal ng <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
-    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Puno na ang imbakan ng tablet! Magtanggal ng ilang mga file upang magbakante ng espasyo."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Puno na ang imbakan ng tablet! Magtanggal ng ilang mga file upang magbakante ng puwang."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"Puno na ang imbakan ng telepono! Magtanggal ng ilang file upang magbakante ng espasyo."</string>
     <string name="me" msgid="6545696007631404292">"Ako"</string>
-    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Mga pagpipilian ng tablet"</string>
+    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Mga pagpipilian sa tablet"</string>
     <string name="power_dialog" product="default" msgid="1319919075463988638">"Mga pagpipilian sa telepono"</string>
     <string name="silent_mode" msgid="7167703389802618663">"Silent mode"</string>
     <string name="turn_on_radio" msgid="3912793092339962371">"I-on ang wireless"</string>
@@ -137,13 +136,12 @@
     <string name="screen_lock" msgid="799094655496098153">"Pag-lock sa screen"</string>
     <string name="power_off" msgid="4266614107412865048">"I-off"</string>
     <string name="shutdown_progress" msgid="2281079257329981203">"Nagsa-shut down…"</string>
-    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Magsa-shut down ang iyong tablet."</string>
+    <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Mag-shut down ang iyong tablet."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Magsa-shut down ang iyong telepono."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Gusto mo bang mag-shut down?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Kamakailan"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Walang mga kamakailang application."</string>
-    <string name="global_actions" product="tablet" msgid="408477140088053665">"Mga pagpipilian ng tablet"</string>
+    <string name="global_actions" product="tablet" msgid="408477140088053665">"Mga pagpipilian sa tablet"</string>
     <string name="global_actions" product="default" msgid="2406416831541615258">"Pagpipilian sa telepono"</string>
     <string name="global_action_lock" msgid="2844945191792119712">"Pag-lock sa screen"</string>
     <string name="global_action_power_off" msgid="4471879440839879722">"I-off"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Mga tool na pang-develop"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Kailangan lang ang mga tampok para sa mga nag-develop ng application."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Imbakan"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"I-access ang SD card."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"I-access ang imbakan na USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"I-access ang SD card."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"huwag paganahin o baguhin ang status bar"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Pinapayagan ang application na huwag paganahin ang status bar o magdagdag at mag-alis ng mga icon ng system."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"status bar"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Pinapayagan ang application na maging status bar."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"palawakin/tiklupin ang status bar"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Pinapayagan ang application na palawakin o tiklupin ang status bar."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"sumagap ng mga papalabas na tawag"</string>
@@ -196,10 +192,10 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"magpadala ng mga SMS na mensahe"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Pinapayagan ang application na magpadala ng mga SMS na mensahe. Maaaring mapagastos ka ng mga nakakahamak na application sa pamamagitan ng pagpapadala ng mga mensahe nang wala ng iyong kumpirmasyon."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"magbasa ng SMS o MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Pinapahintulutan ang application na basahin ang mga SMS na mensaheng nakaimbak sa iyong tablet o SIM card. Maaaring basahin ng mga nakakahamak na application ang iyong mga kumpedensyal na mensahe."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Pinapayagan ang application na basahin ang mga mensaheng SMS na nakaimbak sa iyong tablet o SIM card. Maaaring basahin ng mga nakapanghahamak na application ang iyong mga mensahe."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Pinapayagan ang application na basahin ang mga SMS na mensaheng nakaimbak sa iyong telepono o SIM card. Maaaring basahin ng mga nakakahamak na application ang iyong mga kumpidensyal na mensahe."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"i-edit ang SMS o MMS"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Pinapahintulutan ang application na magsulat sa mga SMS na mensahe na nakaimbak sa iyong tablet o SIM card. Maaaring tanggalin ng mga nakakahamak na application ang iyong mga mensahe."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Pinapayagan ang application na magsulat sa mga mensaheng SMS na nakaimbak sa iyong tablet o SIM card. Maaaring tanggalin ng mga nakapanghahamak na application ang iyong mga mensahe."</string>
     <string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Pinapayagan ang application na magsulat sa mga SMS na mensahe na nakaimbak sa iyong telepono o SIM card. Maaaring tanggalin ng mga nakakahamak na application ang iyong mga mensahe."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"tumanggap ng WAP"</string>
     <string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Pinapayagan ang application na tumanggap at magproseso ng mga WAP na mensahe. Maaaring subaybayan ng mga nakakahamak na application ang iyong mensahe o tanggalin ang mga ito nang hindi ipinapakita sa iyo."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"pigilan ang mga paglipat ng app"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Pinipigilan ang user mula sa paglipat sa isa pang application."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"subaybayan at kontrolin ang lahat ng paglulunsad ng application"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Pinapahintulutan ang isang application na subaybayan at kontrolin kung paano naglulunsad ng mga aktibidad ang system. Maaaring ganap na malagay sa panganib ng mga nakakahamak na application ang system. Kailangan lang ang pahintulot na ito para sa pagpapaunlad, hindi kailanman para sa normal na paggamit."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Pinapayagan ang application na subaybayan at kontrolin kung paano naglulunsad ang system ng mga aktibidad. Maaaring kumpletong ikompromiso ng mga nakapanghahamak na application ang system. Kailangan lang ang pahintulot na ito para sa development, hindi para sa normal na paggamit."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"magpadala ng package inalis ang broadcast"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Pinapayagan ang isang application na mag-broadcast ng notification na naalis ang package ng application. Maaari itong gamitin ng mga nakakahamak na application upang isara ang anumang ibang tumatakbong application."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"magpadala ng broadcast na natatanggap sa SMS"</string>
@@ -244,13 +240,13 @@
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"ipakita ang mga hindi pinahintulutang window"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Pinapayagan ang paglikha ng mga window na nilayon para sa paggamit ng user interface ng pangloob na system. Hindi para sa paggamit ng mga normal na application."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"ipakita ang mga alerto sa antas ng system"</string>
-    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Pinapahintulutan ang isang application na ipakita ang system alert windows. Masasakop ng mga nakakahamak na application ang buong screen ng tablet."</string>
+    <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Pinapayagan ang application na magpakita ng mga window ng alerto ng system. Maaaring kunin ng mga nakapanghahamak na application ang buong screen."</string>
     <string name="permlab_setAnimationScale" msgid="2805103241153907174">"baguhin ang bilis ng global animation"</string>
     <string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Pinapayagan ang application na baguhin ang bilis ng global animation (mas mabibilis o mas mababagal na animation) anumang oras."</string>
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"pamahalaana ng mga token ng application"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Pinapayagan ang mga application na likhain at pamahalaan ang sariling mga token nito, at nilalampasan ang kanilang normal na Z-pagkasunud-sunod. Hindi kailanman dapat kailanganin para sa mga normal na application."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"pindutin ang mga key at kontrolin ang mga pindutan"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Pinapahintulutan ang isang application na ihatid ang sarili nitong mga input na kaganapan (mga pagpindot sa key, atbp.) sa ibang mga application. Magagamit ito ng mga nakakahamak na application upang sakupin ang tablet."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Pinapayagan ang application na ihatid ang sariling nitong mga kaganapan ng input (mga pagpindot sa key, atbp.) sa mga ibang application. Maaari itong gamitin ng mga nakapanghahamak na application upang sakupin ang tablet."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Pinapayagan ang isang application na ihatid ang sarili nitong mga input na kaganapan (mga pagpindot sa key, atbp.) sa ibang mga application. Magagamit ito ng mga nakakahamak na application upang sakupin ang telepono."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"itala kung ano ang iyong tina-type at mga pagkilos na iyong ginagawa"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Pinapayagan ang mga application na panoorin ang mga pinipindot mong key maging kapag nakikipag-ugnay sa isa pang application (gaya ng pagpasok ng password). Hindi dapat na kailanganin kailanman para sa mga normal na application."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"direktang i-install ang mga application"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Pinapayagan ang isang application na mag-install ng mga bago o na-update na Android package. Magagamit ito ng mga nakakahamak na application upang magdagdag ng mga bagong application nang may mga pabigla-biglang makapangyarihang pahintulot."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"tanggalin ang lahat ng data sa cache ng application"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Pinapahintulutan ang isang application na magbakante ng imbakan ng tablet sa pamamagitan ng pagtanggal ng mga file sa direktoryo ng cache ng application. Kadalasang napakahigpit ng access sa proseso ng system."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Pinapayagan ang application na bakantehin ang imbakan ng tablet sa pamamagitan ng pagtatanggal ng mga file sa direktoryo ng cache ng application. Karaniwang lubos na pinaghihigpitan ang access sa proseso ng system."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Pinapayagan ang isang application na magbakante ng imbakan ng telepono sa pamamagitan ng pagtanggal ng mga file sa direktoryo ng cache ng application. Kadalasang napakahigpit ng access sa proseso ng system."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Ilipat ang mga mapagkukunan ng application"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Pinapayagan ang isang application na ilipat ang mga mapagkukunan ng application mula sa panloob patungo sa panlabas na media at kabaligtaran."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"basahin ang mga file sa log ng system"</string>
-    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Pinapahintulutan ang isang application na magbasa mula sa iba\'t ibang file ng log ng system. Pinapahintulutan nito itong tumuklas ng pangkalahatang impormasyon tungkol sa kung ano ang ginagawa mo sa tablet, ngunit hindi dapat maglaman ang mga ito ng personal o pribadong impormasyon."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Pinapahintulutan ang isang application na magbasa mula sa iba\'t ibang file ng log ng system. Pinapahintulutan nito itong tumuklas ng pangkalahatang impormasyon tungkol sa kung ano ang ginagawa mo sa tablet, ngunit hindi dapat maglaman ang mga ito ng personal o pribadong impormasyon."</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"magbasa ng sensitibong data ng tala"</string>
+    <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Pinapayagan ang application na magbasa mula sa iba\'t ibang file ng tala ng system. Pinapayagan ito nito na tumuklas ng pangkalahatang impormasyon tungkol sa kung ano ang iyong ginagawa sa tablet, potensyal na kabilang ang personal o pribadong impormasyon."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Pinapayagan ang application na magbasa mula sa iba\'t ibang file ng tala ng system. Pinapayagan ito nito na tumuklas ng pangkalahatang impormasyon tungkol sa kung ano ang iyong ginagawa sa telepono, potensyal na kabilang ang personal o pribadong impormasyon."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"magbasa/magsulat sa mga mapagkukunang pag-aari ng diag"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Pinapayagan ang isang application na magbasa at magsulat ng anumang mapagkukunang pag-aari ng pangkat ng diag; halimbawa, mga file sa /dev. Posibleng maapektuhan nito ang katatagan at seguridad ng system. Dapat LANG itong gamitin sa mga tukoy sa hardware na diagnostic ng manufacturer o operator."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"paganahin o huwag paganahin ang mga nilalaman ng application"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Pinapahintulutan ang isang application na baguhin kung pinagana o hindi ang isang nilalaman ng isa pang application. Magagamit ito ng mga nakakahamak na application upang huwag paganahin ang mahahalagang kakayahan ng tablet. Ang pangangalaga ay dapat gamitin nang may pahintulot, dahil posibleng makuha ang mga nilalaman ng application sa hindi magagamit, pabagu-bago, o hindi matatag na katayuan."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Pinapahintulutan ang isang application na baguhin kung pinagana o hindi ang isang nilalaman ng isa pang application. Magagamit ito ng mga nakakahamak na application upang huwag paganahin ang mahahalagang kakayahan ng tablet. Ang pangangalaga ay dapat gamitin nang may pahintulot, dahil posibleng makuha ang mga nilalaman ng application sa hindi magagamit, pabagu-bago, o hindi matatag na katayuan."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Pinapayagan ang application na baguhin kung pinagana o hindi ang bahagi ng isa pang application. Maaari itong gamitin ng mga nakapanghahamak na application upang huwag paganahin ang mga mahalagang kakayahan ng tablet. Dapat na mag-ingat sa pahintulot na ito, dahil posibleng magawang hindi na magagamit, hindi patas, o hindi matatag na katayuan ang mga bahagi ng application."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Pinapayagan ang application na baguhin kung pinagana o hindi ang bahagi ng isa pang application. Maaari itong gamitin ng mga nakapanghahamak na application upang huwag paganahin ang mga mahalagang kakayahan ng telepono. Dapat na mag-ingat sa pahintulot na ito, dahil posibleng magawang hindi na magagamit, hindi patas, o hindi matatag na katayuan ang mga bahagi ng application."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"itakda ang mga ninanais na application"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Pinapayagan ang isang application na baguhin ang mga ninanais mong application. Mapapayagan nito ang mga nakakahamak na application na tahimik na baguhin ang mga application na pinapatakbo, na gumagaya sa iyong mga umiiral na application upang kumolekta ng pribadong data mula sa iyo."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"baguhin ang mga setting ng global system"</string>
@@ -298,19 +294,19 @@
     <string name="permlab_writeGservices" msgid="2149426664226152185">"baguhin ang mapa ng mga serbisyo ng Google"</string>
     <string name="permdesc_writeGservices" msgid="6602362746516676175">"Pinapayagan ang isang application na baguhin ang mapa ng mga serbisyo ng Google. Hindi para sa paggamit ng mga normal na application."</string>
     <string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"awtomatikong magsimula sa boot"</string>
-    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Pinapahintulutan ang isang application na makapagsimula sa sandaling matapos mag-boot ang system. Magagawa nitong mapatagal ang pagsisimula ng tablet at pinapayagan ang application na pabagalin ang kabuuan ng tablet sa pamamagitan ng palagiang pagtakbo."</string>
+    <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Pinapayagan ang application na simulan ang sarili nito pagkatapos mismo na mag-boot ng system. Maaari itong magsanhi na mas matagal magsimula ang tablet at payagan ang application na pabagalin ang pangkalahatang tablet sa pamamagitan ng palaging pagtakbo."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Pinapayagan ang isang application na makapagsimula sa sandaling matapos mag-boot ang system. Magagawa nitong mapatagal ang pagsisimula ng telepono at pinapayagan ang application na pabagalin ang kabuuan ng telepono sa pamamagitan ng palagiang pagtakbo."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"magpadala ng sticky na pag-broadcast"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Pinapahintulutan ang isang application na magpadala ng mga sticky na broadcast, na nananatili pagkatapos ng broadcast. Magagawa ng mga nakakahamak na application na pabagalin o hindi maayos ang tablet sa pamamagitan ng paggamit ng masyadong maraming memorya nito."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Pinapayagan ang application na magpadala ng mga sticky broadcast, na mananatili pagkatapos na magwakas ng broadcast. Maaaring pabagalin o gawing hindi maayos ng mga nakapanghahamak na application ang tablet sa pamamagitan ng pagsasanhi dito sa paggamit ng masyadong maraming memorya."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Pinapayagan ang isang application na magpadala ng mga sticky na broadcast, na nananatili pagkatapos ng broadcast. Magagawa ng mga nakakahamak na application na pabagalin o hindi maayos ang telepono sa pamamagitan ng paggamit ng masyadong maraming memorya nito."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"basahin ang data ng contact"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Pinapahintulutan ang isang application na basahin ang lahat ng mga data ng pakikipag-ugnay (address) na nakaimbak sa iyong tablet. Magagamit ito ng mga nakakahamak na application upang ipadala ang iyong data sa ibang tao."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Pinapayagan ang application na basahin ang lahat ng data ng contact (address) na nakaimbak sa iyong tablet. Maaari itong gamitin ng mga nakapanghahamak na application upang ipadala ang iyong data sa mga ibang tao."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Pinapayagan ang isang application na basahin ang lahat ng mga data ng pakikipag-ugnay (address) na nakaimbak sa iyong telepono. Magagamit ito ng mga nakakahamak na application upang ipadala ang iyong data sa ibang tao."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"sumulat ng data ng pakikipag-ugnay"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Pinapahintulutan ang isang application na baguhin ang data ng pakikipag-ugnay (address) na nakaimbak sa iyong tablet. Magagamit ito ng mga nakakahamak na application upang burahin o baguhin ang iyong data ng pakikipag-ugnay."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Pinapayagan ang application na baguhin ang data ng contact (address) na nakaimbak sa iyong tablet. Maaari itong gamitin ng mga nakapanghahamak na application upang burahin o baguhin ang data ng iyong contact."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Pinapayagan ang isang application na baguhin ang data ng pakikipag-ugny (address) na nakaimbak sa iyong telepono. Magagamit ito ng mga nakakahamak na application upang burahin o baguhin ang iyong data ng pakikipag-ugnay."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"basahin ang mga kaganapan sa kalendaryo"</string>
-    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Pinapahintulutan ang isang application na basahin ang lahat ng mga kaganapan sa kalendaryong nakaimbak sa iyong tablet. Magagamit ito ng mga nakakahamak na application upang ipadala ang iyong mga kaganapan sa kalendaryo sa ibang tao."</string>
+    <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Pinapayagan ang application na basahin ang lahat ng mga kaganapan sa kalendaryo na nakaimbak sa iyong tablet. Maaari itong gamitin ng mga nakapanghahamak na application upang ipadala ang iyong mga kaganapan sa kalendaryo sa mga ibang tao."</string>
     <string name="permdesc_readCalendar" product="default" msgid="5533029139652095734">"Pinapayagan ang isang application na basahin ang lahat ng mga kaganapan sa kalendaryong nakaimbak sa iyong telepono. Magagamit ito ng mga nakakahamak na application upang ipadala ang iyong mga kaganapan sa kalendaryo sa ibang tao."</string>
     <string name="permlab_writeCalendar" msgid="3894879352594904361">"magdagdag o baguhin ang mga kaganapan sa kalendaryo at magpadala ng email sa mga bisita"</string>
     <string name="permdesc_writeCalendar" msgid="2988871373544154221">"Pinapayagan ang isang application na magdagdag o magbago ng mga kaganapan sa iyong kalendaryo, na maaaring magpadala ng email sa mga bisita. Magagamit ito ng mga nakakahamak na application upang burahin o baguhin ang iyong mga kaganapan sa kalendaryo o magpadala ng email sa mga bisita."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"pahintulot na mag-install ng provider ng lokasyon"</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Lumikha ng mga kunwaring pinagmumulan ng lokasyon para sa pagsubok. Magagamit ito ng mga nakakahamak na application upang i-override ang lokasyon at/o katayuang ibinalik ng mga tunay na pinagmumulan ng lokasyon gaya ng GPS o mga Network provider o subaybayan at iulat ang iyong lokasyon sa panlabas na pinagmumulan."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"mahusay na (GPS) lokasyon"</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"I-access ang mahuhusay na mga pinagmumulan ng lokasyon gaya ng Global Positioning System sa tablet, kung saan available. Magagamit ito ng mga nakakahamak na application upang tukuyin kung nasaan ka, at maaaring gumamit ng karagdagang lakas ng baterya."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"I-access ang mga pinong mapagkukunan ng lokasyon gaya ng Global Positioning System sa tablet, kung saan available. Maaaring gamitin ito ng mga nakapanghahamak na application upang matukoy kung nasaan ka, at maaaring makakonsumo ng karagdagang lakas ng baterya."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"I-access ang mahuhusay na pinagmumulan ng lokasyon gaya ng Global Positioning System sa telepono, kung saan available. Magagamit ito ng mga nakakahamak na application upang tukuyin kung nasaan ka, at maaaring gumamit ng karagdagang lakas ng baterya."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"hindi tumpak na (batay sa network) lokasyon"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"I-access ang mga hindi tumpak na pinagmumulan ng lokasyon gaya ng database ng cellular network upang tumukoy ng malapit na lokasyon ng tablet, kung saan available. Magagamit ito ng mga nakakahamak na application upang tukuyin ang pinakamalapit na kinaroroonan mo."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"I-access ang mga magaspang na mapagkukunan ng lokasyon tulad ng database ng cellular network upang matukoy ang tinatayang lokasyon ng tablet, kung saan available. Maaari itong gamitin ng mga nakapanghahamak na application upang tinantyang matukoy kung nasaan ka."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"I-access ang mga hindi tumpak na pinagmumulan ng lokasyon gaya ng database ng cellular network upang tumukoy ng malapit na lokasyon ng telepono, kung saan available. Magagamit ito ng mga nakakahamak na application upang tukuyin ang pinakamalapit na kinaroroonan mo."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"i-access ang SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Pinapayagan ang application na gumamit ng mababang antas na mga tampok ng SurfaceFlinger."</string>
@@ -334,45 +330,43 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Pinapayagan ang application na baguhin ang mga setting ng global audio gaya ng lakas ng tunog at pag-route."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"mag-record ng audio"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Pinapayagan ang application na i-access ang path ng audio record."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"kumuha ng mga larawan"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Pinapayagan ang application na kumuha ng mga larawan sa camera. Pinapayagan nito ang application anumang oras na kumolekta ng mga larawang nakikita ng camera."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"kumuha ng mga larawan at video"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Pinapayagan ang application na kumuha ng mga larawan at video gamit ang camera. Pinapayagan nito ang application sa anumang oras na mangolekta ng mga larawan na nakikita ng camera."</string>
     <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"permanenteng huwag paganahin ang tablet"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"permanenteng huwag paganahin ang telepono"</string>
-    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Pinapahintulutan ang application na permanenteng huwag paganahin ang buong tablet. Napaka-mapanganib ito."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Pinapayagan ang application na permanenteng huwag paganahin ang buong tablet. Lubos na mapanganib ito."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Pinapayagan ang application na permanenteng huwag paganahin ang buong telepono. Napaka-mapanganib nito."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"puwersahang pag-reboot ng tablet"</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"puwersahin ang pag-reboot ng tablet"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"puwersahin ang pag-reboot ng telepono"</string>
-    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Pinapahintulutan ang application na puwersahing i-reboot ang tablet."</string>
+    <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Pinapayagan ang application na puwersahin ang tablet na mag-reboot."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Pinapayagan ang application na puwersahing i-reboot ang telepono."</string>
     <string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"i-mount at huwag i-mount ang mga filesystem"</string>
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Pinapayagan ang application na i-mount at i-unmount ang mga filesystem para sa naaalis na imbakan."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"i-format ang panlabas na imbakan"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Pinapayagan ang application na i-format ang naaalis na imbakan."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"kumuha ng impormasyon sa secure na imbakan"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Pinapayagan ang application na kumuha ng impormasyon sa secure na imbakan."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"lumikha ng secure na imbakan"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Pinapayagan ang application na lumikha ng secure na imbakan."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"sirain ang secure na imbakan"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Pinapayagan ang application na sirain ang secure na imbakan."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"i-mount / i-unmount ang secure na imbakan"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Pinapayagan ang application na i-mount / i-unmount ang secure na imbakan."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"palitan ang pangalan ng secure na imbakan"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Pinapayagan ang application na palitan ang pangalan ng secure na imbakan."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"kumuha ng impormasyon sa panloob na imbakan"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Pinapayagan ang application na kumuha ng impormasyon sa panloob na imbakan."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"lumikha ng panloob na imbakan"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Pinapayagan ang application na likhain ang panloob na imbakan."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"sirain ang panloob na imbakan"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Pinapayagan ang application na sirain ang panloob na imbakan."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"i-mount / i-unmount ang panloob na imbakan"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Pinapayagan ang application na i-mount / i-unmount ang panloob na imbakan."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"palitan ang pangalan ng panloob na imbakan"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Pinapayagan ang application na palitan ang pangalan ng panloob na imbakan."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"kontrolin ang vibrator"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Pinapayagan ang application na kontrolin ang vibrator."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"kontrolin ang flashlight"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Pinapayagan ang application na kontrolin ang flashlight."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"i-access ang mga USB device"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Pinapayagan ang application na i-access ang mga USB device."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"subukan ang hardware"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Pinapayagan ang application na kontrolin ang iba\'t ibang peripheral para sa layunin ng pagsubok ng hardware."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"direktang tawagan ang mga numero ng telepono"</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Pinapayagan ang application na tumawag sa mga numero ng telepono nang wala ng iyong panghihimasok. Maaarig magdulot ang mga nakakahamak na application ng mga hindi inaasahang tawag sa iyong singilin sa telepono. Tandaan na hindi nito pinapayagan ang application na tumawag sa mga pang-emergency na numero."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"direktang tawagan ang anumang numero ng telepono"</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Pinapayagan ang application na tumawag sa anumang numero ng telepono, kabilang ang mga pang-emergency na numero, nang wala ng iyong panghihimasok. Maaaring gumawa ang mga nakakahawak na application ng hindi kailangan at ilegal na tawag sa mga pang-emergency na serbisyo."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"direktang simulan ang pag-set up ng CDMA na tablet"</string>
+    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"direktang simulan ang setup ng CDMA tablet"</string>
     <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"direktang simulan ang pag-set up ng CDMA na telepono"</string>
     <string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Pinapayagan ang application na simulan ang pagprobisyon ng CDMA. Maaaring simulan ng mga nakakahamak na application ang pagprobisyon ng CDMA"</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"kotrolin ang mga notification ng pag-update ng lokasyon"</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Pinapayagan ang application na kontrolin ang mga tampok sa telepono ng device. Makakapagpalit ng mga network ang application na may ganitong pahintulot, i-on at i-off ang radyo at mga katulad nito nang hindi ka nino-notify."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"basahin ang katayuan ng telepono at pagkakakilanlan"</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Pinapayagan ang application na i-access ang mga tampok sa telepono ng device. Matutukoy ng application na may ganitong pahintulot ang numero ng telepono at serial number ng teleponong ito, kung aktibo man ang tawag, ang numerong kung saan konektado ang tawag na iyon at mga katulad nito."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"pigilan ang tablet mula sa paghinto"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"pigilan ang tablet mula sa pag-sleep"</string>
     <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"pigilan ang telepono mula sa paghinto"</string>
-    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Pinapahintulutan ang isang application na pigilan ang tablet na huminto."</string>
+    <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Pinapayagan ang application na pigilan ang tablet mula sa pag-sleep."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Pinapayagan ang isang application na pigilan ang telepono na huminto."</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"i-on o i-off ang tablet"</string>
+    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"i-on o i-off ang power tablet"</string>
     <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"i-on o i-off ang telepono"</string>
-    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Pinapahintulutan ang application na i-on o i-off ang tablet."</string>
+    <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Pinapayagan ang application na i-on o i-off ang tablet."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Pinapayagan ang application na i-on o i-off ang telepono."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"tumakbo sa factory test mode"</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Patakbuhin bilang mababang antas na pagsubok ng gumawa, na nagpapahintulot ng kumpletong access sa hardware ng tablet. Available lang kapag tumatakbo ang tablet sa test mode ng gumawa."</string>
+    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Patakbuhin bilang isang pagsubok ng mababang antas na gumagawa, na pumapayag sa kumpletong access sa hardware ng tablet. Available lang kapag tumatakbo ang isang tablet sa mode na pagsubok ng gumagawa."</string>
     <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Patakbuhin bilang mababang antas na pagsubok ng gumawa, na nagpapahintulot ng kumpletong access sa hardware ng telepono. Available lang kapag tumatakbo ang telepono sa test mode ng gumawa."</string>
     <string name="permlab_setWallpaper" msgid="6627192333373465143">"itakda ang wallpaper"</string>
     <string name="permdesc_setWallpaper" msgid="6417041752170585837">"Pinapayagan ang application na itakda ang wallpaper ng system."</string>
@@ -403,15 +397,15 @@
     <string name="permlab_masterClear" msgid="2315750423139697397">"i-reset ang system sa mga factory default"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Pinapayagan ang isang application na ganap na i-reset ang system sa mga setting ng factory nito, binubura ang lahat ng data, configuration, at mga naka-install na application."</string>
     <string name="permlab_setTime" msgid="2021614829591775646">"itakda ang oras"</string>
-    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Pinapahintulutan ang isang application na baguhin ang oras sa orasan ng tablet."</string>
+    <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Pinapayagan ang application na baguhin ang oras ng tablet."</string>
     <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Pinapayagan ang isang application na baguhin ang oras sa orasan ng telepono."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"itakda ang time zone"</string>
-    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Pinapayagan ang isang application na baguhin ang time zone ng tablet."</string>
+    <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Pinapayagan ang application na baguhin ang time zone ng tablet."</string>
     <string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Pinapayagan ang isang application na baguhin ang time zone ng telepono."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"gumanap bilang AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Pinapayagan ang isang application na tumawag sa AccountAuthenticators"</string>
     <string name="permlab_getAccounts" msgid="4549918644233460103">"tuklasin ang mga kilalang account"</string>
-    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Pinapahintulutan ang isang application na makuha ang listahan ng mga account na kilala ng tablet."</string>
+    <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Pinapayagan ang application na makuha ang listahan ng mga account na kilala ng tablet."</string>
     <string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Pinapayagan ang isang application na makuha ang listahan ng mga account na kilala ng telepono."</string>
     <string name="permlab_authenticateAccounts" msgid="3940505577982882450">"gumaganap bilang tagapagpatotoo ng account"</string>
     <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Pinapayagan ang isang application na gamitin ang mga kakayanang makapagpatotoo ng account ng AccountManager, kabilang ang paglikha ng mga account at pagkuha at pagtakda ng kanilang mga password."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"payagan ang pagtanggap ng Wi-Fi Multicast"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Pinapayagan ang isang application na tumanggap ng mga packet na hindi direktang nakatugon sa iyong device. Magiging kapaki-pakinabang ito kapag tumutuklas ng mga serbisyong inaalok sa malapit. Gumagamit ito ng higit pang baterya kaysa sa non-multicast mode."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"pangangasiwa ng bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Pinapahintulutan ang isang application na i-configure ang lokal na Bluetooth na tablet, at upang tumuklas at mapareha sa mga remote na device."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Pinapayagan ang application na i-configure ang lokal na Bluetooth tablet, at tumuklas at ipares sa mga malayuang device."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Pinapayagan ang isang application na i-configure ang lokal na Bluetooth na telepono, at upang tumuklas at mapareha sa mga remote na device."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"lumikha ng mga koneksyon ng Bluetooth"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Pinapahintulutan ang isang application na tingnan ang configuration ng lokal na Bluetooth na tablet, at upang gumawa at tumanggap ng mga koneksyon sa mga nakapares na device."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Pinapayagan ang application na tingnan ang configuration ng lokal na Bluetooth tablet, at gumawa at tumanggap ng mga koneksyon sa mga ipinares na device."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Pinapayagan ang isang application na tingnan ang configuration ng lokal na Bluetooth na telepono, at upang gumawa at tumanggap ng mga koneksyon sa mga nakapares na device."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"kontrolin ang Near Field Communication"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Pinapayagan ang application na makipagkomunika sa mga Near Field Communication (NFC) na tag, card, at reader."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"huwag paganahin ang keylock"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Pinapayagan ang isang application na huwag paganahin ang keylock at ang anumang nauugnay na seguridad sa password. Ang isang lehitimong halimbawa nito ay ang hindi pagpapagana ng telepono sa keylock kapag nakakatanggap ng papasok na tawag sa telepono, pagkatapos ay muling pagaganahin ang keylock kapag tapos na ang tawag."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"basahin ang mga setting ng sync"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Pinapayagan ang isang application na magbasa ng anumang mga pribadong salita, pangalan, at parirala na maaaring naimbak ng user sa diksyunaryo ng user."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"isulat sa diksyunaryong tinukoy ng user"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Pinapayagan ang isang application na magsulat ng mga bagong salita sa diksyunaryo ng user."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"baguhin/tanggalin ang mga nilalaman ng SD card"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"baguhin/tanggalin laman ng USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"baguhin/tanggalin ang mga nilalaman ng SD card"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Pinapayagan ang isang application na magsulat sa SD card."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Pinapayagan application na sumulat sa imbakan na USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Pinapayagan ang isang application na magsulat sa SD card."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"baguhin/tanggalin ang mga nilalaman ng panloob na imbakan ng media"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Pinapayagan ang application na baguhin ang mga nilalaman ng panloob na imbakan ng media."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"i-access ang cache filesystem"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Pinapayagan ang isang application na basahin at isulat ang cache filesystem."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Limitahan ang password"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Higpitan ang mga uri ng password na maaari mong gamitin."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Panoorin ang mga pagtatangka sa pag-login"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Subaybayan ang bilang ng mga maling password na naipasok kapag nag-unlock ng screen, at i-lock ang tablet o burahin ang lahat ng data ng tablet kung masyadong maraming maling password ang naipasok"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Subaybayan ang bilang ng mga maling password na naipasok kapag nag-unlock ng screen, at i-lock ang tablet o burahin ang lahat ng data ng tablet kung masyadong maraming maling password ang naipasok"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"I-reset ang password"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Puwersahin ang iyong password sa bagong halaga, na hinihiling na ibigay sa iyo ng administrator bago ka maka-log in."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Puwersahang i-lock"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Kontrolin kapag nag-lock ang device, hinihiling sa iyong muling ipasok ang password nito."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"gumawa/tumanggap ng mga tawag sa Internet"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Pinapayagan ang application upang gamitin ang serbisyong SIP upang gumawa/tumanggap ng mga tawag sa Internet."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Magtakda ng mga panuntunan sa password"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Kontrolin ang haba at mga character na pinapayagan sa mga password sa pag-unlock ng screen"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Subaybayan ang mga pagsubok sa pag-unlock ng screen"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Subaybayan ang bilang ng hindi tamang password na ipinasok kapag ina-unlock ang screen, at i-lock ang tablet o burahin ang lahat ng data ng telepono kung masyadong maraming hindi tamang password ang ipinasok"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Subaybayan ang bilang ng hindi tamang password na ipinasok kapag ina-unlock ang screen, at i-lock ang telepono o burahin ang lahat ng data ng telepono kung masyadong maraming hindi tamang password ang ipinasok"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Palitan ang password sa pag-unlock ng screen"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Palitan ang password sa pag-unlock ng screen"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"I-lock ang screen"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Kontrolin kung paano at kailan magla-lock ang screen"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Burahin ang lahat ng data"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Burahin ang data ng tablet nang walang babala, sa pamamagitan ng pagsasagawa ng pag-reset ng data ng factory"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Burahin ang data ng tablet nang walang babala, sa pamamagitan ng pagsasagawa ng pag-reset ng data ng factory"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Burahin ang data ng tablet nang walang babala, sa pamamagitan ng pagsasagawa ng pag-reset sa data ng factory"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Burahin ang data ng telepono nang walang babala, sa pamamagitan ng pagsasagawa ng pag-reset sa data ng factory"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Itakda ang pandaigdigang proxy ng device"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Itakda ang pandaigdigang proxy ng device na gagamitin habang pinagana ang patakaran. Tanging ang unang admin ng device ang magtatakda sa may bisang pandaigdigang proxy."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Itakda pag-expire ng password"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Kontrolin kung gaano katagal bago kailangang palitan ang password sa pag-lock ng screen"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Home"</item>
     <item msgid="869923650527136615">"Mobile"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager sa Trabaho"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Katuwang"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Custom"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Kaarawan"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Anibersaryo"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Kaganapan"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Iba pa"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Custom"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Home"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Trabaho"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Trabaho"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Iba pa"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Custom"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Custom"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistant"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Kapatid na Lalaki"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Anak"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Domestic Partner"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Ama"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Kaibigan"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Manager"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Ina"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Magulang"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Kasosyo"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Ni-refer ni"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Kamag-anak"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Kapatid na Babae"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Asawa"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Custom"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Home"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Trabaho"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Iba pa"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ipasok ang PIN code"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Ipasok ang password upang i-unlock"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Ipasok ang PIN upang i-unlock"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Maling PIN code!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Upang i-unlock, pindutin ang Menu pagkatapos ay 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Pang-emergency na numero"</string>
@@ -646,8 +609,7 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Bumalik sa tawag"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Tama!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Paumanhin, subukang muli"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Paumanhin, subukang muli"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Nagcha-charge (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Naka-charge."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -663,11 +625,9 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Naka-lock ang SIM card."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Ina-unlock ang SIM card…"</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Mali mong naguhit ang iyong pattern na pang-unlock nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. "\n\n"Pakisubukang muli sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> (na) segundo."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Nakuha mo nang mali ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%d</xliff:g> higit pang hindi matagumpay na pagtatangka, hihilingin sa iyong i-unlock ang iyong tablet gamit ang iyong pag-sign-in sa Google."\n\n" Mangyaring subukang muli sa <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Naipasok mo nang hindi tama ang iyong password ng <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. "\n\n"Pakisubukang muli pagkalipas ng <xliff:g id="NUMBER_1">%d</xliff:g> (na) segundo."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Naipasok mo nang hindi tama ang iyong PIN ng <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. "\n\n"Pakisubukang muli pagkalipas ng <xliff:g id="NUMBER_1">%d</xliff:g> (na) segundo."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Naiguhit mo nang hindi tama ang iyong pattern sa pag-unlock ng <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%d</xliff:g> pang hindi matagumpay na pagsubok, hihilingin sa iyong i-unlock ang iyong tablet gamit ang iyong pag-sign-in sa Google."\n\n" Pakisubukang muli pagkalipas ng <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Naguhit mo nang mali ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%d</xliff:g> higit pang hindi matagumpay na pagtatangka, hihingin sa iyong i-unlock ang iyong telepono gamit ang iyong pag-sign-in sa Google."\n\n" Pakisubukang muli sa loob ng <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> (na) segundo."</string>
     <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Nakalimutan ang pattern?"</string>
@@ -698,23 +658,17 @@
     <string name="double_tap_toast" msgid="1068216937244567247">"Tip: mag-double-tap upang mag-zoom in at out."</string>
     <string name="autofill_this_form" msgid="1272247532604569872">"AutoFill"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Setup AutoFill"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"basahin ang kasaysayan at mga bookmark ng Browser"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Pinapayagan ang application na basahin ang lahat ng URL na binisita ng Browser, at lahat ng bookmark ng Browser."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"isulat ang kasaysayan ng Browser at mga bookmark"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Pinapahintulutan ang isang application na baguhin ang kasaysayan o mga bookmark ng Browser na nakaimbak sa iyong tablet. Magagamit ito ng mga nakakahamak na application upang burahin o baguhin ang iyong data ng Browser."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Pinapayagan ang application na baguhin ang kasaysayan o mga bookmark ng Browser na nakaimbak sa iyong tablet. Maaari itong gamitin ng mga nakapanghahamak na application upang burahin o baguhin ang data ng iyong Browser."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Pinapayagan ang isang application na baguhin ang kasaysayan o mga bookmark ng Browser na nakaimbak sa iyong telepono. Magagamit ito ng mga nakakahamak na application upang burahin o baguhin ang iyong data ng Browser."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"itakda ang alarm sa alarm clock"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Pinapayagan ang application na magtakda ng alarm sa isang naka-install na application ng alarm clock. Maaaring hindi ipatupad ng ilang application ng alarm clock ang tampok na ito."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Baguhin ang mga pahintulot ng Browser geolocation"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Pinapayagan ang isang application na baguhin ang mga pahintulot sa geolocation ng Browser. Magagamit ito ng mga nakakahamak na application upang payagan ang pagpapadala ng impormasyon ng lokasyon sa mga hindi saklaw na web site."</string>
     <string name="save_password_message" msgid="767344687139195790">"Gusto mo bang tandaan ng browser ang password na ito?"</string>
@@ -830,25 +784,21 @@
     <string name="cut" msgid="3092569408438626261">"I-cut"</string>
     <string name="copy" msgid="2681946229533511987">"Kopyahin"</string>
     <string name="paste" msgid="5629880836805036433">"I-paste"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Walang ipe-paste"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Kopyahin ang URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Pumili ng teksto..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Pagpili ng teksto"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Pamamaraan ng pag-input"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"I-edit ang teksto"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Pagkilos ng teksto"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mababa sa espasyo"</string>
-    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Lumiliit ang espasyo ng imbakan ng tablet."</string>
+    <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Bumababa na ang puwang ng imbakan ng Tablet."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Lumiliit ang espasyo ng imbakan ng telepono."</string>
     <string name="ok" msgid="5970060430562524910">"OK"</string>
     <string name="cancel" msgid="6442560571259935130">"Kanselahin"</string>
     <string name="yes" msgid="5362982303337969312">"OK"</string>
     <string name="no" msgid="5141531044935541497">"Kanselahin"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Bigyang pansin"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Naglo-load..."</string>
     <string name="capital_on" msgid="1544682755514494298">"I-ON"</string>
     <string name="capital_off" msgid="6815870386972805832">"I-OFF"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Kumpletuhin ang pagkilos gamit ang"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Puwersahang pagsara"</string>
     <string name="report" msgid="4060218260984795706">"Ulat"</string>
     <string name="wait" msgid="7147118217226317732">"Maghintay"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Ni-redirect application"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"Tumatakbo na ngayon ang <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"Orihinal na nalunsad ang <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+    <string name="smv_application" msgid="295583804361236288">"Ang application na <xliff:g id="APPLICATION">%1$s</xliff:g> (prosesong <xliff:g id="PROCESS">%2$s</xliff:g>) ay lumabag sa sarili nitong ipinapatupad na patakarang StrictMode."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Ang prosesong <xliff:g id="PROCESS">%1$s</xliff:g> ay lumabag sa sarili nitong ipinapatupad na patakarang StrictMode."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"Tumatakbo ang <xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Piliin upang lumipat ng application"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Maglipat ng mga application?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"May tumatakbo nang isa pang application na dapat na ihinto bago ka maaaring magsimula ng isang bago."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Bumalik sa <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Huwag simulan ang bagong application."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Simulan ang <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Itigil ang lumang application nang hindi nagse-save."</string>
     <string name="sendText" msgid="5132506121645618310">"Pumili ng pagkilos para sa teksto"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Lakas ng tunog ng ringer"</string>
     <string name="volume_music" msgid="5421651157138628171">"Lakas ng tunog ng media"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Ipakita lahat"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB Mass Storage"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Nakakonekta ang USB"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Kinonekta mo ang iyong telepono sa iyong computer sa pamamagitan ng USB. Piliin ang pindutan sa ibaba kung gusto mong kumopya ng mga file sa pagitan ng iyong computer at SD card ng iyong Android."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Kinonekta mo ang iyong telepono sa iyong computer sa pamamagitan ng USB. Piliin ang pindutan sa ibaba kung gusto mong kumopya ng mga file sa pagitan ng iyong computer at SD card ng iyong Android."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Kumonekta ka sa iyong computer sa pamamagitan ng USB. Pindutin ang pindutan sa ibaba kung gusto mong kumopya ng mga file sa pagitan ng iyong computer at imbakan na USB ng iyong Android."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Kumonekta ka sa iyong computer sa pamamagitan ng USB. Pindutin ang pindutan sa ibaba kung gusto mong kumopya ng mga file sa pagitan ng iyong computer at SD card ng iyong Android."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"I-on ang USB storage"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"May problema sa paggamit ng iyong SD card para sa USB storage."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"May problema sa paggamit ng iyong SD card para sa USB storage."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"May problema sa paggamit ng iyong imbakan na USB para sa maramihang imbakan na USB."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Nagkaproblema sa paggamit ng iyong SD card para sa maramihang imbakan na USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Nakakonekta ang USB"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Piliin upang kopyahin ang mga file sa/mula sa iyong computer."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"I-off ang USB storage"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Piliin upang i-off ang USB storage."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"Ginagamit ang USB storage"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Bago i-off ang USB storage, tiyaking na-unmount (“inalis”) mo ang SD card ng iyong Android mula sa iyong computer."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Bago i-off ang imbakan na USB, tiyaking na-unmount (“na-eject”) ang imbakan na USB ng Android mula sa iyong computer."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Bago i-off ang USB storage, tiyaking na-unmount (“inalis”) mo ang SD card ng iyong Android mula sa iyong computer."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"I-off ang USB storage"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Nagkaproblema sa pag-off ng USB storage. Tingnan upang matiyak na na-unmount mo ang host ng USB, pagkatapos ay subukan muli."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Kung io-on mo ang USB storage, titigil ang ilang application na ginagamit mo at maaaring maging hindi available hanggang sa i-off mo ang USB storage."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Nabigo ang pagpapatakbo ng USB"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"I-format ang SD card"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"I-format USB storage"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"I-format ang SD card"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Sigurado ka bang gusto mong i-format ang SD card? Mawawala ang lahat ng data sa iyong card."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"I-format ang imbakan na USB, na binubura ang lahat ng mga file na nakaimbak doon? Hindi maaaring maibalik ang pagkilos!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Sigurado ka bang gusto mong i-format ang SD card? Mawawala ang lahat ng data sa iyong card."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Konektado ang debugging ng USB"</string>
@@ -960,28 +897,28 @@
     <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>"mga kandidato"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Hinahanda ang SD card"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Ihinahanda ang imbakan na USB"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Hinahanda ang SD card"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Sinusuri para sa mga error."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Blangkong SD card"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Blangkong imbakan na USB"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Blangkong SD card"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"blangko ang SD card o may hindi suportadong filesystem."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Blangko ang imbakan na USB o may hindi sinusuportahang filesystem."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"blangko ang SD card o may hindi suportadong filesystem."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Sirang SD card"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Nasirang imbakan na USB"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Sirang SD card"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Nasira ang SD card. Maaaring kailanganin mo itong i-reformat."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Nasira ang imbakan na USB. Maaaring kailangan mo itong i-reformat."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Nasira ang SD card. Maaaring kailanganin mo itong i-reformat."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Hindi inaasahang inalis ang SD card"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Di inasahan naalis USB storage"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"Hindi inaasahang inalis ang SD card"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"I-unmount ang SD card bago alisin upang maiwasan ang pagkawala ng data."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"I-unmount ang imbakan na USB bago alisin upang maiwasan ang pagkawala ng data."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"I-unmount ang SD card bago alisin upang maiwasan ang pagkawala ng data."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"ligtas na alisin ang SD card"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Ligtas na alisin imbakan na USB"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"ligtas na alisin ang SD card"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Ligtas mo nang maaalis ang SD card."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Maaari mong ligtas na alisin ang imbakan na USB."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Ligtas mo nang maaalis ang SD card."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Naalis na SD card"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Inalis na imbakan na USB"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Naalis na SD card"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Inalis ang SD card. Magpasok ng bago."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Inalis ang imbakan na USB. Magpasok ng bagong media."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"Inalis ang SD card. Magpasok ng bago."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Walang nakitang mga tumutugmang aktibidad"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"i-update ang mga istatistika ng paggamit ng nilalaman"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Ipadala"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Susunod"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Tapos na"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Nkraan"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Isakatuparan"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Mag-dial ng numero"\n"gamit ang <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Lumikha ng contact"\n"gamit ang <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Unang ibinahaging key na batay sa L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Batay sa certificate na L2TP/IPSec VPN"</string>
     <string name="upload_file" msgid="2897957172366730416">"Pumili ng file"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Walang napiling file"</string>
     <string name="reset" msgid="2448168080964209908">"I-reset"</string>
     <string name="submit" msgid="1602335572089911941">"Isumite"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Pinagana ang car mode"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Piliin upang lumabas sa car mode."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Pagsasama o aktibong hotspot"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Galawin upang i-configure"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Bumalik"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Susunod"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Laktawan"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Mataas na paggamit ng data ng mobile"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Galawin upang matuto nang higit pa tungkol sa paggamit ng data ng mobile"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Lumagpas na sa limitasyon ng data ng mobile"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Galawin upang matuto nang higit pa tungkol sa paggamit ng data ng mobile"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Walang mga tugma"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Maghanap sa pahina"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 tugma"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> ng <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Tapos na"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Ina-unmount ang imbakan na USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Ina-unmount ang SD card..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Binubura ang imbakan na USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Binubura ang SD card..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Nabigong burahin ang imbakan na USB."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Nabigong burahin ang SD card."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"Inalis ang SD card bago na-unmount."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Kasalukuyang sinusuri ang imbakan na USB."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"Kasalukuyang sinusuri ang SD card."</string>
+    <string name="media_removed" msgid="7001526905057952097">"Inalis ang SD card."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Kasalukuyang ginagamit ang imbakan na USB ng isang computer."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Kasalukuyang ginagamit ang SD card ng isang computer."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Panlabas na media sa hindi kilalang katayuan."</string>
+    <string name="share" msgid="1778686618230011964">"Ibahagi"</string>
+    <string name="find" msgid="4808270900322985960">"Hanapin"</string>
+    <string name="websearch" msgid="4337157977400211589">"Paghahanap sa Web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 625f174..0d07234 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"Harici medyanın durumu bilinmiyor."</string>
     <string name="share" msgid="1778686618230011964">"Paylaş"</string>
     <string name="find" msgid="4808270900322985960">"Bul"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"Google Web Arama"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 4f21650..93f41fd 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Голос. пошта"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Пробл. підключення чи недійсний код MMI."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Операція лише для номерів фіксованого набору."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Послугу ввімкнено."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Службу ввімкнено для:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Службу вимкнено."</string>
@@ -126,10 +125,10 @@
     <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="2292820184396262278">"Пам\'ять пристрою заповнено! Видаліть файли, щоб звільнити місце."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Пам\'ять пристр. заповнено! Видал. файли, щоб звільн. місце."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"Пам\'ять тел. заповн.! Видаліть файли, щоб звільн. місце."</string>
     <string name="me" msgid="6545696007631404292">"Я"</string>
-    <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Параметри пристрою"</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>
@@ -139,8 +138,7 @@
     <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>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Дійсно вимкнути?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Останні"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Немає останніх програм."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Парам. пристрою"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Інструм. розробника"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Функції потрібні лише для розробників програми."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Зберігання"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Доступ до карти SD."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Отрим. доступу до носія USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Доступ до карти SD."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"вимикати чи змін. рядок стану"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Дозволяє програмі вимик. рядок стану чи додавати та видаляти системні піктогр."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"рядок стану"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Дозволяє програмі бути рядком стану."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"розгорнути/згорн. рядок стану"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Дозволяє програмі розгортати чи згортати рядок стану."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"перехопл. вихідні дзвінки"</string>
@@ -196,7 +192,7 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"надсил. SMS повідом."</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Дозволяє програмі надсил. SMS повідомл. Шкідливі програми можуть спричин. збитки, надсилаючи повідомлення без вашого підтвердження."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"читати SMS або MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Дозволяє програмі читати SMS повідомлення, збережені в пристрої чи SIM-карті. Шкідливі програми можуть читати ваші конфіденційні повідомлення."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Дозволяє програмі читати SMS повідомлення, збережені в пристрої чи SIM-карті. Шкідливі програми можуть читати ваші конфіденц. повідомл."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Дозволяє програмі зчитувати SMS повідомлення, збереж. у вашому тел. чи SIM-карті. Шкідливі прогр. можуть зчит. ваші конфіденційні повід."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"редаг. SMS або MMS"</string>
     <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Дозволяє програмі змінювати SMS повідомлення, збережені в пристрої чи SIM-карті. Шкідливі програми можуть видаляти ваші повідомл."</string>
@@ -250,7 +246,7 @@
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"керувати маркерами програми"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Дозволяє програмам створ. і керувати власними маркерами, не застосовуючи звич. накладання по осі Z. Ніколи не потрібний для звичайних програм."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"натиск. клавіші чи кнопки керув."</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Дозволяє програмі надавати власні події введення (натискання клавіш тощо) іншим програмам. Шкідливі програми можуть використовувати це для контролю над пристроєм."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Дозволяє програмі надавати власні події введення (натискання клавіш тощо) іншим програмам. Шкідливі програми можуть використов. це для контролю над пристроєм."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Дозволяє програмі надавати власні події введення (натискання клавіш і т. д.) іншим програмам. Шкідливі програми можуть використ. це для контролю над телеф."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"записувати, що ви вводите та які дії викон."</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Дозволяє програмі переглядати клавіші, які ви натискаєте, навіть під час роботи з іншою програмою (наприклад, під час вводу пароля). Ніколи не потрібний для звичайних програм."</string>
@@ -281,14 +277,14 @@
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Дозволяє програмі звільняти пам\'ять телефону, видаливши файли в каталозі кешування програми. Доступ зазвичай строго обмежено системним процесом."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Переміщати ресурси програми"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Дозволяє програмі переміщувати ресурси програми з внутрішніх на зовнішні носії та навпаки."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"чит. файли сист. журналу"</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"зчит. закриті дані журн."</string>
     <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Дозволяє програмі здійснювати зчитування з різних файлів журналу системи. Це дозволяє дізнаватися загальну інформацію про ваші дії в пристрої, яка потенційно може містити особисті чи конфіденційні дані."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Дозволяє програмі здійснювати зчитування з різних файлів журналу системи. Це дозволяє дізнаватися загальну інформацію про ваші дії в пристрої, яка потенційно може містити особисті чи конфіденційні дані."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Дозволяє програмі здійснювати зчитування з різних файлів журналу системи. Це дозволяє дізнаватися загальну інформацію про ваші дії в телефоні, яка потенційно може містити особисті чи конфіденційні дані."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"чит./зап. на ресури., якими вол. діаг."</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Дозволяє програмі зчитувати та запис. на будь-який ресурс, яким володіє діагностична група; напр., файли в /dev. Це потенційно може вплинути на безпеку та стабільність системи. Це необхідно використ. ЛИШЕ для діагностики обладнання, яку виконує виробник чи оператор."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"вмикати чи вимикати компоненти програми"</string>
     <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Дозволяє програмі змінювати, чи ввімкнено компонент іншої програми. Шкідливі програми можуть використовувати це для вимкнення важливих можливостей пристрою. З цим типом дозволу треба поводитися обережно, оскільки компоненти програми можуть стати непридатними, невідповідними чи нестабільними."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Дозволяє програмі змінювати, чи ввімкнено компонент іншої програми. Шкідливі програми можуть використовувати це для вимкнення важливих можливостей пристрою. З цим типом дозволу треба поводитися обережно, оскільки компоненти програми можуть стати непридатними, невідповідними чи нестабільними."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Дозволяє програмі змінювати, чи ввімкнено компонент іншої програми. Шкідливі програми можуть використовувати це для вимкнення важливих можливостей телефону. З цим типом дозволу треба поводитися обережно, оскільки компоненти програми можуть стати непридатними, невідповідними чи нестабільними."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"установл. потрібні програми"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Дозволяє програмі змінювати ваші вибрані програми. Це може дозволити шкідливим програмам непомітно змінювати запущені програми, примушувати існуючі програми за допомогою спуфінгу збирати ваші особисті дані."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"змін. загальні налашт-ня сист."</string>
@@ -301,13 +297,13 @@
     <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Дозволяє програмі запускатися відразу після завантаження системи. Це може затримати запуск пристрою та дозволяє програмі сповільнити загальну роботу пристрою своїм постійним функціонуванням."</string>
     <string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Дозволяє програмі запускатися відразу після завантаження системи. Це може затримати запуск телефону та дозволяє програмі сповільнити загальну роботу телефону своїм постійним функціонуванням."</string>
     <string name="permlab_broadcastSticky" msgid="7919126372606881614">"надсилати закріпл. запис"</string>
-    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Дозволяє програмі надсилати закріплені записи, які залишаються після відтворення запису. Шкідливі програми можуть сповільнювати роботу пристрою, робити його нестабільним, спричиняти використання завеликої кількості пам\'яті."</string>
+    <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Дозволяє програмі надсил. закріпл. записи, які залиш. після відтвор. запису. Шкідливі прогр. можуть сповільн. роботу пристрою, робити його нестаб., спричин. викор. завеликої к-сті пам\'яті."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Дозволяє програмі надсил. закріпл. записи, які залиш. після відтвор. запису. Шкідливі програми можуть сповільн. роботу тел., робити його нестаб., спричин. викор. завеликої к-сті пам\'яті."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"читати контакт. дані"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Дозволяє програмі зчитувати всі контактні дані (адреси), збережені у вашому пристрої. Шкідливі програми можуть використовувати це для надсилання ваших даних іншим людям."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Дозволяє програмі зчитувати всі контактні дані (адреси), збережені у вашому пристрої. Шкідливі програми можуть використ. це для надсил. ваших даних іншим людям."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Дозволяє програмі зчитувати всі дані контактів (адреси), збережені у вашому тел. Шкідливі програми можуть використ. це для надсилання ваших даних іншим людям."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"запис. контактні дані"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Дозволяє програмі змінювати контактні дані (адреси), збережені в пристрої. Шкідливі програми можуть використовувати це для видалення чи зміни ваших контактних даних."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Дозволяє програмі змінювати контактні дані (адреси), збереж. в пристрої. Шкідливі програми можуть використ. це для видалення чи зміни ваших контактних даних."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Дозволяє програмі змінювати контактні дані (адресу), збереж. в телефоні. Шкідливі програми можуть використ. це для видалення чи зміни ваших контактних даних."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"читати події календаря"</string>
     <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Дозволяє програмі зчитувати всі події календаря, збережені в пристрої. Шкідливі програми можуть використовувати це для надсилання ваших подій календаря іншим людям."</string>
@@ -321,10 +317,10 @@
     <string name="permlab_installLocationProvider" msgid="6578101199825193873">"дозвіл на встановлення провайдера місцезнах."</string>
     <string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Створ. фіктивні джерела місцезн. для тестув. Шкідливі прогр. можуть викор. це для заміни місцезн. і/чи статусу, отрим. від дійсних джерел місцезн., таких як GPS або моб. операторів, а також для відстеж. і передачі вашого місцезн. зовн. джерелу."</string>
     <string name="permlab_accessFineLocation" msgid="8116127007541369477">"точне (GPS) місцезнах."</string>
-    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Отримує доступ до джерел точного місцезнаходження, наприклад системи глобального позиціонування в пристрої, де це доступно. Шкідливі програми можуть використовувати це для визначення вашого місцезнаходження та споживати додаткову енергію батареї."</string>
+    <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Отрим. доступ до джерел точного місцезн., напр. системи глоб. позиціонування в пристрої, де це доступно. Шкідливі прогр. можуть викор. це для визначення вашого місцезн. і споживати додаткову енергію батареї."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Отрим. доступ до точних джерел місцезн., таких як сист. глоб. позиціонування в тел., де це доступно. Шкідливі прогр. можуть викор. це для визнач. вашого місцезн. і споживати додаткову енергію батареї."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"приблизне (мережеве) місцезнах."</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Отримує доступ до джерел приблизного місцезнаходження, наприклад баз даних мобільної мережі, для визначення приблизного місцезнаходження пристрою, де це доступно. Шкідливі програми можуть використовувати це, щоб приблизно визначати ваше місцезнаходження."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Отрим. доступ до джерел прибл. місцезнах., напр. баз даних моб. мережі, для визначення прибл. місцезнах. пристрою, де це доступно. Шкідливі програми можуть використов. це, щоб приблизно визначати ваше місцезнах."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Отрим. доступ до джерел прибл. місцезн., напр. баз даних моб. мережі, для визначення прибл. місцезн. телефону, де це доступно. Шкідливі програми можуть використов. це, щоб приблизно визначати ваше місцезн."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"дост. до SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Дозволяє програмі викор. низькорівневі функції SurfaceFlinger."</string>
@@ -334,13 +330,13 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Дозволяє програмі змінювати заг. налашт-ня аудіо, такі як гучність і маршрутиз."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"запис-ти аудіо"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Дозволяє програмі отрим. доступ до шляху аудіозапису."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"фотографувати"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Дозоляє програмі робити знімки за допомогою камери. Це дозволяє програмі будь-коли отримувати зображення з камери."</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"фотограф. та знімати відео"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Дозоляє програмі фотографувати та знімати відео за допомогою камери. Це дозволяє програмі будь-коли отримувати зображення з камери."</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="7379164636920817963">"Дозволяє програмі остаточно вимкнути весь пристрій. Це дуже небезпечно."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Дозволяє програмі остаточно вимкнути весь телефон. Це дуже небезпечно."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"примусово перезавантажити пристрій"</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="4555793623560701557">"Дозволяє програмі примусово перезавантажувати пристрій."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Дозволяє програмі примусово перезавантажувати телефон."</string>
@@ -348,31 +344,29 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Дозволяє програмі підкл. і відкл. файлові сист. для зберіг. на знімних носіях."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"форматувати зовн. пам\'ять"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Дозволяє програмі форматувати знімну пам\'ять."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"переносити інф-ю в безпечне сховище"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Дозволяє програмі переносити інформацію в безпечне сховище."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"створ. безпечне сховище"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Дозволяє програмі створювати безпечне сховище."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"знищ. безпечне сховище"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Дозволяє програмі знищувати безпечне сховище."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"підкл./відкл. безпечне сховище"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Дозволяє програмі підключати/відключати безпечне сховище."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"переймен. безп. сховище"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Дозволяє програмі перейменовувати безпечне сховище."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"переносити інф-ю у внутрішню пам\'ять"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Дозволяє програмі переносити інформацію у внутрішню пам\'ять."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"створ. внутрішню пам\'ять"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Дозволяє програмі створювати внутрішню пам\'ять."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"знищувати внутрішню пам\'ять"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Дозволяє програмі знищувати внутрішню пам\'ять."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"підключ./відключ. внутрішню пам\'ять"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Дозволяє програмі підключати/відключати внутрішню пам\'ять."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"переймен. внутр. пам\'ять"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Дозволяє програмі перейменовувати внутрішню пам\'ять."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"контрол. вібросигн."</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Дозволяє програмі контролювати вібросигнал."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"контр. блим. світло"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Дозволяє програмі контролювати світловий сигнал."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"отр.дост.до прист.USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Дозволяє програмі отрим. доступ до пристр. USB."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"тест-ти обладн."</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Дозволяє програмі контрол. різні периферійні пристрої для тестування апаратного забезпечення."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"прямо набирати номери тел."</string>
     <string name="permdesc_callPhone" msgid="3369867353692722456">"Дозволяє програмі набирати номери телефону без вашого залучення. Шкідливі програми можуть негативно впливати на стан вашого телефонного рахунку. Зауважте, що програмі не дозволено набирати номери аварійних служб."</string>
     <string name="permlab_callPrivileged" msgid="4198349211108497879">"прямо набирати будь-які ном. тел."</string>
     <string name="permdesc_callPrivileged" msgid="244405067160028452">"Дозволяє програмі набирати будь-який номер телефону, зокрема аварійні номери, без вашого залучення. Шкідливі програми можуть здійснювати непотрібні та незаконні дзвінки до аварійних служб."</string>
-    <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"безпосередньо почати налаштування пристрою CDMA"</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="6457447676108355905">"Дозволяє програмі запускати ініціалізацію CDMA. Шкідливі програми можуть без потреби запускати ініціалізацію CDMA"</string>
     <string name="permlab_locationUpdates" msgid="7785408253364335740">"контрол. сповіщ. про оновлення місцезн."</string>
@@ -385,16 +379,16 @@
     <string name="permdesc_modifyPhoneState" msgid="3302284561346956587">"Дозволяє програмі контролювати телефонні функції пристрою. Програма з цим дозволом може змінювати мережі, вмикати та вимикати радіо телефону тощо, не повідомляючи вас."</string>
     <string name="permlab_readPhoneState" msgid="2326172951448691631">"читати стан телефону та ідентиф."</string>
     <string name="permdesc_readPhoneState" msgid="188877305147626781">"Дозволяє програмі отримувати доступ до телефонних функцій пристрою. Програма з цим дозволом може визначити номер телефону та серійний номер даного телефону, активність виклику, номер, на який робиться виклик та інше."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"не допускати перехід пристрою в режим сну"</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="4032181488045338551">"Дозволяє програмі не допускати перехід пристрою в режим сну."</string>
     <string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Дозволяє програмі не допускати перехід телефону в режим сну."</string>
-    <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"увімкнути чи вимкнути пристрій"</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="3853773100100451905">"Дозволяє програмі вимикати чи вимикати пристрій."</string>
     <string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Дозволяє програмі вимикати чи вимикати телефон."</string>
     <string name="permlab_factoryTest" msgid="3715225492696416187">"запуск у завод. реж. тест."</string>
-    <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Запускає тест виробника на низькому рівні, дозволяючи повний доступ до апаратного забезпечення пристрою. Доступно лише коли пристрій запущено в режимі тестування виробником."</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="6417041752170585837">"Дозволяє програмі встановлювати фонов. мал. системи."</string>
@@ -438,15 +432,13 @@
     <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"дозвол. отримання багатоадр. Wi-Fi"</string>
     <string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Дозволяє програмі отрим. пакети, які не адрес. безпосер. вашому пристрою. Це може бути корисно під час виявл. пропонованих служб неподалік. Викор. більше потужності, ніж не багатоадресний реж."</string>
     <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"адміністрування bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Дозволяє програмі налаштовувати локальний пристрій із Bluetooth, знаходити віддалені пристрої та створювати з ними пару."</string>
+    <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Дозволяє програмі налашт. локальний пристрій із Bluetooth, знаходити віддалені пристрої та створ. з ними пару."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Дозволяє програмі налашт. локальний телефон із Bluetooth і знаходити та створ. пару з віддаленими пристроями."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"створюв. підключення Bluetooth"</string>
     <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Дозволяє програмі переглядати конфігурацію локального пристрою з Bluetooth, створювати та приймати з\'єднання зі спареними пристроями."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Дозволяє програмі переглядати конфігурацію локального Bluetooth телефону, створювати та приймати з\'єднання зі спареними пристроями."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"контрол. Near Field Communication"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Дозволяє прогр. обмін. даними з тегами, картками та читачами екрана Near Field Communication (NFC)."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"вимик. блок. клав."</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Дозволяє програмі вимикати блокування клавіатури та будь-який пов\'язаний захист паролем. Допустимий приклад, коли телефон вимикає блокування клавіат. при отриманні вхідного дзвінка, після завершення якого блокування клавіатури відновлюється."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"чит. налашт-ня синхр."</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Дозволяє програмі зчитувати будь-які особисті вислови, назви та фрази, які користувач може зберігати в своєму словнику."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"запис. до заданого корист. словника"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Дозволяє програмі записувати до словника користувача нові слова."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"змінювати/видал. вміст карти SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"змін./видаляти вміст носія USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"змінювати/видал. вміст карти SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Дозволяє програмі записувати на карту SD."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Дозволяє програмі записувати на носій USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Дозволяє програмі записувати на карту SD."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"змін./видаляти вміст внутр. сховища медіа-файлів"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Дозволяє програмі змінювати вміст внутрішнього сховища медіа-файлів."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"отр. дост. до файл. сист. кешу"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Дозволяє програмі зчитувати та записувати файлову сист. кешу."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Обмежити пароль"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Обмежити типи паролів, дозволені для використання."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Перегляд спроб входу"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Відстежує кількість неправильних паролів, введених під час розблокування екрана, і блокує телефон або видаляє всі його дані, якщо введено забагато неправильних паролів"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Відстежує кількість неправильних паролів, введених під час розблокування екрана, і блокує телефон або видаляє всі його дані, якщо введено забагато неправильних паролів"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Змінити пароль"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Примусово присвоює паролю нове значення, що вимагає надання паролю адміністратором перед входом."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Примус. блок."</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Контрол., коли пристрій блок., вимагаючи повтор. ввести пароль."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"здійсн./отрим. Інтернет-дзвін."</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Дозволяє програмі використ. службу SIP, щоб здійсн./отрим. Інтернет-дзвінки."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Устан. правила пароля"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Контролює довжину паролів для розблокув. екрана та дозволені в них символи"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Відстежув. спроби розблок. екрана"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Відстежує кількість неправильних паролів, введених під час розблокування екрана, і блокує пристрій або видаляє всі його дані, якщо введено забагато неправильних паролів"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Відстежує кількість неправильних паролів, введених під час розблокування екрана, і блокує телефон або видаляє всі його дані, якщо введено забагато неправильних паролів"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Змінити пароль для розблокув. екрана"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Змінює пароль для розблок. екрана"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Блокувати екран"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Контролює, як і коли блокується екран"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Видалити всі дані"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Видаляє дані пристрою без попередження, відновлюючи заводські налаштування"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Видаляє дані пристрою без попередження, відновлюючи заводські налаштування"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Видаляє дані телефону без попередження, відновлюючи заводські налаштування"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Установ. глоб. проксі пристрою"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Устан. використ. глоб. проксі, коли ввімкнено політику. Лише адміністратор першого пристрою встановлює активний глоб. проксі."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Установити термін дії пароля"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Регулює, за скільки часу перед блокуванням екрана треба змінювати пароль"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Дом."</item>
     <item msgid="869923650527136615">"Мобільний"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Роб. пейджер"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Помічник"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Спеціальні"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"День нар."</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Річниця"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Подія"</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>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Роб."</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Інше"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Спеціал."</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <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="3731488827218876115">"Введіть PIN-код"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Введіть пароль, щоб розбл."</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Введ. PIN для розблок."</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Неправильний PIN-код!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Щоб розбл., натисн. меню та 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Аварійний номер"</string>
@@ -646,14 +609,13 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Поверн. до дзвін."</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Правильно!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Спробуйте ще"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Спробуйте ще"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Зарядж-ся (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Заряджено."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<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="7381499217732227295">"Нема SIM-карти."</string>
-    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"У пристрої немає 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="8874620818937719067">"Вставте SIM-карту."</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"Лише аварійні виклики"</string>
@@ -663,11 +625,9 @@
     <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="3514742106066877476">"Неправильно намальовано ключ розблокування стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n"Спробуйте ще через <xliff:g id="NUMBER_1">%d</xliff:g> сек."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Неправильно намальовано ключ розблокування стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. Ваш пристрій потрібно буде розблоковувати за допомогою входу в Google після стількох додаткових неуспішних спроб: <xliff:g id="NUMBER_1">%d</xliff:g>."\n\n" Спробуйте ще через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Неправильно введено пароль стільки разів: <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="6827749231465145590">"Неправильно введено 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="8687762517114904651">"Неправильно намал. ключ розблокування стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. Ваш пристрій потрібно буде розблок-ти за допомогою входу в Google після стількох додатк. неуспішних спроб: <xliff:g id="NUMBER_1">%d</xliff:g>."\n\n" Спробуйте ще через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Неправильно намал. ключ розблокування стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. Ваш телефон потрібно буде розблок-ти за допомогою входу в Google після стількох додатк. неуспішних спроб: <xliff:g id="NUMBER_1">%d</xliff:g>."\n\n" Спробуйте ще через <xliff:g id="NUMBER_2">%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>
@@ -696,25 +656,19 @@
     <string name="js_dialog_before_unload" msgid="1901675448179653089">"Перейти з цієї стор.?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Виберіть OK, щоб продовж., або \"Скасувати\", щоб залиш. на поточній стор."</string>
     <string name="save_password_label" msgid="6860261758665825069">"Підтверд."</string>
     <string name="double_tap_toast" msgid="1068216937244567247">"Порада: двічі нат. для збіл. або змен."</string>
-    <string name="autofill_this_form" msgid="1272247532604569872">"Автозап."</string>
+    <string name="autofill_this_form" msgid="1272247532604569872">"Автозаповн."</string>
     <string name="setup_autofill" msgid="8154593408885654044">"Налашт. автозап."</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"читати історію та закладки переглядача"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Дозволяє програмі зчитувати всі URL-адреси, на які заходив переглядач, і всі закладки переглядача."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"запис. історію та закладки переглядача"</string>
-    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Дозволяє програмі змінювати історію чи закладки веб-переглядача, збережені в пристрої. Шкідливі програми можуть використовувати це для видалення чи зміни даних веб-переглядача."</string>
+    <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Дозволяє програмі змінювати історію чи закладки веб-переглядача, збережені в пристрої. Шкідливі прогр. можуть використ. це для видалення чи зміни даних веб-переглядача."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Дозволяє програмі змінювати історію чи закладки переглядача, збережені у вашому тел. Шкідливі програми можуть викор. це, щоб видаляти чи змінювати дані переглядача."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"налашт. сигнал у будильн."</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Дозволяє програмі налаштовувати сигнал у встановленій програмі будильника. У деяких програмах будильника ця функція може не застосовуватися."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Змін. дозволи геогр. місцезн. перегладача"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Дозволяє програмі змін. дозволи географ. місцезн. переглядача. Шкідливі програми можуть використ. це, щоб дозволяти надсилати інф-ю про місцезн. випадковим веб-сайтам."</string>
     <string name="save_password_message" msgid="767344687139195790">"Хочете, щоб переглядач запам\'ятав цей пароль?"</string>
@@ -830,15 +784,12 @@
     <string name="cut" msgid="3092569408438626261">"Виріз."</string>
     <string name="copy" msgid="2681946229533511987">"Копіюв."</string>
     <string name="paste" msgid="5629880836805036433">"Вставити"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Немає що вставити"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Копіюв. URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Вибрати текст..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Вибір тексту"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Метод введення"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Редаг. текст"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Дії з текстом"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Недост. місця"</string>
     <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Пам\'яті пристрою стає недостатньо."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Пам\'яті телефону стає недостатньо."</string>
@@ -847,8 +798,7 @@
     <string name="yes" msgid="5362982303337969312">"OK"</string>
     <string name="no" msgid="5141531044935541497">"Скасувати"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Увага"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Завант-ня..."</string>
     <string name="capital_on" msgid="1544682755514494298">"УВІМК."</string>
     <string name="capital_off" msgid="6815870386972805832">"ВИМК."</string>
     <string name="whichApplication" msgid="4533185947064773386">"Завершити дію за доп."</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Примус. закр."</string>
     <string name="report" msgid="4060218260984795706">"Повідом."</string>
     <string name="wait" msgid="7147118217226317732">"Чекати"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Програму переадресовано"</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="smv_application" msgid="295583804361236288">"Програма <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="heavy_weight_notification" msgid="9087063985776626166">"Працює <xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Виберіть, щоб перейти до програми"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Переключ. між прогр.?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Уже працює інша програма, яку потрібно зупинити перед тим, як запускати нову програму."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Поверн. до <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Не запускайте нову програму."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Запуст. <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Зупинити попередню програму без збереження."</string>
     <string name="sendText" msgid="5132506121645618310">"Виберіть дію для тексту"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Гучність дзвінка"</string>
     <string name="volume_music" msgid="5421651157138628171">"Гучність медіа"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Показ. всі"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB великої ємності"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Підкл. через USB"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Ваш телефон було підключено до комп\'ютера за допомогою USB. Натисніть кнопку нижче, якщо хочете скопіювати файли з комп\'ютера на карту SD вашого Android."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Ваш телефон було підключено до комп\'ютера за допомогою USB. Натисніть кнопку нижче, якщо хочете скопіювати файли з комп\'ютера на карту SD вашого Android."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Ви підключилися до комп\'ютера за допомогою USB. Торкніться кнопки нижче, якщо хочете скопіювати файли з комп\'ютера на носій USB вашого пристрою Android або навпаки."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Ви підключилися до комп\'ютера за допомогою USB. Торкніться кнопки нижче, якщо хочете скопіювати файли з комп\'ютера на карту SD вашого пристрою Android або навпаки."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Увімкнути носій USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Виникла проблема з використанням карти SD для носія USB."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Виникла проблема з використанням карти SD для носія USB."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Виникла проблема з використанням носія USB замість носія USB великої ємності."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Виникла проблема з викор. карти SD замість носія USB вел. ємн."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Підкл. через USB"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Виберіть, щоб скопіюв. файли на/з вашого комп."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Вимкнути носій USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Виберіть, щоб вимкнути носій USB."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"Носій USB зайнято"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Перед вимкненням носія USB переконайтеся, що ви відключили (\"вийняли\") карту SD свого Android із комп\'ютера."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Перед вимкненням носія USB переконайтеся, що ви відключили від комп\'ютера (\"вийняли\") носій USB вашого пристрою Android."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Перед вимкненням носія USB переконайтеся, що ви відключили (\"вийняли\") карту SD свого Android із комп\'ютера."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Вимкнути носій USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Під час вимкнення носія USB виникла проблема. Перевірте, чи ви відключили USB-хост, після чого спробуйте знову."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Якщо ввімкнути носій USB, деякі програми, які викор., припинять свою роботу та можуть бути недоступними до вимкнення носія USB."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Помилка операції з USB"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Формат. карти SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Форматув. носій USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Формат. карти SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Ви дійсно хочете форматувати карту SD? Усі дані на вашій карті буде втрачено."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Форматувати носій USB, видаляючи всі збережені файли? Дію не можна скасувати!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Ви дійсно хочете форматувати карту SD? Усі дані на вашій карті буде втрачено."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Форматув."</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Налагодження USB підключ."</string>
@@ -960,28 +897,28 @@
     <string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
     <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
     <string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Пригот-ня карти SD"</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>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Порожня карта SD"</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>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Карта SD порожня чи має непідтрим. файл. сист."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Носій USB порожній або має непідтримувану файлову систему."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"Карта SD порожня чи має непідтрим. файл. сист."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Пошкодж. карта 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>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Карту SD пошкоджено. Її треба ще раз відформат."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Носій USB пошкоджено. Його треба ще раз відформатувати."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Карту SD пошкоджено. Її треба ще раз відформат."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Карту 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>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Відключ. карту 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>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Карту 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>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Можна безпечно вилучити карту 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>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Вилучена карта 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>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Карту 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="4168820609403385789">"Не знайдено відповідних дій"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"оновл. статистику викор. компонентів"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Надісл."</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Далі"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Готово"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Назад"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Запустити"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Набр. номер"\n", викор. <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Створ. контакт"\n", викор. <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Спільн. ключ на осн. L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN на осн. сертифіката"</string>
     <string name="upload_file" msgid="2897957172366730416">"Виберіть файл"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <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="668663626721675614">"Вибер. для вих. з реж.авто."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Прив\'язка чи точка дост. активна"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Натисн., щоб налашт."</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <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="2609734763845705708">"Натисн., щоб дізнатися про викор. моб. даних"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Перевищено ліміт моб. даних"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Натисн., щоб дізнатися про викор. моб. даних"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <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="INDEX">%d</xliff:g> з <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Готово"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Відключення носія USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Відключення карти SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Очищення носія USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Очищення карти SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Помилка очищення носія USB."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Помилка очищення карти 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">"Наразі комп\'ютер використовує карту SD."</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>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index fcdbf1c..997eb37 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -34,8 +34,7 @@
     <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Thư thoại"</string>
     <string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
     <string name="mmiError" msgid="5154499457739052907">"Sự cố kết nối hoặc mã MMI không hợp lệ."</string>
-    <!-- no translation found for mmiFdnError (5224398216385316471) -->
-    <skip />
+    <string name="mmiFdnError" msgid="5224398216385316471">"Chỉ hạn chế thao tác đối với số quay số định sẵn."</string>
     <string name="serviceEnabled" msgid="8147278346414714315">"Dịch vụ đã được bật."</string>
     <string name="serviceEnabledFor" msgid="6856228140453471041">"Dịch vụ đã được bật cho:"</string>
     <string name="serviceDisabled" msgid="1937553226592516411">"Dịch vụ đã bị vô hiệu hoá."</string>
@@ -126,7 +125,7 @@
     <string name="contentServiceSync" msgid="8353523060269335667">"Đồng bộ hoá"</string>
     <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Đồng bộ hoá"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Quá nhiều lần xoá <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
-    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Bộ nhớ máy tính bảng đã đầy! Hãy xóa một số tệp để tạo thêm dung lượng."</string>
+    <string name="low_memory" product="tablet" msgid="2292820184396262278">"Bộ nhớ máy tính bảng đã đầy! Hãy xóa một số tệp để giải phóng dung lượng."</string>
     <string name="low_memory" product="default" msgid="6632412458436461203">"Bộ nhớ điện thoại đã đầy! Hãy xoá một số tệp để tạo thêm dung lượng."</string>
     <string name="me" msgid="6545696007631404292">"Tôi"</string>
     <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tùy chọn máy tính bảng"</string>
@@ -139,8 +138,7 @@
     <string name="shutdown_progress" msgid="2281079257329981203">"Đang tắt…"</string>
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Máy tính bảng của bạn sẽ tắt."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Điện thoại của bạn sẽ tắt."</string>
-    <!-- no translation found for shutdown_confirm_question (6656441286856415014) -->
-    <skip />
+    <string name="shutdown_confirm_question" msgid="6656441286856415014">"Bạn có muốn tắt không?"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Gần đây"</string>
     <string name="no_recent_tasks" msgid="279702952298056674">"Không có ứng dụng nào gần đây."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Tùy chọn máy tính bảng"</string>
@@ -177,14 +175,12 @@
     <string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Công cụ phát triển"</string>
     <string name="permgroupdesc_developmentTools" msgid="9056431193893809814">"Các tính năng chỉ cần cho nhà phát triển ứng dụng."</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Dung lượng"</string>
-    <!-- outdated translation 9203302214915355774 -->     <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Truy cập thẻ SD."</string>
+    <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Truy cập bộ nhớ USB."</string>
     <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Truy cập thẻ SD."</string>
     <string name="permlab_statusBar" msgid="7417192629601890791">"vô hiệu hoá hoặc sửa đổi thanh trạng thái"</string>
     <string name="permdesc_statusBar" msgid="1365473595331989732">"Cho phép ứng dụng vô hiệu hoá thanh trạng thái hoặc thêm và xoá biểu tượng hệ thống."</string>
-    <!-- no translation found for permlab_statusBarService (7247281911387931485) -->
-    <skip />
-    <!-- no translation found for permdesc_statusBarService (4097605867643520920) -->
-    <skip />
+    <string name="permlab_statusBarService" msgid="7247281911387931485">"thanh trạng thái"</string>
+    <string name="permdesc_statusBarService" msgid="4097605867643520920">"Cho phép ứng dụng là thanh trạng thái."</string>
     <string name="permlab_expandStatusBar" msgid="1148198785937489264">"mở rộng/thu gọn thanh trạng thái"</string>
     <string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Cho phép ứng dụng mở rộng hoặc thu gọn thanh trạng thái."</string>
     <string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"chặn các cuộc gọi đi"</string>
@@ -196,7 +192,7 @@
     <string name="permlab_sendSms" msgid="5600830612147671529">"gửi tin nhắn SMS"</string>
     <string name="permdesc_sendSms" msgid="1946540351763502120">"Cho phép ứng dụng gửi tin nhắn SMS. Các ứng dụng độc hại có thể khiến bạn tốn tiền bằng cách gửi tin nhắn mà không cần xác nhận của bạn."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"đọc SMS hoặc MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Cho phép ứng dụng đọc tin nhắn SMS được lưu trữ trên máy tính bảng hoặc trên thẻ SIM của bạn. Các ứng dụng độc hại có thể đọc tin nhắn bí mật của bạn."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Cho phép ứng dụng đọc tin nhắn SMS được lưu trữ trên máy tính bảng hoặc thẻ SIM của bạn. Các ứng dụng độc hại có thể đọc tin nhắn bí mật của bạn."</string>
     <string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Cho phép ứng dụng đọc tin nhắn SMS được lưu trữ trên điện thoại hoặc thẻ SIM của bạn. Các ứng dụng độc hại có thể đọc tin nhắn bí mật của bạn."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"chỉnh sửa SMS hoặc MMS"</string>
     <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Cho phép ứng dụng ghi vào tin nhắn SMS được lưu trữ trên máy tính bảng hoặc thẻ SIM của bạn. Các ứng dụng độc hại có thể xóa tin nhắn của bạn."</string>
@@ -226,7 +222,7 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"ngăn chuyển đổi ứng dụng"</string>
     <string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Ngăn người dùng chuyển sang ứng dụng khác."</string>
     <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"giám sát và kiểm soát tất cả khởi chạy ứng dụng"</string>
-    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Cho phép ứng dụng giám sát và kiểm soát cách hệ thống khởi chạy các hoạt động. Các ứng dụng độc hại hoàn toàn có thể làm tổn hại hệ thống. Quyền này chỉ cần cho việc phát triển, không bao giờ dùng cho việc sử dụng thông thường."</string>
+    <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Cho phép ứng dụng giám sát và kiểm soát cách hệ thống khởi chạy các hoạt động. Các ứng dụng độc hại có thể làm tổn hại hoàn toàn hệ thống. Quyền này chỉ cần cho việc phát triển, không bao giờ dùng cho việc sử dụng thông thường."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"gửi truyền phát đã xoá của gói"</string>
     <string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Cho phép ứng dụng truyền phát thông báo rằng gói ứng dụng đã bị xoá. Các ứng dụng độc hại có thể sử dụng quyền này để loại bỏ mọi ứng dụng đang chạy khác."</string>
     <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"gửi truyền phát SMS nhận được"</string>
@@ -250,7 +246,7 @@
     <string name="permlab_manageAppTokens" msgid="17124341698093865">"quản lý mã thông báo ứng dụng"</string>
     <string name="permdesc_manageAppTokens" msgid="977127907524195988">"Cho phép ứng dụng tạo và quản lý các mã thông báo riêng của mình, chuyển đổi thứ tự Z thông thường. Không cần thiết cho các ứng dụng thông thường."</string>
     <string name="permlab_injectEvents" msgid="1378746584023586600">"nhấn phím và kiểm soát các nút"</string>
-    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Cho phép ứng dụng phân phát các sự kiện nhập của riêng ứng dụng (số lần nhấn phím. v.v.) đến các ứng dụng khác. Các ứng dụng độc hại có thể sử dụng quyền này để kiểm soát máy tính bảng."</string>
+    <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Cho phép ứng dụng phân phát các sự kiện nhập của riêng ứng dụng (số lần nhấn phím. v.v..) đến các ứng dụng khác. Các ứng dụng độc hại có thể sử dụng quyền này để kiểm soát máy tính bảng."</string>
     <string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Cho phép ứng dụng phân phát các sự kiện nhập của riêng ứng dụng (số lần nhấn phím. v.v..) đến các ứng dụng khác. Các ứng dụng độc hại có thể sử dụng quyền này để kiểm soát điện thoại."</string>
     <string name="permlab_readInputState" msgid="469428900041249234">"ghi lại nội dung bạn nhập và tác vụ bạn thực hiện"</string>
     <string name="permdesc_readInputState" msgid="5132879321450325445">"Cho phép ứng dụng xem các phím bạn nhấn ngay cả khi tương tác với ứng dụng khác (chẳng hạn như nhập mật khẩu). Không cần thiết cho các ứng dụng thông thường."</string>
@@ -277,18 +273,18 @@
     <string name="permlab_installPackages" msgid="335800214119051089">"cài đặt trực tiếp ứng dụng"</string>
     <string name="permdesc_installPackages" msgid="526669220850066132">"Cho phép ứng dụng cài đặt các gói Android mới hoặc đã được cập nhật. Các ứng dụng độc hại có thể sử dụng quyền này để thêm ứng dụng mới có quyền mạnh mẽ tuỳ ý."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"xoá tất cả dữ liệu bộ nhớ cache của ứng dụng"</string>
-    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Cho phép ứng dụng tạo thêm dung lượng máy tính bảng bằng cách xóa các tệp trong thư mục bộ nhớ cache ứng dụng. Quyền truy cập thường rất hạn chế đối với quy trình hệ thống."</string>
+    <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Cho phép ứng dụng giải phóng bộ nhớ máy tính bảng bằng cách xóa các tệp trong thư mục bộ nhớ cache ứng dụng. Quyền truy cập thường rất hạn chế đối với quy trình hệ thống."</string>
     <string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Cho phép ứng dụng tạo thêm dung lượng điện thoại bằng cách xoá các tệp trong thư mục bộ nhớ cache ứng dụng. Quyền truy cập thường rất hạn chế đối với quy trình hệ thống."</string>
     <string name="permlab_movePackage" msgid="728454979946503926">"Chuyển tài nguyên của ứng dụng"</string>
     <string name="permdesc_movePackage" msgid="6323049291923925277">"Cho phép ứng dụng di chuyển các tài nguyên của ứng dụng từ phương tiện truyền thông bên trong ra phương tiện bên ngoài và ngược lại."</string>
-    <!-- outdated translation 4811921703882532070 -->     <string name="permlab_readLogs" msgid="6615778543198967614">"đọc tệp nhật ký hệ thống"</string>
+    <string name="permlab_readLogs" msgid="6615778543198967614">"đọc dữ liệu nhật ký nhạy cảm"</string>
     <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Cho phép ứng dụng đọc từ nhiều tệp nhật ký khác nhau của hệ thống. Quyền này cho phép ứng dụng phát hiện thông tin chung về những gì bạn đang thực hiện với máy tính bảng, có thể bao gồm thông tin cá nhân hoặc riêng tư."</string>
-    <!-- outdated translation 4077356893924755294 -->     <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Cho phép ứng dụng đọc từ nhiều tệp nhật ký khác nhau của hệ thống. Quyền này cho phép ứng dụng phát hiện thông tin chung về những gì bạn đang thực hiện với máy tính bảng, có thể bao gồm thông tin cá nhân hoặc riêng tư."</string>
+    <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Cho phép ứng dụng đọc từ nhiều tệp nhật ký khác nhau của hệ thống. Quyền này cho phép ứng dụng phát hiện thông tin chung về những gì bạn đang thực hiện với điện thoại, có thể bao gồm thông tin cá nhân hoặc riêng tư."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"đọc/ghi vào tài nguyên do chẩn đoán sở hữu"</string>
     <string name="permdesc_diagnostic" msgid="3121238373951637049">"Cho phép ứng dụng đọc và ghi vào bất kỳ tài nguyên nào do nhóm chẩn đoán sở hữu; ví dụ: các tệp trong /dev. Quyền này có thể ảnh hưởng đến sự ổn định và bảo mật của hệ thống. CHỈ nên sử dụng quyền này cho các chẩn đoán phần cứng cụ thể bởi nhà sản xuất hoặc nhà cung cấp dịch vụ."</string>
     <string name="permlab_changeComponentState" msgid="79425198834329406">"bật hoặc vô hiệu hoá các thành phần ứng dụng"</string>
-    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Cho phép ứng dụng thay đổi việc có nên bật thành phần của ứng dụng khác hay không. Các ứng dụng độc hại có thể sử dụng quyền này để vô hiệu hóa các tính năng quan trọng của máy tính bảng. Phải cẩn thận khi sử dụng quyền này vì nó có thể khiến các thành phần của ứng dụng rơi vào trạng thái không sử dụng được, không đồng nhất hoặc không ổn định."</string>
-    <!-- outdated translation 4647419365510068321 -->     <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Cho phép ứng dụng thay đổi việc có nên bật thành phần của ứng dụng khác hay không. Các ứng dụng độc hại có thể sử dụng quyền này để vô hiệu hóa các tính năng quan trọng của máy tính bảng. Phải cẩn thận khi sử dụng quyền này vì nó có thể khiến các thành phần của ứng dụng rơi vào trạng thái không sử dụng được, không đồng nhất hoặc không ổn định."</string>
+    <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Cho phép ứng dụng thay đổi việc có nên bật thành phần của ứng dụng khác hay không. Các ứng dụng độc hại có thể sử dụng quyền này để vô hiệu hóa các tính năng quan trọng của máy tính bảng. Phải cẩn thận khi sử dụng quyền này vì nó có thể khiến các thành phần rơi vào trạng thái không sử dụng được, không đồng nhất hoặc không ổn định."</string>
+    <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Cho phép ứng dụng thay đổi việc có nên bật thành phần của ứng dụng khác hay không. Các ứng dụng độc hại có thể sử dụng quyền này để vô hiệu hóa các tính năng quan trọng của điện thoại. Phải cẩn thận khi sử dụng các quyền vì nó có thể khiến các thành phần ứng dụng rơi vào trạng thái không sử dụng được, không đồng nhất hoặc không ổn định."</string>
     <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"đặt ứng dụng ưa thích"</string>
     <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Cho phép ứng dụng sửa đổi các ứng dụng ưa thích của bạn. Quyền này có thể cho phép các ứng dụng độc hại ngầm thay đổi các ứng dụng đã được chạy, giả mạo các ứng dụng hiện có để thu thập dữ liệu cá nhân của bạn."</string>
     <string name="permlab_writeSettings" msgid="1365523497395143704">"sửa đổi cài đặt hệ thống chung"</string>
@@ -304,10 +300,10 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Cho phép ứng dụng gửi truyền phát hấp dẫn người xem, tiếp tục sau khi truyền phát kết thúc. Các ứng dụng độc hại có thể làm cho máy tính bảng bị chậm hoặc không ổn định bằng cách khiến ứng dụng sử dụng quá nhiều bộ nhớ."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Cho phép ứng dụng gửi truyền phát hấp dẫn người xem, tiếp tục sau khi truyền phát kết thúc. Các ứng dụng độc hại có thể làm cho điện thoại bị chậm hoặc không ổn định bằng cách khiến ứng dụng sử dụng quá nhiều bộ nhớ."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"đọc dữ liệu liên hệ"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Cho phép ứng dụng đọc tất cả dữ liệu liên hệ (địa chỉ) được lưu trữ trên máy tính bảng của bạn. Các ứng dụng độc hại có thể sử dụng quyền này để gửi dữ liệu của bạn cho những người khác."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Cho phép ứng dụng đọc tất cả dữ liệu (địa chỉ) liên hệ được lưu trữ trong máy tính bảng của bạn. Các ứng dụng độc hại có thể sử dụng quyền này để gửi dữ liệu của bạn cho những người khác."</string>
     <string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Cho phép ứng dụng đọc tất cả dữ liệu liên hệ (địa chỉ) được lưu trữ trên điện thoại của bạn. Các ứng dụng độc hại có thể sử dụng quyền này để gửi dữ liệu của bạn cho những người khác."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"ghi dữ liệu liên hệ"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Cho phép ứng dụng sửa đổi dữ liệu liên hệ (địa chỉ) được lưu trữ trên máy tính bảng của bạn. Các ứng dụng độc hại có thể sử dụng quyền này để xóa hoặc sửa đổi dữ liệu liên hệ của bạn."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Cho phép ứng dụng sửa đổi dữ liệu (địa chỉ) liên hệ được lưu trữ trên máy tính bảng của bạn. Các ứng dụng độc hại có thể sử dụng quyền này để xóa hoặc sửa đổi dữ liệu liên hệ của bạn."</string>
     <string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Cho phép ứng dụng sửa đổi dữ liệu liên hệ (địa chỉ) được lưu trữ trên điện thoại của bạn. Các ứng dụng độc hại có thể sử dụng quyền này để xoá hoặc sửa đổi dữ liệu liên hệ của bạn."</string>
     <string name="permlab_readCalendar" msgid="6898987798303840534">"Đọc sự kiện lịch"</string>
     <string name="permdesc_readCalendar" product="tablet" msgid="5905870265734599678">"Cho phép ứng dụng đọc tất cả các sự kiện lịch được lưu trữ trên máy tính bảng của bạn. Các ứng dụng độc hại có thể sử dụng quyền này để gửi các sự kiện lịch của bạn cho những người khác."</string>
@@ -324,7 +320,7 @@
     <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Truy cập các nguồn vị trí chính xác như Hệ thống định vị toàn cầu trên máy tính bảng, nếu có. Các ứng dụng độc hại có thể sử dụng quyền này để xác định vị trí của bạn và có thể tốn thêm nguồn pin."</string>
     <string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Truy cập các nguồn vị trí chính xác như Hệ thống Định vị Toàn cầu trên điện thoại, nếu có. Các ứng dụng độc hại có thể sử dụng quyền này để xác định vị trí của bạn và có thể tốn thêm nguồn pin."</string>
     <string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"vị trí (dựa trên mạng) tổng thể"</string>
-    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Truy cập các nguồn vị trí tổng thể chẳng hạn như cơ sở dữ liệu mạng di động nhằm xác định vị trí gần đúng của máy tính bảng, nếu có. Các ứng dụng độc hại có thể sử dụng quyền này để xác định vị trí gần đúng của bạn."</string>
+    <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Truy cập các nguồn vị trí gần đúng chẳng hạn như cơ sở dữ liệu mạng di động nhằm xác định vị trí gần đúng của máy tính bảng, nếu có. Các ứng dụng độc hại có thể sử dụng quyền này để xác định vị trí gần đúng của bạn."</string>
     <string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Truy cập các nguồn vị trí tổng thể chẳng hạn như cơ sở dữ liệu mạng di động nhằm xác định vị trí gần đúng của điện thoại, nếu có. Các ứng dụng độc hại có thể sử dụng quyền này để xác định vị trí gần đúng của bạn."</string>
     <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"truy cập SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Cho phép ứng dụng sử dụng các tính năng cấp thấp của SurfaceFlinger."</string>
@@ -334,13 +330,13 @@
     <string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Cho phép ứng dụng sửa đổi cài đặt âm thanh chung chẳng hạn như âm lượng và định tuyến."</string>
     <string name="permlab_recordAudio" msgid="3876049771427466323">"ghi âm thanh"</string>
     <string name="permdesc_recordAudio" msgid="6493228261176552356">"Cho phép ứng dụng truy cập vào đường dẫn bản ghi âm thanh."</string>
-    <!-- outdated translation 8059288807274039014 -->     <string name="permlab_camera" msgid="3616391919559751192">"chụp ảnh"</string>
-    <!-- outdated translation 9013476258810982546 -->     <string name="permdesc_camera" msgid="6004878235852154239">"Cho phép ứng dụng chụp ảnh bằng máy ảnh. Quyền này cho phép ứng dụng thu thập ảnh mà máy ảnh chụp vào bất kỳ thời điểm nào."</string>
-    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"vô hiệu hóa máy tính bảng vĩnh viễn"</string>
+    <string name="permlab_camera" msgid="3616391919559751192">"chụp ảnh và quay video"</string>
+    <string name="permdesc_camera" msgid="6004878235852154239">"Cho phép ứng dụng chụp ảnh và quay video bằng máy ảnh. Quyền này cho phép ứng dụng thu thập ảnh mà máy ảnh chụp vào bất kỳ thời điểm nào."</string>
+    <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"vô hiệu hóa vĩnh viễn máy tính bảng"</string>
     <string name="permlab_brick" product="default" msgid="8337817093326370537">"vĩnh viễn vô hiệu hoá điện thoại"</string>
-    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Cho phép ứng dụng vô hiệu hóa toàn bộ máy tính bảng vĩnh viễn. Việc này rất nguy hiểm."</string>
+    <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Cho phép ứng dụng vô hiệu hóa vĩnh viễn toàn bộ máy tính bảng. Việc này rất nguy hiểm."</string>
     <string name="permdesc_brick" product="default" msgid="5569526552607599221">"Cho phép ứng dụng vô hiệu hoá vĩnh viễn toàn bộ điện thoại. Việc này rất nguy hiểm."</string>
-    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"bắt buộc khởi động lại máy tính bảng"</string>
+    <string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"buộc máy tính bảng khởi động lại"</string>
     <string name="permlab_reboot" product="default" msgid="2898560872462638242">"buộc khởi động lại điện thoại"</string>
     <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Cho phép ứng dụng buộc máy tính bảng khởi động lại."</string>
     <string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Cho phép ứng dụng buộc điện thoại khởi động lại."</string>
@@ -348,24 +344,22 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Cho phép ứng dụng lắp và tháo các hệ thống tệp cho bộ nhớ di động."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"định dạng bộ nhớ bên ngoài"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Cho phép ứng dụng định dạng bộ nhớ di động."</string>
-    <!-- outdated translation 1070364079249834666 -->     <string name="permlab_asec_access" msgid="3411338632002193846">"nhận thông tin trên bộ lưu trữ an toàn"</string>
-    <!-- outdated translation 7691616292170590244 -->     <string name="permdesc_asec_access" msgid="8820326551687285439">"Cho phép ứng dụng nhận thông tin trên bộ lưu trữ an toàn."</string>
-    <!-- outdated translation 7312078032326928899 -->     <string name="permlab_asec_create" msgid="6414757234789336327">"tạo bộ lưu trữ an toàn"</string>
-    <!-- outdated translation 7041802322759014035 -->     <string name="permdesc_asec_create" msgid="2621346764995731250">"Cho phép ứng dụng tạo bộ lưu trữ an toàn."</string>
-    <!-- outdated translation 7787322878955261006 -->     <string name="permlab_asec_destroy" msgid="526928328301618022">"huỷ bỏ bộ lưu trữ an toàn"</string>
-    <!-- outdated translation 5740754114967893169 -->     <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Cho phép ứng dụng huỷ bỏ bộ lưu trữ an toàn."</string>
-    <!-- outdated translation 7517449694667828592 -->     <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"lắp / tháo bộ lưu trữ an toàn"</string>
-    <!-- outdated translation 5438078121718738625 -->     <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Cho phép ứng dụng lắp / tháo bộ lưu trữ an toàn."</string>
-    <!-- outdated translation 5685344390439934495 -->     <string name="permlab_asec_rename" msgid="7496633954080472417">"đổi tên bộ lưu trữ an toàn"</string>
-    <!-- outdated translation 1387881770708872470 -->     <string name="permdesc_asec_rename" msgid="2152829985238876790">"Cho phép ứng dụng đổi tên bộ lưu trữ an toàn."</string>
+    <string name="permlab_asec_access" msgid="3411338632002193846">"nhận thông tin trên bộ nhớ trong"</string>
+    <string name="permdesc_asec_access" msgid="8820326551687285439">"Cho phép ứng dụng nhận thông tin trên bộ nhớ trong."</string>
+    <string name="permlab_asec_create" msgid="6414757234789336327">"tạo bộ nhớ trong"</string>
+    <string name="permdesc_asec_create" msgid="2621346764995731250">"Cho phép ứng dụng tạo bộ nhớ trong."</string>
+    <string name="permlab_asec_destroy" msgid="526928328301618022">"hủy bỏ bộ nhớ trong"</string>
+    <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Cho phép ứng dụng hủy bỏ bộ nhớ trong."</string>
+    <string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"kết nối / ngắt kết nối bộ nhớ trong"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Cho phép ứng dụng kết nối / ngắt kết nối bộ nhớ trong."</string>
+    <string name="permlab_asec_rename" msgid="7496633954080472417">"đổi tên bộ nhớ trong"</string>
+    <string name="permdesc_asec_rename" msgid="2152829985238876790">"Cho phép ứng dụng đổi tên bộ nhớ trong."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"kiểm soát bộ rung"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Cho phép ứng dụng kiểm soát bộ rung."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"kiểm soát đèn nháy"</string>
     <string name="permdesc_flashlight" msgid="6433045942283802309">"Cho phép ứng dụng kiểm soát đèn nháy."</string>
-    <!-- no translation found for permlab_accessUsb (7362327818655760496) -->
-    <skip />
-    <!-- no translation found for permdesc_accessUsb (2414271762914049292) -->
-    <skip />
+    <string name="permlab_accessUsb" msgid="7362327818655760496">"truy cập bộ nhớ USB"</string>
+    <string name="permdesc_accessUsb" msgid="2414271762914049292">"Cho phép ứng dụng truy cập thiết bị USB."</string>
     <string name="permlab_hardware_test" msgid="4148290860400659146">"kiểm tra phần cứng"</string>
     <string name="permdesc_hardware_test" msgid="3668894686500081699">"Cho phép ứng dụng kiểm soát các thiết bị ngoại vi khác nhau nhằm mục đích kiểm tra phần cứng."</string>
     <string name="permlab_callPhone" msgid="3925836347681847954">"gọi trực tiếp số điện thoại"</string>
@@ -441,12 +435,10 @@
     <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Cho phép ứng dụng định cấu hình máy tính bảng Bluetooth nội hạt cũng như phát hiện và ghép nối với các thiết bị từ xa."</string>
     <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Cho phép ứng dụng định cấu hình điện thoại Bluetooth nội hạt cũng như phát hiện và ghép nối với các thiết bị từ xa."</string>
     <string name="permlab_bluetooth" msgid="8361038707857018732">"tạo kết nối Bluetooth"</string>
-    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Cho phép ứng dụng xem cấu hình của máy tính bảng Bluetooth nội hạt cũng như tạo và chấp nhận các kết nối với các thiết bị được ghép nối."</string>
+    <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Cho phép ứng dụng xem cấu hình của máy tính bảng Bluetooth nội hạt cũng như tạo và chấp nhận kết nối với các thiết bị được ghép nối."</string>
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Cho phép ứng dụng xem cấu hình của điện thoại Bluetooth nội hạt cũng như tạo và chấp nhận các kết nối với các thiết bị được ghép nối."</string>
-    <!-- no translation found for permlab_nfc (4423351274757876953) -->
-    <skip />
-    <!-- no translation found for permdesc_nfc (9171401851954407226) -->
-    <skip />
+    <string name="permlab_nfc" msgid="4423351274757876953">"kiểm soát Liên lạc trường gần"</string>
+    <string name="permdesc_nfc" msgid="9171401851954407226">"Cho phép ứng dụng liên lạc với thẻ Liên lạc trường gần (NFC), thẻ và trình đọc."</string>
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"vô hiệu hoá khoá phím"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Cho phép ứng dụng vô hiệu hoá khoá phím và bất kỳ bảo mật mật khẩu được liên kết nào. Ví dụ thích hợp của việc này là điện thoại vô hiệu hoá khoá phím khi nhận được cuộc gọi đến sau đó bật lại khoá phím khi cuộc gọi kết thúc."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"đọc cài đặt đồng bộ hoá"</string>
@@ -463,40 +455,32 @@
     <string name="permdesc_readDictionary" msgid="1082972603576360690">"Cho phép ứng dụng đọc bất kỳ từ, tên và cụm từ riêng nào mà người dùng có thể đã lưu trữ trong từ điển của người dùng."</string>
     <string name="permlab_writeDictionary" msgid="6703109511836343341">"ghi vào từ điển do người dùng xác định"</string>
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Cho phép ứng dụng ghi từ mới vào từ điển của người dùng."</string>
-    <!-- outdated translation 8079403759001777291 -->     <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"sửa đổi/xoá nội dung thẻ SD"</string>
+    <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"sửa đổi/xóa nội dung bộ nhớ USB"</string>
     <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"sửa đổi/xoá nội dung thẻ SD"</string>
-    <!-- outdated translation 6643963204976471878 -->     <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Cho phép ứng dụng ghi vào thẻ SD."</string>
+    <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"C.phép ứ.dụng ghi vào b.nhớ USB."</string>
     <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Cho phép ứng dụng ghi vào thẻ SD."</string>
-    <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) -->
-    <skip />
-    <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) -->
-    <skip />
+    <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"sửa đổi/xóa nội dung trên bộ nhớ phương tiện cục bộ"</string>
+    <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Cho phép ứng dụng sửa đổi nội dung của bộ nhớ phương tiện nội bộ."</string>
     <string name="permlab_cache_filesystem" msgid="5656487264819669824">"truy cập hệ thống tệp bộ nhớ cache"</string>
     <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Cho phép ứng dụng đọc và ghi hệ thống tệp bộ nhớ cache."</string>
-    <!-- no translation found for permlab_use_sip (5986952362795870502) -->
-    <skip />
-    <!-- no translation found for permdesc_use_sip (6320376185606661843) -->
-    <skip />
-    <!-- outdated translation 4307861496302850201 -->     <string name="policylab_limitPassword" msgid="4497420728857585791">"Giới hạn mật khẩu"</string>
-    <!-- outdated translation 1719877245692318299 -->     <string name="policydesc_limitPassword" msgid="9083400080861728056">"Hạn chế các loại mật khẩu bạn được phép sử dụng."</string>
-    <!-- outdated translation 7374780712664285321 -->     <string name="policylab_watchLogin" msgid="914130646942199503">"Xem các lần đăng nhập"</string>
-    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Giám sát số lượng mật khẩu đã nhập sai khi mở khóa màn hình và khóa máy tính bảng hoặc xóa tất cả dữ liệu của máy tính bảng nếu đã nhập quá nhiều mật khẩu sai"</string>
-    <!-- outdated translation 933601759466308092 -->     <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Giám sát số lượng mật khẩu đã nhập sai khi mở khóa màn hình và khóa máy tính bảng hoặc xóa tất cả dữ liệu của máy tính bảng nếu đã nhập quá nhiều mật khẩu sai"</string>
-    <!-- outdated translation 9084772090797485420 -->     <string name="policylab_resetPassword" msgid="2620077191242688955">"Đặt lại mật khẩu"</string>
-    <!-- outdated translation 3332167600331799991 -->     <string name="policydesc_resetPassword" msgid="5391240616981297361">"Buộc mật khẩu của bạn về giá trị mới, yêu cầu quản trị viên cung cấp mật khẩu mới cho bạn trước khi bạn có thể đăng nhập."</string>
-    <!-- outdated translation 5760466025247634488 -->     <string name="policylab_forceLock" msgid="2274085384704248431">"Buộc khoá"</string>
-    <!-- outdated translation 2819868664946089740 -->     <string name="policydesc_forceLock" msgid="5696964126226028442">"Kiểm soát khi thiết bị khoá, yêu cầu bạn nhập lại mật khẩu của thiết bị."</string>
+    <string name="permlab_use_sip" msgid="5986952362795870502">"thực hiện/nhận cuộc gọi qua Internet"</string>
+    <string name="permdesc_use_sip" msgid="6320376185606661843">"Cho phép ứng dụng sử dụng dịch vụ SIP để thực hiện/nhận cuộc gọi qua Internet."</string>
+    <string name="policylab_limitPassword" msgid="4497420728857585791">"Đặt quy tắc mật khẩu"</string>
+    <string name="policydesc_limitPassword" msgid="9083400080861728056">"Kiểm soát độ dài và ký tự được phép trong mật khẩu mở khóa màn hình"</string>
+    <string name="policylab_watchLogin" msgid="914130646942199503">"Giám sát những lần thử mở khóa màn hình"</string>
+    <string name="policydesc_watchLogin" product="tablet" msgid="933601759466308092">"Giám sát số lượng mật khẩu không chính xác được nhập vào khi mở khóa màn hình và khóa máy tính bảng hoặc xóa tất cả dữ liệu của máy tính bảng nếu có quá nhiều mật khẩu không chính xác được nhập vào"</string>
+    <string name="policydesc_watchLogin" product="default" msgid="7227578260165172673">"Giám sát số lượng mật khẩu không chính xác được nhập khi mở khóa màn hình và khóa điện thoại hoặc xóa tất cả dữ liệu trên điện thoại nếu có quá nhiều mật khẩu không chính xác được nhập vào"</string>
+    <string name="policylab_resetPassword" msgid="2620077191242688955">"Thay đổi mật khẩu mở khóa màn hình"</string>
+    <string name="policydesc_resetPassword" msgid="5391240616981297361">"Thay đổi mật khẩu mở khóa màn hình"</string>
+    <string name="policylab_forceLock" msgid="2274085384704248431">"Khóa màn hình"</string>
+    <string name="policydesc_forceLock" msgid="5696964126226028442">"Kiểm tra cách và thời điểm khóa màn hình"</string>
     <string name="policylab_wipeData" msgid="3910545446758639713">"Xoá tất cả dữ liệu"</string>
-    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Xóa dữ liệu của máy tính bảng mà không cảnh báo, bằng cách đặt lại về dữ liệu gốc"</string>
-    <!-- outdated translation 314455232799486222 -->     <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Xóa dữ liệu của máy tính bảng mà không cảnh báo, bằng cách đặt lại về dữ liệu gốc"</string>
-    <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
-    <skip />
-    <!-- no translation found for policydesc_setGlobalProxy (6387497466660154931) -->
-    <skip />
-    <!-- no translation found for policylab_expirePassword (2314569545488269564) -->
-    <skip />
-    <!-- no translation found for policydesc_expirePassword (7276906351852798814) -->
-    <skip />
+    <string name="policydesc_wipeData" product="tablet" msgid="314455232799486222">"Xóa dữ liệu trên máy tính bảng mà không cần cảnh báo, bằng cách thực hiện đặt lại về dữ liệu gốc"</string>
+    <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Xóa dữ liệu trên điện thoại mà không cần cảnh báo, bằng cách thực hiện đặt lại về dữ liệu gốc"</string>
+    <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Đặt proxy chung của điện thoại"</string>
+    <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Đặt proxy chung của điện thoại được sử dụng trong khi chính sách được bật. Chỉ quản trị viên đầu tiên của điện thoại mới có thể đặt proxy chung hiệu quả."</string>
+    <string name="policylab_expirePassword" msgid="2314569545488269564">"Đặt hết hạn mật khẩu"</string>
+    <string name="policydesc_expirePassword" msgid="7276906351852798814">"Kiểm soát thời lượng trước khi mật khẩu khóa màn hình cần được thay đổi"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Nhà riêng"</item>
     <item msgid="869923650527136615">"ĐT di động"</item>
@@ -561,11 +545,10 @@
     <string name="phoneTypeWorkPager" msgid="649938731231157056">"Số Máy nhắn tin tại Cơ quan"</string>
     <string name="phoneTypeAssistant" msgid="5596772636128562884">"Số điện thoại Hỗ trợ"</string>
     <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
-    <!-- no translation found for eventTypeCustom (7837586198458073404) -->
-    <skip />
+    <string name="eventTypeCustom" msgid="7837586198458073404">"Tùy chỉnh"</string>
     <string name="eventTypeBirthday" msgid="2813379844211390740">"Ngày sinh"</string>
     <string name="eventTypeAnniversary" msgid="3876779744518284000">"Ngày kỷ niệm"</string>
-    <!-- outdated translation 5834288791948564594 -->     <string name="eventTypeOther" msgid="7388178939010143077">"Sự kiện"</string>
+    <string name="eventTypeOther" msgid="7388178939010143077">"Khác"</string>
     <string name="emailTypeCustom" msgid="8525960257804213846">"Tuỳ chỉnh"</string>
     <string name="emailTypeHome" msgid="449227236140433919">"Nhà riêng"</string>
     <string name="emailTypeWork" msgid="3548058059601149973">"Cơ quan"</string>
@@ -592,48 +575,28 @@
     <string name="orgTypeWork" msgid="29268870505363872">"Cơ quan"</string>
     <string name="orgTypeOther" msgid="3951781131570124082">"Khác"</string>
     <string name="orgTypeCustom" msgid="225523415372088322">"Tuỳ chỉnh"</string>
-    <!-- no translation found for relationTypeCustom (3542403679827297300) -->
-    <skip />
-    <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
-    <skip />
-    <!-- no translation found for relationTypeBrother (8757913506784067713) -->
-    <skip />
-    <!-- no translation found for relationTypeChild (1890746277276881626) -->
-    <skip />
-    <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
-    <skip />
-    <!-- no translation found for relationTypeFather (5228034687082050725) -->
-    <skip />
-    <!-- no translation found for relationTypeFriend (7313106762483391262) -->
-    <skip />
-    <!-- no translation found for relationTypeManager (6365677861610137895) -->
-    <skip />
-    <!-- no translation found for relationTypeMother (4578571352962758304) -->
-    <skip />
-    <!-- no translation found for relationTypeParent (4755635567562925226) -->
-    <skip />
-    <!-- no translation found for relationTypePartner (7266490285120262781) -->
-    <skip />
-    <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
-    <skip />
-    <!-- no translation found for relationTypeRelative (1799819930085610271) -->
-    <skip />
-    <!-- no translation found for relationTypeSister (1735983554479076481) -->
-    <skip />
-    <!-- no translation found for relationTypeSpouse (394136939428698117) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
-    <skip />
-    <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
-    <skip />
+    <string name="relationTypeCustom" msgid="3542403679827297300">"Tùy chỉnh"</string>
+    <string name="relationTypeAssistant" msgid="6274334825195379076">"Trợ lý"</string>
+    <string name="relationTypeBrother" msgid="8757913506784067713">"Anh em trai"</string>
+    <string name="relationTypeChild" msgid="1890746277276881626">"Con cái"</string>
+    <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Vợ chồng"</string>
+    <string name="relationTypeFather" msgid="5228034687082050725">"Cha"</string>
+    <string name="relationTypeFriend" msgid="7313106762483391262">"Bạn bè"</string>
+    <string name="relationTypeManager" msgid="6365677861610137895">"Người quản lý"</string>
+    <string name="relationTypeMother" msgid="4578571352962758304">"Mẹ"</string>
+    <string name="relationTypeParent" msgid="4755635567562925226">"Cha mẹ"</string>
+    <string name="relationTypePartner" msgid="7266490285120262781">"Đối tác"</string>
+    <string name="relationTypeReferredBy" msgid="101573059844135524">"Được giới thiệu bởi"</string>
+    <string name="relationTypeRelative" msgid="1799819930085610271">"Họ hàng"</string>
+    <string name="relationTypeSister" msgid="1735983554479076481">"Chị em gái"</string>
+    <string name="relationTypeSpouse" msgid="394136939428698117">"Vợ/chồng"</string>
+    <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Tùy chỉnh"</string>
+    <string name="sipAddressTypeHome" msgid="6093598181069359295">"Nhà riêng"</string>
+    <string name="sipAddressTypeWork" msgid="6920725730797099047">"Cơ quan"</string>
+    <string name="sipAddressTypeOther" msgid="4408436162950119849">"Khác"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Nhập mã PIN"</string>
     <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Nhập mật khẩu để mở khoá"</string>
-    <!-- no translation found for keyguard_password_enter_pin_password_code (638347075625491514) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_password_code" msgid="638347075625491514">"Nhập PIN để mở khóa"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Mã PIN không chính xác!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Để mở khoá, hãy nhấn vào Trình đơn sau đó nhấn 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Số khẩn cấp"</string>
@@ -646,14 +609,13 @@
     <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Quay lại cuộc gọi"</string>
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Chính xác!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Rất tiếc, hãy thử lại"</string>
-    <!-- no translation found for lockscreen_password_wrong (6237443657358168819) -->
-    <skip />
+    <string name="lockscreen_password_wrong" msgid="6237443657358168819">"Rất tiếc, hãy thử lại"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Đang sạc (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Đã sạc."</string>
     <string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="lockscreen_low_battery" msgid="1482873981919249740">"Kết nối bộ sạc của bạn."</string>
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Không có thẻ SIM nào."</string>
-    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Không có thẻ SIM trong máy tính bảng."</string>
+    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"Không có thẻ SIM nào trong máy tính bảng."</string>
     <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"Không có thẻ SIM nào trong điện thoại."</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Vui lòng lắp thẻ SIM."</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"Chỉ cuộc gọi khẩn cấp"</string>
@@ -663,10 +625,8 @@
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Thẻ SIM đã bị khoá."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Đang mở khoá thẻ SIM…"</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Bạn đã vẽ không chính xác hình mở khoá của mình <xliff:g id="NUMBER_0">%d</xliff:g> lần. "\n\n"Vui lòng thử lại sau <xliff:g id="NUMBER_1">%d</xliff:g> giây."</string>
-    <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (4906034376425175381) -->
-    <skip />
-    <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6827749231465145590) -->
-    <skip />
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Bạn đã nhập sai mật khẩu <xliff:g id="NUMBER_0">%d</xliff:g> lần. "\n\n"Vui lòng thử lại trong <xliff:g id="NUMBER_1">%d</xliff:g> giấy."</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6827749231465145590">"Bạn đã nhập sai PIN <xliff:g id="NUMBER_0">%d</xliff:g> lần. "\n\n"Vui lòng thử lại trong <xliff:g id="NUMBER_1">%d</xliff:g> giây."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="8687762517114904651">"Bạn đã vẽ không chính xác hình mở khóa của mình <xliff:g id="NUMBER_0">%d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%d</xliff:g> lần thử không thành công khác, bạn sẽ được yêu cầu mở khóa máy tính bảng bằng thông tin đăng nhập Google của mình."\n\n" Vui lòng thử lại trong <xliff:g id="NUMBER_2">%d</xliff:g> giây."</string>
     <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="3351013842320127827">"Bạn đã vẽ không chính xác hình mở khoá của mình <xliff:g id="NUMBER_0">%d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%d</xliff:g> lần thử không thành công khác, bạn sẽ được yêu cầu mở khoá điện thoại bằng thông tin đăng nhập Google của mình."\n\n" Vui lòng thử lại trong <xliff:g id="NUMBER_2">%d</xliff:g> giây."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Hãy thử lại sau <xliff:g id="NUMBER">%d</xliff:g> giây."</string>
@@ -698,23 +658,17 @@
     <string name="double_tap_toast" msgid="1068216937244567247">"Mẹo: nhấn đúp để phóng to và thu nhỏ."</string>
     <string name="autofill_this_form" msgid="1272247532604569872">"Tự động điền"</string>
     <string name="setup_autofill" msgid="8154593408885654044">"C.đặt TĐ điền"</string>
-    <!-- no translation found for autofill_address_name_separator (2504700673286691795) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
-    <skip />
-    <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
-    <skip />
+    <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</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="permlab_readHistoryBookmarks" msgid="1284843728203412135">"đọc lịch sử và dấu trang của Trình duyệt"</string>
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Cho phép ứng dụng đọc tất cả các URL mà Trình duyệt đã truy cập và tất cả các dấu trang của Trình duyệt."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"xem lịch sử và dấu trang của Trình duyệt"</string>
     <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Cho phép ứng dụng sửa đổi lịch sử hoặc dấu trang của Trình duyệt được lưu trữ trên máy tính bảng của bạn. Các ứng dụng độc hại có thể sử dụng quyền này để xóa hoặc sửa đổi dữ liệu Trình duyệt của bạn."</string>
     <string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Cho phép ứng dụng sửa đổi lịch sử hoặc dấu trang của Trình duyệt được lưu trữ trên điện thoại của bạn. Các ứng dụng độc hại có thể sử dụng quyền này để xoá hoặc sửa đổi dữ liệu Trình duyệt của bạn."</string>
-    <!-- no translation found for permlab_setAlarm (5924401328803615165) -->
-    <skip />
-    <!-- no translation found for permdesc_setAlarm (5966966598149875082) -->
-    <skip />
+    <string name="permlab_setAlarm" msgid="5924401328803615165">"đặt báo thức trong đồng hồ báo thức"</string>
+    <string name="permdesc_setAlarm" msgid="5966966598149875082">"Cho phép ứng dụng đặt báo thức trong ứng dụng đồng hồ báo thức được cài đặt. Một số ứng dụng đồng hồ báo thức có thể không sử dụng tính năng này."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Sửa đổi quyền về vị trí địa lý của Trình duyệt"</string>
     <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Cho phép ứng dụng sửa đổi các quyền về vị trí địa lý của Trình duyệt. Các ứng dụng độc hại có thể sử dụng quyền này để cho phép gửi thông tin vị trí đến trang web bất kỳ."</string>
     <string name="save_password_message" msgid="767344687139195790">"Bạn có muốn trình duyệt nhớ mật khẩu này không?"</string>
@@ -830,15 +784,12 @@
     <string name="cut" msgid="3092569408438626261">"Cắt"</string>
     <string name="copy" msgid="2681946229533511987">"Sao chép"</string>
     <string name="paste" msgid="5629880836805036433">"Dán"</string>
-    <!-- no translation found for pasteDisabled (7259254654641456570) -->
-    <skip />
+    <string name="pasteDisabled" msgid="7259254654641456570">"Không có gì để dán"</string>
     <string name="copyUrl" msgid="2538211579596067402">"Sao chép URL"</string>
-    <!-- no translation found for selectTextMode (6738556348861347240) -->
-    <skip />
-    <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
-    <skip />
+    <string name="selectTextMode" msgid="6738556348861347240">"Chọn văn bản..."</string>
+    <string name="textSelectionCABTitle" msgid="5236850394370820357">"Lựa chọn văn bản"</string>
     <string name="inputMethod" msgid="1653630062304567879">"Phương thức nhập"</string>
-    <!-- outdated translation 1672989176958581452 -->     <string name="editTextMenuTitle" msgid="4909135564941815494">"Chỉnh sửa văn bản"</string>
+    <string name="editTextMenuTitle" msgid="4909135564941815494">"Tác vụ văn bản"</string>
     <string name="low_internal_storage_view_title" msgid="1399732408701697546">"Còn ít dung lượng"</string>
     <string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Dung lượng lưu trữ của máy tính bảng thấp."</string>
     <string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Dung lượng lưu trữ của điện thoại thấp."</string>
@@ -847,8 +798,7 @@
     <string name="yes" msgid="5362982303337969312">"OK"</string>
     <string name="no" msgid="5141531044935541497">"Huỷ"</string>
     <string name="dialog_alert_title" msgid="2049658708609043103">"Chú ý"</string>
-    <!-- no translation found for loading (1760724998928255250) -->
-    <skip />
+    <string name="loading" msgid="1760724998928255250">"Đang tải..."</string>
     <string name="capital_on" msgid="1544682755514494298">"BẬT"</string>
     <string name="capital_off" msgid="6815870386972805832">"TẮT"</string>
     <string name="whichApplication" msgid="4533185947064773386">"Hoàn tất tác vụ đang sử dụng"</string>
@@ -867,32 +817,19 @@
     <string name="force_close" msgid="3653416315450806396">"Buộc đóng"</string>
     <string name="report" msgid="4060218260984795706">"Báo cáo"</string>
     <string name="wait" msgid="7147118217226317732">"Đợi"</string>
-    <!-- no translation found for launch_warning_title (8323761616052121936) -->
-    <skip />
-    <!-- no translation found for launch_warning_replace (6202498949970281412) -->
-    <skip />
-    <!-- no translation found for launch_warning_original (188102023021668683) -->
-    <skip />
-    <!-- no translation found for smv_application (295583804361236288) -->
-    <skip />
-    <!-- no translation found for smv_process (5120397012047462446) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
-    <skip />
-    <!-- no translation found for heavy_weight_notification_detail (2423977499339403402) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_title (1135403633766694316) -->
-    <skip />
-    <!-- no translation found for heavy_weight_switcher_text (4592075610079319667) -->
-    <skip />
-    <!-- no translation found for old_app_action (493129172238566282) -->
-    <skip />
-    <!-- no translation found for old_app_description (942967900237208466) -->
-    <skip />
-    <!-- no translation found for new_app_action (5472756926945440706) -->
-    <skip />
-    <!-- no translation found for new_app_description (6830398339826789493) -->
-    <skip />
+    <string name="launch_warning_title" msgid="8323761616052121936">"Ứng dụng đã được chuyển hướng"</string>
+    <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> hiện đang chạy."</string>
+    <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> được khởi chạy trước tiên."</string>
+    <string name="smv_application" msgid="295583804361236288">"Ứng dụng <xliff:g id="APPLICATION">%1$s</xliff:g> (quá trình <xliff:g id="PROCESS">%2$s</xliff:g>) đã vi phạm chính sách StrictMode tự thi hành của mình."</string>
+    <string name="smv_process" msgid="5120397012047462446">"Quá trình <xliff:g id="PROCESS">%1$s</xliff:g> đã vi phạm chính sách StrictMode tự thi hành của mình."</string>
+    <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> đang hoạt động"</string>
+    <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Chọn để chuyển sang ứng dụng"</string>
+    <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Chuyển ứng dụng?"</string>
+    <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Bạn phải dừng một ứng dụng khác hiện đang chạy trước khi khởi động một ứng dụng mới."</string>
+    <string name="old_app_action" msgid="493129172238566282">"Quay lại <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="old_app_description" msgid="942967900237208466">"Không khởi động ứng dụng mới."</string>
+    <string name="new_app_action" msgid="5472756926945440706">"Bắt đầu <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+    <string name="new_app_description" msgid="6830398339826789493">"Dừng ứng dụng cũ mà không lưu."</string>
     <string name="sendText" msgid="5132506121645618310">"Chọn một tác vụ cho văn bản"</string>
     <string name="volume_ringtone" msgid="6885421406845734650">"Âm lượng chuông"</string>
     <string name="volume_music" msgid="5421651157138628171">"Âm lượng phương tiện"</string>
@@ -931,17 +868,17 @@
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Hiển thị tất cả"</b></string>
     <string name="usb_storage_activity_title" msgid="2399289999608900443">"Thiết bị lưu trữ USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB đã kết nối"</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Bạn đã kết nối điện thoại với máy tính của mình qua USB. Hãy chọn nút bên dưới nếu bạn muốn sao chép các tệp giữa máy tính và thẻ SD của Android của mình."</string>
-    <!-- outdated translation 4796759646167247178 -->     <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Bạn đã kết nối điện thoại với máy tính của mình qua USB. Hãy chọn nút bên dưới nếu bạn muốn sao chép các tệp giữa máy tính và thẻ SD của Android của mình."</string>
+    <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Bạn đã kết nối với máy tính của mình qua USB. Hãy chạm nút bên dưới nếu bạn muốn sao chép các tệp giữa máy tính và bộ nhớ USB của Android của bạn."</string>
+    <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Bạn đã kết nối với máy tính của mình qua USB. Hãy chạm nút bên dưới nếu bạn muốn sao chép các tệp giữa máy tính và thẻ SD của Android của bạn."</string>
     <string name="usb_storage_button_mount" msgid="1052259930369508235">"Bật bộ lưu trữ USB"</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Đã xảy ra sự cố khi sử dụng thẻ SD của bạn cho bộ lưu trữ USB."</string>
-    <!-- outdated translation 2534784751603345363 -->     <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Đã xảy ra sự cố khi sử dụng thẻ SD của bạn cho bộ lưu trữ USB."</string>
+    <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Đã xảy ra sự cố khi sử dụng bộ nhớ USB của bạn cho bộ nhớ dung lượng lớn USB."</string>
+    <string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Đã xảy ra sự cố khi sử dụng thẻ SD của bạn cho bộ nhớ dung lượng lớn USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB đã kết nối"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Chọn để sao chép tệp đến/từ máy tính của bạn."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Tắt bộ lưu trữ USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Chọn tắt bộ lưu trữ USB."</string>
     <string name="usb_storage_stop_title" msgid="660129851708775853">"Bộ lưu trữ USB đang được sử dụng"</string>
-    <!-- outdated translation 3613713396426604104 -->     <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Trước khi tắt bộ lưu trữ USB, đảm bảo rằng bạn đã tháo (“đẩy”) thẻ SD của Android khỏi máy tính của mình."</string>
+    <string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Trước khi tắt bộ nhớ USB, đảm bảo rằng bạn đã ngắt kết nối (“đẩy”) bộ nhớ USB của Android khỏi máy tính của mình."</string>
     <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Trước khi tắt bộ lưu trữ USB, đảm bảo rằng bạn đã tháo (“đẩy”) thẻ SD của Android khỏi máy tính của mình."</string>
     <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Tắt bộ lưu trữ USB"</string>
     <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Đã xảy ra sự cố khi tắt bộ lưu trữ USB. Hãy kiểm tra để đảm bảo bạn đã tháo trình điều khiển chủ USB rồi thử lại."</string>
@@ -949,9 +886,9 @@
     <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Nếu bạn bật bộ lưu trữ USB, một số ứng dụng bạn đang sử dụng sẽ dừng và có thể không khả dụng cho tới khi bạn tắt bộ lưu trữ USB."</string>
     <string name="dlg_error_title" msgid="8048999973837339174">"Thao tác USB không thành công"</string>
     <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
-    <!-- outdated translation 8663247929551095854 -->     <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Định dạng thẻ SD"</string>
+    <string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Định dạng b.nhớ USB"</string>
     <string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Định dạng thẻ SD"</string>
-    <!-- outdated translation 3621369962433523619 -->     <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Bạn có chắc chắn muốn định dạng thẻ SD không? Tất cả dữ liệu trên thẻ của bạn sẽ bị mất."</string>
+    <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Định dạng bộ nhớ USB, xóa tất cả tệp được lưu trữ tại đây? Không thể hoàn tác tác vụ!"</string>
     <string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Bạn có chắc chắn muốn định dạng thẻ SD không? Tất cả dữ liệu trên thẻ của bạn sẽ bị mất."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Định dạng"</string>
     <string name="adb_active_notification_title" msgid="6729044778949189918">"Gỡ lỗi USB đã được kết nối"</string>
@@ -960,28 +897,28 @@
     <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>"ứng viên"</u></string>
-    <!-- outdated translation 5457603418970994050 -->     <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Đang chuẩn bị thẻ SD"</string>
+    <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"Đang chuẩn bị bộ nhớ USB"</string>
     <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"Đang chuẩn bị thẻ SD"</string>
     <string name="ext_media_checking_notification_message" msgid="8287319882926737053">"Đang kiểm tra lỗi."</string>
-    <!-- outdated translation 780477838241212997 -->     <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Thẻ SD trống"</string>
+    <string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"Bộ nhớ USB trống"</string>
     <string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"Thẻ SD trống"</string>
-    <!-- outdated translation 3817704088027829380 -->     <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Thẻ SD trống hoặc có hệ thống tệp không được hỗ trợ."</string>
+    <string name="ext_media_nofs_notification_message" product="nosdcard" msgid="8623130522556087311">"Bộ nhớ USB trống hoặc không có hệ thống tệp được hỗ trợ."</string>
     <string name="ext_media_nofs_notification_message" product="default" msgid="3817704088027829380">"Thẻ SD trống hoặc có hệ thống tệp không được hỗ trợ."</string>
-    <!-- outdated translation 6410723906019100189 -->     <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Thẻ SD đã bị hỏng"</string>
+    <string name="ext_media_unmountable_notification_title" product="nosdcard" msgid="2090046769532713563">"Bộ nhớ USB bị hỏng"</string>
     <string name="ext_media_unmountable_notification_title" product="default" msgid="6410723906019100189">"Thẻ SD đã bị hỏng"</string>
-    <!-- outdated translation 6902531775948238989 -->     <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Thẻ SD bị hỏng. Bạn có thể phải định dạng lại thẻ SD đó."</string>
+    <string name="ext_media_unmountable_notification_message" product="nosdcard" msgid="529021299294450667">"Bộ nhớ USB bị hỏng. Bạn có thể phải định dạng lại bộ nhớ USB đó."</string>
     <string name="ext_media_unmountable_notification_message" product="default" msgid="6902531775948238989">"Thẻ SD bị hỏng. Bạn có thể phải định dạng lại thẻ SD đó."</string>
-    <!-- outdated translation 6872152882604407837 -->     <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Thẻ SD bị tháo đột ngột"</string>
+    <string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"Bộ nhớ USB bị tháo đột ngột"</string>
     <string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"Thẻ SD bị tháo đột ngột"</string>
-    <!-- outdated translation 7260183293747448241 -->     <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Tháo thẻ SD trước khi gỡ nhằm tránh mất dữ liệu."</string>
+    <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"Ngắt kết nối USB trước khi tháo nhằm tránh mất dữ liệu."</string>
     <string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"Tháo thẻ SD trước khi gỡ nhằm tránh mất dữ liệu."</string>
-    <!-- outdated translation 6729801130790616200 -->     <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"An toàn để tháo thẻ SD"</string>
+    <string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"Bộ nhớ USB an toàn để tháo"</string>
     <string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"An toàn để tháo thẻ SD"</string>
-    <!-- outdated translation 568841278138377604 -->     <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Bạn có thể tháo an toàn thẻ SD."</string>
+    <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"Bạn có thể tháo an toàn bộ nhớ USB."</string>
     <string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"Bạn có thể tháo an toàn thẻ SD."</string>
-    <!-- outdated translation 8902518030404381318 -->     <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Thẻ SD đã bị tháo"</string>
+    <string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"Bộ nhớ USB đã tháo"</string>
     <string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"Thẻ SD đã bị tháo"</string>
-    <!-- outdated translation 3870120652983659641 -->     <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Thẻ SD đã được tháo. Hãy lắp một thẻ mới."</string>
+    <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"Bộ nhớ USB bị tháo. Hãy lắp phương tiện mới."</string>
     <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"Thẻ SD đã được tháo. Hãy lắp một thẻ mới."</string>
     <string name="activity_list_empty" msgid="4168820609403385789">"Không tìm thấy hoạt động nào phù hợp"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"cập nhật thống kê sử dụng thành phần"</string>
@@ -995,8 +932,7 @@
     <string name="ime_action_send" msgid="2316166556349314424">"Gửi"</string>
     <string name="ime_action_next" msgid="3138843904009813834">"Tiếp theo"</string>
     <string name="ime_action_done" msgid="8971516117910934605">"Xong"</string>
-    <!-- no translation found for ime_action_previous (1443550039250105948) -->
-    <skip />
+    <string name="ime_action_previous" msgid="1443550039250105948">"Trước"</string>
     <string name="ime_action_default" msgid="2840921885558045721">"Thực hiện"</string>
     <string name="dial_number_using" msgid="5789176425167573586">"Quay số"\n"sử dụng <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using" msgid="4947405226788104538">"Tạo liên hệ"\n"sử dụng <xliff:g id="NUMBER">%s</xliff:g>"</string>
@@ -1019,64 +955,43 @@
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"L2TP/IPSec VPN dựa trên khoá chia sẻ trước"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN dựa trên chứng chỉ"</string>
     <string name="upload_file" msgid="2897957172366730416">"Chọn tệp"</string>
-    <!-- no translation found for no_file_chosen (6363648562170759465) -->
-    <skip />
+    <string name="no_file_chosen" msgid="6363648562170759465">"Không có tệp nào được chọn"</string>
     <string name="reset" msgid="2448168080964209908">"Đặt lại"</string>
     <string name="submit" msgid="1602335572089911941">"Gửi"</string>
     <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Chế độ trên ô tô đã được bật"</string>
     <string name="car_mode_disable_notification_message" msgid="668663626721675614">"Chọn để thoát khỏi chế độ trên ô tô."</string>
     <string name="tethered_notification_title" msgid="3146694234398202601">"Chức năng điểm truy cập Internet hoặc điểm phát sóng đang hoạt động"</string>
     <string name="tethered_notification_message" msgid="3067108323903048927">"Chạm để định cấu hình"</string>
-    <!-- no translation found for back_button_label (2300470004503343439) -->
-    <skip />
-    <!-- no translation found for next_button_label (1080555104677992408) -->
-    <skip />
-    <!-- no translation found for skip_button_label (1275362299471631819) -->
-    <skip />
+    <string name="back_button_label" msgid="2300470004503343439">"Quay lại"</string>
+    <string name="next_button_label" msgid="1080555104677992408">"Tiếp theo"</string>
+    <string name="skip_button_label" msgid="1275362299471631819">"Bỏ qua"</string>
     <string name="throttle_warning_notification_title" msgid="4890894267454867276">"Sử dụng dữ liệu di động có nguy cơ cao"</string>
     <string name="throttle_warning_notification_message" msgid="2609734763845705708">"Chạm để tìm hiểu thêm về việc sử dụng dữ liệu di động"</string>
     <string name="throttled_notification_title" msgid="6269541897729781332">"Đã vượt quá giới hạn dữ liệu di động"</string>
     <string name="throttled_notification_message" msgid="4712369856601275146">"Chạm để tìm hiểu thêm về việc sử dụng dữ liệu di động"</string>
-    <!-- no translation found for no_matches (8129421908915840737) -->
-    <skip />
-    <!-- no translation found for find_on_page (1946799233822820384) -->
-    <skip />
-    <!-- no translation found for matches_found:one (8167147081136579439) -->
-    <!-- no translation found for matches_found:other (4641872797067609177) -->
-    <!-- no translation found for action_mode_done (7217581640461922289) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (535863554318797377) -->
-    <skip />
-    <!-- no translation found for progress_unmounting (5556813978958789471) -->
-    <skip />
-    <!-- no translation found for progress_erasing (4183664626203056915) -->
-    <skip />
-    <!-- no translation found for progress_erasing (2115214724367534095) -->
-    <skip />
-    <!-- no translation found for format_error (4320339096529911637) -->
-    <skip />
-    <!-- no translation found for format_error (1343380371925238343) -->
-    <skip />
-    <!-- no translation found for media_bad_removal (7960864061016603281) -->
-    <skip />
-    <!-- no translation found for media_checking (418188720009569693) -->
-    <skip />
-    <!-- no translation found for media_checking (7334762503904827481) -->
-    <skip />
-    <!-- no translation found for media_removed (7001526905057952097) -->
-    <skip />
-    <!-- no translation found for media_shared (5830814349250834225) -->
-    <skip />
-    <!-- no translation found for media_shared (5706130568133540435) -->
-    <skip />
-    <!-- no translation found for media_unknown_state (729192782197290385) -->
-    <skip />
-    <!-- no translation found for share (1778686618230011964) -->
-    <skip />
-    <!-- no translation found for find (4808270900322985960) -->
-    <skip />
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="no_matches" msgid="8129421908915840737">"Không có kết quả nào phù hợp"</string>
+    <string name="find_on_page" msgid="1946799233822820384">"Tìm kiếm trên trang"</string>
+  <plurals name="matches_found">
+    <item quantity="one" msgid="8167147081136579439">"1 kết quả phù hợp"</item>
+    <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> trong tổng số <xliff:g id="TOTAL">%d</xliff:g>"</item>
+  </plurals>
+    <string name="action_mode_done" msgid="7217581640461922289">"Xong"</string>
+    <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Đang ngắt kết nối bộ nhớ USB..."</string>
+    <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Đang ngắt kết nối thẻ SD..."</string>
+    <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Đang xóa bộ nhớ USB..."</string>
+    <string name="progress_erasing" product="default" msgid="2115214724367534095">"Đang xóa thẻ SD..."</string>
+    <string name="format_error" product="nosdcard" msgid="4320339096529911637">"Không thể xóa bộ nhớ USB."</string>
+    <string name="format_error" product="default" msgid="1343380371925238343">"Không thể xóa thẻ SD."</string>
+    <string name="media_bad_removal" msgid="7960864061016603281">"Thẻ SD bị tháo trước khi được ngắt kết nối."</string>
+    <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Bộ nhớ USB hiện đang được kiểm tra."</string>
+    <string name="media_checking" product="default" msgid="7334762503904827481">"Thẻ SD hiện đang được kiểm tra."</string>
+    <string name="media_removed" msgid="7001526905057952097">"Thẻ SD đã được tháo."</string>
+    <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Bộ nhớ USB hiện đang được máy tính sử dụng."</string>
+    <string name="media_shared" product="default" msgid="5706130568133540435">"Thẻ SD hiện đang được máy tính sử dụng."</string>
+    <string name="media_unknown_state" msgid="729192782197290385">"Phương tiện bên ngoài ở trạng thái không xác định."</string>
+    <string name="share" msgid="1778686618230011964">"Chia sẻ"</string>
+    <string name="find" msgid="4808270900322985960">"Tìm"</string>
+    <string name="websearch" msgid="4337157977400211589">"Tìm kiếm trên web"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1087,4 +1002,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-xlarge/styles.xml b/core/res/res/values-xlarge/styles.xml
index 095a83d..489e530 100644
--- a/core/res/res/values-xlarge/styles.xml
+++ b/core/res/res/values-xlarge/styles.xml
@@ -34,5 +34,13 @@
     <style name="TextAppearance.StatusBar.EventContent.Title">
         <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
+
+    <style name="PreferencePanel">
+        <item name="android:layout_marginLeft">@dimen/preference_screen_side_margin</item>
+        <item name="android:layout_marginRight">@dimen/preference_screen_side_margin</item>
+        <item name="android:layout_marginTop">48dip</item>
+        <item name="android:layout_marginBottom">48dip</item>
+        <item name="android:background">?attr/preferencePanelBackground</item>
+    </style>
 </resources>
 
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index b416c06..51f9568 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"外部媒体处于未知状态。"</string>
     <string name="share" msgid="1778686618230011964">"分享"</string>
     <string name="find" msgid="4808270900322985960">"查找"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"网页搜索"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 1bb6028..47cccea 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -997,8 +997,7 @@
     <string name="media_unknown_state" msgid="729192782197290385">"外部媒體狀態不明。"</string>
     <string name="share" msgid="1778686618230011964">"分享"</string>
     <string name="find" msgid="4808270900322985960">"尋找"</string>
-    <!-- no translation found for websearch (4337157977400211589) -->
-    <skip />
+    <string name="websearch" msgid="4337157977400211589">"網頁搜尋"</string>
     <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
     <skip />
     <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
@@ -1009,4 +1008,14 @@
     <skip />
     <!-- no translation found for gpsVerifNo (1146564937346454865) -->
     <skip />
+    <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+    <skip />
+    <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) -->
+    <skip />
+    <!-- no translation found for sync_really_delete (8933566316059338692) -->
+    <skip />
+    <!-- no translation found for sync_undo_deletes (8610996708225006328) -->
+    <skip />
+    <!-- no translation found for sync_do_nothing (8717589462945226869) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 98c9270..f6899ad 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -48,6 +48,7 @@
              theme does not set this value, meaning it is based on whether the
              window is floating. -->
         <attr name="backgroundDimEnabled" format="boolean" />
+
         <!-- =========== -->
         <!-- Text styles -->
         <!-- =========== -->
@@ -261,7 +262,7 @@
         <!-- Flag indicating whether this is a translucent window. -->
         <attr name="windowIsTranslucent" format="boolean" />
         <!-- Flag indicating that this window's background should be the
-        	 user's current wallpaper. -->
+           user's current wallpaper. -->
         <attr name="windowShowWallpaper" format="boolean" />
         <!-- This Drawable is overlaid over the foreground of the Window's content area, usually
              to place a shadow below the title.  -->
@@ -503,21 +504,17 @@
         <!-- Default PopupMenu style. -->
         <attr name="popupMenuStyle" format="reference" />
 
-        <!-- @hide NumberPicker up button style -->
+        <!-- NumberPicker style. -->
+        <attr name="numberPickerStyle" format="reference" />
+        <!-- NumberPicker up button style. -->
         <attr name="numberPickerUpButtonStyle" format="reference" />
-        <!-- @hide NumberPicker down button style -->
+        <!-- NumberPicker down button style. -->
         <attr name="numberPickerDownButtonStyle" format="reference" />
-        <!-- @hide NumberPicker input text style -->
+        <!-- NumberPicker input text style. -->
         <attr name="numberPickerInputTextStyle" format="reference" />
 
-        <!-- @hide NumberPicker the fading edge length of the selector wheel -->
-        <attr name="numberPickerStyle" format="reference" />
-
-        <!-- @hide DayPicker$WeekView style-->
-        <attr name="dayPickerWeekViewStyle" format="reference" />
-
-        <!-- @hide DayPickerDayView style-->
-        <attr name="dayPickerWeekDayViewStyle" format="reference" />
+        <!-- The CalndarView style. -->
+        <attr name="calendarViewStyle" format="reference" />
 
         <!-- Fast scroller styles -->
         <eat-comment />
@@ -605,6 +602,8 @@
         <attr name="preferenceLayoutChild" format="reference" />
         <!-- Preference panel background -->
         <attr name="preferencePanelBackground" format="reference" />
+        <!-- Preference panel style -->
+        <attr name="preferencePanelStyle" format="reference" />
 
         <!-- ============================ -->
         <!-- Text selection handle styles -->
@@ -847,7 +846,8 @@
              {@link android.text.InputType#TYPE_TEXT_VARIATION_WEB_PASSWORD}. -->
         <flag name="textWebPassword" value="0x000000e1" />
         <!-- A numeric only field.  Corresponds to
-             {@link android.text.InputType#TYPE_CLASS_NUMBER}. -->
+             {@link android.text.InputType#TYPE_CLASS_NUMBER} |
+             {@link android.text.InputType#TYPE_NUMBER_VARIATION_NORMAL}. -->
         <flag name="number" value="0x00000002" />
         <!-- Can be combined with <var>number</var> and its other options to
              allow a signed number.  Corresponds to
@@ -859,6 +859,10 @@
              {@link android.text.InputType#TYPE_CLASS_NUMBER} |
              {@link android.text.InputType#TYPE_NUMBER_FLAG_DECIMAL}. -->
         <flag name="numberDecimal" value="0x00002002" />
+        <!-- A numeric password field.  Corresponds to
+             {@link android.text.InputType#TYPE_CLASS_NUMBER} |
+             {@link android.text.InputType#TYPE_NUMBER_VARIATION_PASSWORD}. -->
+        <flag name="numberPassword" value="0x00000012" />
         <!-- For entering a phone number.  Corresponds to
              {@link android.text.InputType#TYPE_CLASS_PHONE}. -->
         <flag name="phone" value="0x00000003" />
@@ -1634,6 +1638,14 @@
              will result when the reference is accessed.-->
         <attr name="nextFocusDown" format="reference"/>
 
+        <!-- Defines the next view to give focus to when the next focus is
+             {@link android.view.View#FOCUS_FORWARD}
+
+             If the reference refers to a view that does not exist or is part
+             of a hierarchy that is invisible, a {@link java.lang.RuntimeException}
+             will result when the reference is accessed.-->
+        <attr name="nextFocusForward" format="reference"/>
+
         <!-- Defines whether this view reacts to click events. -->
         <attr name="clickable" format="boolean" />
 
@@ -2810,6 +2822,14 @@
         <attr name="startYear" format="integer" />
         <!-- The last year (inclusive), for example "2010". -->
         <attr name="endYear" format="integer" />
+        <!-- Whether the spinners are shown. -->
+        <attr name="spinnersShown" format="boolean" />
+        <!-- Whether the calendar view is shown. -->
+        <attr name="calendarViewShown" format="boolean" />
+        <!-- The minimal date shown by this calendar view in mm/dd/yyyy format. -->
+        <attr name="minDate" format="string" />
+        <!-- The minimal date shown by this calendar view in mm/dd/yyyy format. -->
+        <attr name="maxDate" format="string" />
     </declare-styleable>
 
     <declare-styleable name="TwoLineListItem">
@@ -2978,27 +2998,38 @@
         <attr name="minorWeightMax" format="float" />
     </declare-styleable>
 
-    <!-- @hide -->
-    <declare-styleable name="DayPickerWeekView">
-        <attr name="height" />
-        <attr name="weekStartDay" format="integer|reference" />
-        <attr name="weekDayCount" format="integer|reference" />
-        <attr name="showWeekNumber" format="boolean|reference" />
-        <attr name="weekSeperatorWidth" format="dimension" />
-        <attr name="textSize" />
-        <attr name="weekDayPadding" format="dimension" />
-        <attr name="selectedDayLineWidth" format="dimension" />
-        <attr name="selectionBackgroundColor" format="color|reference" />
+    <declare-styleable name="CalendarView">
+        <!-- The first day of week according to {@link java.util.Calendar}. -->
+        <attr name="firstDayOfWeek" format="integer" />
+        <!-- Whether do show week numbers. -->
+        <attr name="showWeekNumber" format="boolean" />
+        <!-- The minimal date shown by this calendar view in mm/dd/yyyy format. -->
+        <attr name="minDate" />
+        <!-- The minimal date shown by this calendar view in mm/dd/yyyy format. -->
+        <attr name="maxDate" />
+        <!-- The number of weeks to be shown. -->
+        <attr name="shownWeekCount" format="integer"/>
+        <!-- The background color for the selected week. -->
+        <attr name="selectedWeekBackgroundColor" format="color|reference" />
+        <!-- The color for the dates of the selected month. -->
         <attr name="focusedMonthDateColor" format="color|reference" />
-        <attr name="otherMonthDateColor" format="color|reference" />
+        <!-- The color for the dates of an unfocused month. -->
+        <attr name="unfocusedMonthDateColor" format="color|reference" />
+        <!-- The color for the week numbers. -->
         <attr name="weekNumberColor" format="color|reference" />
-        <attr name="gridLinesColor" format="color|reference" />
-        <attr name="selectedDayLine" format="reference" />
+        <!-- The color for the sepatator line between weeks. -->
+        <attr name="weekSeparatorLineColor" format="color|reference" />
+        <!-- Drawable for the vertical bar shown at the beggining and at the end of a selected date. -->
+        <attr name="selectedDateVerticalBar" format="reference" />
+        <!-- The text appearance for the week day abbreviation of the calendar header. -->
+        <attr name="weekDayTextAppearance" format="reference" />
+        <!-- The text appearance for the calendar dates. -->
+        <attr name="dateTextAppearance" format="reference" />
     </declare-styleable>
 
-    <!-- @hide -->
     <declare-styleable name="NumberPicker">
         <attr name="orientation" />
+        <!-- Color for the solid color background if such for optimized rendering. -->
         <attr name="solidColor" format="color|reference" />
     </declare-styleable>
 
@@ -4310,7 +4341,7 @@
              If not supplied, then no activity will be launched. -->
         <attr name="configure" format="string" />
         <!-- A preview of what the AppWidget will look like after it's configured.
-       	     If not supplied, the AppWidget's icon will be used. -->
+              If not supplied, the AppWidget's icon will be used. -->
         <attr name="previewImage" format="reference" />
         <!-- The view id of the AppWidget subview which should be auto-advanced.
              by the widget's host. -->
@@ -4421,6 +4452,10 @@
         <attr name="smallIcon" format="reference"/>
         <!-- A preferences.xml file for authenticator-specific settings. -->
         <attr name="accountPreferences" format="reference"/>
+        <!-- Account handles its own token storage and permissions.
+             Default to false
+          -->
+        <attr name="customTokens" format="boolean"/>
     </declare-styleable>
 
     <!-- =============================== -->
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index b1c54ff..a286265 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -103,6 +103,11 @@
     <color name="keyguard_text_color_soundon">#e69310</color>
     <color name="keyguard_text_color_decline">#fe0a5a</color>
 
+    <!-- keyguard clock -->
+    <color name="lockscreen_clock_background">#ff9a9a9a</color>
+    <color name="lockscreen_clock_foreground">#ff666666</color>
+    <color name="lockscreen_clock_am_pm">#ff9a9a9a</color>
+
     <!-- For holo theme -->
 	  <drawable name="screen_background_holo_light">#fff3f3f3</drawable>
 	  <drawable name="screen_background_holo_dark">#ff000000</drawable>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 5d03638..590baf1 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -214,6 +214,14 @@
          rotations as the default behavior. -->
     <bool name="config_allowAllRotations">true</bool>
 
+    <!-- If true, the direction rotation is applied to get to an application's requested
+         orientation is reversed.  Normally, the model is that landscape is
+         clockwise from portrait; thus on a portrait device an app requesting
+         landscape will cause a clockwise rotation, and on a landscape device an
+         app requesting portrait will cause a counter-clockwise rotation.  Setting
+         true here reverses that logic. -->
+    <bool name="config_reverseDefaultRotation">false</bool>
+
     <!-- The number of degrees to rotate the display when the keyboard is open. -->
     <integer name="config_lidOpenRotation">90</integer>
 
@@ -489,6 +497,9 @@
     <!-- Enables SIP on WIFI only -->
     <bool name="config_sip_wifi_only">true</bool>
 
+    <!-- Enables built-in SIP phone capability -->
+    <bool name="config_built_in_sip_phone">false</bool>
+
     <!-- Boolean indicating if restoring network selection should be skipped -->
     <!-- The restoring is handled by modem if it is true-->
     <bool translatable="false" name="skip_restoring_network_selection">false</bool>
@@ -497,6 +508,17 @@
          to handle queries on each database. -->
     <integer name="db_connection_pool_size">1</integer>
 
+    <!-- Max space (in MB) allocated to DownloadManager to store the downloaded
+         files if they are to be stored in DownloadManager's data dir,
+         which typically is /data/data/com.android.providers.downloads/files -->
+    <integer name="config_downloadDataDirSize">100</integer>
+
+    <!-- When the free space available in DownloadManager's data dir falls
+         below the percentage value specified by this param, DownloadManager
+         starts removing files to try to make percentage of available
+         free space above this threshold value. -->
+    <integer name="config_downloadDataDirLowSpaceThreshold">10</integer>
+
     <!-- The URL that should be sent in an x-wap-profile header with an HTTP request,
          as defined in the Open Mobile Alliance User Agent Profile specification
          OMA-TS-UAProf-V2_0-20060206-A Section 8.1.1.1. If the URL contains a '%s'
@@ -504,4 +526,7 @@
          Build.MODEL. The format string shall not be escaped. -->
     <string name="config_useragentprofile_url"></string>
 
+    <!-- When a database query is executed, the results retuned are paginated
+         in pages of size (in KB) indicated by this value -->
+    <integer name="config_cursorWindowSize">2048</integer>
 </resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 2f0dfc1..53d4e42 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -54,6 +54,8 @@
     <dimen name="password_keyboard_spacebar_vertical_correction">4dip</dimen>
     <!-- Preference activity side margins -->
     <dimen name="preference_screen_side_margin">0dp</dimen>
+    <!-- Preference activity side margins negative-->
+    <dimen name="preference_screen_side_margin_negative">0dp</dimen>
     <!-- Preference widget area width (to the left of the text) -->
     <dimen name="preference_widget_width">56dp</dimen>
 </resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 3a5b238..9f1b9a1 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1407,6 +1407,24 @@
   <public type="attr" name="fastScrollPreviewBackgroundRight" />
   <public type="attr" name="fastScrollTrackDrawable" />
   <public type="attr" name="fastScrollOverlayPosition" />
+  <public type="attr" name="customTokens" />
+  <public type="attr" name="nextFocusForward" />
+  <public type="attr" name="firstDayOfWeek" />
+  <public type="attr" name="showWeekNumber" />
+  <public type="attr" name="minDate" />
+  <public type="attr" name="maxDate" />
+  <public type="attr" name="shownWeekCount" />
+  <public type="attr" name="selectedWeekBackgroundColor" />
+  <public type="attr" name="focusedMonthDateColor" />
+  <public type="attr" name="unfocusedMonthDateColor" />
+  <public type="attr" name="weekNumberColor" />
+  <public type="attr" name="weekSeparatorLineColor" />
+  <public type="attr" name="selectedDateVerticalBar" />
+  <public type="attr" name="weekDayTextAppearance" />
+  <public type="attr" name="dateTextAppearance" />
+  <public type="attr" name="solidColor" />
+  <public type="attr" name="spinnersShown" />
+  <public type="attr" name="calendarViewShown" />
 
   <public type="anim" name="animator_fade_in" />
   <public type="anim" name="animator_fade_out" />
@@ -1576,5 +1594,18 @@
   <public type="style" name="Holo.Light.ButtonBar.AlertDialog" />
   <public type="style" name="Holo.SegmentedButton" />
   <public type="style" name="Holo.Light.SegmentedButton" />
+  <public type="style" name="Widget.ImageButton.NumberPickerUpButton" />
+  <public type="style" name="Widget.EditText.NumberPickerInputText" />
+  <public type="style" name="Widget.ImageButton.NumberPickerDownButton" />
+  <public type="style" name="Widget.Holo.ImageButton.NumberPickerUpButton" />
+  <public type="style" name="Widget.Holo.EditText.NumberPickerInputText" />
+  <public type="style" name="Widget.Holo.ImageButton.NumberPickerDownButton" />
+  <public type="style" name="Widget.Holo.Light.ImageButton.NumberPickerUpButton" />
+  <public type="style" name="Widget.Holo.Light.EditText.NumberPickerInputText" />
+  <public type="style" name="Widget.Holo.Light.ImageButton.NumberPickerDownButton" />
+  <public type="style" name="Widget.CalendarView" />
+  <public type="style" name="Widget.Holo.CalendarView" />
+  <public type="style" name="Widget.Holo.Light.CalendarView" />
   <public type="string" name="selectTextMode" />
+
 </resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index e48321c..3902734 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -298,12 +298,12 @@
     <string name="shutdown_confirm_question">Would you like to shut down?</string>
 
     <!-- Recent Tasks dialog: title
-     TODO: this should move to SystemUI.apk, but the code for the old 
+     TODO: this should move to SystemUI.apk, but the code for the old
             recent dialog is still in the framework
      -->
     <string name="recent_tasks_title">Recent</string>
     <!-- Recent Tasks dialog: message when there are no recent applications
-     TODO: this should move to SystemUI.apk, but the code for the old 
+     TODO: this should move to SystemUI.apk, but the code for the old
             recent dialog is still in the framework
      -->
     <string name="no_recent_tasks">No recent applications.</string>
@@ -1363,17 +1363,17 @@
     <!-- Title of policy access to limiting the user's password choices -->
     <string name="policylab_limitPassword">Set password rules</string>
     <!-- Description of policy access to limiting the user's password choices -->
-    <string name="policydesc_limitPassword">Control the length and the characters 
+    <string name="policydesc_limitPassword">Control the length and the characters
     allowed in screen-unlock passwords</string>
     <!-- Title of policy access to watch user login attempts -->
     <string name="policylab_watchLogin">Monitor screen-unlock attempts</string>
     <!-- Description of policy access to watch user login attempts -->
-    <string name="policydesc_watchLogin" product="tablet">Monitor the number of incorrect passwords 
-    entered when unlocking the screen, and lock the tablet or erase all the tablet\'s 
+    <string name="policydesc_watchLogin" product="tablet">Monitor the number of incorrect passwords
+    entered when unlocking the screen, and lock the tablet or erase all the tablet\'s
     data if too many incorrect passwords are entered</string>
     <!-- Description of policy access to watch user login attempts -->
-    <string name="policydesc_watchLogin" product="default">Monitor the number of incorrect passwords 
-    entered when unlocking the screen, and lock the phone or erase all the phone\'s 
+    <string name="policydesc_watchLogin" product="default">Monitor the number of incorrect passwords
+    entered when unlocking the screen, and lock the phone or erase all the phone\'s
     data if too many incorrect passwords are entered</string>
     <!-- Title of policy access to reset user's password -->
     <string name="policylab_resetPassword">Change the screen-unlock password</string>
@@ -1386,10 +1386,10 @@
     <!-- Title of policy access to wipe the user's data -->
     <string name="policylab_wipeData">Erase all data</string>
     <!-- Description of policy access to wipe the user's data -->
-    <string name="policydesc_wipeData" product="tablet">Erase the tablet\'s data without warning, 
+    <string name="policydesc_wipeData" product="tablet">Erase the tablet\'s data without warning,
     by performing a factory data reset</string>
     <!-- Description of policy access to wipe the user's data -->
-    <string name="policydesc_wipeData" product="default">Erase the phone\'s data without warning, 
+    <string name="policydesc_wipeData" product="default">Erase the phone\'s data without warning,
     by performing a factory data reset</string>
     <string name="policylab_setGlobalProxy">Set the device global proxy</string>
     <!-- Description of policy access to wipe the user's data -->
@@ -1602,7 +1602,7 @@
     <string name="relationTypeSister">Sister</string>
     <!-- Spouse relationship type [CHAR LIMIT=20] -->
     <string name="relationTypeSpouse">Spouse</string>
-    
+
     <!-- Custom SIP address type -->
     <string name="sipAddressTypeCustom">Custom</string>
     <!-- Home SIP address type -->
@@ -1806,7 +1806,7 @@
 
     <!-- Do not translate.  WebView User Agent string -->
     <string name="web_user_agent" translatable="false">Mozilla/5.0 (Linux; U; <xliff:g id="x">Android %s</xliff:g>)
-        AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 <xliff:g id="mobile">%s</xliff:g>Safari/534.13</string>
+        AppleWebKit/534.14 (KHTML, like Gecko) Version/4.0 <xliff:g id="mobile">%s</xliff:g>Safari/534.14</string>
     <!-- Do not translate.  WebView User Agent targeted content -->
     <string name="web_user_agent_target_content" translatable="false">"Mobile "</string>
 
@@ -2640,4 +2640,15 @@
     <!-- Network positioning verification No. Button to push to deny sharing of location
          information. -->
     <string name="gpsVerifNo">No</string>
+
+    <!-- Error message when the sync tried to delete too many things -->
+    <string name="sync_too_many_deletes">Delete limit exceeded</string>
+    <!-- Dialog message for when there are too many deletes that would take place and we want user confirmation -->
+    <string name="sync_too_many_deletes_desc">There are <xliff:g id="number_of_deleted_items">%1$d</xliff:g> deleted items for <xliff:g id="type_of_sync">%2$s</xliff:g>, account <xliff:g id="account_name">%3$s</xliff:g>. What would you like to do?</string>
+    <!-- Dialog action for when there are too many deletes that would take place and we want user confirmation, and the user wants to delete the items -->
+    <string name="sync_really_delete">Delete the items.</string>
+    <!-- Dialog action for when there are too many deletes that would take place and we want user confirmation, and the user wants to undo the deletions -->
+    <string name="sync_undo_deletes">Undo the deletes.</string>
+    <!-- Dialog action for when there are too many deletes that would take place and we want user confirmation, and the user wants to do nothing for now -->
+    <string name="sync_do_nothing">Do nothing for now.</string>
 </resources>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 3e75261..f6c88e7 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -238,8 +238,7 @@
         <item name="android:textColor">#ff272727</item>
     </style>
 
-    <!-- @hide -->
-    <style name="TextAppearance.Small.DayPickerWeekDayView">
+    <style name="TextAppearance.Small.CalendarViewWeekDayView">
         <item name="android:textStyle">bold</item>
     </style>
 
@@ -473,25 +472,22 @@
         <item name="android:background">@android:drawable/btn_default</item>
     </style>
 
-    <!-- @hide -->
-    <style name="Widget.DayPickerWeekView">
-        <item name="android:height">26dip</item>
-        <item name="android:weekStartDay">1</item>
-        <item name="android:weekDayCount">7</item>
+    <style name="Widget.CalendarView">
         <item name="android:showWeekNumber">true</item>
-        <item name="android:weekSeperatorWidth">1dip</item>
-        <item name="android:textSize">14dip</item>
-        <item name="android:weekDayPadding">0dip</item>
-        <item name="android:selectedDayLineWidth">6dip</item>
-        <item name="android:selectionBackgroundColor">#330099FF</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>
+        <item name="android:selectedWeekBackgroundColor">#330099FF</item>
         <item name="android:focusedMonthDateColor">#FFFFFFFF</item>
-        <item name="android:otherMonthDateColor">#66FFFFFF</item>
+        <item name="android:unfocusedMonthDateColor">#66FFFFFF</item>
         <item name="android:weekNumberColor">#33FFFFFF</item>
-        <item name="android:gridLinesColor">#19FFFFFF</item>
-        <item name="selectedDayLine">@android:drawable/day_picker_week_view_dayline_holo_dark</item>
+        <item name="android:weekSeparatorLineColor">#19FFFFFF</item>
+        <item name="android:selectedDateVerticalBar">@android:drawable/day_picker_week_view_dayline_holo</item>
+        <item name="android:weekDayTextAppearance">@android:style/TextAppearance.Small.CalendarViewWeekDayView</item>
+        <item name="android:dateTextAppearance">?android:attr/textAppearanceSmall</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.NumberPicker">
         <item name="android:orientation">vertical</item>
         <item name="android:fadingEdge">vertical</item>
@@ -499,17 +495,14 @@
         <item name="android:solidColor">@android:color/transparent</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.ImageButton.NumberPickerUpButton">
         <item name="android:background">@android:drawable/timepicker_up_btn</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.ImageButton.NumberPickerDownButton">
         <item name="android:background">@android:drawable/timepicker_down_btn</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.EditText.NumberPickerInputText">
         <item name="android:textAppearance">@style/TextAppearance.Large.Inverse.NumberPickerInputText</item>
         <item name="android:gravity">center</item>
@@ -861,7 +854,6 @@
         <item name="android:textStyle">bold</item>
     </style>
 
-    <!-- @hide -->
     <style name="TextAppearance.Large.Inverse.NumberPickerInputText">
         <item name="android:textColor">@android:color/primary_text_light</item>
         <item name="android:textSize">30sp</item>
@@ -915,6 +907,20 @@
         <item name="android:widgetLayout">@android:layout/preference_dialog</item>
     </style>
 
+    <!-- No margins or background by default. Could be different for x-large screens -->
+    <style name="PreferencePanel">
+    </style>
+
+    <!-- The attributes are overridden here because the x-large or large resources may have
+         changed the margins and background in the parent PreferencePanel style. -->
+    <style name="PreferencePanel.Dialog">
+        <item name="android:layout_marginLeft">0dip</item>
+        <item name="android:layout_marginRight">0dip</item>
+        <item name="android:layout_marginTop">0dip</item>
+        <item name="android:layout_marginBottom">0dip</item>
+        <item name="android:background">@null</item>
+    </style>
+
     <!-- Other Misc Styles -->
     <eat-comment />
 
@@ -1228,8 +1234,7 @@
         <item name="android:textSize">18sp</item>
     </style>
 
-    <!-- @hide -->
-    <style name="TextAppearance.Holo.DayPickerWeekDayView" parent="TextAppearance.Small.DayPickerWeekDayView">
+    <style name="TextAppearance.Holo.CalendarViewWeekDayView" parent="TextAppearance.Small.CalendarViewWeekDayView">
         <item name="android:textColor">#505050</item>
     </style>
 
@@ -1329,8 +1334,7 @@
         <item name="android:textSize">18sp</item>
     </style>
 
-    <!-- @hide -->
-    <style name="TextAppearance.Holo.Light.DayPickerWeekDayView" parent="TextAppearance.Small.DayPickerWeekDayView">
+    <style name="TextAppearance.Holo.Light.CalendarViewWeekDayView" parent="TextAppearance.Small.CalendarViewWeekDayView">
     </style>
 
     <!-- Widget Styles -->
@@ -1443,35 +1447,34 @@
         <item name="android:listSelector">?android:attr/selectableItemBackground</item>
     </style>
 
-    <!-- @hide -->
-    <style name="Widget.Holo.DayPickerWeekView" parent="Widget.DayPickerWeekView">
-        <item name="android:selectionBackgroundColor">#330099FF</item>
+    <style name="Widget.Holo.CalendarView" parent="Widget.CalendarView">
+        <item name="android:selectedWeekBackgroundColor">#330099FF</item>
         <item name="android:focusedMonthDateColor">#FFFFFFFF</item>
-        <item name="android:otherMonthDateColor">#66FFFFFF</item>
+        <item name="android:unfocusedMonthDateColor">#66FFFFFF</item>
         <item name="android:weekNumberColor">#33FFFFFF</item>
-        <item name="android:gridLinesColor">#19FFFFFF</item>
-        <item name="selectedDayLine">@android:drawable/day_picker_week_view_dayline_holo_dark</item>
+        <item name="android:weekSeparatorLineColor">#19FFFFFF</item>
+        <item name="android:selectedDateVerticalBar">@android:drawable/day_picker_week_view_dayline_holo</item>
+        <item name="android:weekDayTextAppearance">@android:style/TextAppearance.Holo.CalendarViewWeekDayView</item>
     </style>
 
     <style name="Widget.Holo.ImageButton" parent="Widget.ImageButton">
         <item name="android:background">@android:drawable/btn_default_holo_dark</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.Holo.ImageButton.NumberPickerUpButton">
         <item name="android:background">@null</item>
-        <item name="android:paddingBottom">26sp</item>
         <item name="android:src">@android:drawable/timepicker_up_btn_holo_dark</item>
+        <item name="android:paddingTop">26dip</item>
+        <item name="android:paddingBottom">26dip</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.Holo.ImageButton.NumberPickerDownButton">
         <item name="android:background">@null</item>
-        <item name="android:paddingTop">26sp</item>
         <item name="android:src">@android:drawable/timepicker_down_btn_holo_dark</item>
+        <item name="android:paddingTop">26dip</item>
+        <item name="android:paddingBottom">26dip</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.Holo.EditText.NumberPickerInputText">
         <item name="android:paddingTop">13sp</item>
         <item name="android:paddingBottom">13sp</item>
@@ -1535,8 +1538,8 @@
         <item name="android:indeterminateOnly">false</item>
         <item name="android:progressDrawable">@android:drawable/scrubber_progress_horizontal_holo_dark</item>
         <item name="android:indeterminateDrawable">@android:drawable/scrubber_progress_horizontal_holo_dark</item>
-        <item name="android:minHeight">6dip</item>
-        <item name="android:maxHeight">6dip</item>
+        <item name="android:minHeight">13dip</item>
+        <item name="android:maxHeight">13dip</item>
         <item name="android:thumb">@android:drawable/scrubber_control_holo</item>
         <item name="android:thumbOffset">16dip</item>
         <item name="android:focusable">true</item>
@@ -1817,27 +1820,23 @@
         <item name="android:background">@android:drawable/btn_default_holo_light</item>
     </style>
 
-    <!-- @hide -->
-    <style name="Widget.Holo.Light.DayPickerWeekView" parent="Widget.DayPickerWeekView">
-        <item name="android:selectionBackgroundColor">#7F080030</item>
+    <style name="Widget.Holo.Light.CalendarView" parent="Widget.CalendarView">
+        <item name="android:selectedWeekBackgroundColor">#330066ff</item>
         <item name="android:focusedMonthDateColor">#FF000000</item>
-        <item name="android:otherMonthDateColor">#7F08002B</item>
+        <item name="android:unfocusedMonthDateColor">#7F08002B</item>
         <item name="android:weekNumberColor">#7F080021</item>
-        <item name="android:gridLinesColor">#7F08002A</item>
-        <item name="selectedDayLine">@android:drawable/day_picker_week_view_dayline_holo_light</item>
+        <item name="android:weekSeparatorLineColor">#7F08002A</item>
+        <item name="android:weekDayTextAppearance">@android:style/TextAppearance.Holo.Light.CalendarViewWeekDayView</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.Holo.Light.ImageButton.NumberPickerUpButton" parent="Widget.Holo.ImageButton.NumberPickerUpButton">
         <item name="android:src">@android:drawable/timepicker_up_btn_holo_light</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.Holo.Light.ImageButton.NumberPickerDownButton" parent="Widget.Holo.ImageButton.NumberPickerDownButton">
         <item name="android:src">@android:drawable/timepicker_down_btn_holo_light</item>
     </style>
 
-    <!-- @hide -->
     <style name="Widget.Holo.Light.EditText.NumberPickerInputText" parent="Widget.Holo.EditText.NumberPickerInputText">
     </style>
 
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 87029ef..43686bc 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -234,6 +234,7 @@
         <item name="editTextPreferenceStyle">@android:style/Preference.DialogPreference.EditTextPreference</item>
         <item name="ringtonePreferenceStyle">@android:style/Preference.RingtonePreference</item>
         <item name="preferenceLayoutChild">@android:layout/preference_child</item>
+        <item name="preferencePanelStyle">@style/PreferencePanel</item>
         <item name="preferencePanelBackground">@android:drawable/panel_bg_holo_dark</item>
 
         <!-- Search widget styles -->
@@ -272,7 +273,6 @@
         <item name="searchViewEditQuery">@android:drawable/ic_commit</item>
         <item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>
 
-
         <!-- PreferenceFrameLayout attributes -->
         <item name="preferenceFrameLayoutStyle">@android:style/Widget.PreferenceFrameLayout</item>
 
@@ -282,11 +282,8 @@
         <item name="numberPickerInputTextStyle">@style/Widget.EditText.NumberPickerInputText</item>
         <item name="numberPickerStyle">@style/Widget.NumberPicker</item>
 
-        <!-- DayPicker$WeekView style-->
-        <item name="dayPickerWeekViewStyle">@style/Widget.DayPickerWeekView</item>
-
-        <!-- DayPickerWeekDayView style-->
-        <item name="dayPickerWeekDayViewStyle">@style/TextAppearance.Small.DayPickerWeekDayView</item>
+        <!-- CalendarView style-->
+        <item name="calendarViewStyle">@style/Widget.CalendarView</item>
 
         <item name="fastScrollThumbDrawable">@android:drawable/scrollbar_handle_accelerated_anim2</item>
         <item name="fastScrollTrackDrawable">@null</item>
@@ -936,11 +933,8 @@
         <item name="numberPickerDownButtonStyle">@style/Widget.Holo.ImageButton.NumberPickerDownButton</item>
         <item name="numberPickerInputTextStyle">@style/Widget.Holo.EditText.NumberPickerInputText</item>
 
-        <!-- DayPicker$WeekView style-->
-        <item name="dayPickerWeekViewStyle">@style/Widget.Holo.DayPickerWeekView</item>
-
-        <!-- DayPickerWeekDayView style-->
-        <item name="dayPickerWeekDayViewStyle">@style/TextAppearance.Holo.DayPickerWeekDayView</item>
+        <!-- CalendarView style-->
+        <item name="calendarViewStyle">@style/Widget.Holo.CalendarView</item>
 
         <item name="fastScrollThumbDrawable">@android:drawable/fastscroll_thumb_holo</item>
         <item name="fastScrollPreviewBackgroundLeft">@android:drawable/fastscroll_label_left_holo_dark</item>
@@ -1193,11 +1187,8 @@
         <item name="numberPickerDownButtonStyle">@style/Widget.Holo.Light.ImageButton.NumberPickerDownButton</item>
         <item name="numberPickerInputTextStyle">@style/Widget.Holo.Light.EditText.NumberPickerInputText</item>
 
-        <!-- DayPicker$WeekView style-->
-        <item name="dayPickerWeekViewStyle">@style/Widget.Holo.Light.DayPickerWeekView</item>
-
-        <!-- DayPickerWeekDayView style-->
-        <item name="dayPickerWeekDayViewStyle">@style/TextAppearance.Holo.Light.DayPickerWeekDayView</item>
+        <!-- CalendarView style-->
+        <item name="calendarViewStyle">@style/Widget.Holo.Light.CalendarView</item>
 
         <item name="fastScrollThumbDrawable">@android:drawable/fastscroll_thumb_holo</item>
         <item name="fastScrollPreviewBackgroundLeft">@android:drawable/fastscroll_label_left_holo_light</item>
@@ -1306,7 +1297,7 @@
          (large, xlarge). -->
     <style name="Theme.Holo.DialogWhenLarge.NoActionBar" parent="@android:style/Theme.Holo.NoActionBar">
     </style>
-    
+
     <!-- Light holo dialog themes -->
 
     <!-- Holo light theme for dialog windows and activities, which is used by the
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java
index af74c6f..3d5588c 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java
@@ -22,6 +22,10 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Bundle;
+import android.os.IPowerManager;
+import android.os.PowerManager;
+import android.os.ServiceManager;
+import android.os.SystemClock;
 import android.provider.Settings;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -460,6 +464,26 @@
         return mWifiManager.setWifiEnabled(true);
     }
 
+    // Turn screen off
+    public void turnScreenOff() {
+        log("Turn screen off");
+        PowerManager pm =
+            (PowerManager) getSystemService(Context.POWER_SERVICE);
+        pm.goToSleep(SystemClock.uptimeMillis() + 100);
+    }
+
+    // Turn screen on
+    public void turnScreenOn() {
+        log("Turn screen on");
+        IPowerManager mPowerManagerService = IPowerManager.Stub.asInterface(
+                ServiceManager.getService("power"));;
+        try {
+            mPowerManagerService.userActivityWithForce(SystemClock.uptimeMillis(), false, true);
+        } catch (Exception e) {
+            log(e.toString());
+        }
+    }
+
     /**
      * Associate the device to given SSID
      * If the device is already associated with a WiFi, disconnect and forget it,
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java
index 2ac7265..ea79f8c 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java
@@ -26,7 +26,10 @@
 import android.net.wifi.WifiConfiguration.AuthAlgorithm;
 import android.net.wifi.WifiManager;
 import android.os.Environment;
+import android.os.IPowerManager;
 import android.os.PowerManager;
+import android.os.ServiceManager;
+import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.suitebuilder.annotation.LargeTest;
 import android.util.Log;
@@ -46,7 +49,6 @@
     private final static String OUTPUT_FILE = "WifiStressTestOutput.txt";
     private ConnectivityManagerTestActivity mAct;
     private int iterations;
-    private PowerManager.WakeLock mWakelock = null;
     private BufferedWriter mOutputWriter = null;
     private int mLastIteration = 0;
 
@@ -61,17 +63,11 @@
         ConnectivityManagerStressTestRunner mRunner =
             (ConnectivityManagerStressTestRunner)getInstrumentation();
         iterations = mRunner.mSoftapIterations;
-        PowerManager pm =
-            (PowerManager)mRunner.getContext().getSystemService(Context.POWER_SERVICE);
-        mWakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "wifiApStress");
-        mWakelock.acquire();
+        mAct.turnScreenOn();
     }
 
     @Override
     public void tearDown() throws Exception {
-        if (mWakelock != null) {
-            mWakelock.release();
-        }
         // write the total number of iterations into output file
         mOutputWriter = new BufferedWriter(new FileWriter(new File(
                 Environment.getExternalStorageDirectory(), OUTPUT_FILE)));
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java
index 7914417..ae009ca6 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java
@@ -30,7 +30,9 @@
 import android.net.wifi.WifiManager;
 import android.os.Environment;
 import android.os.PowerManager;
+import android.os.IPowerManager;
 import android.os.SystemClock;
+import android.os.ServiceManager;
 import android.provider.Settings;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.suitebuilder.annotation.LargeTest;
@@ -57,7 +59,7 @@
     /**
      * Wi-Fi idle time for default sleep policy
      */
-    private final static long WIFI_IDLE_MS = 5 * 1000;
+    private final static long WIFI_IDLE_MS = 60 * 1000;
 
     /**
      * The delay for Wi-Fi to get into idle, after screen off + WIFI_IDEL_MS + WIFI_IDLE_DELAY
@@ -73,7 +75,6 @@
     private String mSsid;
     private String mPassword;
     private ConnectivityManagerStressTestRunner mRunner;
-    private PowerManager.WakeLock wl = null;
     private BufferedWriter mOutputWriter = null;
 
     public WifiStressTest() {
@@ -90,10 +91,11 @@
         mPassword = mRunner.mReconnectPassword;
         mScanIterations = mRunner.mScanIterations;
         mWifiSleepTime = mRunner.mSleepTime;
-        wl = null;
         mOutputWriter = new BufferedWriter(new FileWriter(new File(
                 Environment.getExternalStorageDirectory(), OUTPUT_FILE), true));
+        mAct.turnScreenOn();
         if (!mAct.mWifiManager.isWifiEnabled()) {
+            log("Enable wi-fi before stress tests.");
             if (!mAct.enableWifi()) {
                 tearDown();
                 fail("enable wifi failed.");
@@ -106,9 +108,6 @@
     @Override
     public void tearDown() throws Exception {
         log("tearDown()");
-        if ((wl != null) && wl.isHeld()) {
-            wl.release();
-        }
         if (mOutputWriter != null) {
             mOutputWriter.close();
         }
@@ -129,26 +128,6 @@
         }
     }
 
-    private void turnScreenOff() {
-        log("Turn screen off");
-        if (wl != null) {
-            log("release wake lock");
-            wl.release();
-        }
-        PowerManager pm =
-            (PowerManager) mRunner.getContext().getSystemService(Context.POWER_SERVICE);
-        pm.goToSleep(SystemClock.uptimeMillis() + 50);
-    }
-
-    private void turnScreenOn() {
-        log("Turn screen on");
-        PowerManager pm =
-            (PowerManager)mRunner.getContext().getSystemService(Context.POWER_SERVICE);
-        wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
-                "wifiStressTest");
-        wl.acquire();
-    }
-
     public void log(String message) {
         Log.v(TAG, message);
     }
@@ -247,7 +226,6 @@
                 Settings.Secure.WIFI_IDLE_MS, WIFI_IDLE_MS);
 
         // Connect to a Wi-Fi network
-        turnScreenOn();
         WifiConfiguration config = new WifiConfiguration();
         config.SSID = mSsid;
         config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
@@ -267,26 +245,34 @@
                 ConnectivityManagerTestActivity.LONG_TIMEOUT));
         int i;
         for (i = 0; i < mReconnectIterations; i++) {
-            // 1. Put device into sleep
-            // 2. Wait for the device to sleep for sometime, very 3G is connected
-            // 3. Wake up the device
+            // 1. Put device into sleep mode
+            // 2. Wait for the device to sleep for sometime, verify wi-fi is off and mobile is on.
+            // 3. Maintain the sleep mode for some time,
+            // 4. Verify the Wi-Fi is still off, and data is on
+            // 5. Wake up the device, verify Wi-Fi is enabled and connected.
             writeOutput(String.format("iteration %d out of %d",
                     i, mReconnectIterations));
             log("iteration: " + i);
-            turnScreenOff();
+            mAct.turnScreenOff();
             PowerManager pm =
                 (PowerManager)mRunner.getContext().getSystemService(Context.POWER_SERVICE);
             assertFalse(pm.isScreenOn());
-            sleep(WIFI_IDLE_MS + WIFI_IDLE_DELAY, "Interruped while wait for wifi to be idle");
+            sleep(WIFI_IDLE_MS, "Interruped while wait for wifi to be idle");
             assertTrue("Wait for Wi-Fi to idle timeout",
                     mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.DISCONNECTED,
-                    ConnectivityManagerTestActivity.SHORT_TIMEOUT));
+                    6 * ConnectivityManagerTestActivity.SHORT_TIMEOUT));
+            // use long timeout as the pppd startup may take several retries.
             assertTrue("Wait for cellular connection timeout",
                     mAct.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED,
                     ConnectivityManagerTestActivity.LONG_TIMEOUT));
             sleep(mWifiSleepTime + WIFI_IDLE_DELAY, "Interrupted while device is in sleep mode");
+            // Verify the wi-fi is still off and data connection is on
+            assertEquals("Wi-Fi is reconnected", State.DISCONNECTED,
+                    mAct.mCM.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState());
+            assertEquals("Cellular connection is down", State.CONNECTED,
+                    mAct.mCM.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState());
             // Turn screen on again
-            turnScreenOn();
+            mAct.turnScreenOn();
             assertTrue("Wait for Wi-Fi enable timeout after wake up",
                     mAct.waitForWifiState(WifiManager.WIFI_STATE_ENABLED,
                     ConnectivityManagerTestActivity.SHORT_TIMEOUT));
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/unit/WifiClientTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/unit/WifiClientTest.java
index e0a3ee6..e22b018 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/unit/WifiClientTest.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/unit/WifiClientTest.java
@@ -18,14 +18,17 @@
 
 import android.content.BroadcastReceiver;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.Context;
 import android.app.Instrumentation;
 import android.os.Handler;
 import android.os.Message;
+import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiConfiguration.KeyMgmt;
 import android.net.wifi.WifiConfiguration.Status;
+import android.net.wifi.SupplicantState;
 
 import android.test.suitebuilder.annotation.LargeTest;
 import android.test.AndroidTestCase;
@@ -45,10 +48,62 @@
 
     //10s delay for turning on wifi
     private static final int DELAY = 10000;
+    private WifiStateListener mWifiStateListener;
+    int mWifiState;
+    int mDisableBroadcastCounter = 0;
+    int mEnableBroadcastCounter = 0;
+    NetworkInfo mNetworkInfo;
+    boolean mSupplicantConnection;
+    SupplicantState mSupplicantState;
+
+    private class WifiStateListener extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
+                mWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
+                        WifiManager.WIFI_STATE_UNKNOWN);
+                switch (mWifiState) {
+                    case WifiManager.WIFI_STATE_DISABLING:
+                        if (mDisableBroadcastCounter == 0) mDisableBroadcastCounter++;
+                        break;
+                    case WifiManager.WIFI_STATE_DISABLED:
+                        if (mDisableBroadcastCounter == 1) mDisableBroadcastCounter++;
+                        break;
+                    case WifiManager.WIFI_STATE_ENABLING:
+                        if (mEnableBroadcastCounter == 0) mEnableBroadcastCounter++;
+                        break;
+                    case WifiManager.WIFI_STATE_ENABLED:
+                        if (mEnableBroadcastCounter == 1) mEnableBroadcastCounter++;
+                        break;
+                }
+            } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+                mNetworkInfo = (NetworkInfo)
+                        intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
+            } else if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
+                mSupplicantState = (SupplicantState)
+                        intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
+            } else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
+                mSupplicantConnection =
+                        intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
+            }
+        }
+    }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+
+        // register a connectivity receiver for CONNECTIVITY_ACTION;
+
+        mWifiStateListener = new WifiStateListener();
+        IntentFilter mIntentFilter = new IntentFilter();
+        mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+        mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
+        mIntentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
+        mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+        getContext().registerReceiver(mWifiStateListener, mIntentFilter);
+
         mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
         mWifiManager.setWifiEnabled(true);
         assertNotNull(mWifiManager);
@@ -183,4 +238,37 @@
         assertTrue(ret);
         mWifiManager.saveConfiguration();
     }
+
+    // Test case 5: test wifi state change broadcasts
+    @LargeTest
+    public void testWifiBroadcasts() {
+
+        /* Initialize */
+        mWifiManager.setWifiEnabled(false);
+        sleepAfterWifiEnable();
+        mDisableBroadcastCounter = 0;
+        mEnableBroadcastCounter = 0;
+        mSupplicantConnection = false;
+        mNetworkInfo = null;
+        mSupplicantState = null;
+
+        /* Enable wifi */
+        mWifiManager.setWifiEnabled(true);
+        sleepAfterWifiEnable();
+        assertTrue(mEnableBroadcastCounter == 2);
+        assertTrue(mSupplicantConnection == true);
+        assertTrue(mNetworkInfo.isConnected());
+        assertTrue(mSupplicantState == SupplicantState.COMPLETED);
+
+
+        /* Disable wifi */
+        mWifiManager.setWifiEnabled(false);
+        sleepAfterWifiEnable();
+        assertTrue(mDisableBroadcastCounter == 2);
+        assertTrue(mSupplicantConnection == false);
+        assertTrue(!mNetworkInfo.isConnected());
+        assertTrue(mSupplicantState != SupplicantState.COMPLETED);
+
+    }
+
 }
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index f2857fa..72120a8 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -4,9 +4,9 @@
      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.
@@ -117,7 +117,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.focus.FocusAfterRemoval" android:label="FocusAfterRemoval">
@@ -145,28 +145,28 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.focus.ListOfEditTexts" android:label="ListOfEditTexts">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.focus.ListOfInternalSelectionViews" android:label="ListOfInternalSelectionViews">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>                        
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.focus.ListWithFooterViewAndNewLabels" android:label="FocusListWithFooter">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.focus.ListWithMailMessages" android:label="ListWithMailMessages">
@@ -180,7 +180,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.focus.VerticalFocusSearch" android:label="VerticalFocusSearch">
@@ -257,7 +257,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.layout.linear.LLOfButtons1" android:label="LLOfButtons1">
@@ -285,7 +285,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.layout.linear.Weight" android:label="Weight">
@@ -483,7 +483,7 @@
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.view.PreDrawListener" android:label="PreDrawListener">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -518,7 +518,7 @@
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.listview.ListScrollListener" android:label="ListScrollListener">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -532,21 +532,21 @@
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.listview.ListTakeFocusFromSide" android:label="ListTakeFocusFromSide">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.listview.ListBottomGravity" android:label="ListBottomGravity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.listview.ListBottomGravityMany" android:label="ListBottomGravityMany">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -568,19 +568,19 @@
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.listview.ListTopGravityMany" android:label="ListTopGravityMany">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.listview.ListEndingWithMultipleSeparators" android:label="ListEndingWithMultipleSeparators">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>                        
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListGetSelectedView" android:label="ListGetSelectedView">
@@ -615,21 +615,21 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListOfItemsTallerThanScreen" android:label="ListOfItemsTallerThanScreen">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListOfThinItems" android:label="ListOfThinItems">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>                        
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListOfShortTallShort" android:label="ListOfShortTallShort">
@@ -643,14 +643,14 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListWithOffScreenNextSelectable" android:label="ListWithOffScreenNextSelectable">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>                                    
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListWithFirstScreenUnSelectable" android:label="ListWithFirstScreenUnSelectable">
@@ -665,7 +665,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListWithHeaders" android:label="ListWithHeaders">
@@ -686,14 +686,14 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListWithScreenOfNoSelectables" android:label="ListWithScreenOfNoSelectables">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListItemFocusablesFarApart" android:label="ListItemFocusablesFarApart">
@@ -721,21 +721,21 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListItemsExpandOnSelection" android:label="ListItemsExpandOnSelection">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListWithOnItemSelectedAction" android:label="ListWithOnItemSelectedAction">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
 
         <activity android:name="android.widget.listview.ListItemISVAndButton" android:label="ListItemISVAndButton">
@@ -770,30 +770,30 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
-       
+
 	    <activity android:name="android.widget.listview.ListManagedCursor" android:label="ListManagedCursor">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-       
+
 	    <activity android:name="android.widget.listview.ListWithEmptyView" android:label="ListWithEmptyView">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.gridview.GridInHorizontal" android:label="GridInHorizontal">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.gridview.GridPadding" android:label="GridPadding">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -884,21 +884,21 @@
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.gridview.GridVerticalSpacingStackFromBottom" android:label="GridVerticalSpacingStackFromBottom">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.gridview.GridSingleColumn" android:label="GridSingleColumn">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.view.menu.ListContextMenu" android:label="ListContextMenu">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -1012,7 +1012,7 @@
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
-        
+
         <activity android:name="android.widget.AutoCompleteTextViewSimple"
                   android:label="AutoCompleteTextViewSimple">
             <intent-filter>
@@ -1037,9 +1037,9 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>            
+            </intent-filter>
         </activity>
-        
+
 
 
         <!-- Activity-level metadata -->
@@ -1052,13 +1052,6 @@
         <meta-data android:name="com.android.frameworks.coretests.reference"
                    android:resource="@xml/metadata_app" />
 
-        <activity android:name="AndroidPerformanceTests" android:label="Android Performance Tests">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.UNIT_TEST" />
-            </intent-filter>
-        </activity>
-
         <!-- Application components used for activity tests -->
 
         <activity android:name="android.app.activity.TestedActivity"
diff --git a/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java b/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java
index 1bb2a57..6a471ad 100644
--- a/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java
+++ b/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java
@@ -57,7 +57,7 @@
  * Base class for Instrumented tests for the Download Manager.
  */
 public class DownloadManagerBaseTest extends InstrumentationTestCase {
-
+    private static final String TAG = "DownloadManagerBaseTest";
     protected DownloadManager mDownloadManager = null;
     protected MockWebServer mServer = null;
     protected String mFileType = "text/plain";
@@ -616,19 +616,22 @@
         int nextChunkSize = CHUNK_SIZE;
         byte[] randomData = null;
         Random rng = new LoggingRng();
+        byte[] chunkSizeData = generateData(nextChunkSize, type, rng);
 
         try {
             while (remaining > 0) {
                 if (remaining < CHUNK_SIZE) {
                     nextChunkSize = (int)remaining;
                     remaining = 0;
+                    randomData = generateData(nextChunkSize, type, rng);
                 }
                 else {
                     remaining -= CHUNK_SIZE;
+                    randomData = chunkSizeData;
                 }
-
-                randomData = generateData(nextChunkSize, type, rng);
                 output.write(randomData);
+                Log.i(TAG, "while creating " + fileSize + " file, " +
+                        "remaining bytes to be written: " + remaining);
             }
         } catch (IOException e) {
             Log.e(LOG_TAG, "Error writing to file " + file.getAbsolutePath());
diff --git a/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java b/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java
index 06f3ba4..afe7f55 100644
--- a/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java
+++ b/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java
@@ -20,20 +20,14 @@
 
 import android.app.DownloadManager.Query;
 import android.app.DownloadManager.Request;
-import android.app.DownloadManagerBaseTest.DataType;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
-import android.os.StatFs;
 import android.test.suitebuilder.annotation.LargeTest;
-import android.util.Log;
 
 import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
 import java.util.Iterator;
-import java.util.Random;
 import java.util.Set;
 
 /**
@@ -152,55 +146,6 @@
     }
 
     /**
-     * Attempts to download several files simultaneously
-     */
-    @LargeTest
-    public void testMultipleDownloads() throws Exception {
-        // need to be sure all current downloads have stopped first
-        removeAllCurrentDownloads();
-        int NUM_FILES = 10;
-        int MAX_FILE_SIZE = 10 * 1024; // 10 kb
-
-        Random r = new LoggingRng();
-        for (int i=0; i<NUM_FILES; ++i) {
-            int size = r.nextInt(MAX_FILE_SIZE);
-            byte[] blobData = generateData(size, DataType.TEXT);
-
-            Uri uri = getServerUri(DEFAULT_FILENAME + i);
-            Request request = new Request(uri);
-            request.setTitle(String.format("%s--%d", DEFAULT_FILENAME + i, i));
-
-            // Prepare the mock server with a standard response
-            enqueueResponse(HTTP_OK, blobData);
-
-            long requestID = mDownloadManager.enqueue(request);
-        }
-
-        waitForDownloadsOrTimeout(WAIT_FOR_DOWNLOAD_POLL_TIME, MAX_WAIT_FOR_DOWNLOAD_TIME);
-        Cursor cursor = mDownloadManager.query(new Query());
-        try {
-            assertEquals(NUM_FILES, cursor.getCount());
-
-            if (cursor.moveToFirst()) {
-                do {
-                    int status = cursor.getInt(cursor.getColumnIndex(
-                            DownloadManager.COLUMN_STATUS));
-                    String filename = cursor.getString(cursor.getColumnIndex(
-                            DownloadManager.COLUMN_URI));
-                    String errorString = String.format(
-                            "File %s failed to download successfully. Status code: %d",
-                            filename, status);
-                    assertEquals(errorString, DownloadManager.STATUS_SUCCESSFUL, status);
-                } while (cursor.moveToNext());
-            }
-
-            assertEquals(NUM_FILES, mReceiver.numDownloadsCompleted());
-        } finally {
-            cursor.close();
-        }
-    }
-
-    /**
      * Tests trying to download to SD card when the file with same name already exists.
      */
     @LargeTest
@@ -478,103 +423,4 @@
         // Even tho the server drops the connection, we should still get a completed notification
         assertEquals(1, mReceiver.numDownloadsCompleted());
     }
-
-    /**
-     * Tests downloading a file to system cache when there isn't enough space in the system cache 
-     * to hold the entire file. DownloadManager deletes enough files to make space for the
-     * new download.
-     */
-    @LargeTest
-    public void testDownloadToCacheWithAlmostFullCache() throws Exception {
-        int DOWNLOAD_FILE_SIZE = 1024 * 1024; // 1MB
-
-        StatFs fs = new StatFs(CACHE_DIR);
-        int blockSize = fs.getBlockSize();
-        int availableBlocks = fs.getAvailableBlocks();
-        int availableBytes = blockSize * availableBlocks;
-        Log.i(TAG, "INITIAL stage, available space in /cache: " + availableBytes);
-        File outFile = File.createTempFile("DM_TEST", null, new File(CACHE_DIR));
-        byte[] buffer = new byte[blockSize];
-
-        try {
-            // fill cache to ensure we don't have enough space - take half the size of the
-            // download size, and leave that much freespace left on the cache partition
-            if (DOWNLOAD_FILE_SIZE <= availableBytes) {
-                int writeSizeBytes = availableBytes - (DOWNLOAD_FILE_SIZE / 2);
-
-                int writeSizeBlocks = writeSizeBytes / blockSize;
-                int remainderSizeBlocks = availableBlocks - writeSizeBlocks;
-
-                FileOutputStream fo = null;
-                try {
-                    fo = new FileOutputStream(outFile);
-                    while (fs.getAvailableBlocks() >= remainderSizeBlocks) {
-                        fo.write(buffer);
-                        fs.restat(CACHE_DIR);
-                    }
-                } catch (IOException e) {
-                    Log.e(LOG_TAG, "error filling file: ", e);
-                    throw e;
-                } finally {
-                    if (fo != null) {
-                        fo.close();
-                    }
-                }
-            }
-
-            // /cache should now be almost full. 
-            long spaceAvailable = fs.getAvailableBlocks() * blockSize;
-            Log.i(TAG, "BEFORE download, available space in /cache: " + spaceAvailable);
-            assertTrue(DOWNLOAD_FILE_SIZE > spaceAvailable);
-
-            // try to download 1MB file into /cache - and it should succeed
-            byte[] blobData = generateData(DOWNLOAD_FILE_SIZE, DataType.TEXT);
-            long dlRequest = doBasicDownload(blobData, DOWNLOAD_TO_SYSTEM_CACHE);
-            verifyAndCleanupSingleFileDownload(dlRequest, blobData);
-        } finally {
-            if (outFile != null) {
-                outFile.delete();
-            }
-        }
-    }
-
-    /**
-     * Tests that files are not deleted when DOWNLOAD_CACHE_NON_PURGEABLE is set, even if we've
-     * run out of space.
-     */
-    @LargeTest
-    public void testDownloadToCacheNonPurgeableWithFullCache() throws Exception {
-        int fileSize = 1024 * 1024; // 1MB
-        byte[] blobData = generateData(fileSize, DataType.BINARY);
-        long dlRequest = -1;
-
-        // Fill up the cache partition with DOWNLOAD_CACHE_NON_PURGEABLE downloads
-        // until 500KB is left.
-        boolean spaceAvailable = true;
-        while (spaceAvailable) {
-            // since this tests package has android.permission.DOWNLOAD_CACHE_NON_PURGEABLE
-            // permission, downloads are automatically set to be DOWNLOAD_CACHE_NON_PURGEABLE
-            dlRequest = enqueueDownloadRequest(blobData, DOWNLOAD_TO_DOWNLOAD_CACHE_DIR);
-            waitForDownloadOrTimeout(dlRequest);
-
-            // Check if we've filled up the cache yet
-            StatFs fs = new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath());
-            int availableBytes = fs.getBlockSize() * fs.getAvailableBlocks();
-            Log.i(TAG, "available space in /cache: " + availableBytes);
-            spaceAvailable = (availableBytes > fileSize) ? true : false;
-        }
-
-        // Now add one more 1MB download (should not fit in the space left over)
-        dlRequest = enqueueDownloadRequest(blobData, DOWNLOAD_TO_DOWNLOAD_CACHE_DIR);
-        waitForDownloadOrTimeout(dlRequest);
-
-        // For the last download we should have failed b/c there is not enough space left in cache
-        Cursor cursor = getCursor(dlRequest);
-        try {
-            verifyInt(cursor, DownloadManager.COLUMN_REASON,
-                    DownloadManager.ERROR_INSUFFICIENT_SPACE);
-        } finally {
-            cursor.close();
-        }
-    }
 }
diff --git a/core/tests/coretests/src/android/app/DownloadManagerStressTest.java b/core/tests/coretests/src/android/app/DownloadManagerStressTest.java
index 18b279f..bdeb554 100644
--- a/core/tests/coretests/src/android/app/DownloadManagerStressTest.java
+++ b/core/tests/coretests/src/android/app/DownloadManagerStressTest.java
@@ -16,21 +16,28 @@
 
 package android.app;
 
-
 import android.app.DownloadManager.Query;
 import android.app.DownloadManager.Request;
 import android.database.Cursor;
 import android.net.Uri;
+import android.os.Environment;
 import android.os.ParcelFileDescriptor;
+import android.os.StatFs;
 import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.Suppress;
 import android.util.Log;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.Random;
 
-
+/**
+ * Integration tests of the DownloadManager API.
+ */
 public class DownloadManagerStressTest extends DownloadManagerBaseTest {
+    private static final String TAG = "DownloadManagerStressTest";
+    private final static String CACHE_DIR =
+            Environment.getDownloadCacheDirectory().getAbsolutePath();
 
     /**
      * {@inheritDoc}
@@ -38,8 +45,8 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        mServer.play(0);
         setWiFiStateOn(true);
+        mServer.play();
         removeAllCurrentDownloads();
     }
 
@@ -59,76 +66,62 @@
     }
 
     /**
-     * Attempts to downloading thousands of files simultaneously
-     * don't run this test - downloadmanager needs to allow only a few simultaneous downloads.
+     * Attempts to download several files simultaneously
      */
-    @Suppress
-    public void testDownloadThousands() throws Exception {
-        int NUM_FILES = 1500;
-        int MAX_FILE_SIZE = 3000;
-        long[] reqs = new long[NUM_FILES];
-
+    @LargeTest
+    public void testMultipleDownloads() throws Exception {
         // need to be sure all current downloads have stopped first
-        MultipleDownloadsCompletedReceiver receiver = registerNewMultipleDownloadsReceiver();
-        Cursor cursor = null;
+        removeAllCurrentDownloads();
+        int NUM_FILES = 10;
+        int MAX_FILE_SIZE = 10 * 1024; // 10 kb
+
+        Random r = new LoggingRng();
+        for (int i=0; i<NUM_FILES; ++i) {
+            int size = r.nextInt(MAX_FILE_SIZE);
+            byte[] blobData = generateData(size, DataType.TEXT);
+
+            Uri uri = getServerUri(DEFAULT_FILENAME + i);
+            Request request = new Request(uri);
+            request.setTitle(String.format("%s--%d", DEFAULT_FILENAME + i, i));
+
+            // Prepare the mock server with a standard response
+            enqueueResponse(HTTP_OK, blobData);
+
+            long requestID = mDownloadManager.enqueue(request);
+        }
+
+        waitForDownloadsOrTimeout(WAIT_FOR_DOWNLOAD_POLL_TIME, MAX_WAIT_FOR_DOWNLOAD_TIME);
+        Cursor cursor = mDownloadManager.query(new Query());
         try {
-            Random r = new LoggingRng();
-            for (int i = 0; i < NUM_FILES; ++i) {
-                int size = r.nextInt(MAX_FILE_SIZE);
-                byte[] blobData = generateData(size, DataType.TEXT);
-
-                Uri uri = getServerUri(DEFAULT_FILENAME);
-                Request request = new Request(uri);
-                request.setTitle(String.format("%s--%d", DEFAULT_FILENAME, i));
-
-                // Prepare the mock server with a standard response
-                enqueueResponse(HTTP_OK, blobData);
-
-                Log.i(LOG_TAG, "issuing request: " + i);
-                long reqId = mDownloadManager.enqueue(request);
-                reqs[i] = reqId;
-            }
-
-            // wait for the download to complete or timeout
-            waitForDownloadsOrTimeout(WAIT_FOR_DOWNLOAD_POLL_TIME,
-                    MAX_WAIT_FOR_LARGE_DOWNLOAD_TIME);
-            cursor = mDownloadManager.query(new Query());
             assertEquals(NUM_FILES, cursor.getCount());
-            Log.i(LOG_TAG, "Verified number of downloads in download manager is what we expect.");
-            while (cursor.moveToNext()) {
-                int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
-                String filename = cursor.getString(cursor.getColumnIndex(
-                        DownloadManager.COLUMN_URI));
-                String errorString = String.format("File %s failed to download successfully. " +
-                        "Status code: %d", filename, status);
-                assertEquals(errorString, DownloadManager.STATUS_SUCCESSFUL, status);
-            }
-            Log.i(LOG_TAG, "Verified each download was successful.");
-            assertEquals(NUM_FILES, receiver.numDownloadsCompleted());
-            Log.i(LOG_TAG, "Verified number of completed downloads in our receiver.");
 
-            // Verify that for each request, we can open the downloaded file
-            for (int i = 0; i < NUM_FILES; ++i) {
-                ParcelFileDescriptor pfd = mDownloadManager.openDownloadedFile(reqs[i]);
-                pfd.close();
+            if (cursor.moveToFirst()) {
+                do {
+                    int status = cursor.getInt(cursor.getColumnIndex(
+                            DownloadManager.COLUMN_STATUS));
+                    String filename = cursor.getString(cursor.getColumnIndex(
+                            DownloadManager.COLUMN_URI));
+                    String errorString = String.format(
+                            "File %s failed to download successfully. Status code: %d",
+                            filename, status);
+                    assertEquals(errorString, DownloadManager.STATUS_SUCCESSFUL, status);
+                } while (cursor.moveToNext());
             }
-            Log.i(LOG_TAG, "Verified we can open each file.");
+
+            assertEquals(NUM_FILES, mReceiver.numDownloadsCompleted());
         } finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-            mContext.unregisterReceiver(receiver);
-            removeAllCurrentDownloads();
+            cursor.close();
         }
     }
-
     /**
      * Tests trying to download a large file (50M bytes).
      */
     @LargeTest
     public void testDownloadLargeFile() throws Exception {
         long fileSize = 50000000L;  // note: kept relatively small to not exceed /cache dir size
+        Log.i(TAG, "creating a file of size: " + fileSize);
         File largeFile = createFileOnSD(null, fileSize, DataType.TEXT, null);
+        Log.i(TAG, "DONE creating a file of size: " + fileSize);
         MultipleDownloadsCompletedReceiver receiver = registerNewMultipleDownloadsReceiver();
 
         try {
@@ -149,4 +142,64 @@
             largeFile.delete();
         }
     }
+
+
+    /**
+     * Tests downloading a file to system cache when there isn't enough space in the system cache 
+     * to hold the entire file. DownloadManager deletes enough files to make space for the
+     * new download.
+     */
+    @LargeTest
+    public void testDownloadToCacheWithAlmostFullCache() throws Exception {
+        int DOWNLOAD_FILE_SIZE = 1024 * 1024; // 1MB
+
+        StatFs fs = new StatFs(CACHE_DIR);
+        int blockSize = fs.getBlockSize();
+        int availableBlocks = fs.getAvailableBlocks();
+        int availableBytes = blockSize * availableBlocks;
+        Log.i(TAG, "INITIAL stage, available space in /cache: " + availableBytes);
+        File outFile = File.createTempFile("DM_TEST", null, new File(CACHE_DIR));
+        byte[] buffer = new byte[blockSize];
+
+        try {
+            // fill cache to ensure we don't have enough space - take half the size of the
+            // download size, and leave that much freespace left on the cache partition
+            if (DOWNLOAD_FILE_SIZE <= availableBytes) {
+                int writeSizeBytes = availableBytes - (DOWNLOAD_FILE_SIZE / 2);
+
+                int writeSizeBlocks = writeSizeBytes / blockSize;
+                int remainderSizeBlocks = availableBlocks - writeSizeBlocks;
+
+                FileOutputStream fo = null;
+                try {
+                    fo = new FileOutputStream(outFile);
+                    while (fs.getAvailableBlocks() >= remainderSizeBlocks) {
+                        fo.write(buffer);
+                        fs.restat(CACHE_DIR);
+                    }
+                } catch (IOException e) {
+                    Log.e(LOG_TAG, "error filling file: ", e);
+                    throw e;
+                } finally {
+                    if (fo != null) {
+                        fo.close();
+                    }
+                }
+            }
+
+            // /cache should now be almost full. 
+            long spaceAvailable = fs.getAvailableBlocks() * blockSize;
+            Log.i(TAG, "BEFORE download, available space in /cache: " + spaceAvailable);
+            assertTrue(DOWNLOAD_FILE_SIZE > spaceAvailable);
+
+            // try to download 1MB file into /cache - and it should succeed
+            byte[] blobData = generateData(DOWNLOAD_FILE_SIZE, DataType.TEXT);
+            long dlRequest = doBasicDownload(blobData, DOWNLOAD_TO_SYSTEM_CACHE);
+            verifyAndCleanupSingleFileDownload(dlRequest, blobData);
+        } finally {
+            if (outFile != null) {
+                outFile.delete();
+            }
+        }
+    }
 }
diff --git a/core/tests/coretests/src/android/net/http/DefaultHttpClientTest.java b/core/tests/coretests/src/android/net/http/DefaultHttpClientTest.java
new file mode 100644
index 0000000..ad3ec3d
--- /dev/null
+++ b/core/tests/coretests/src/android/net/http/DefaultHttpClientTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.net.http;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+import junit.framework.TestCase;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+import tests.http.MockResponse;
+import tests.http.MockWebServer;
+import tests.http.SocketPolicy;
+import static tests.http.SocketPolicy.DISCONNECT_AT_END;
+import static tests.http.SocketPolicy.SHUTDOWN_INPUT_AT_END;
+import static tests.http.SocketPolicy.SHUTDOWN_OUTPUT_AT_END;
+
+public final class DefaultHttpClientTest extends TestCase {
+
+    private MockWebServer server = new MockWebServer();
+
+    @Override protected void tearDown() throws Exception {
+        server.shutdown();
+        super.tearDown();
+    }
+
+    public void testServerClosesSocket() throws Exception {
+        testServerClosesOutput(DISCONNECT_AT_END);
+    }
+
+    public void testServerShutdownInput() throws Exception {
+        testServerClosesOutput(SHUTDOWN_INPUT_AT_END);
+    }
+
+    /**
+     * DefaultHttpClient fails if the server shutdown the output after the
+     * response was sent. http://b/2612240
+     */
+    public void testServerShutdownOutput() throws Exception {
+        testServerClosesOutput(SHUTDOWN_OUTPUT_AT_END);
+    }
+
+    private void testServerClosesOutput(SocketPolicy socketPolicy) throws Exception {
+        server.enqueue(new MockResponse()
+                .setBody("This connection won't pool properly")
+                .setSocketPolicy(socketPolicy));
+        server.enqueue(new MockResponse()
+                .setBody("This comes after a busted connection"));
+        server.play();
+
+        DefaultHttpClient client = new DefaultHttpClient();
+
+        HttpResponse a = client.execute(new HttpGet(server.getUrl("/a").toURI()));
+        assertEquals("This connection won't pool properly", contentToString(a));
+        assertEquals(0, server.takeRequest().getSequenceNumber());
+
+        HttpResponse b = client.execute(new HttpGet(server.getUrl("/b").toURI()));
+        assertEquals("This comes after a busted connection", contentToString(b));
+        // sequence number 0 means the HTTP socket connection was not reused
+        assertEquals(0, server.takeRequest().getSequenceNumber());
+    }
+
+    private String contentToString(HttpResponse response) throws IOException {
+        StringWriter writer = new StringWriter();
+        char[] buffer = new char[1024];
+        Reader reader = new InputStreamReader(response.getEntity().getContent());
+        int length;
+        while ((length = reader.read(buffer)) != -1) {
+            writer.write(buffer, 0, length);
+        }
+        reader.close();
+        return writer.toString();
+    }
+}
diff --git a/data/fonts/AndroidClock.ttf b/data/fonts/AndroidClock.ttf
new file mode 100644
index 0000000..24a7f08
--- /dev/null
+++ b/data/fonts/AndroidClock.ttf
Binary files differ
diff --git a/data/fonts/AndroidClock_Highlight.ttf b/data/fonts/AndroidClock_Highlight.ttf
new file mode 100644
index 0000000..1e14a8f
--- /dev/null
+++ b/data/fonts/AndroidClock_Highlight.ttf
Binary files differ
diff --git a/data/fonts/fonts.mk b/data/fonts/fonts.mk
index 34d0331..b8a93e8 100644
--- a/data/fonts/fonts.mk
+++ b/data/fonts/fonts.mk
@@ -26,4 +26,6 @@
     frameworks/base/data/fonts/DroidSerif-BoldItalic.ttf:system/fonts/DroidSerif-BoldItalic.ttf \
     frameworks/base/data/fonts/DroidSansMono.ttf:system/fonts/DroidSansMono.ttf \
     frameworks/base/data/fonts/Clockopia.ttf:system/fonts/Clockopia.ttf \
-    frameworks/base/data/fonts/DroidSansFallback.ttf:system/fonts/DroidSansFallback.ttf
+    frameworks/base/data/fonts/DroidSansFallback.ttf:system/fonts/DroidSansFallback.ttf \
+    frameworks/base/data/fonts/AndroidClock.ttf:system/fonts/AndroidClock.ttf \
+    frameworks/base/data/fonts/AndroidClock_Highlight.ttf:system/fonts/AndroidClock_Highlight.ttf 
diff --git a/docs/html/guide/developing/building/building-cmdline.jd b/docs/html/guide/developing/building/building-cmdline.jd
new file mode 100644
index 0000000..ff8e236
--- /dev/null
+++ b/docs/html/guide/developing/building/building-cmdline.jd
@@ -0,0 +1,306 @@
+page.title=Building and Running Applications in Other IDEs
+@jd:body
+
+ <div id="qv-wrapper">
+    <div id="qv">
+      <h2>In this document</h2>
+
+      <ol>
+        <li><a href="#DebugMode">Building in debug mode</a></li>
+
+        <li><a href="#ReleaseMode">Building in release mode</a></li>
+
+        <li><a href="#RunningOnEmulator">Running on an emulator</a></li>
+
+        <li><a href="#RunningOnDevice">Running on a device</a></li>
+      </ol>
+    </div>
+  </div>
+
+  <p>There are two ways to build your application using the Ant build script: one for
+  testing/debugging your application &mdash; <em>debug mode</em> &mdash; and one for building your
+  final package for release &mdash; <em>release mode</em>. Regardless of which way you build your application,
+  it must be signed before it can install on an emulator or device&mdash;with a debug key when building
+  in debug mode and with your own private key when building in release mode.</p>
+
+  <p>Whether you're building in debug mode or release mode, you need to use the Ant tool to compile
+  and build your project. This will create the .apk file that you can install on an emulator or device.
+  When you build in debug mode, the .apk file is automatically signed by the SDK tools with
+  a debug key, so it's instantly ready for installation onto an emulator or attached
+  development device. You cannot distribute an application that is signed with a debug key.
+  When you build in release mode, the .apk file is <em>unsigned</em>, so you
+  must manually sign it with your own private key, using Keytool and Jarsigner.</p>
+
+  <p>It's important that you read and understand <a href=
+  "{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>, particularly once
+  you're ready to release your application and share it with end-users. That document describes the
+  procedure for generating a private key and then using it to sign your .apk file. If you're just
+  getting started, however, you can quickly run your applications on an emulator or your own
+  development device by building in debug mode.</p>
+
+  <p>If you don't have Ant, you can obtain it from the <a href="http://ant.apache.org/">Apache Ant
+  home page</a>. Install it and make sure it is in your executable PATH. Before calling Ant, you
+  need to declare the JAVA_HOME environment variable to specify the path to where the JDK is
+  installed.</p>
+
+  <p class="note"><strong>Note:</strong> When installing JDK on Windows, the default is to install
+  in the "Program Files" directory. This location will cause <code>ant</code> to fail, because of
+  the space. To fix the problem, you can specify the JAVA_HOME variable like this: 
+  <pre>set JAVA_HOME=c:\Progra~1\Java\&lt;jdkdir&gt;
+  </pre>
+  
+  The easiest solution, however, is to install JDK in a non-space directory, for example:
+  
+  <pre>c:\java\jdk1.6.0_02</pre>
+
+  <h2 id="DebugMode">Building in debug mode</h2>
+
+  <p>For immediate application testing and debugging, you can build your application in debug mode
+  and immediately install it on an emulator. In debug mode, the build tools automatically sign your
+  application with a debug key and optimize the package with {@code zipalign}.</p>
+
+  <p>To build in debug mode:</p>
+
+  <ol>
+    <li>Open a command-line and navigate to the root of your project directory.</li>
+    <li>Use Ant to compile your project in debug mode:
+      <pre>
+ant debug
+</pre>
+
+      <p>This creates your debug <code>.apk</code> file inside the project <code>bin/</code> directory, named
+      <code>&lt;your_project_name&gt;-debug.apk</code>. The file is already signed with
+      the debug key and has been aligned with
+      <a href="{@docRoot}/guide/developing/tools/zipalign.html"><code>zipalign</code></a>.
+      </p>
+    </li>
+  </ol>
+
+  <p>Each time you change a source file or resource, you must run Ant again in order to package up
+  the latest version of the application.</p>
+
+  <p>To install and run your application on an emulator, see the following section about <a href=
+  "#RunningOnEmulator">Running on the Emulator</a>.</p>
+
+  <h2 id="ReleaseMode">Building in release mode</h2>
+
+  <p>When you're ready to release and distribute your application to end-users, you must build your
+  application in release mode. Once you have built in release mode, it's a good idea to perform
+  additional testing and debugging with the final .apk.</p>
+
+  <p>Before you start building your application in release mode, be aware that you must sign the
+  resulting application package with your private key, and should then align it using the {@code
+  zipalign} tool. There are two approaches to building in release mode: build an unsigned package
+  in release mode and then manually sign and align the package, or allow the build script to sign
+  and align the package for you.</p>
+
+  <h3 id="ManualReleaseMode">Build unsigned</h3>
+
+  <p>If you build your application <em>unsigned</em>, then you will need to manually sign and align
+  the package.</p>
+
+  <p>To build an <em>unsigned</em> .apk in release mode:</p>
+
+  <ol>
+    <li>Open a command-line and navigate to the root of your project directory.</li>
+
+    <li>Use Ant to compile your project in release mode:
+      <pre>
+ant release
+</pre>
+    </li>
+  </ol>
+
+  <p>This creates your Android application .apk file inside the project <code>bin/</code>
+  directory, named <code><em>&lt;your_project_name&gt;</em>-unsigned.apk</code>.</p>
+
+  <p class="note"><strong>Note:</strong> The .apk file is <em>unsigned</em> at this point and can't
+  be installed until signed with your private key.</p>
+
+  <p>Once you have created the unsigned .apk, your next step is to sign the .apk with your private
+  key and then align it with {@code zipalign}. To complete this procedure, read <a href=
+  "{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>.</p>
+
+  <p>When your <code>.apk</code> has been signed and aligned, it's ready to be distributed to end-users.
+  You should test the final build on different devices or AVDs to ensure that it
+  runs properly on different platforms.</p>
+
+  <h3 id="AutoReleaseMode">Build signed and aligned</h3>
+
+  <p>If you would like, you can configure the Android build script to automatically sign and align
+  your application package. To do so, you must provide the path to your keystore and the name of
+  your key alias in your project's {@code build.properties} file. With this information provided,
+  the build script will prompt you for your keystore and alias password when you build in release
+  mode and produce your final application package, which will be ready for distribution.</p>
+
+  <p class="caution"><strong>Caution:</strong> Due to the way Ant handles input, the password that
+  you enter during the build process <strong>will be visible</strong>. If you are concerned about
+  your keystore and alias password being visible on screen, then you may prefer to perform the
+  application signing manually, via Jarsigner (or a similar tool). To instead perform the signing
+  procedure manually, <a href="#ManualReleaseMode">build unsigned</a> and then continue with
+  <a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>.</p>
+
+  <p>To specify your keystore and alias, open the project {@code build.properties} file (found in
+  the root of the project directory) and add entries for {@code key.store} and {@code key.alias}.
+  For example:</p>
+  <pre>
+key.store=path/to/my.keystore
+key.alias=mykeystore
+</pre>
+
+  <p>Save your changes. Now you can build a <em>signed</em> .apk in release mode:</p>
+
+  <ol>
+    <li>Open a command-line and navigate to the root of your project directory.</li>
+
+    <li>Use Ant to compile your project in release mode:
+      <pre>
+ant release
+</pre>
+    </li>
+
+    <li>When prompted, enter you keystore and alias passwords.
+
+      <p class="caution"><strong>Caution:</strong> As described above, your password will be
+      visible on the screen.</p>
+    </li>
+  </ol>
+
+  <p>This creates your Android application .apk file inside the project <code>bin/</code>
+  directory, named <code><em>&lt;your_project_name&gt;</em>-release.apk</code>. This .apk file has
+  been signed with the private key specified in {@code build.properties} and aligned with {@code
+  zipalign}. It's ready for installation and distribution.</p>
+
+  <h3>Once built and signed in release mode</h3>
+
+  <p>Once you have signed your application with a private key, you can install and run it on an
+  <a href="#RunningOnEmulator">emulator</a> or <a href="#RunningOnDevice">device</a>. You can 
+  also try installing it onto a device from a web server. Simply upload the signed .apk to a web 
+  site, then load the .apk URL in your Android web browser to download the application and begin 
+  installation. (On your device, be sure you have enabled 
+  <em>Settings &gt; Applications &gt; Unknown sources</em>.)</p>
+
+  <h2 id="RunningOnEmulator">Running on the emulator</h2>
+
+  <p>Before you can run your application on the Android Emulator, you must <a href=
+  "{@docRoot}guide/developing/devices/managing-avds.html">create an AVD</a>.</p>
+
+  <p>To run your application:</p>
+
+  <ol>
+    <li>
+      <strong>Open the SDK and AVD Manager and launch a virtual device</strong>
+
+      <p>From your SDK's <code>platform-tools/</code> directory, execute the {@code android} tool with no
+      arguments:</p>
+      <pre>
+android
+</pre>
+
+      <p>In the <em>Virtual Devices</em> view, select an AVD and click <strong>Start</strong>.</p>
+    </li>
+
+    <li>
+      <strong>Install your application</strong>
+
+      <p>From your SDK's <code>tools/</code> directory, install the {@code .apk} on the
+      emulator:</p>
+      <pre>
+adb install <em>&lt;path_to_your_bin&gt;</em>.apk
+</pre>
+
+      <p>Your .apk file (signed with either a release or debug key) is in your project {@code bin/}
+      directory after you build your application.</p>
+
+      <p>If there is more than one emulator running, you must specify the emulator upon which to
+      install the application, by its serial number, with the <code>-s</code> option. For
+      example:</p>
+      <pre>
+adb -s emulator-5554 install <em>path/to/your/app</em>.apk
+</pre>
+
+      <p>To see a list of available device serial numbers, execute {@code adb devices}.</p>
+    </li>
+  </ol>
+
+  <p>If you don't see your application on the emulator, try closing the emulator and launching the
+  virtual device again from the SDK and AVD Manager. Sometimes when you install an application for the
+  first time, it won't show up in the application launcher or be accessible by other applications.
+  This is because the package manager usually examines manifests completely only on emulator
+  startup.</p>
+
+  <p>Be certain to create multiple AVDs upon which to test your application. You should have one
+  AVD for each platform and screen type with which your application is compatible. For instance, if
+  your application compiles against the Android 1.5 (API Level 3) platform, you should create an
+  AVD for each platform equal to and greater than 1.5 and an AVD for each <a href=
+  "{@docRoot}guide/practices/screens_support.html">screen type</a> you support, then test your
+  application on each one.</p>
+
+  <p class="note"><strong>Tip:</strong> If you have <em>only one</em> emulator running, you can
+  build your application and install it on the emulator in one simple step. Navigate to the root of
+  your project directory and use Ant to compile the project with <em>install mode</em>: <code>ant
+  install</code>. This will build your application, sign it with the debug key, and install it on
+  the currently running emulator.</p>
+
+  <h2 id="RunningOnDevice">Running on a device</h2>
+
+  <p>Before you can run your application on a device, you must perform some basic setup for your
+  device:</p>
+
+  <ul>
+    <li>Ensure that your application is debuggable by setting the
+    <code>android:debuggable</code> attribute of the <code>&lt;application&gt;</code>
+    element to <code>true</code>. As of ADT 8.0, this is done by default when you build in debug mode.</li>
+
+    <li>Enable USB Debugging on your device. You can find the setting on most Android devices by
+    going to <strong>Settings > Applications > Development > USB debugging</strong>.</li>
+
+    <li>Ensure that your development computer can detect your device when connected via USB</li>
+  </ul>
+
+  <p>Read <a href="{@docRoot}guide/developing/device.html#setting-up">Setting up a Device for
+  Development</a> for more information.</p>
+
+  <p>Once your device is set up and connected via USB, navigate to your SDK's <code>platform-tools/</code>
+  directory and install the <code>.apk</code> on the device:</p>
+  <pre>
+adb -d install <em>path/to/your/app</em>.apk 
+</pre>
+
+  <p>The {@code -d} flag specifies that you want to use the attached device (in case you also have
+  an emulator running).</p>
+
+  <p>For more information on the tools used above, please see the following documents:</p>
+
+  <ul>
+    <li><a href="{@docRoot}guide/developing/tools/android.html">android Tool</a></li>
+
+    <li><a href="{@docRoot}guide/developing/devices/emulator.html">Android Emulator</a></li>
+
+    <li><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a> (ADB)</li>
+  </ul>
+
+  <h2 id="Signing">Application Signing</h2>
+
+  <p>As you begin developing Android applications, understand that all Android applications must be
+  digitally signed before the system will install them on an emulator or device. There are two ways
+  to do this: with a <em>debug key</em> (for immediate testing on an emulator or development
+  device) or with a <em>private key</em> (for application distribution).</p>
+
+  <p>The Android build tools help you get started by automatically signing your .apk files with a
+  debug key at build time. This means that you can compile your application and install it on the
+  emulator without having to generate your own private key. However, please note that if you intend
+  to publish your application, you <strong>must</strong> sign the application with your own private
+  key, rather than the debug key generated by the SDK tools.</p>
+
+  <p>The ADT plugin helps you get started quickly by signing your .apk files with a debug key,
+  prior to installing them on an emulator or development device. This means that you can quickly
+  run your application from Eclipse without having to generate your own private key. No specific
+  action on your part is needed, provided ADT has access to Keytool.However, please note that if
+  you intend to publish your application, you <strong>must</strong> sign the application with your
+  own private key, rather than the debug key generated by the SDK tools.</p>
+
+  <p>Please read <a href="{@docRoot}guide/publishing/app-signing.html">Signing Your
+  Applications</a>, which provides a thorough guide to application signing on Android and what it
+  means to you as an Android application developer. The document also includes a guide to exporting
+  and signing your application with the ADT's Export Wizard.</p>
\ No newline at end of file
diff --git a/docs/html/guide/developing/building/building-eclipse.jd b/docs/html/guide/developing/building/building-eclipse.jd
new file mode 100644
index 0000000..4de4f31
--- /dev/null
+++ b/docs/html/guide/developing/building/building-eclipse.jd
@@ -0,0 +1,163 @@
+page.title=Building and Running Applications in Eclipse
+@jd:body
+
+<div id="qv-wrapper">
+    <div id="qv">
+      <h2>In this document</h2>
+
+      <ol>
+        <li><a href="#RunningOnEmulatorEclipse">Running on an Emulator</a></li>
+
+        <li><a href="#RunningOnDeviceEclipse">Running on a Device</a></li>
+
+        <li><a href="#RunConfig">Creating a Run Configuration</a></li>
+      </ol>
+    </div>
+  </div>
+
+  <p>Eclipse and ADT provide an environment where most of the details of the build process are
+  hidden from you. By default, the build process constantly runs in the background as you make
+  changes to your project.</p>
+
+  <p>When Eclipse automatically builds your application, it enables debugging and signs the
+  <code>.apk</code> with a debug key, by default. When you run the application,
+  Eclipse invokes ADB and installs your application to a device or emulator, so you do not have to
+  manually perform these tasks. Since most of the build process is taken care of by Eclipse, the
+  following topics show you how to run an application, which will automatically build your
+  application as well.</p>
+
+  <p>To distribute your application, however, you must build your application in release mode and sign the
+  <code>.apk</code> file with your own private key.</p>
+  
+   <p>This document shows you how to run your application on an emulator or a real device 
+   from Eclipse&mdash;all of which is done using the debug version of your application. 
+   For more information about how to sign your application with a private key for release, see <a href=
+  "{@docRoot}guide/publishing/app-signing.html#ExportWizard">Signing Your Applications</a></p>
+
+  <h2 id="RunningOnEmulatorEclipse">Running on the emulator</h2>
+
+  <p>Before you can run your application on the Android Emulator, you must <a href=
+  "{@docRoot}guide/developing/devices/managing-avds.html">create an AVD</a>.</p>
+
+  <p>To run (or debug) your application, select <strong>Run</strong> &gt; <strong>Run</strong> (or
+  <strong>Run</strong> &gt; <strong>Debug</strong>) from the Eclipse menu bar. The ADT plugin will
+  automatically create a default run configuration for the project. Eclipse will then perform the
+  following:</p>
+
+  <ol>
+    <li>Compile the project (if there have been changes since the last build).</li>
+
+    <li>Create a default run configuration (if one does not already exist for the project).</li>
+
+    <li>Install and start the application on an emulator (or device), based on the Deployment
+    Target defined by the run configuration.
+
+      <p>By default, Android run configurations use an "automatic target" mode for selecting a
+      device target. For information on how automatic target mode selects a deployment target, see
+      <a href="#AutoAndManualTargetModes">Automatic and manual target modes</a> below.</p>
+    </li>
+  </ol>
+
+  <p>If you run the application with the Debug option, the application will start in the "Waiting For Debugger" mode. Once the debugger
+  is attached, Eclipse opens the Debug perspective and starts the application's main activity. Otherwise, if you run the
+  application with the normal Run option, Eclipse installs the application on the device and launches the main activity.</p>
+
+  <p>To set or change the run configuration used for your project, use the run configuration
+  manager. See the section below about <a href="#RunConfig">Creating a Run Configuration</a> for more information.</p>
+
+  <p>Be certain to create multiple AVDs upon which to test your application. You should have one
+  AVD for each platform and screen type with which your application is compatible. For instance, if
+  your application compiles against the Android 1.5 (API Level 3) platform, you should create an
+  AVD for each platform equal to and greater than 1.5 and an AVD for each <a href=
+  "{@docRoot}guide/practices/screens_support.html">screen type</a> you support, then test your
+  application on each one.</p>
+
+  <h2 id="RunningOnDeviceEclipse">Running on a device</h2>
+
+  <p>Before you can run your application on a device, you must perform some basic setup for your
+  device:</p>
+
+  <ul>
+    <li>Ensure that your application is debuggable by setting the
+    <code>android:debuggable</code> attribute of the <code>&lt;application&gt;</code>
+    element to <code>true</code>. As of ADT 8.0, this is done by default when you build in debug mode.</li>
+
+    <li>Enable USB Debugging on your device. You can find the setting on most Android devices by
+    going to <strong>Settings > Applications > Development > USB debugging</strong>.</li>
+
+    <li>Ensure that your development computer can detect your device when connected via USB</li>
+  </ul>
+
+  <p>Read <a href="{@docRoot}guide/developing/device.html">Connecting Hardware Devices</a>
+  for more information.</p>
+
+  <p>Once set up and your device is connected via USB, install your application on the device by
+  selecting <strong>Run</strong> &gt; <strong>Run</strong> (or <strong>Run</strong> &gt;
+  <strong>Debug</strong>) from the Eclipse menu bar.</p>
+
+  <h2 id="RunConfig">Creating a Run Configuration</h2>
+
+  <p>The run configuration specifies the project to run, the Activity to start, the emulator or
+  connected device to use, and so on. When you first run a project as an <em>Android
+  Application</em>, ADT will automatically create a run configuration. The default run
+  configuration will launch the default project Activity and use automatic target mode for device
+  selection (with no preferred AVD). If the default settings don't suit your project, you can
+  customize the run configuration or even create a new one.</p>
+
+  <p>To create or modify a run configuration, refer to the Eclipse documentation on how to create Run configurations.
+  The following steps highlight the important things you need to do for an Android project:</p>
+
+  <ol>
+    <li>Open the run configuration manager from the Run Menu.</li>
+
+    <li>Expand the <strong>Android Application</strong> item and create a new configuration or open
+    an existing one.
+    </li>
+
+    <li>With the Run Configuration selected, adjust your desired run configuration settings:
+      <ul>
+      <li>In the Android tab, specify the Project and Activity to launch.
+      </li>
+      <li><p>In the Target tab, consider whether you'd like to use Manual or Automatic mode when
+      selecting an AVD to run your application. See the following section on <a href=
+      "#AutoAndManualTargetModes">Automatic and manual target modes</a>).</p>
+
+      <p>You can specify any emulator options to the Additional Emulator Command Line Options
+      field. For example, you could add <code>-scale 96dpi</code> to scale the AVD's screen to an
+      accurate size, based on the dpi of your computer monitor. For a full list of emulator
+      options, see the <a href="{@docRoot}guide/developing/tools/emulator.html">Android
+      Emulator</a> document.</p>
+      </li>
+      </ul>
+    </li>
+  </ol>
+
+  <h4 id="AutoAndManualTargetModes">Automatic and manual target modes</h4>
+
+  <p>By default, a run configuration uses the <strong>automatic</strong> target mode in order to
+  select an AVD. In this mode, ADT will select an AVD for the application in the following
+  manner:</p>
+
+  <ol>
+    <li>If there's a device or emulator already running and its AVD configuration meets the
+    requirements of the application's build target, the application is installed and run upon
+    it.</li>
+
+    <li>If there's more than one device or emulator running, each of which meets the requirements
+    of the build target, a "device chooser" is shown to let you select which device to use.</li>
+
+    <li>If there are no devices or emulators running that meet the requirements of the build
+    target, ADT looks at the available AVDs. If there is an AVD that matches the build target of the project,
+    ADT chooses that AVD. If the AVD versions are newer than the build target of the project, ADT chooses
+    the oldest possible version of an AVD that meets the project's build target requirement.</li>
+
+    <li>If there are no suitable AVDs, the application is not installed a console error warning tells
+    you that there is no existing AVD that meets the build target requirements.</li>
+  </ol>
+
+  <p>However, if a "preferred AVD" is selected in the run configuration, then the application will
+  <em>always</em> be deployed to that AVD. If it's not already running, then a new emulator will be
+  launched.</p>
+
+  <p>If your run configuration uses <strong>manual</strong> mode, then the "device chooser" is
+  presented every time that your application is run, so that you can select which AVD to use.</p>
\ No newline at end of file
diff --git a/docs/html/guide/developing/building/index.jd b/docs/html/guide/developing/building/index.jd
new file mode 100644
index 0000000..83a7bb3
--- /dev/null
+++ b/docs/html/guide/developing/building/index.jd
@@ -0,0 +1,80 @@
+page.title=Building and Running Applications
+@jd:body
+
+<div id="qv-wrapper">
+    <div id="qv">
+      <h2>In this document</h2>
+      <ol>
+        <li><a href="#detailed-build">A Detailed Look at the Build Process</a></li>
+      </ol>
+    </div>
+  </div>
+  
+ <p>During the build process, your Android projects are compiled and packaged into an .apk file,
+  the container for your application binary. It contains all of the information necessary to run
+  your application on a device or emulator, such as compiled <code>.dex</code> files (<code>.class</code> files
+  converted to Dalvik byte code), a binary version of the <code>AndroidManifest.xml</code> file, compiled
+  resources (<code>resources.arsc</code>) and uncompiled resource files for your application.</p>
+
+  <p>If you are developing in Eclipse, the ADT plugin incrementally builds your project as you
+  make changes to the source code. Eclipse outputs an <code>.apk</code> file automatically to the bin folder of
+  the project, so you do not have to do anything extra to generate the <code>.apk</code>.</p>
+
+  <p>If you are developing in a non-Eclipse environment, you can build your project with the
+  generated <code>build.xml</code> Ant file that is in the project directory. The Ant file calls targets that
+  automatically call the build tools for you.</p>
+
+  <p>To run an application on an emulator or device, the application must be signed using debug or
+  release mode. You typically want to sign your application in debug mode when you develop and test
+  your application, because the build tools use a debug key with a known password so you do not have
+  to enter it every time you build. When you are ready to release the application to Android
+  Market, you must sign the application in release mode, using your own private key.</p>
+
+  <p>Fortunately, Eclipse or your Ant build script signs the application for you in debug mode
+  when you build your application. You can also easily setup Eclipse or your Ant build to sign your
+  application in release mode as well. For more information on signing applications, see <a href=
+  "{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a>.</p>
+  
+  <p>The following diagram depicts the components involved in building and running an application:</p>
+
+  <img src="/images/build-simplified.png" />
+
+  <h2 id="detailed-build">A Detailed Look at the Build Process</h2>
+
+  <p>The build process involves many tools and processes that generate intermediate files on the
+  way to producing an <code>.apk</code>. If you are developing in Eclipse, the complete build process is
+  automatically done periodically as you develop and save your code changes. If you are using other
+  IDEs, this build process is done every time you run the generated Ant build script for your
+  project. It is useful, however, to understand what is happening under the hood since much of the
+  tools and processes are masked from you. The following diagram depicts the different tools and
+  processes that are involved in a build:</p>
+
+  <p><img src="/images/build.png" /></p>
+
+  <p>The general process for a typical build is outlined below:</p>
+
+  <ul>
+    <li>The Android Asset Packaging Tool (aapt) takes your application resource files, such as the
+    <code>AndroidManifest.xml</code> file and the XML files for your Activities, and compiles them. An <code>R.java</code> is
+    also produced so you can reference your resources from your Java code.</li>
+
+    <li>The aidl tool converts any <code>.aidl</code> interfaces that you have into Java interfaces.</li>
+
+    <li>All of your Java code, including the <code>R.java</code> and <code>.aidl</code> files, are compiled by the Java
+    compiler and .class files are output.</li>
+
+    <li>The dex tool converts the .class files to Dalvik byte code. Any 3rd party libraries and
+    .class files that you have included in your project are also converted into <code>.dex</code> files so that
+    they can be packaged into the final <code>.apk</code> file.</li>
+
+    <li>All non-compiled resources (such as images), compiled resources, and the .dex files are
+    sent to the apkbuilder tool to be packaged into an <code>.apk</code> file.</li>
+
+    <li>Once the <code>.apk</code> is built, it must be signed with either a debug or release key before it can
+    be installed to a device.</li>
+
+    <li>Finally, if the application is being signed in release mode, you must align the <code>.apk</code> with
+    the zipalign tool. Aligning the final <code>.apk</code> decreases memory usage when the application is
+    running on a device.</li>
+  </ul>
+
diff --git a/docs/html/guide/developing/device.jd b/docs/html/guide/developing/device.jd
index a4cec63..91c62ad 100644
--- a/docs/html/guide/developing/device.jd
+++ b/docs/html/guide/developing/device.jd
@@ -15,10 +15,6 @@
   <ol>
     <li><a
     href="{@docRoot}sdk/win-usb.html">USB Driver for Windows</a></li>
-    <li><a
-href="{@docRoot}guide/developing/eclipse-adt.html">Developing in Eclipse, with ADT</a></li>
-    <li><a
-href="{@docRoot}guide/developing/other-ide.html">Developing in other IDEs</a></li>
   </ol>
 </div>
 </div>
@@ -30,10 +26,7 @@
 <p>You can use any Android-powered device as an environment for running,
 debugging, and testing your applications. The tools included in the SDK make it easy to install and
 run your application on the device each time you compile. You can install your application on the
-device <a
-href="{@docRoot}guide/developing/eclipse-adt.html#RunningOnDevice">directly from
-Eclipse</a> or <a href="{@docRoot}guide/developing/other-ide.html#RunningOnDevice">from the
-command line</a>. If
+device directly from Eclipse or from the command line with ADB. If
 you don't yet have a device, check with the service providers in your area to determine which
 Android-powered devices are available.</p>
 
diff --git a/docs/html/guide/developing/devices/emulator.jd b/docs/html/guide/developing/devices/emulator.jd
new file mode 100644
index 0000000..08fb89d
--- /dev/null
+++ b/docs/html/guide/developing/devices/emulator.jd
@@ -0,0 +1,1773 @@
+page.title=Using the Android Emulator
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+  <h2>In this document</h2>
+    <ol>
+      <li><a href="#overview">Overview</a></li>
+      <li><a href="#starting">Starting and Stopping the Emulator</a></li>
+      <li><a href="#starting">Android Virtual Devices and the Emulator</a></li>
+      <li><a href="#controlling">Controlling the Emulator</a></li>
+      <li><a href="#startup-options">Emulator Startup Options</a></li>
+      <li><a href="#diskimages">Working with Emulator Disk Images</a>
+	      <ol>
+	        <li><a href="#defaultimages">Default Images</a></li>
+	        <li><a href="#runtimeimages">Runtime Images: User Data and SD Card</a></li>
+	        <li><a href="#temporaryimages">Temporary Images</a></li>
+	      </ol>
+	    </li>
+      <li><a href="#emulatornetworking">Emulator Networking</a>
+	      <ol>
+          <li><a href="#networkaddresses">Network Address Space</a></li>
+          <li><a href="#networkinglimitations">Local Networking Limitations</a></li>
+          <li><a href="#redirections">Using Network Redirections</a></li>
+          <li><a href="#dns">Configuring the Emulator's DNS Settings</a></li>
+          <li><a href="#proxy">Using the Emulator with a Proxy</a></li>
+          <li><a href="#connecting">Interconnecting Emulator Instances</a></li>
+          <li><a href="#calling">Sending a Voice Call or SMS to Another Emulator Instance</a></li>
+        </ol>
+      </li>
+    </ol>
+</div>
+</div>
+
+
+<img src="/images/emulator-wvga800l.png" alt="Image of the Android Emulator"
+width="367" height="349" style="margin-left:2em;float:right;"/>
+<p>The Android SDK includes a virtual mobile device emulator
+that runs on your computer. The emulator lets you prototype, develop, and test
+Android applications without using a physical device. </p>
+
+<p>The Android emulator mimics all of the hardware and software features
+of a typical mobile device, except that it cannot place actual phone
+calls. It provides a variety of navigation and control keys, which you can "press"
+using your mouse or keyboard to generate events for your application. It also
+provides a screen in which your application is displayed, together with any other
+Android applications running. </p>
+
+<p>To let you model and test your application more easily, the emulator utilizes
+Android Virtual Device (AVD) configurations. AVDs let you define certain hardware
+aspects of your emulated phone and allow you to create many configurations to test
+many Android platforms and hardware permutations. Once your application is running on
+the emulator, it can use the services of the Android platform to invoke other
+applications, access the network, play audio and video, store and retrieve data,
+notify the user, and render graphical transitions and themes. </p>
+
+<p>The emulator also includes a variety of debug capabilities, such as a console 
+from which you can log kernel output, simulate application interrupts (such as 
+arriving SMS messages or phone calls), and simulate latency effects and dropouts 
+on the data channel.</p>
+
+
+
+
+
+<h2  id="overview">Overview</h2>
+
+<p>The Android emulator is a QEMU-based application that provides a virtual ARM
+mobile device on which you can run your Android applications. It runs a full
+Android system stack, down to the kernel level, that includes a set of
+preinstalled applications (such as the dialer) that you can access from your
+applications. You can choose what version of the Android system you want to
+run in the emulator by configuring AVDs, and you can also customize the
+mobile device skin and key mappings. When launching the emulator and at runtime,
+you can use a variety of commands and options to control the its behaviors.
+</p>
+
+<p>The Android system image distributed in the SDK contains ARM machine code for
+the Android Linux kernel, the native libraries, the Dalvik VM, and the various
+Android package files (such as for for the Android framework and preinstalled
+applications). The emulator's QEMU layers provide dynamic binary translation of
+the ARM machine code to the OS and processor architecture of your development
+machine. </p>
+
+<p>Adding custom capabilities to the underlying QEMU services, the Android
+emulator supports many hardware features likely to be found on mobile devices,
+including: </p>
+
+<ul>
+  <li>An ARMv5 CPU and the corresponding memory-management unit (MMU)</li>
+  <li>A 16-bit LCD display</li>
+  <li>One or more keyboards (a Qwerty-based keyboard and associated Dpad/Phone
+buttons)</li>
+  <li>A sound chip with output and input capabilities</li>
+  <li>Flash memory partitions (emulated through disk image files on the
+development machine)</li>
+  <li>A GSM modem, including a simulated SIM Card</li>
+</ul>
+
+<p>The sections below provide more information about the emulator and how to use
+it for developing Android applications.</p>
+
+
+<a name="avds"></a>
+
+<h2>Android Virtual Devices and the Emulator</h2>
+
+<p>To use the emulator, you first must create one or more AVD configurations. In each
+configuration, you specify an Android platform to run in the emulator and the set of hardware
+options and emulator skin you want to use. Then, when you launch the emulator, you specify
+the AVD configuration that you want to load. </p>
+
+<p>To specify the AVD you want to load when starting the emulator, you use the
+<code>-avd</code> argument, as shown in the previous section. </p>
+
+<p>Each AVD functions as an independent device, with its own private storage for
+user data, SD card, and so on. When you launch the emulator with an AVD configuration,
+it automatically loads the user data and SD card data from the AVD directory. By default,
+the emulator stores the user data, SD card data, and cache in the AVD directory.</p>
+
+<p>To create and manage AVDs you use the android tool, a command-line utility
+included in the SDK. For complete information about how to set up AVDs, see <a
+href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>.</p>
+
+<a name="starting"></a>
+
+<h2>Starting and Stopping the Emulator</h2>
+
+<p>During development and testing of your application, you install and run your
+application in the Android emulator. You can launch the emulator as a standalone
+application, from a command line, or you can use it as part of your Eclipse
+development environment. In either case, you specify the AVD configuration to
+load and any startup options you want to use, as described in this document.
+</p>
+
+<p>You can run your application on a single instance of the emulator or,
+depending on your needs, you can start multiple emulator instances and run your
+application in more than one emulated device. You can use the emulator's
+built-in commands to simulate GSM phone calling or SMS between emulator
+instances, and you can set up network redirections that allow emulators to send
+data to one another. For more information, see <a href="#telephony">Telephony
+Emulation</a>, <a href="#sms">SMS Emulation</a>, and
+<a href="#emulatornetworking">Emulator Networking</a></p>
+
+<p>To start an instance of the emulator from the command line, change to the
+<code>tools/</code> folder of the SDK. Enter <code>emulator</code> command
+like this: </p>
+
+<pre>emulator -avd &lt;avd_name&gt;</pre>
+
+<p>This initializes the emulator and loads an AVD configuration (see the next
+section for more information about AVDs). You will see the emulator window
+appear on your screen. </p>
+
+<p>If you are working in Eclipse, the ADT plugin for Eclipse installs your
+application and starts the emulator automatically, when you run or debug
+the application. You can specify emulator startup options in the Run/Debug
+dialog, in the Target tab. When the emulator is running, you can issue
+console commands as described later in this document.</p>
+
+<p>If you are not working in Eclipse, see <a href="#apps">Installing Applications
+on the Emulator</a> for information about how to install your application.</p>
+
+<p>To stop an emulator instance, just close the emulator's window.</p>
+
+
+
+
+
+
+
+<a name="controlling"></a>
+
+
+<h2>Controlling the Emulator</h2>
+
+<p>You can use emulator <a href="#startup-options">startup options</a> and <a
+href="#console">console commands</a> to control the behaviors and
+characteristics of the emulated environment itself.
+</p>
+
+<p>When the emulator is running, you can interact with the emulated mobile
+device just as you would an actual mobile device, except that you use your mouse
+pointer to &quot;touch&quot; the touchscreen and your keyboard keys to
+&quot;press&quot; the simulated device keys. </p>
+
+<p>The table below summarizes the mappings between the emulator keys and and
+the keys of your keyboard. </p>
+
+<table  border="0" style="clear:left;">
+  <tr>
+    <th>Emulated Device Key </th>
+    <th>Keyboard Key </th>
+  </tr>
+  <tr>
+    <td>Home</td>
+    <td>HOME</td>
+  </tr>
+  <tr>
+    <td>Menu (left softkey)</td>
+    <td>F2 <em>or</em> Page-up button</td>
+  </tr>
+  <tr>
+    <td>Star (right softkey)</td>
+    <td>Shift-F2 <em>or </em>Page Down</td>
+  </tr>
+  <tr>
+    <td>Back</td>
+    <td>ESC</td>
+  </tr>
+  <tr>
+    <td>Call/dial button </td>
+    <td>F3</td>
+  </tr>
+  <tr>
+    <td>Hangup/end call button</td>
+    <td>F4</td>
+  </tr>
+  <tr>
+    <td>Search</td>
+    <td>F5 </td>
+  </tr>
+  <tr>
+    <td>Power button</td>
+    <td>F7 </td>
+  </tr>
+  <tr>
+    <td>Audio volume up button</td>
+    <td>KEYPAD_PLUS, Ctrl-5</td>
+  </tr>
+
+  <tr>
+    <td>Audio volume down button</td>
+    <td>KEYPAD_MINUS, Ctrl-F6</td>
+  </tr>
+  <tr>
+    <td>Camera button</td>
+    <td>Ctrl-KEYPAD_5, Ctrl-F3</td>
+  </tr>
+  <tr>
+    <td>Switch to previous layout orientation (for example, portrait, landscape)</td>
+    <td>KEYPAD_7, Ctrl-F11</td>
+  </tr>
+  <tr>
+    <td>Switch to next layout orientation (for example, portrait, landscape)</td>
+    <td>KEYPAD_9, Ctrl-F12</td>
+  </tr>
+  <tr>
+    <td>Toggle cell networking on/off</td>
+    <td>F8</td>
+  </tr>
+  <tr>
+    <td>Toggle code profiling</td>
+    <td>F9 (only with <code>-trace</code> startup option)</td>
+  </tr>
+  <tr>
+    <td>Toggle fullscreen mode</td>
+    <td>Alt-Enter</td>
+  </tr>
+  <tr>
+    <td>Toggle trackball mode</td>
+    <td>F6</td>
+  </tr>
+  <tr>
+    <td>Enter trackball mode temporarily (while key is pressed)</td>
+    <td>Delete</td>
+  </tr>
+  <tr>
+    <td>DPad left/up/right/down</td>
+    <td>KEYPAD_4/8/6/2</td>
+  </tr>
+  <tr>
+    <td>DPad center click</td>
+    <td>KEYPAD_5</td>
+  </tr>
+  <tr>
+    <td>Onion alpha increase/decrease</td>
+    <td>KEYPAD_MULTIPLY(*) / KEYPAD_DIVIDE(/)</td>
+  </tr>
+</table>
+
+<p>Note that, to use keypad keys, you must first disable NumLock on your development computer. </p>
+
+<h2 id="emulator">Emulator Startup Options</h2>
+
+<p>The emulator supports a variety of options that you can specify
+when launching the emulator, to control its appearance or behavior.
+Here's the command-line usage for launching the emulator with options: </p>
+
+<pre>emulator -avd &lt;avd_name&gt; [-&lt;option&gt; [&lt;value&gt;]] ... [-&lt;qemu args&gt;]</pre>
+
+<p>The table below summarizes the available options.</p>
+
+<table>
+<tr>
+  <th width="10%" >Category</th>
+  <th width="20%" >Option</th>
+    <th width="30%" >Description</th>
+    <th width="40%" >Comments</th>
+</tr>
+
+<tr>
+  <td rowspan="9">Help</td>
+  <td><code>-help</code></td>
+  <td>Print a list of all emulator options.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-help-all</code></td>
+  <td>Print help for all startup options.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-help-&lt;option&gt;</code></td>
+  <td>Print help for a specific startup option.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-help-debug-tags</code></td>
+  <td>Print a list of all tags for <code>-debug &lt;tags&gt;</code>.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-help-disk-images</code></td>
+  <td>Print help for using emulator disk images.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-help-environment</code></td>
+  <td>Print help for emulator environment variables.</td>
+  <td>&nbsp;</td>
+</tr><tr>
+  <td><code>-help-keys</code></td>
+  <td>Print the current mapping of keys.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-help-keyset-file</code></td>
+  <td>Print help for defining a custom key mappings file.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-help-virtual-device</code></td>
+  <td>Print help for Android Virtual Device usage.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td>AVD</td>
+  <td><code>-avd &lt;avd_name&gt;</code> or <br>
+      <code>@&lt;avd_name&gt;</code></td>
+  <td><strong>Required</strong>. Specifies the AVD to load for this emulator
+      instance.</td>
+  <td>You must create an AVD configuration before launching the emulator. For
+      information, see <a href="{@docRoot}guide/developing/tools/avd.html">Android
+      Virtual Devices</a>.</td>
+<tr>
+  <td rowspan="7">Disk Images</td>
+  <td><code>-cache&nbsp;&lt;filepath&gt;</code></td>
+  <td>Use &lt;filepath&gt; as the working cache partition image. </td>
+  <td>Optionally, you can specify a path relative to the current working directory.
+  If no cache file is specified, the emulator's default behavior is to use a temporary file instead.
+  <p>For more information on disk images, use <code>-help-disk-images</code>.</p>
+</td></tr>
+<tr>
+  <td><code>-data&nbsp;&lt;filepath&gt;</code></td>
+  <td>Use &lt;filepath&gt; as the working user-data disk image. </td>
+  <td>Optionally, you can specify a path relative to the current working directory.
+  If <code>-data</code> is not used, the emulator looks for a file named &quot;userdata-qemu.img&quot;
+  in the storage area of the AVD being used (see <code>-avd</code>).
+</td></tr>
+<!--
+<tr>
+  <td><code>-datadir &lt;dir&gt;</code></td>
+  <td>Search for the user-data disk image specified in <code>-data</code> in &lt;dir&gt;</td>
+  <td><code>&lt;dir&gt;</code> is a path relative to the current working directory.
+
+<p>If you do not specify <code>-datadir</code>, the emulator looks for the user-data image
+in the storage area of the AVD being used (see <code>-avd</code>)</p><p>For more information
+on disk images, use <code>-help-disk-images</code>.</p>
+</td></tr>
+-->
+<!-- 
+<tr>
+  <td><code>-image&nbsp;&lt;filepath&gt;</code></td>
+  <td>Use &lt;filepath&gt; as the system image.</td>
+  <td>Optionally, you can specify a path relative to the current working directory.
+   Default is &lt;system&gt;/system.img.</td>
+</tr>
+-->
+<tr>
+  <td><code>-initdata&nbsp;&lt;filepath&gt;</code></td>
+  <td>When resetting the user-data image (through <code>-wipe-data</code>), copy the contents
+  of this file to the new user-data disk image. By default, the emulator copies the <code>&lt;system&gt;/userdata.img</code>.</td>
+  <td>Optionally, you can specify a path relative to the current working directory. See also <code>-wipe-data</code>.
+  <p>For more information on disk images, use <code>-help-disk-images</code>.</p></td>
+</tr>
+<!--
+<tr>
+  <td><code>-kernel&nbsp;&lt;filepath&gt;</code></td>
+  <td>Use &lt;filepath&gt; as the emulated kernel.</td>
+  <td>Optionally, you can specify a path relative to the current working directory. </td>
+</tr>
+-->
+<tr>
+  <td><code>-nocache</code></td>
+  <td>Start the emulator without a cache partition.</td>
+  <td>See also <code>-cache &lt;file&gt;</code>.</td>
+</tr>
+<tr>
+  <td><code>-ramdisk&nbsp;&lt;filepath&gt;</code></td>
+  <td>Use &lt;filepath&gt; as the ramdisk image.</td>
+  <td>Default value is <code>&lt;system&gt;/ramdisk.img</code>.
+  <p>Optionally, you can specify a path relative to the current working directory. 
+  For more information on disk images, use <code>-help-disk-images</code>.</p>
+</td>
+</tr>
+<tr>
+  <td><code>-sdcard&nbsp;&lt;filepath&gt;</code></td>
+  <td>Use &lt;file&gt; as the SD card image.</td>
+  <td>Default value is <code>&lt;system&gt;/sdcard.img</code>.
+  <p>Optionally, you can specify a path relative to the current working directory. For more information on disk images, use <code>-help-disk-images</code>.</p>
+</td>
+</tr>
+<!--
+<tr>
+ <td><code>-system&nbsp;&lt;dirpath&gt;</code></td>
+ <td>Search for system, ramdisk and user data images in &lt;dir&gt;.</td>
+ <td><code>&lt;dir&gt;</code> is a directory path relative to the current 
+  working directory.</td>
+</tr>
+-->
+<tr>
+  <td><code>-wipe-data</code></td>
+  <td>Reset the current user-data disk image (that is, the file specified by <code>-datadir</code> and 
+  <code>-data</code>, or the default file). The emulator deletes all data from the user data image file, 
+  then copies the contents of the file at <code>-inidata</code> data to the image file before starting. 
+  </td>
+  <td>See also <code>-initdata</code>. 
+  <p>For more information on disk images, use <code>-help-disk-images</code>.</p>
+</td>
+</tr>
+<tr>
+  <td rowspan="9">Debug</td>
+  <td><code>-debug &lt;tags&gt;</code></td>
+  <td>Enable/disable debug messages for the specified debug tags.</td>
+  <td><code>&lt;tags&gt;</code> is a space/comma/column-separated list of debug component names. 
+  Use <code>-help-debug-tags</code> to print a list of debug component names that you can use. </td>
+</tr>
+<tr>
+  <td><code>-debug-&lt;tag&gt;</code></td>
+  <td>Enable/disable debug messages for the specified debug tag.</td>
+  <td rowspan="2">Use <code>-help-debug-tags</code> to print a list of debug component names that you can use in <code>&lt;tag&gt;</code>. </td>
+</tr>
+<tr>
+  <td><code>-debug-no-&lt;tag&gt;</code></td>
+  <td>Disable debug messages for the specified debug tag.</td>
+</tr>
+<tr>
+  <td><code>-logcat &lt;logtags&gt;</code></td>
+  <td>Enable logcat output with given tags.</td>
+  <td>If the environment variable ANDROID_LOG_TAGS is defined and not
+    empty, its value will be used to enable logcat output by default.</td>
+</tr>
+<tr>
+  <td><code>-shell</code></td>
+  <td>Create a root shell console on the current terminal.</td>
+  <td>You can use this command even if the adb daemon in the emulated system is broken. 
+  Pressing Ctrl-c from the shell stops the emulator instead of the shell.</td>
+</tr>
+<tr>
+  <td><code>-shell-serial&nbsp;&lt;device&gt;</code></td>
+  <td>Enable the root shell (as in <code>-shell</code> and specify the QEMU character 
+  device to use for communication with the shell.</td>
+  <td>&lt;device&gt; must be a QEMU device type. See the documentation for '-serial <em>dev</em>' at 
+  <a href="http://www.nongnu.org/qemu/qemu-doc.html#SEC10">http://www.bellard.org/qemu/qemu-doc.html#SEC10</a> 
+  for a list of device types.
+
+<p>Here are some examples: </p>
+<ul>
+  <li><code>-shell-serial stdio</code> is identical to <code>-shell</code></li>
+  <li><code>-shell-serial tcp::4444,server,nowait</code> lets you communicate with the shell over TCP port 4444</li>
+  <li><code>-shell-serial fdpair:3:6</code> lets a parent process communicate with the shell using fds 3 (in) and 6 (out)</li>
+  <li><code>-shell-serial fdpair:0:1</code> uses the normal stdin and stdout fds, except that QEMU won't tty-cook the data.</li>
+  </ul>
+</td>
+</tr>
+<tr>
+  <td><code>-show-kernel &lt;name&gt;</code></td>
+  <td>Display kernel messages.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-trace &lt;name&gt;</code></td>
+  <td>Enable code profiling (press F9 to start), written to a specified file.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-verbose</code></td>
+  <td>Enable verbose output.</td>
+  <td>Equivalent to <code>-debug-init</code>. 
+<p>You can define the default verbose output options used by emulator instances in the Android environment variable 
+ANDROID_VERBOSE. Define the options you want to use in a comma-delimited list, specifying only the stem of each option: 
+<code>-debug-&lt;tags&gt;.</code> </p>
+<p>Here's an example showing ANDROID_VERBOSE defined with the <code>-debug-init</code> and <code>-debug-modem</code> options: 
+<p><code>ANDROID_VERBOSE=init,modem</code></p>
+<p>For more information about debug tags, use <code>&lt;-help-debug-tags&gt;</code>.</p>
+</td>
+</tr>
+<tr>
+  <td rowspan="6">Media</td>
+  <td><code>-audio &lt;backend&gt;</code></td>
+  <td>Use the specified audio backend.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-audio-in &lt;backend&gt;</code></td>
+  <td>Use the specified audio-input backend.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-audio-out &lt;backend&gt;</code></td>
+  <td>Use the specified audio-output backend.</td>
+  <td>&nbsp;</td>
+</tr>
+<!--<tr>
+  <td><code>-mic &lt;device or file&gt;</code></td>
+  <td>Use device or WAV file for audio input.</td>
+  <td>&nbsp;</td>
+</tr>
+-->
+<tr>
+  <td><code>-noaudio</code></td>
+  <td>Disable audio support in the current emulator instance.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-radio &lt;device&gt;</code></td>
+  <td>Redirect radio modem interface to a host character device.</td>
+  <td>&nbsp;</td></tr>
+<tr>
+  <td><code>-useaudio</code></td>
+  <td>Enable audio support in the current emulator instance.</td>
+  <td>Enabled by default. </td>
+</tr>
+
+<tr>
+  <td rowspan="7">Network</td>
+  <td><code>-dns-server &lt;servers&gt;</code></td>
+  <td>Use the specified DNS server(s). </td>
+  <td>The value of <code>&lt;servers&gt;</code> must be a comma-separated list of up to 4 DNS server names or
+  IP addresses.</td>
+</tr>
+<tr>
+  <td><code>-http-proxy &lt;proxy&gt;</code></td>
+  <td>Make all TCP connections through a specified HTTP/HTTPS proxy</td>
+  <td>The value of <code>&lt;proxy&gt;</code> can be one of the following:<br>
+     <code>http://&lt;server&gt;:&lt;port&gt;</code><br>
+     <code>http://&lt;username&gt;:&lt;password&gt;@&lt;server&gt;:&lt;port&gt;</code>
+  <p>The <code>http://</code> prefix can be omitted. If the <code>-http-proxy &lt;proxy&gt;</code> command is not supplied,
+  the emulator looks up the <code>http_proxy</code> environment variable and automatically uses any value matching
+  the <code>&lt;proxy&gt;</code> format described above.</p></td>
+</tr>
+<tr>
+  <td><code>-netdelay &lt;delay&gt;</code></td>
+  <td>Set network latency emulation to &lt;delay&gt;.</td>
+  <td>Default value is <code>none</code>. See the table in <a href="#netdelay">Network Delay Emulation</a> for 
+  supported <code>&lt;delay&gt;</code> values. </td>
+</tr>
+<tr>
+  <td><code>-netfast</code></td>
+  <td>Shortcut for <code>-netspeed full -netdelay none</code></td>
+  <td>&nbsp;</td></tr>
+<tr>
+  <td><code>-netspeed &lt;speed&gt;</code></td>
+  <td>Set network speed emulation to &lt;speed&gt;.</td>
+  <td>Default value is <code>full</code>. See the table in <a href="#netspeed">Network Speed Emulation</a> for 
+  supported <code>&lt;speed&gt;</code> values. </td>
+</tr>
+<tr>
+  <td><code>-port &lt;port&gt;</code></td>
+  <td>Set the console port number for this emulator instance to <code>&lt;port&gt;</code>.</td>
+  <td>The console port number must be an even integer between 5554 and 5584, inclusive. <code>&lt;port&gt;</code>+1 
+  must also be free and will be reserved for ADB.</td>
+</tr>
+<tr>
+  <td><code>-report-console &lt;socket&gt;</code></td>
+  <td>Report the assigned console port for this emulator instance to a remote third party 
+  before starting the emulation. </td>
+  <td><code>&lt;socket&gt;</code> must use one of these formats:
+
+<p><code>tcp:&lt;port&gt;[,server][,max=&lt;seconds&gt;]</code></br>
+<code>unix:&lt;port&gt;[,server][,max=&lt;seconds&gt;]</code></p>
+
+<p>Use <code>-help-report-console</code></p> to view more information about this topic. </td>
+</tr>
+<tr>
+  <td rowspan="8">System</td>
+  <td><code>-cpu-delay &lt;delay&gt;</code></td>
+  <td>Slow down emulated CPU speed by &lt;delay&gt; </td>
+  <td>Supported values for &lt;delay&gt; are integers between 0 and 1000.
+
+<p>Note that the &lt;delay&gt; does not correlate to clock speed or other absolute metrics 
+&mdash; it simply represents an abstract, relative delay factor applied non-deterministically 
+in the emulator. Effective performance does not always 
+scale in direct relationship with &lt;delay&gt; values.</p>
+</td>
+</tr>
+<tr>
+  <td><code>-gps &lt;device&gt;</code></td>
+  <td>Redirect NMEA GPS to character device.</td>
+  <td>Use this command to emulate an NMEA-compatible GPS unit connected to
+  an external character device or socket. The format of <code>&lt;device&gt;</code> must be QEMU-specific 
+  serial device specification. See the documentation for 'serial -dev' at 
+  <a href="http://www.bellard.org/qemu/qemu-doc.html#SEC10">http://www.bellard.org/qemu/qemu-doc.html#SEC10</a>.
+</td>
+</tr>
+<tr>
+  <td><code>-nojni</code></td>
+  <td>Disable JNI checks in the Dalvik runtime.</td><td>&nbsp;</td></tr>
+<tr>
+  <td><code>-qemu</code></td>
+  <td>Pass arguments to qemu.</td>
+  <td>&nbsp;</td></tr>
+<tr>
+  <td><code>-qemu -h</code></td>
+  <td>Display qemu help.</td>
+  <td></td></tr>
+<tr>
+  <td><code>-radio &lt;device&gt;</code></td>
+  <td>Redirect radio mode to the specified character device.</td>
+  <td>The format of <code>&lt;device&gt;</code> must be QEMU-specific 
+  serial device specification. See the documentation for 'serial -dev' at 
+<a href="http://www.bellard.org/qemu/qemu-doc.html#SEC10">http://www.bellard.org/qemu/qemu-doc.html#SEC10</a>.
+</td>
+</tr>
+<tr>
+ <td><code>-timezone &lt;timezone&gt;</code></td>
+ <td>Set the timezone for the emulated device to &lt;timezone&gt;, instead of the host's timezone.</td>
+ <td><code>&lt;timezone&gt;</code> must be specified in zoneinfo format. For example:
+<p>"America/Los_Angeles"<br>
+"Europe/Paris"</p>
+</td>
+</tr>
+<tr>
+ <td><code>-version</code></td>
+ <td>Display the emulator's version number.</td>
+ <td>&nbsp;</td>
+</tr>
+<tr>
+  <td rowspan="12">UI</td>
+  <td><code>-dpi-device &lt;dpi&gt;</code></td>
+  <td>Scale the resolution of the emulator to match the screen size
+  of a physical device.</td>
+  <td>The default value is 165. See also <code>-scale</code>.</td>
+</tr>
+<tr>
+  <td><code>-no-boot-anim</code></td>
+  <td>Disable the boot animation during emulator startup.</td>
+  <td>Disabling the boot animation can speed the startup time for the emulator.</td>
+</tr>
+<tr>
+  <td><code>-no-window</code></td>
+  <td>Disable the emulator's graphical window display.</td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>-scale &lt;scale&gt;</code></td>
+  <td>Scale the emulator window. </td>
+  <td><code>&lt;scale&gt;</code> is a number between 0.1 and 3 that represents the desired scaling factor. You can 
+  also specify scale as a DPI value if you add the suffix "dpi" to the scale value. A value of "auto" 
+  tells the emulator to select the best window size.</td>
+</tr>
+<tr>
+  <td><code>-raw-keys</code></td>
+  <td>Disable Unicode keyboard reverse-mapping.</td>
+  <td>&nbsp;</td></tr>
+<tr>
+  <td><code>-noskin</code></td>
+  <td>Don't use any emulator skin.</td>
+  <td>&nbsp;</td></tr>
+<tr>
+  <td><code>-keyset &lt;file&gt;</code></td>
+  <td>Use the specified keyset file instead of the default.</td>
+  <td>The keyset file defines the list of key bindings between the emulator and the host keyboard. 
+  For more information, use <code>-help-keyset</code> to print information about this topic.
+</td>
+</tr>
+<tr>
+  <td><code>-onion &lt;image&gt;</code></td>
+  <td>Use overlay image over screen.</td>
+  <td>No support for JPEG. Only PNG is supported.</td></tr>
+<tr>
+  <td><code>-onion-alpha &lt;percent&gt;</code></td>
+  <td>Specify onion skin translucency  value (as percent).
+  <td>Default is 50.</td>
+</tr>
+<tr>
+  <td><code>-onion-rotation &lt;position&gt;</code></td>
+  <td>Specify onion skin rotation.
+  <td><code>&lt;position&gt;</code> must be one of the values 0, 1, 2, 3.</td>
+</tr>
+<tr>
+  <td><code>-skin &lt;skinID&gt;</code></td>
+  <td>This emulator option is deprecated. </td>
+  <td>Please set skin options using AVDs, rather than by using this emulator
+option. Using this option may yield unexpected and in some cases misleading
+results, since the density with which to render the skin may not be defined.
+AVDs let you associate each skin with a default density and override the default
+as needed. For more information, see <a
+href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>.
+</td>
+</tr>
+<tr>
+  <td><code>-skindir &lt;dir&gt;</code></td>
+  <td>This emulator option is deprecated. </td>
+  <td>See comments for <code>-skin</code>, above.</td></tr>
+</table>
+
+
+
+
+
+
+
+
+
+
+
+<a name="diskimages"></a>
+
+<h2>Working with Emulator Disk Images</h2>
+
+<p>The emulator uses mountable disk images stored on your development machine to
+simulate flash (or similar) partitions on an actual device. For example, it uses
+disk image containing an emulator-specific kernel, the Android system, a
+ramdisk image, and writeable images for user data and simulated SD card.</p>
+
+<p>To run properly, the emulator requires access to a specific set of disk image
+files. By default, the Emulator always looks for the disk images in the 
+private storage area of the AVD in use. If no images exist there when 
+the Emulator is launched, it creates the images in the AVD directory based on 
+default versions stored in the SDK. </p>
+
+<p class="note"><strong>Note:</strong> The default storage location for 
+AVDs is in <code>~/.android/avd</code> on OS X and Linux, <code>C:\Documents and 
+Settings\&lt;user&gt;\.android\</code> on Windows XP, and 
+<code>C:\Users\&lt;user&gt;\.android\</code>
+on Windows Vista.</p>
+
+<p>To let you use alternate or custom versions of the image files, the emulator
+provides startup options that override the default locations and filenames of
+the image files. When you use the options, the emulator searches for the image
+file under the image name or location that you specify; if it can not locate the
+image, it reverts to using the default names and location.</p>
+
+<p>The emulator uses three types of image files: default image files, runtime
+image files, and temporary image files. The sections below describe how to
+override the location/name of each type of file. </p>
+
+<a name="defaultimages"></a>
+<h3>Default Images</h3>
+
+<p>When the emulator launches but does not find an existing user data image in
+the active AVD's storage area, it creates a new one from a default version
+included in the SDK. The default user data image is read-only. The image 
+files are read-only.</p>
+
+<p>The emulator provides the <code>-system &lt;dir&gt;</code> startup option to
+let you override the location under which the emulator looks for the default
+user data image. </p>
+
+<p>The emulator also provides a startup option that lets you override the name
+of the default user data image, as described in the table below. When you use the 
+option, the emulator looks in the default directory, or in a custom location
+(if you specified <code>-system &lt;dir&gt;</code>). </p>
+
+
+<table>
+<tr>
+  <th width="10%" >Name</th>
+    <th width="30%" >Description</th>
+    <th width="40%" >Comments</th>
+</tr>
+
+<!--
+<tr>
+  <td><code>kernel-qemu.img</code></td>
+  <td>The emulator-specific Linux kernel image</td>
+  <td>Override using <code>-kernel &lt;file&gt;</code></td>
+</tr>
+
+<tr>
+  <td><code>ramdisk.img</code></td>
+  <td>The ramdisk image used to boot the system.</td>
+  <td>Override using <code>-ramdisk &lt;file&gt;</code></td>
+</tr>
+
+<tr>
+  <td><code>system.img</code></td>
+  <td>The <em>initial</em> Android system image.</td>
+  <td>Override using <code>-image &lt;file&gt;</code></td>
+</tr>
+-->
+<tr>
+  <td><code>userdata.img</code></td>
+  <td>The <em>initial</em> user-data disk image</td>
+  <td>Override using <code>-initdata &lt;file&gt;</code>. Also see
+<code>-data &lt;file&gt;</code>, below.</td>
+</tr>
+
+</table>
+
+<a name="runtimeimages"></a>
+<h3>Runtime Images: User Data and SD Card</h3>
+
+<p>At runtime, the emulator reads and writes data on two disk images: a
+user-data image and (optionally) an SD card image. This emulates the user-data
+partition and removable storage media on actual device. </p>
+
+<p>The emulator provides a default user-data disk image. At startup, the emulator 
+creates the default image as a copy of the system user-data image (user-data.img), 
+described above. The emulator stores the new image with the files of the active AVD.</p>
+
+<!--
+<p>The emulator provides a startup option, <code>-datadir &lt;dir&gt;</code>, 
+that you can use to override the location under which the emulator looks for the runtime
+image files. </p>
+-->
+
+<p>The emulator provides startup options to let you override the actual names and storage 
+locations of the runtime images to load, as described in the table below. When you use one 
+of these options, the emulator looks for the specified file(s) in the current working directory,
+in the AVD directory, or in a custom location (if you specified a path with the filename). </p>
+
+<table>
+<tr>
+  <th width="10%" >Name</th>
+    <th width="30%" >Description</th>
+    <th width="40%" >Comments</th>
+</tr>
+<tr>
+  <td><code>userdata-qemu.img</code></td>
+  <td>An image to which the emulator writes runtime user-data for a unique user.</td>
+  <td>Override using <code>-data &lt;filepath&gt;</code>, where <code>&lt;filepath&gt;</code> is the
+path the image, relative to the current working directory. If you supply a filename only, 
+the emulator looks for the file in the current working directory. If the file at <code>&lt;filepath&gt;</code> does
+not exist, the emulator creates an image from the default userdata.img, stores it under the name you
+specified, and persists user data to it at shutdown. </td>
+</tr>
+
+<tr>
+  <td><code>sdcard.img</code></td>
+  <td>An image representing an SD card inserted into the emulated device.</td>
+  <td>Override using <code>-sdcard &lt;filepath&gt;</code>, where <code>&lt;filepath&gt;</code> is the
+path the image, relative to the current working directory. If you supply a filename only, 
+the emulator looks for the file in the current working directory. </td>
+</tr>
+
+</table>
+
+<h4>User-Data Image</h4>
+
+<p>Each emulator instance uses a writeable user-data image to store user- and
+session-specific data. For example, it uses the image to store a unique user's
+installed application data, settings, databases, and files. </p>
+
+<p>At startup, the emulator attempts to load a user-data image stored during 
+a previous session. It looks for the file in the current working directory, 
+in the AVD directory as described above, and at the custom location/name 
+that you specified at startup. </p>
+
+<ul>
+<li>If it finds a user-data image, it mounts the image and makes it available 
+to the system for reading/writing of user data. </li>
+<li>If it does not find one, it creates an image by copying the system user-data
+image (userdata.img), described above. At device power-off, the system persists
+the user data to the image, so that it will be available in the next session. 
+Note that the emulator stores the new disk image at the location/name that you
+specify in <code>-data</code> startup option.</li>
+</ul>
+
+<p class="note"><strong>Note:</strong> Because of the AVD configurations used in the emulator,
+each emulator instance now gets its own dedicated storage. There is no need 
+to use the <code>-d</code> option to specify an instance-specific storage area.</p>
+
+<h4>SD Card</h4>
+
+<P>Optionally, you can create a writeable disk image that the emulator can use
+to simulate removeable storage in an actual device. For information about how to create an 
+emulated SD card and load it in the emulator, see <a href="#sdcard">SD Card Emulation</a></p>
+
+<p>You can also use the android tool to automatically create an SD Card image
+for you, when creating an AVD. For more information, see <a 
+href="{@docRoot}guide/developing/tools/avd.html#options">Command-line options for AVDs</a>.
+
+<a name="temporaryimages"></a>
+<h3>Temporary Images</h3>
+
+<p>The emulator creates two writeable images at startup that it deletes at
+device power-off. The images are: </p>
+
+<ul>
+  <li>A writable copy of the Android system image</li>
+  <li>The <code>/cache</code> partition image</li>
+</ul>
+
+<p>The emulator does not permit renaming the temporary system image or
+persisting it at device power-off. </p>
+
+<p>The <code>/cache</code> partition image is initially empty, and is used by
+the browser to cache downloaded web pages and images. The emulator provides an 
+<code>-cache &lt;file&gt;</code>, which specifies the name of the file at which 
+to persist the <code>/cache</code> image at device power-off. If <code>&lt;file&gt;
+</code> does not exist, the emulator creates it as an empty file. </p>
+
+<p>You can also disable the use of the cache partition by specifying the
+<code>-nocache</code> option at startup. </p>
+
+
+<a name="emulatornetworking"></a>
+<h2>Emulator Networking</h2>
+
+<p>The emulator provides versatile networking capabilities that you can use to
+set up complex modeling and testing environments for your application. The
+sections below introduce the emulator's network architecture and capabilities.
+</p>
+
+<a name="networkaddresses"></a>
+<h3>Network Address Space</h3>
+
+<p>Each instance of the emulator runs behind a virtual router/firewall service
+that isolates it from your development machine's network interfaces and settings
+and from the internet. An emulated device can not see your development machine
+or other emulator instances on the network. Instead, it sees only that it is
+connected through Ethernet to a router/firewall.</p>
+
+<p>The virtual router for each instance manages the 10.0.2/24 network address
+space &mdash; all addresses managed by the router are in the form of
+10.0.2.&lt;xx&gt;, where &lt;xx&gt; is a number. Addresses within this space are
+pre-allocated by the emulator/router as follows:</p>
+
+<table>
+  <tr>
+    <th>Network Address</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>10.0.2.1</td>
+    <td>Router/gateway address </td>
+  </tr>
+  <tr>
+    <td>10.0.2.2</td>
+    <td>Special alias to your host loopback interface (i.e., 127.0.0.1 on your
+development machine)</td>
+  </tr>
+  <tr>
+    <td>10.0.2.3</td>
+    <td>First DNS server</td>
+  </tr>
+  <tr>
+    <td>10.0.2.4 / 10.0.2.5 / 10.0.2.6</td>
+    <td>Optional second, third and fourth DNS server (if any) </td>
+  </tr>
+  <tr>
+    <td>10.0.2.15</td>
+    <td>The emulated device's own network/ethernet interface</td>
+  </tr>
+  <tr>
+    <td>127.0.0.1</td>
+    <td>The emulated device's own loopback interface </td>
+  </tr>
+</table>
+
+<p>Note that the same address assignments are used by all running emulator
+instances. That means that if you have two instances running concurrently on
+your machine, each will have its own router and, behind that, each will have an
+IP address of 10.0.2.15. The instances are isolated by a router and can
+<em>not</em> see each other on the same network. For information about how to
+let emulator instances communicate over TCP/UDP, see <a
+href="#connecting">Connecting Emulator Instances</a>.</p>
+
+<p>Also note that the address 127.0.0.1 on your development machine corresponds
+to the emulator's own loopback interface. If you want to access services running
+on your development machine's loopback interface (a.k.a. 127.0.0.1 on your
+machine), you should use the special address 10.0.2.2 instead.</p>
+
+<p>Finally, note that each emulated device's pre-allocated addresses are
+specific to the Android emulator and will probably be very different on real
+devices (which are also very likely to be NAT-ed, i.e., behind a
+router/firewall)</p>
+
+<a name="networkinglimitations"></a>
+<h3>Local Networking Limitations</h3>
+
+<p>Each emulator instance runs behind a virtual router, but unlike an actual
+device connected to a physical router, the emulated device doesn't have access
+to a physical network. Instead it runs as part of a normal application on your
+development machine. This means that it is subject to the same networking
+limitations as other applications on your machine:</p>
+
+<ul>
+  <li>Communication with the emulated device may be blocked by a firewall
+program running on your machine.</li>
+  <li>Communication with the emulated device may be blocked by another
+(physical) firewall/router to which your machine is connected.</li>
+</ul>
+
+<p>The emulator's virtual router should be able to handle all outbound TCP and
+UDP connections/messages on behalf of the emulated device, provided your
+development machine's network environment allows it to do so. There are no
+built-in limitations on port numbers or ranges except the one imposed by your
+host operating system and network.</p>
+
+<p>Depending on the environment, the emulator may not be able to support other
+protocols (such as ICMP, used for "ping") might not be supported. Currently, the
+emulator does not support IGMP or multicast. </p>
+
+<a name="redirections"></a>
+<h3>Using Network Redirections</h3>
+
+<p>To communicate with an emulator instance behind its virtual router, you need
+to set up network redirections on the virtual router. Clients can then connect
+to a specified guest port on the router, while the router directs traffic
+to/from that port to the emulated device's host port. </p>
+
+<p>To set up the network redirections, you create a mapping of host and guest
+ports/addresses on the the emulator instance. There are two ways to set up
+network redirections: using emulator console commands and using the ADB tool, as
+described below. </p>
+
+<a name="consoleredir"></a>
+<h4>Setting up Redirections through the Emulator Console</h4>
+
+<p>Each emulator instance provides a control console the you can connect to, to
+issue commands that are specific to that instance. You can use the
+<code>redir</code> console command to set up redirections as needed for an
+emulator instance. </p>
+
+<p>First, determine the console port number for the target emulator instance.
+For example, the console port number for the first emulator instance launched is
+5554. Next, connect to the console of the target emulator instance, specifying
+its console port number, as follows: </p>
+
+<pre><code>telnet localhost 5554</code></pre>
+
+<p>Once connected, use the <code>redir</code> command to work with redirections.
+To add a redirection, use:</p>
+
+<pre><code>add&nbsp;&lt;protocol&gt;:&lt;host-port&gt;:&lt;guest-port&gt;</code>
+</pre>
+
+<p>where <code>&lt;protocol&gt;</code> is either <code>tcp</code> or <code>udp</code>, 
+and <code>&lt;host-port&gt;</code> and <code>&lt;guest-port&gt;</code> sets the 
+mapping between your own machine and the emulated system, respectively. </p>
+
+<p>For example, the following command sets up a redirection that will handle all
+incoming TCP connections to your host (development) machine on 127.0.0.1:5000
+and will pass them through to the emulated system's 10.0.2.15:6000.:</p>
+
+<pre>redir add tcp:5000:6000</pre>
+
+<p>To delete a redirection, you can use the <code>redir del</code> command. To
+list all redirections for a specific instance, you can use <code>redir
+list</code>. For more information about these and other console commands, see 
+<a href="#console">Using the Emulator Console</a>. </p>
+
+<p>Note that port numbers are restricted by your local environment. this typically
+means that you cannot use host port numbers under 1024 without special
+administrator privileges.  Also, you won't be able to set up a redirection for a
+host port that is already in use by another process on your machine. In that
+case, <code>redir</code> generates an error message to that effect. </p>
+
+<a name="adbredir"></a>
+<h4>Setting Up Redirections through ADB</h4>
+
+<p>The Android Debug Bridge (ADB) tool provides port forwarding, an alternate
+way for you to set up network redirections. For more information, see <a
+href="{@docRoot}guide/developing/tools/adb.html#forwardports">Forwarding Ports</a> in the ADB
+documentation.</p>
+
+<p>Note that ADB does not currently offer any way to remove a redirection,
+except by killing the ADB server.</p>
+
+<a name="dns"></a>
+<h3>Configuring the Emulator's DNS Settings</h3>
+
+<p>At startup, the emulator reads the list of DNS servers that your system is
+currently using. It then stores the IP addresses of up to four servers on this
+list and sets up aliases to them on the emulated addresses 10.0.2.3, 10.0.2.4,
+10.0.2.5 and 10.0.2.6 as needed.  </p>
+
+<p>On Linux and OS X, the emulator obtains the DNS server addresses by parsing 
+the file <code>/etc/resolv.conf</code>. On Windows, the emulator obtains the 
+addresses by calling the <code>GetNetworkParams()</code> API. Note that this 
+usually means that the emulator ignores the content of your "hosts" file 
+(<code>/etc/hosts</code> on Linux/OS X, <code>%WINDOWS%/system32/HOSTS</code>
+ on Windows).</P>
+
+<p>When starting the emulator at the command line, you can also use the
+<code>-dns-server &lt;serverList&gt;</code> option to manually specify the
+addresses of DNS servers to use, where &lt;serverList&gt; is a comma-separated
+list of server names or IP addresses. You might find this option useful if you
+encounter DNS resolution problems in the emulated network (for example, an
+"Unknown Host error" message that appears when using the web browser).</p>
+
+<a name="proxy"></a>
+<h3>Using the Emulator with a Proxy</h3>
+
+<p>If your emulator must access the Internet through a proxy server, you can use
+the <code>-http-proxy &lt;proxy&gt;</code> option when starting the emulator, to
+set up the appropriate redirection. In this case, you specify proxy information
+in <code>&lt;proxy&gt;</code> in one of these formats:</p>
+
+<pre>http://&lt;machineName&gt;:&lt;port&gt;</pre>
+
+<p>or</p>
+
+<pre>http://&lt;username&gt;:&lt;password&gt;@&lt;machineName&gt;:&lt;port&gt;</pre>
+
+<p>The <code>-http-proxy</code> option forces the emulator to use the specified
+HTTP/HTTPS proxy for all outgoing TCP connections. Redirection for UDP is not
+currently supported.</p>
+
+<p>Alternatively, you can define the environment variable
+<code>http_proxy</code> to the value you want to use for
+<code>&lt;proxy&gt;</code>. In this case, you do not need to specify a value for
+<code>&lt;proxy&gt;</code> in the <code>-http-proxy</code> command &mdash; the
+emulator checks the value of the <code>http_proxy</code> environment variable at
+startup and uses its value automatically, if defined. </p>
+
+<p>You can use the <code>-verbose-proxy</code> option to diagnose proxy
+connection problems.</p>
+
+<a name="connecting"></a>
+<h3>Interconnecting Emulator Instances</h3>
+
+<p>To allow one emulator instance to communicate with another, you must set up
+the necessary network redirections as illustrated below. </p>
+
+<p>Assume that your environment is</p>
+
+<ul>
+  <li>A is you development machine</li>
+  <li>B is your first emulator instance, running on A</li>
+  <li>C is your second emulator instance, running on A too</li>
+</ul>
+
+<p>and you want to run a server on B, to which C will connect, here is how you
+could set it up: </p>
+
+<ol>
+  <li>Set up the server on B, listening to
+<code>10.0.2.15:&lt;serverPort&gt;</code></li>
+  <li>On B's console, set up a redirection from
+<code>A:localhost:&lt;localPort&gt;</code> to <code>
+B:10.0.2.15:&lt;serverPort&gt;</code></li>
+  <li>On C, have the client connect to <code>10.0.2.2:&lt;localPort&gt;</code></li>
+</ol>
+
+<p>For example, if you wanted to run an HTTP server, you can select
+<code>&lt;serverPort&gt;</code> as 80 and <code>&lt;localPort&gt;</code> as
+8080:</p>
+
+<ul>
+  <li>B listens on 10.0.2.15:80</li>
+  <li>On B's console, issue <code>redir add tcp:8080:80</code></li>
+  <li>C connects to 10.0.2.2:8080</li>
+</ul>
+
+<a name="calling"></a>
+<h3>Sending a Voice Call or SMS to Another Emulator Instance</h3>
+
+<p>The emulator automatically forwards simulated voice calls and SMS messages from one instance to another. To send a voice call or SMS, you use the dialer application and SMS application (if available) installed on one emulator </p>
+
+<p>To initiate a simulated voice call to another emulator instance:</p>
+<ol>
+<li>Launch the dialer application on the originating emulator instance.</li>
+<li>As the number to dial, enter the console port number of the instance you'd like to call. You can determine
+  the console port number of the target instance by checking its window title, where the
+  console port number is reported as "Android Emulator (&lt;port&gt;). </li>
+<li>Press "Dial". A new inbound call appears in the target emulator instance. </li>
+</ol>
+
+<p>To send an SMS message to another emulator instance, launch the SMS application (if available). Specify the console port number of the target emulator instance as as the SMS address, enter the message text, and send the message. The message is delivered to the target emulator instance. </p>
+
+<p>You can also connect to an emulator instance's console to simulate an incoming voice call or SMS. For more information, see <a href="#telephony">Telephony Emulation</a> and <a href="#sms">SMS Emulation</a>.
+
+<a name="console"></a>
+
+<h2>Using the Emulator Console</h2>
+
+<p>Each running emulator instance includes a console facility that lets you dynamically query and control the simulated device environment. For example, you can use the console to dynamically manage port redirections and network characteristics and simulate telephony events. To access the console and enter commands, you use telnet to connect to the console's port number. </p>
+<p>To connect to the console of any running emulator instance at any time, use this command: </p>
+
+<pre>telnet localhost &lt;console-port&gt;</pre>
+
+<p>An emulator instance occupies a pair of adjacent ports: a console port and an adb port. The port numbers differ by 1, with the adb port having the higher port number. The console of the first emulator instance running on a given machine uses console port 5554 and adb port 5555. Subsequent instances use port numbers increasing by two &mdash; for example, 5556/5557, 5558/5559, and so on. Up to 16 concurrent emulator instances can run a console facility. </p>
+
+<p>To connect to the emulator console, you must specify a valid console port. If multiple emulator instances are running, you need to determine the console port of the emulator instance you want to connect to. You can find the instance's console port listed in the title of the instance window. For example, here's the window title for an instance whose console port is 5554:</p>
+
+<p><code>Android Emulator (5554)</code></p>
+
+<p>Alternatively, you can use the <code>adb devices</code> command, which prints a list of running emulator instances and their console port numbers. For more information, see <a href="{@docRoot}guide/developing/tools/adb.html#devicestatus">Querying for Emulator/Device Instances</a> in the adb documentation.</p>
+
+<p class="note">Note: The emulator listens for connections on ports 5554-5587 and accepts connections only from localhost.</p>
+
+<p>Once you are connected to the console, you can then enter <code>help [command]</code> to see a list of console commands and learn about specific commands. </p>
+
+<p>To exit the console session, use <code>quit</code> or <code>exit</code>.</p>
+
+<p>The sections below describe the major functional areas of the console.</p>
+
+<a name="portredirection"></a>
+
+<h3>Port Redirection</h3>
+<p>You can use the console to add and remove port redirections while the emulator is running. After connecting to the console, you can manage port redirections in this way:</p>
+<pre>redir &lt;list|add|del&gt; </pre>
+
+<p>The <code>redir</code> command supports the subcommands listed in the table below. </p>
+
+<table>
+<tr>
+  <th width="25%" >Subcommand
+  <th width="30%" >Description</th>
+  <th width="35%">Comments</th>
+</tr>
+  
+  <tr>
+    <td><code>list</code></td>
+    <td>List the current port redirections.</td>
+  <td>&nbsp;</td>
+  </tr>
+
+  
+<tr>
+ <td><code>add&nbsp;&lt;protocol&gt;:&lt;host-port&gt;:&lt;guest-port&gt;</code></td>
+  <td>Add a new port redirection.</td>
+<td><ul><li>&lt;protocol&gt; must be either &quot;tcp&quot; or &quot;udp&quot;</li>
+<li>&lt;host-port&gt; is the port number to open on the host</li>
+<li>&lt;guest-port&gt; is the port number to route data to on the emulator/device</li>
+</ul></td>
+</tr>
+<tr>
+  <td><code>del &lt;protocol&gt;:&lt;host-port&gt;</code></td>
+  <td>Delete a port redirection.</td>
+<td>See above for meanings of &lt;protocol&gt; and &lt;host-port&gt;.</td>
+</tr>
+</table>
+
+<a name="geo"></a>
+<h3>Geo Location Provider Emulation</h3>
+
+<p>The console provides commands to let you set the geo position used by an emulator emulated device.
+You can use the <code>geo</code> command to send a simple GPS fix to the emulator, without needing to
+use NMEA 1083 formatting. The usage for the command is:</p>
+
+<pre>geo &lt;fix|nmea&gt;</pre>
+
+<p>The <code>geo</code> command supports the subcommands listed in the table below.</p>
+
+<table>
+<tr>
+  <th width="25%" >Subcommand
+  <th width="30%" >Description</th>
+  <th width="35%">Comments</th>
+</tr>
+  
+  <tr>
+    <td><code>fix &lt;longitude&gt; &lt;latitude&gt; [&lt;altitude&gt;]</code></td>
+    <td>Send a simple GPS fix to the emulator instance.</td>
+  <td>Specify longitude and latitude in decimal degrees. Specify altitude in meters.</td>
+  </tr>
+<tr>
+  <td><code>nmea &lt;sentence&gt;</code></td>
+  <td>Send an NMEA 0183 sentence to the emulated device, as if it were sent from an emulated GPS modem.</td>
+<td><code>&lt;sentence&gt;</code> must begin with '$GP'. Only '$GPGGA' and '$GPRCM' sentences are currently supported.</td>
+</tr>
+</table>
+
+<p>You can issue the <code>geo</code> command to fix the GPS location as soon as an emulator instance is running.
+The emulator creates a mock location provider that sends it to GPS-aware applications as soon as they start and
+register location listeners. Any application can query the location manager to obtain the current GPS fix for the
+emulated device by calling:
+
+<pre>LocationManager.getLastKnownLocation("gps")</pre>
+
+<p>For more information about the Location Manager, see {@link android.location.LocationManager} and its methods.</p>
+
+<a name="events"></a>
+<h3>Hardware Events Emulation</h3>
+
+<p>You can use the <code>event</code> command to send various events to the emulator.The usage for the command is: </p>
+
+<pre>event &lt;send|types|codes|text&gt;</pre>
+
+<p>The <code>event</code> command supports the subcommands listed in the table below. </p>
+
+<table>
+<tr>
+  <th width="25%" >Subcommand
+  <th width="30%" >Description</th>
+  <th width="35%">Comments</th>
+</tr>
+  
+  <tr>
+    <td><code>send &lt;type&gt;:&lt;code&gt;:&lt;value&gt; [...]</code></td>
+    <td>Send one or more events to the Android kernel. </td>
+  <td>You can use text names or integers for <code>&lt;type&gt;</code> and <code>&lt;value&gt;</code>.</td>
+  </tr>
+<tr>
+  <td><code>types</code></td>
+  <td>List all <code>&lt;type&gt;</code> string aliases supported by the <code>event</code> subcommands.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>codes &lt;type&gt;</code></td>
+  <td>List all <code>&lt;codes&gt;</code> string aliases supported by the <code>event</code> 
+   subcommands for the specified <code>&lt;type&gt;</code>.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>event text &lt;message&gt;</code></td>
+  <td>Simulate keypresses to send the specified string of characters as a message,</td>
+<td>The message must be a UTF-8 string. Unicode posts will be reverse-mapped according to the current device keyboard. Unsupported characters will be discarded silently.</td>
+</tr>
+</table>
+
+<a name="power"></a>
+<h3>Device Power Characteristics</h3>
+
+<p>You can use the <code>power</code> command to control the simulated power state of the emulator instance.The usage for the command is: </p>
+
+<pre>power &lt;display|ac|status|present|health|capacity&gt;</pre>
+
+<p>The <code>event</code> command supports the subcommands listed in the table below. </p>
+
+<table>
+<tr>
+  <th width="25%" >Subcommand </th>
+  <th width="30%" >Description</th>
+  <th width="35%">Comments</th>
+</tr>
+  
+  <tr>
+    <td><code>display</code></td>
+    <td>Display battery and charger state.</td>
+  <td>&nbsp;</td>
+  </tr>
+<tr>
+  <td><code>ac &lt;on|off&gt;</code></td>
+  <td>Set AC charging state to on or off. </td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>status &lt;unknown|charging|discharging|not-charging|full&gt;</code></td>
+  <td>Change battery status as specified.</td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+  <td><code>present &lt;true|false&gt;</code></td>
+  <td>Set battery presence state.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>health &lt;unknown|good|overheat|dead|overvoltage|failure&gt;</code></td>
+  <td>Set battery health state.</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+  <td><code>power health &lt;percent&gt;</code></td>
+  <td>Set remaining battery capacity state (0-100).</td>
+<td>&nbsp;</td>
+</tr>
+</table>
+
+<a name="netstatus"></a>
+<h3>Network Status</h3>
+
+<p>You can use the console to check the network status and current delay and speed characteristics. To do so, connect to the console and use the <code>netstatus</code> command. Here's an example of the command and its output. </p>
+
+<pre>network status
+</pre>
+
+<a name="netdelay"></a>
+<h3>Network Delay Emulation</h3>
+
+<p>The emulator lets you simulate various network latency levels, so that you can test your application in an environment more typical of the actual conditions in which it will run. You can set a latency level or range at emulator startup or you can use the console to change the latency dynamically, while the application is running in the emulator. </p>
+<p>To set latency at emulator startup, use the  <code>-netdelay</code> emulator option with a supported <code>&lt;delay&gt;</code> value, as listed in the table below. Here are some examples:</p>
+<pre>emulator -netdelay gprs
+emulator -netdelay 40 100</pre>
+
+<p>To make dynamic changes to  network delay while the emulator is running, connect to the console and use the <code>netdelay</code> command with a supported <code>&lt;delay&gt;</code> value from the table below.  </p>
+
+<pre>network delay gprs</pre>
+
+<p>The format of network &lt;delay&gt; is one of the following (numbers are milliseconds):</p>
+
+<table style="clear:right;width:100%;">
+<tr>
+  <th width="30%" >Value</th>
+  <th width="35%" >Description</th><th width="35%">Comments</th></tr>
+  
+  <tr><td><code>gprs</code></td><td>GPRS</td>
+  <td>(min 150, max 550)</td>
+  </tr>
+
+<tr><td><code>edge</code></td><td>EDGE/EGPRS</td>
+<td>(min 80, max 400)</td>
+</tr>
+<tr><td><code>umts</code></td><td>UMTS/3G</td>
+<td>(min 35, max 200)</td>
+</tr>
+<tr><td><code>none</code></td><td>No latency</td><td>(min 0, max 0)</td></tr>
+<tr><td><code>&lt;num&gt;</code></td>
+<td>Emulate an exact latency  (milliseconds).</td>
+<td>&nbsp;</td></tr>
+<tr><td><code>&lt;min&gt;:&lt;max&gt;</code></td>
+<td>Emulate an specified latency range (min, max milliseconds).</td>
+<td>&nbsp;</td></tr>
+</table>
+
+<a name="netspeed"></a>
+<h3>Network Speed Emulation</h3>
+
+<p>The emulator also lets you simulate various network transfer rates. 
+You can set a transfer rate or range at emulator startup or you can use the console to change the rate dynamically,
+while the application is running in the emulator.</p>
+
+<p>To set the network speed at emulator startup, use the  <code>-netspeed</code> emulator option with a supported
+<code>&lt;speed&gt;</code> value, as listed in the table below. Here are some examples:</p>
+<pre>emulator -netspeed gsm
+emulator -netspeed 14.4 80</pre>
+
+<p>To make dynamic changes to  network speed while the emulator is running, connect to the console and use the <code>netspeed</code> command with a supported <code>&lt;speed&gt;</code> value from the table below.  </p>
+
+<pre>network speed 14.4 80</pre>
+
+<p>The format of network <code>&lt;speed&gt;</code> is one of the following (numbers are
+kilobits/sec):</p>
+<table style="clear:right;width:100%;">
+<tbody>
+<tr>
+  <th width="30%">Value</th>
+  <th width="35%">Description</th><th width="35%">Comments</th></tr>
+  
+  <tr>
+  <td><code>gsm</code></td>
+  <td>GSM/CSD</td><td>(Up: 14.4, down: 14.4)</td></tr>
+<tr>
+  <td><code>hscsd</code></td>
+  <td>HSCSD</td><td>(Up: 14.4, down: 43.2)</td></tr>
+<tr>
+  <td><code>gprs</code></td>
+  <td>GPRS</td><td>(Up: 40.0, down: 80.0)</td></tr>
+<tr>
+  <td><code>edge</code></td>
+  <td>EDGE/EGPRS</td>
+  <td>(Up: 118.4, down: 236.8)</td>
+</tr>
+<tr>
+  <td><code>umts</code></td>
+  <td>UMTS/3G</td><td>(Up: 128.0, down: 1920.0)</td></tr>
+<tr>
+  <td><code>hsdpa</code></td>
+  <td>HSDPA</td><td>(Up: 348.0, down: 14400.0)</td></tr>
+<tr>
+  <td><code>full</code></td>
+  <td>no limit</td><td>(Up: 0.0, down: 0.0)</td></tr>
+<tr>
+  <td><code>&lt;num&gt;</code></td>
+  <td>Set an exact rate used for both upload and download.</td><td></td></tr>
+<tr>
+  <td><code>&lt;up&gt;:&lt;down&gt;</code></td>
+  <td>Set exact rates for upload and download separately.</td><td></td></tr>
+</table>
+
+<a name="telephony"></a>
+
+<h3>Telephony Emulation</h3>
+
+<p>The Android emulator includes its own GSM emulated modem that lets you simulate telephony functions in the emulator. For example, you can simulate inbound phone calls and establish/terminate data connections. The Android system handles simulated calls exactly as it would actual calls. The emulator does not support call audio in this release. </p>
+<p>You can use the console to access the emulator's telephony functions. After connecting to the console, you can use</p>
+<pre>gsm &lt;call|accept|busy|cancel|data|hold|list|voice|status&gt; </pre>
+<p>to invoke telephony functions. </p>
+<p>The <code>gsm</code> command supports the subcommands listed in the table below. </p>
+<table>
+  <tr>
+    <th>Subcommand </th>
+    <th width="25%">Description</th>
+    <th>Comments</th>
+  </tr>
+  <tr>
+    <td><code>call &lt;phonenumber&gt;</code></td>
+    <td>Simulate an inbound phone call from &lt;phonenumber&gt;.</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td><code>accept &lt;phonenumber&gt;</code></td>
+    <td>Accept an inbound call from &lt;phonenumber&gt; and change the call's state "active".</td>
+    <td>You can change a call's state to "active" only if its current state is "waiting" or "held".</td>
+  </tr>
+  <tr>
+    <td><code>busy &lt;phonenumber&gt;</code></td>
+    <td>Close an outbound call to &lt;phonenumber&gt; and change the call's state to "busy".</td>
+    <td>You can change a call's state to "busy" only if its current state is "waiting".</td>
+  </tr>
+  <tr>
+    <td><code>cancel &lt;phonenumber&gt;</code></td>
+    <td>Terminate an inbound or outbound phone call to/from &lt;phonenumber&gt;.</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td><code>data &lt;state&gt;</code></td>
+    <td>Change the state of the GPRS data connection to &lt;state&gt;.</td>
+    <td>Supported &lt;state&gt; values are:<br />
+    <ul>
+          <li><code>unregistered</code> -- No network available</li>
+          <li><code>home</code> -- On local network, non-roaming</li>
+          <li><code>roaming</code> -- On roaming network</li>
+          <li><code>searching</code> -- Searching networks</li>
+          <li><code>denied</code> -- Emergency calls only</li>
+          <li><code>off</code> -- Same as 'unregistered'</li>
+      <li><code>on</code> -- same as 'home'</li>
+    </ul>
+          </td>
+  </tr>
+  <tr>
+    <td><code>hold</code></td>
+    <td>Change the state of a call to "held". </td>
+    <td>You can change a call's state to "held" only if its current state is	 "active" or "waiting". </td>
+  </tr>
+  <tr>
+    <td><code>list</code></td>
+    <td>List all inbound and outbound calls and their states.</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td><code>voice &lt;state&gt;</code></td>
+    <td>Change the state of the GPRS voice connection to &lt;state&gt;.</td>
+    <td>Supported &lt;state&gt; values are:<br />
+    <ul>
+    <li><code>unregistered</code> -- No network available</li>
+    <li><code>home</code> -- On local network, non-roaming</li>
+    <li><code>roaming</code> -- On roaming network</li>
+    <li><code>searching</code> -- Searching networks</li>
+    <li><code>denied</code> -- Emergency calls only</li>
+    <li><code>off</code> -- Same as 'unregistered'</li>
+    <li><code>on</code> -- Same as 'home'</li>
+    </ul>
+    </td>
+  </tr>
+
+  <tr>
+    <td><code>status</code></td>
+    <td>Report the current GSM voice/data state.</td>
+    <td>Values are those described for the <code>voice</code> and <code>data</code> commands.</td>
+  </tr>
+</table>
+
+<a name="sms"></a>
+
+<h3>SMS Emulation</h3>
+
+<p>The Android emulator console lets you generate an SMS message and direct it to an emulator instance. Once you connect to an emulator instance, you can generate an emulated incoming SMS using this command:</p>
+
+<pre>sms send &lt;senderPhoneNumber&gt; &lt;textmessage&gt;</pre>
+
+<p>where <code>&lt;senderPhoneNumber&gt;</code> contains an arbitrary numeric string. </p>
+
+<p>The console forwards the SMS message to the Android framework, which passes it through to an application that handles that message type. </p>
+
+<a name="vm"></a>
+
+<h3>VM State</h3>
+
+<p>You can use the <code>vm</code> command to control the VM on an emulator instance.The usage for the command is: </p>
+
+<pre>vm &lt;start|stop|status&gt;</pre>
+
+<p>The <code>vm</code> command supports the subcommands listed in the table below. </p>
+
+<table>
+<tr>
+  <th width="25%" >Subcommand </th>
+  <th width="30%" >Description</th>
+  <th width="35%">Comments</th>
+</tr>
+<tr>
+    <td><code>start</code></td>
+    <td>Start the VM on the instance. </td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+    <td><code>stop</code></td>
+    <td>Stop the VM on the instance. </td>
+  <td>&nbsp;</td>
+</tr>
+<tr>
+    <td><code>start</code></td>
+    <td>Display the current status of the VM (running or stopped). </td>
+  <td>&nbsp;</td>
+</tr>
+</table>
+
+
+<a name="window"></a>
+
+<h3>Emulator Window</h3>
+
+<p>You can use the <code>window</code> command to manage the emulator window. The usage for the command is: </p>
+
+<pre>window &lt;scale&gt;</pre>
+
+<p>The <code>vm</code> command supports the subcommands listed in the table below. </p>
+
+<table>
+<tr>
+  <th width="25%" >Subcommand
+  <th width="30%" >Description</th>
+  <th width="35%">Comments</th>
+</tr>
+<tr>
+    <td><code>scale &lt;scale&gt;</code></td>
+    <td>Scale the emulator window.</td>
+  <td>&lt;scale&gt; must be a number between 0.1 and 3 that describes the desired scaling factor. You can 
+  also specify scale as a DPI value if you add the suffix "dpi" to the scale value. A value of "auto" 
+  tells the emulator to select the best window size.</td>
+</tr>
+</table>
+
+
+<a name="terminating"></a>
+
+<h3>Terminating an Emulator Instance</h3>
+
+<p>You can terminate an emulator instance through the console, using the <code>kill</code> command.</p>
+
+
+<a name="skins"></a>
+
+<h2>Using Emulator Skins</h2>
+
+<p>The Android SDK includes several Emulator skins that you can use to control the resolution and density of the emulated device's screen. To select a specific skin for running the emulator, create an AVD that uses that skin. Please do not use deprecated emulator options such as <code>-skin</code> to control the skin used by an emulator instance. For more information about AVDs, see <a
+href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>.  </p>
+
+
+<a name="multipleinstances"></a>
+
+<h2>Running Multiple Emulator Instances</h2>
+
+<p>Through the AVDs configurations used by the emulator, you can run multiple
+instances of the emulator concurrently, each with its own AVD configuration and
+storage area for user data, SD card, and so on. You no longer need to use the
+<code>-d</code> option when launching the emulator, to point to an
+instance-specific storage area. </p>
+
+<a name="apps"></a>
+
+<h2>Installing Applications on the Emulator</h2>
+
+<p>If you don't have access to Eclipse or the ADT Plugin, you can install 
+your application on the emulator <a href="{@docRoot}guide/developing/tools/adb.html#move">using 
+the adb utility</a>. Before installing the application, you need to package it 
+in a .apk file using the <a href="{@docRoot}guide/developing/tools/aapt.html">Android Asset Packaging Tool</a>. 
+Once the application is installed, you can start the emulator from the command 
+line, as described in this document, using any startup options necessary. 
+When the emulator is running, you can also connect to the emulator instance's 
+console to issue commands as needed.</p>
+
+<p>As you update your code, you periodically package and install it on the emulator. 
+The emulator preserves the application and its state data across restarts, 
+in a user-data disk partition. To ensure that the application runs properly 
+as you update it, you may need to delete the emulator's user-data partition. 
+To do so, start the emulator with the <code>-wipe-data</code> option. 
+For more information about the user-data partition and other emulator storage, 
+see <a href="#diskimages">Working with Emulator Disk Images</a>.</p>
+
+<a name="sdcard"></a>
+<a name="creating"></a>
+
+<h2>SD Card Emulation</h2>
+
+<p>You can create a disk image and then load it to the emulator at startup, to
+simulate the presence of a user's SD card in the device. To do this, you can use
+the android tool to create a new SD card image with a new AVD, or you can use
+the mksdcard utility included in the SDK. </p>
+
+<p>The sections below describe how to create an SD card disk image, how to copy
+files to it, and how to load it in the emulator at startup. </p>
+
+<p>Note that you can only load disk image at emulator startup. Similarly, you
+can not remove a simulated SD card from a running emulator. However, you can
+browse, send files to, and copy/remove files from a simulated SD card either
+with adb or the emulator. </p>
+
+<p>The emulator supports emulated SDHC cards, so you can create an SD card image
+of any size up to 128 gigabytes.</p>
+
+<h3 id="creatinga">Creating an SD card image using the android tool</h3>
+
+<p>The easiest way to create a new SD card is to use the android tool. When
+creating an AVD, you simply specify the <code>-c</code> option, like this: </p>
+
+<pre>android create avd -n &lt;avd_name&gt; -t &lt;targetID&gt; -c &lt;size&gt;[K|M]</pre>
+
+<p>You can also use the <code>-c</code> option to specify a path to an SD card
+image to use in the new AVD. For more information, see <a
+href="{@docRoot}guide/developing/tools/avd.html">Android Virtual Devices</a>.
+</p>
+
+<h3 id="creatingm">Creating an SD card image using mksdcard</h3>
+
+<p>You can use the mksdcard tool, included in the SDK, to create a FAT32 disk
+image that you can load in the emulator at startup. You can access mksdcard in
+the tools/ directory of the SDK and create a disk image like this: </p>
+
+<pre>mksdcard &lt;size&gt; &lt;file&gt;</pre>
+
+<p>For example:</p>
+
+<pre>mksdcard 1024M sdcard1.iso</pre>
+
+<p>For more information, see <a href="{@docRoot}guide/developing/tools/othertools.html">Other Tools</a>. </p>
+
+<a name="copying"></a>
+<h3>Copying Files to a Disk Image</h3>
+
+<p>Once you have created the disk image, you can copy files to it prior to
+loading it in the emulator. To copy files, you can mount the image as a loop
+device and then copy the files to it, or you can use a utility such as mtools to
+copy the files directly to the image. The mtools package is available for Linux,
+Mac, and Windows.</p>
+
+<a name="loading"></a>
+<a name="step3" id="step3"></a>
+
+<h3>Loading the Disk Image at Emulator Startup</h3>
+
+<p>By default, the emulator loads the SD card image that is stored with the active
+AVD (see the <code>-avd</code> startup option).</p>
+
+<p>Alternatively, you ca start the emulator with the
+<code>-sdcard</code> flag and specify the name and path of your image (relative
+to the current working directory): </p>
+
+<pre>emulator -sdcard &lt;filepath&gt;</pre>
+
+<a name="troubleshooting"></a>
+
+<h2>Troubleshooting Emulator Problems</h2>
+
+<p>The adb utility sees the emulator as an actual physical device. For this reason, you might have to use the -d flag with some common adb commands, such as <code>install</code>. The -d flag lets you specify which of several connected devices to use as the target of a command. If you don't specify -d, the emulator will target the first device in its list. For more information about adb, see <a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a>.</p>
+
+<p>For emulators running on Mac OS X, if you see an error &quot;Warning: No DNS servers found&quot; when starting the emulator, check to see whether you have an <code>/etc/resolv.conf</code> file. If not, please run the following line in a command window:</p>
+    <pre>ln -s /private/var/run/resolv.conf /etc/resolv.conf</pre>
+
+<p>See <a href="{@docRoot}resources/faq/index.html">Frequently Asked Questions</a> for more troubleshooting information. </p>
+
+<a name="limitations"></a>
+    <h2>Emulator Limitations</h2>
+    <p>In this release, the  limitations of the emulator include: </p>
+    <ul>
+      <li>No support for placing or receiving actual phone calls. You can simulate phone calls (placed and received) through the emulator console, however. </li>
+      <li>No support for USB connections</li>
+      <li>No support for camera/video capture (input).</li>
+      <li>No support for device-attached headphones</li>
+      <li>No support for determining connected state</li>
+      <li>No support for determining battery charge level and AC charging state</li>
+      <li>No support for determining SD card insert/eject</li>
+      <li>No support for Bluetooth</li>
+    </ul>
diff --git a/docs/html/guide/developing/devices/index.jd b/docs/html/guide/developing/devices/index.jd
new file mode 100644
index 0000000..3e73eb01
--- /dev/null
+++ b/docs/html/guide/developing/devices/index.jd
@@ -0,0 +1,78 @@
+page.title=Creating and Managing Virtual Devices
+@jd:body
+
+
+ <p>An Android Virtual Device (AVD) is an emulator configuration that lets you model an actual
+  device by defining hardware and software options to be emulated by the Android Emulator.</p>
+
+  <p>The easiest way to create an AVD is to use the graphical <a href= 
+  "{@docRoot}guide/developing/devices/managing-avds.html">AVD Manager</a>, which you launch
+  from Eclipse by clicking <strong>Window &gt; Android SDK and AVD Manager</strong>. You can also start
+  the AVD Manager from the command line by calling the <code>android</code> tool in the <strong>tools</strong>
+  directory of the Android SDK.</p>
+
+  <p>You can also create AVDs on the command line by passing the <code>android</code> tool options.
+  For more information on how to create AVDs in this manner, see <a href= 
+  "{@docRoot}guide/developing/devices/managing-avds-cmdline.html">Creating and Managing Virtual
+  Devices on the Command Line</a>.</p>
+
+  <p>An AVD consists of:</p>
+
+  <ul>
+    <li>A hardware profile: Defines the hardware features of the virtual
+    device. For example, you can define whether the device has a camera, whether it uses a physical
+    QWERTY keyboard or a dialing pad, how much memory it has, and so on.</li>
+
+    <li>A mapping to a system image: You can define what version of the Android platform will run
+    on the virtual device. You can choose a version of the standard Android platform or the system
+    image packaged with an SDK add-on.</li>
+
+    <li>Other options: You can specify the emulator skin you want to use with the AVD, which lets
+    you control the screen dimensions, appearance, and so on. You can also specify the emulated SD
+    card to use with the AVD.</li>
+
+    <li>A dedicated storage area on your development machine: the device's user data (installed
+    applications, settings, and so on) and emulated SD card are stored in this area.</li>
+  </ul>
+
+  <p>You can create as many AVDs as you need, based on the types of device you want to model. 
+  To thoroughly test your application, you should create an AVD for each general device configuration
+  (for example, different screen sizes and platform versions) with which your application is compatible
+  and test your application on each one.</p>
+
+  <p>Keep these points in mind when you are selecting a system image target for your AVD:</p>
+
+  <ul>
+    <li>The API Level of the target is important, because your application will not be able to run
+    on a system image whose API Level is less than that required by your application, as specified
+    in the <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">
+    <code>minSdkVersion</code></a> attribute of the application's manifest file. For more
+    information about the relationship between system API Level and application
+    <code>minSdkVersion</code>, see <a href=
+    "{@docRoot}guide/publishing/versioning.html">Specifying Minimum System API Version</a>.</li>
+
+    <li>You should create at least one AVD that uses a target whose API Level is greater than that required
+    by your application, because it allows you to test the
+    forward-compatibility of your application. Forward-compatibility testing ensures that, when
+    users who have downloaded your application receive a system update, your application will
+    continue to function normally.</li>
+
+    <li>If your application declares a 
+    <a href="{@docRoot}guide/topics/manifest/uses-library-element.html"><code>uses-library</code></a>
+    element in its manifest file, the application can only run on a system image in which that external
+    library is present. If you want to run your application on an emulator, create an AVD that
+    includes the required library. Usually, you must create such an AVD using an Add-on component for the
+    AVD's platform (for example, the Google APIs Add-on contains the Google Maps library).</li>
+  </ul>
+
+  <p>To learn how to manage AVDs using a graphical tool, read <a href=
+  "{@docRoot}guide/developing/devices/managing-avds.html">
+  Creating and Managing AVDs with AVD Manager</a>. To learn how to manage AVDs on the command line, read
+  <a href="{@docRoot}guide/developing/devices/managing-avds-cmdline.html">Creating and Managing AVDs
+  on the Command Line</a>.</p>
+
+
+
+
+
+
diff --git a/docs/html/guide/developing/devices/managing-avds-cmdline.jd b/docs/html/guide/developing/devices/managing-avds-cmdline.jd
new file mode 100644
index 0000000..878ccc9
--- /dev/null
+++ b/docs/html/guide/developing/devices/managing-avds-cmdline.jd
@@ -0,0 +1,312 @@
+page.title=Creating and Managing AVDs on the Command Line
+@jd:body
+
+<div id="qv-wrapper">
+  <div id="qv">
+  <h2>In this document</h2>
+  <ol>
+    <li><a href="#listingtargets">Listing targets</a></li>
+    <li><a href="#AVDCmdLine">Creating AVDs</a></li>
+    <li><a href="#moving">Moving an AVD</a></li>
+    <li><a href="#updating">Updating an AVD</a></li>
+    <li><a href="#deleting">Deleting an AVD</a></li>
+  </ol>
+  </div>
+</div>
+
+
+<p>The <code>android</code> tool lets you manage AVDs on the command line. For a complete reference 
+of the command line options that you can use, see the reference for the 
+<a href="{@docRoot}guide/developing/tools/android.html"><code>android</code></a> tool.</p>
+
+
+
+<h2 id="listingtargets">Listing targets</h2>
+
+<p>To generate a list of system image targets, use this command: </p>
+
+<pre>android list targets</pre>
+
+<p>The <code>android</code> tool scans the <code>&lt;sdk&gt;/platforms/</code> and
+<code>&lt;sdk&gt;/add-ons/</code> directories looking for valid system images and
+then generates the list of targets. Here's an example of the command output:
+</p>
+
+<pre>Available Android targets:
+id: 1 or "android-3"
+     Name: Android 1.5
+     Type: Platform
+     API level: 3
+     Revision: 4
+     Skins: QVGA-L, HVGA-L, HVGA (default), HVGA-P, QVGA-P
+id: 2 or "android-4"
+     Name: Android 1.6
+     Type: Platform
+     API level: 4
+     Revision: 3
+     Skins: QVGA, HVGA (default), WVGA800, WVGA854
+id: 3 or "android-7"
+     Name: Android 2.1-update1
+     Type: Platform
+     API level: 7
+     Revision: 2
+     Skins: QVGA, WQVGA400, HVGA (default), WVGA854, WQVGA432, WVGA800
+id: 4 or "android-8"
+     Name: Android 2.2
+     Type: Platform
+     API level: 8
+     Revision: 2
+     Skins: WQVGA400, QVGA, WVGA854, HVGA (default), WVGA800, WQVGA432
+id: 5 or "android-9"
+     Name: Android 2.3
+     Type: Platform
+     API level: 9
+     Revision: 1
+     Skins: HVGA (default), WVGA800, WQVGA432, QVGA, WVGA854, WQVGA400
+</pre>
+
+<h2 id="AVDCmdLine">Creating AVDs</h2> 
+<p>In addition to creating AVDs with the 
+<a href="{@docRoot}guide/developing/devices/managing-avds-cmdline.html">AVD Manager user interface</a>,
+you can also create them by passing in command line arguments to the <code>android</code> tool.
+</p>
+
+<p>Open a terminal window and change to
+the <code>&lt;sdk&gt;/tools/</code> directory, if needed.</p>
+
+<p>To create each AVD, you issue the command <code>android create avd</code>,
+with options that specify a name for the new AVD and the system image you want
+to run on the emulator when the AVD is invoked. You can specify other options on
+the command line also, such as the emulated SD card size, the emulator skin, or a custom
+location for the user data files.</p> 
+
+<p>Here's the command-line usage for creating an AVD: </p>
+
+<pre>android create avd -n &lt;name&gt; -t &lt;targetID&gt; [-&lt;option&gt; &lt;value&gt;] ... </pre>
+
+<p>You can use any name you want for the AVD, but since you are likely to be
+creating multiple AVDs, you should choose a name that lets you recognize the
+general characteristics offered by the AVD. The target ID is an integer assigned by the
+<code>android</code> tool. The target ID is not derived from the system image name, 
+version, or API Level, or other attribute, so you need to run the <code>android list targets</code>
+command to list the target ID of each system image. You should do this <em>before</em> you run
+the <code>android create avd</code> command. See the <a href="{@docRoot}guide/developing/tools/android.html">android</a></p>
+tool documentation for more information on the command line options.  
+
+
+<p>When you've selected the target you want to use and made a note of its ID,
+use the <code>android create avd</code> command to create the AVD, supplying the
+target ID as the <code>-t</code> argument. Here's an example that creates an
+AVD with name "my_android1.5" and target ID "2" (the standard Android 1.5 
+system image in the list above): </p>
+
+<pre>android create avd -n my_android1.5 -t 2</pre>
+
+<p>If the target you selected was a standard Android system image ("Type:
+platform"), the <code>android</code> tool next asks you whether you want to
+create a custom hardware profile. </p>
+<pre>Android 1.5 is a basic Android platform.
+Do you wish to create a custom hardware profile [no]</pre>
+
+<p>If you want to set custom hardware emulation options for the AVD, enter
+"yes" and set values as needed. If you want to use the default hardware
+emulation options for the AVD, just press the return key (the default is "no").
+The <code>android</code> tool creates the AVD with name and system image mapping you
+requested, with the options you specified. For more information, see <a href="#hardwareopts">
+Setting Hardware Emulation Options</a>.
+
+<p class="note"><strong>Note:</strong> If you are creating an AVD whose target is an SDK add-on, the
+<code>android</code> tool does not allow you to set hardware emulation options.
+It assumes that the provider of the add-on has set emulation options
+appropriately for the device that the add-on is modeling, and so prevents you
+from resetting the options. </p>
+
+
+<h3>Default location of AVD files</h3>
+<p>When you create an AVD, the <code>android</code> tool creates a dedicated directory for it
+on your development computer. The directory contains the AVD configuration file,
+the user data image and SD card image (if available), and any other files
+associated with the device. Note that the directory does not contain a system
+image &mdash; instead, the AVD configuration file contains a mapping to the
+system image, which it loads when the AVD is launched. </p>
+
+<p>The <code>android</code> tool also creates an <code>&lt;AVD_name&gt;.ini</code> file for the AVD at the
+root of the <code>.android/avd/</code> directory on your computer. The file specifies the
+location of the AVD directory and always remains at the root the .android 
+directory.</p>
+
+<p>By default, the <code>android</code> tool creates the AVD directory inside
+<code>~/.android/avd/</code> (on Linux/Mac), <code>C:\Documents and
+Settings\&lt;user&gt;\.android\</code> on Windows XP, and 
+<code>C:\Users\&lt;user&gt;\.android\</code> on Windows 7 and Vista. 
+If you want to use a custom location for the AVD directory, you 
+can do so by using the <code>-p &lt;path&gt;</code> option when 
+you create the AVD: </p>
+
+<pre>android create avd -n my_android1.5 -t 2 -p path/to/my/avd</pre>
+
+<p>If the .android directory is hosted on a network drive, we recommend using
+the <code>-p</code> option to place the AVD directory in another location. 
+The  AVD's .ini file remains in the .android directory on the network
+drive, regardless of the location of the AVD directory. 
+
+
+<h3 id="hardwareopts">Setting Hardware Emulation Options</h3>
+
+<p>When you are creating a new AVD that uses a standard Android system image ("Type:
+platform"), the <code>android</code> tool lets you set hardware emulation
+options for virtual device. The table below lists the options available and the
+default values, as well as the names of properties that store the emulated
+hardware options in the AVD's configuration file (the config.ini file in the
+AVD's local directory). </p>
+
+<p class="table-caption"><strong>Table 1.</strong> Available hardware profile options for AVDs and
+the default values </p>
+
+<table>
+<tr>
+<th>Characteristic</th>
+<th>Description</th>
+<th>Property</th>
+</tr>
+
+<tr>
+<td>Device ram size</td>
+<td>The amount of physical RAM on the device, in megabytes. Default value is "96".
+<td>hw.ramSize</td>
+</tr>
+
+<tr>
+<td>Touch-screen support</td>
+<td>Whether there is a touch screen or not on the device. Default value is "yes".</td>
+<td>hw.touchScreen
+
+<tr>
+<td>Trackball support </td>
+<td>Whether there is a trackball on the device. Default value is "yes".</td>
+<td>hw.trackBall</td>
+</tr>
+
+<tr>
+<td>Keyboard support</td>
+<td>Whether the device has a QWERTY keyboard. Default value is "yes".</td>
+<td>hw.keyboard</td>
+</tr>
+
+<tr>
+<td>DPad support</td>
+<td>Whether the device has DPad keys. Default value is "yes".</td>
+<td>hw.dPad</td>
+</tr>
+
+<tr>
+<td>GSM modem support</td>
+<td>Whether there is a GSM modem in the device. Default value is "yes".</td>
+<td>hw.gsmModem</td>
+</tr>
+
+<tr>
+<td>Camera support</td>
+<td>Whether the device has a camera. Default value is "no".</td>
+<td>hw.camera</td>
+</tr>
+
+<tr>
+<td>Maximum horizontal camera pixels</td>
+<td>Default value is "640".</td>
+<td>hw.camera.maxHorizontalPixels</td>
+</tr>
+
+<tr>
+<td>Maximum vertical camera pixels</td>
+<td>Default value is "480".</td>
+<td>hw.camera.maxVerticalPixels</td>
+</tr>
+
+<tr>
+<td>GPS support</td>
+<td>Whether there is a GPS in the device. Default value is "yes".</td>
+<td>hw.gps</td>
+</tr>
+
+<tr>
+<td>Battery support</td>
+<td>Whether the device can run on a battery. Default value is "yes".</td>
+<td>hw.battery</td>
+</tr>
+
+<tr>
+<td>Accelerometer</td>
+<td>Whether there is an accelerometer in the device. Default value is "yes".</td>
+<td>hw.accelerometer</td>
+</tr>
+
+<tr>
+<td>Audio recording support</td>
+<td>Whether the device can record audio. Default value is "yes".</td>
+<td>hw.audioInput</td>
+</tr>
+
+<tr>
+<td>Audio playback support</td>
+<td>Whether the device can play audio. Default value is "yes".</td>
+<td>hw.audioOutput</td>
+</tr>
+
+<tr>
+<td>SD Card support</td>
+<td>Whether the device supports insertion/removal of virtual SD Cards. Default value is "yes".</td>
+<td>hw.sdCard</td>
+</tr>
+
+<tr>
+<td>Cache partition support</td>
+<td>Whether we use a /cache partition on the device. Default value is "yes".</td>
+<td>disk.cachePartition</td>
+</tr>
+
+<tr>
+<td>Cache partition size</td>
+<td>Default value is "66MB".</td>
+<td>disk.cachePartition.size </td>
+</tr>
+
+<tr>
+<td>Abstracted LCD density</td>
+<td>Sets the generalized density characteristic used by the AVD's screen. Default value is "160".</td>
+<td>hw.lcd.density </td>
+</tr>
+
+<tr>
+<td>Trackball support</td>
+<td>Whether there is a trackball present.</td>
+<td>hw.trackBall </td>
+</tr>
+</table>
+
+
+<h2 id="moving">Moving an AVD</h2>
+
+<p>If you want to move or rename an AVD, you can do so using this command:</p>
+
+<pre>android move avd -n &lt;name&gt; [-&lt;option&gt; &lt;value&gt;] ...</pre>
+
+<h2 id="updating">Updating an AVD</h2>
+
+<p>If, for any reason, the platform/add-on root folder has its name changed (maybe because the user has installed an update of the platform/add-on) then the AVD will not be able to load the system image that it is mapped to. In this case, the <code>android list targets</code> command will produce this output: 
+
+<pre>The following Android Virtual Devices could not be loaded: 
+Name: foo 
+Path: &lt;path&gt;/.android/avd/foo.avd 
+Error: Invalid value in image.sysdir. Run 'android update avd -n foo' </pre>
+
+<p>To fix this error, use the <code>android update avd</code> command to recompute the path to the system images.</p>
+
+<h2 id="deleting">Deleting an AVD</h2>
+
+<p>You can use the <code>android</code> tool to delete an AVD. Here is the command usage:</p>
+
+<pre>android delete avd -n &lt;name&gt; </pre>
+
+<p>When you issue the command, the <code>android</code> tool looks for an AVD matching the 
+specified name deletes the AVD's directory and files. </p>
diff --git a/docs/html/guide/developing/devices/managing-avds.jd b/docs/html/guide/developing/devices/managing-avds.jd
new file mode 100644
index 0000000..73a6b6c
--- /dev/null
+++ b/docs/html/guide/developing/devices/managing-avds.jd
@@ -0,0 +1,239 @@
+page.title=Creating and Managing AVDs with AVD Manager
+@jd:body
+
+  <div id="qv-wrapper">
+    <div id="qv">
+      <h2>In this document</h2>
+
+      <ol>
+        <li><a href="#AVDEclipse">Creating an AVD</a></li>
+      </ol>
+    </div>
+  </div>
+
+  <p>The AVD Manager is an easy to use user interface to manage your AVD (Android Virtual Device)
+  configurations. An AVD is a device configuration for the Android emulator that allows you to
+  model different configurations of Android-powered devices. When you start the AVD Manager in Eclipse 
+  or run the <code>android</code> tool on the command line, you will see the AVD Manager as shown in
+  figure 1:</p>
+  
+  <img src="{@docRoot}images/avd-manager.png">
+  
+  <p class="img-caption"><strong>Figure 1. </strong>Screenshot of the AVD Manager. </p>
+  
+  <p>From the main screen, you can create, delete, repair and start AVDs as well as see the details
+  of each AVD. </p>
+
+  
+  <h2>Creating an AVD</h2>
+
+  <p>You can create as many AVDs as you would like to test on. It is recommended that you test your
+  applications on all API levels higher than the target API level for your application.</p>
+
+  <p>To create an AVD:</p>
+
+  <ol>
+    <li>Start the AVD Manager:
+
+      <ul>
+        <li>In Eclipse: select <strong>Window &gt; Android SDK and AVD Manager</strong>, or click
+        the Android SDK and AVD Manager icon in the Eclipse toolbar.</li>
+
+        <li>In other IDEs: Navigate to your SDK's <code>tools/</code> directory and execute the
+        <code>android</code> tool with no arguments.</li>
+      </ul>
+    </li>
+
+    <li><p>In the <em>Virtual Devices</em> panel, you'll see a list of existing AVDs. Click
+    <strong>New</strong> to create a new AVD. The <strong>Create New AVD</strong> dialog appears.</p>
+      
+      <img src="{@docRoot}images/developing/avd-dialog.png" alt="AVD Dialog">
+      <p class="img-caption"><strong>Figure 2.</strong> Screenshot of the Create AVD window</p>
+    </li>
+
+    <li>Fill in the details for the AVD.
+
+      <p>Give it a name, a platform target, an SD card size, and a skin (HVGA is default). You can
+      also add specific hardware features of the emulated device by clicking the
+      <strong>New...</strong> button and selecting the feature. For a list of hardware features,
+      see <a href="#hardwareopts">Hardware options</a>.</p>
+
+      <p class="note"><strong>Note:</strong> Be sure to define a target for your AVD that satisfies
+      your application's Build Target (the AVD platform target must have an API Level equal to or
+      greater than the API Level that your application compiles against).</p>
+    </li>
+
+    <li>Click <strong>Create AVD</strong>.</li>
+  </ol>
+
+  <p>Your AVD is now ready and you can either close the SDK and AVD Manager, create more AVDs, or
+  launch an emulator with the AVD by selecting a device and clicking <strong>Start</strong>.</p>
+
+<h3 id="hardwareopts">Hardware options</h3>
+<p>If you are creating a new AVD, you can specify the following hardware options for the AVD
+to emulate:</p>
+
+  <table>
+    <tr>
+      <th>Characteristic</th>
+
+      <th>Description</th>
+
+      <th>Property</th>
+    </tr>
+
+    <tr>
+      <td>Device ram size</td>
+
+      <td>The amount of physical RAM on the device, in megabytes. Default value is "96".</td>
+
+      <td>hw.ramSize</td>
+    </tr>
+
+    <tr>
+      <td>Touch-screen support</td>
+
+      <td>Whether there is a touch screen or not on the device. Default value is "yes".</td>
+
+      <td>hw.touchScreen</td>
+    </tr>
+
+    <tr>
+      <td>Trackball support</td>
+
+      <td>Whether there is a trackball on the device. Default value is "yes".</td>
+
+      <td>hw.trackBall</td>
+    </tr>
+
+    <tr>
+      <td>Keyboard support</td>
+
+      <td>Whether the device has a QWERTY keyboard. Default value is "yes".</td>
+
+      <td>hw.keyboard</td>
+    </tr>
+
+    <tr>
+      <td>DPad support</td>
+
+      <td>Whether the device has DPad keys. Default value is "yes".</td>
+
+      <td>hw.dPad</td>
+    </tr>
+
+    <tr>
+      <td>GSM modem support</td>
+
+      <td>Whether there is a GSM modem in the device. Default value is "yes".</td>
+
+      <td>hw.gsmModem</td>
+    </tr>
+
+    <tr>
+      <td>Camera support</td>
+
+      <td>Whether the device has a camera. Default value is "no".</td>
+
+      <td>hw.camera</td>
+    </tr>
+
+    <tr>
+      <td>Maximum horizontal camera pixels</td>
+
+      <td>Default value is "640".</td>
+
+      <td>hw.camera.maxHorizontalPixels</td>
+    </tr>
+
+    <tr>
+      <td>Maximum vertical camera pixels</td>
+
+      <td>Default value is "480".</td>
+
+      <td>hw.camera.maxVerticalPixels</td>
+    </tr>
+
+    <tr>
+      <td>GPS support</td>
+
+      <td>Whether there is a GPS in the device. Default value is "yes".</td>
+
+      <td>hw.gps</td>
+    </tr>
+
+    <tr>
+      <td>Battery support</td>
+
+      <td>Whether the device can run on a battery. Default value is "yes".</td>
+
+      <td>hw.battery</td>
+    </tr>
+
+    <tr>
+      <td>Accelerometer</td>
+
+      <td>Whether there is an accelerometer in the device. Default value is "yes".</td>
+
+      <td>hw.accelerometer</td>
+    </tr>
+
+    <tr>
+      <td>Audio recording support</td>
+
+      <td>Whether the device can record audio. Default value is "yes".</td>
+
+      <td>hw.audioInput</td>
+    </tr>
+
+    <tr>
+      <td>Audio playback support</td>
+
+      <td>Whether the device can play audio. Default value is "yes".</td>
+
+      <td>hw.audioOutput</td>
+    </tr>
+
+    <tr>
+      <td>SD Card support</td>
+
+      <td>Whether the device supports insertion/removal of virtual SD Cards. Default value is
+      "yes".</td>
+
+      <td>hw.sdCard</td>
+    </tr>
+
+    <tr>
+      <td>Cache partition support</td>
+
+      <td>Whether we use a /cache partition on the device. Default value is "yes".</td>
+
+      <td>disk.cachePartition</td>
+    </tr>
+
+    <tr>
+      <td>Cache partition size</td>
+
+      <td>Default value is "66MB".</td>
+
+      <td>disk.cachePartition.size</td>
+    </tr>
+
+    <tr>
+      <td>Abstracted LCD density</td>
+
+      <td>Sets the generalized density characteristic used by the AVD's screen. Default value is
+      "160".</td>
+
+      <td>hw.lcd.density</td>
+    </tr>
+
+    <tr>
+      <td>Trackball support</td>
+
+      <td>Whether there is a trackball present.</td>
+
+      <td>hw.trackBall</td>
+    </tr>
+  </table>
+
diff --git a/docs/html/guide/developing/index.jd b/docs/html/guide/developing/index.jd
new file mode 100644
index 0000000..879986c
--- /dev/null
+++ b/docs/html/guide/developing/index.jd
@@ -0,0 +1,115 @@
+page.title=Overview
+@jd:body
+
+<p>Developing applications for Android devices is facilitated by a group of tools that are
+  provided with the SDK. You can access these tools through an Eclipse plugin called ADT (Android
+  Development Tools) or from the command line. Developing with Eclipse is the preferred method because
+  it can directly invoke the tools that you need while developing applications.</p>
+
+  <p>However, you may choose to develop with another IDE or a simple text editor and invoke the
+  tools on the command line or with scripts. This is a less streamlined way to develop because you
+  will sometimes have to call command line tools manually, but you will have access to the same
+  amount of features that you would have in Eclipse.</p>
+
+  <p>The basic steps for developing applications with or without Eclipse are the same:</p>
+
+  <ol>
+    <li>Install Eclipse or your own IDE.
+
+      <p>Install Eclipse along with <a href="{@docRoot}sdk/eclipse-adt.html#installing">the ADT
+      Plugin</a>, or install an editor of your choice if you want to use the command line SDK tools.
+      If you are already developing applications, be sure to <a href= 
+      "{@docRoot}sdk/eclipse-adt.html#updating">update Your ADT Plugin</a> to the latest version
+      before continuing.</p>
+    </li>
+
+    <li>
+      <a href="{@docRoot}guide/developing/devices/avds-devices.html">Set up Android Virtual Devices
+      or hardware devices</a>.
+
+      <p>You need to create Android Virtual Devices (AVD) or connect hardware devices on which
+      you will install your applications.</p>
+    </li>
+
+    <li>
+      <a href="{@docRoot}guide/developing/projects/projects.html">Create an Android project</a>.
+
+      <p>An Android project contains all source code and resource files for your application. It is
+      built into an <code>.apk</code> package that you can install on Android devices.</p>
+    </li>
+
+    <li>
+      <a href="{@docRoot}guide/developing/building/building.html">Build and run your
+      application</a>.
+
+      <p>If you are using Eclipse, builds are generated each time you save changes and you can install
+      your application on a device by clicking <strong>Run</strong>. If you're using another IDE, you can build your
+      project using Ant and install it on a device using ADB.</p>
+    </li>
+
+    <li>
+      <a href="{@docRoot}guide/developing/debugging/debugging.html">Debug your application with the
+      SDK debugging and logging tools</a>.
+
+      <p>Debugging your application involves using a JDWP-compliant debugger along with the
+      debugging and logging tools that are provided with the Android SDK. Eclipse already
+      comes packaged with a compatible debugger.</p>
+    </li>
+
+    <li>
+      <a href="{@docRoot}guide/developing/testing/index.html">Test your application with the
+      Testing and Instrumentation framework</a>.
+
+      <p>The Android SDK provides a testing and instrumnetation framework to help you set up and
+      run tests within an emulator or device.</p>
+    </li>
+  </ol>
+
+  <h2 id="EssentialTools">Essential command line tools</h2>
+
+  <p>When developing in IDEs or editors other than Eclipse, be familiar with
+  all of the tools below, because you will have to run them from the command line.</p>
+
+  <dl>
+    <dt><a href="{@docRoot}guide/developing/tools/android.html">android</a></dt>
+
+    <dd>Create and update Android projects and create, move, and delete AVDs.</dd>
+
+    <dt><a href="{@docRoot}guide/developing/devices/emulator.html">Android Emulator</a></dt>
+
+    <dd>Run your Android applications on an emulated Android platform.</dd>
+
+    <dt><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a></dt>
+
+    <dd>Interface with your emulator or connected device (install apps, shell the device, issue
+    commands, etc.).</dd>
+  </dl>
+
+  <p>In addition to the above tools that are included with the SDK, you need the following open
+  source and third-party tools:</p>
+
+  <dl>
+    <dt>Ant</dt>
+
+    <dd>To compile and build your Android project into an installable .apk file.</dd>
+
+    <dt>Keytool</dt>
+
+    <dd>To generate a keystore and private key, used to sign your .apk file. Keytool is part of the
+    JDK.</dd>
+
+    <dt>Jarsigner (or similar signing tool)</dt>
+
+    <dd>To sign your .apk file with a private key generated by keytool. Jarsigner is part of the
+    JDK.</dd>
+  </dl>
+  
+  <p>If you are using Eclipse and ADT, tools such as <code>adb</code> and the <code>android</code>
+  are called by Eclipse and ADT under the hood or similar functionality is provided within Eclipse.
+  You need to be familiar with <code>adb</code>, however, because certain functions are not accessible from
+  Eclipse, such as the <code>adb</code> shell commands. You might also need to call Keytool and Jarsigner to
+  sign your applications, but you can set up Eclipse to do this automatically as well.</p>
+  
+  <p>For more information on these tools, see the <a href="@{docRoot}guide/developing/tools/index.html">
+  Tools</a> section of the documentation.</p>
+
diff --git a/docs/html/guide/developing/projects/index.jd b/docs/html/guide/developing/projects/index.jd
new file mode 100644
index 0000000..1daf738
--- /dev/null
+++ b/docs/html/guide/developing/projects/index.jd
@@ -0,0 +1,493 @@
+page.title=Creating and Managing Projects
+@jd:body
+
+ <div id="qv-wrapper">
+    <div id="qv">
+      <h2>In this document</h2>
+
+      <ol>
+        <li><a href="#ApplicationProjects">Android Projects</a></li>
+
+        <li><a href="#LibraryProjects">Library Projects</a></li>
+
+        <li><a href="#TestProjects">Test Projects</a></li>
+      </ol>
+    </div>
+  </div>
+
+  <p>Projects act as containers for storing things such as code and resource files. The SDK tools
+  expect your projects to follow a specific structure so it can compile and package your
+  application correctly, so it is highly recommended that you create them with Eclipse and ADT or
+  with the <code>android</code> tool on the command line. There are three types of projects, and
+  they all share the same general structure but differ in function:</p>
+
+  <dl>
+    <dt><strong>Android Projects</strong></dt>
+
+    <dd>An Android project is the container for your application's source code, resource files, and
+    files such as the Ant build and Android Manifest file. An application project is the main type
+    of project and the contents are eventually built into an <code>.apk</code> file that you install on a
+    device.</dd>
+
+    <dt><strong>Test Projects</strong></dt>
+
+    <dd>These projects contain code to test your application projects and are built into
+    applications that run on a device.</dd>
+
+    <dt><strong>Library Projects</strong></dt>
+
+    <dd>These projects contain shareable Android source code and resources that you can reference
+    in Android projects. This is useful when you have common code that you want to reuse. 
+    Library projects cannot be installed onto a device, however, they are
+    pulled into the <code>.apk</code> file at build time.</dd>
+  </dl>
+
+  <p>When you use the Android development tools to create a new project, the essential files and
+  folders will be created for you. There are only a handful of files and folders generated for you,
+  and some of them depend on whether you use the Eclipse plugin or the {@code android} tool to
+  generate your project. As your application grows in complexity, you might require new kinds of
+  resources, directories, and files.</p>
+
+  <h2 id="ApplicationProjects">Android Projects</h2>
+
+  <p>Android projects are the projects that eventually get built into an <code>.apk</code> file that you install
+  onto a device. They contain things such as application source code and resource files.
+  Some are generated for you by default, while others should be created if
+  required. The following directories and files comprise an Android project:</p>
+
+  <dl>
+    <dt><code>src/</code></dt>
+
+    <dd>Contains your stub Activity file, which is stored at
+    <code>src<em>/your/package/namespace/ActivityName</em>.java</code>. All other source code
+     files (such as <code>.java</code> or <code>.aidl</code> files) go here as well.</dd>
+
+    <dt><code>bin</code></dt>
+
+    <dd>Output directory of the build. This is where you can find the final <code>.apk</code> file and other
+    compiled resources.</dd>
+
+    <dt><code>jni</code></dt>
+
+    <dd>Contains native code sources developed using the Android NDK. For more information, see the
+    <a href="{@docRoot}sdk/ndk/index.html">Android NDK documentation</a>.</dd>
+
+    <dt><code>gen/</code></dt>
+
+    <dd>Contains the Java files generated by ADT, such as your <code>R.java</code> file and
+    interfaces created from AIDL files.</dd>
+
+    <dt><code>assets/</code></dt>
+
+    <dd>This is empty. You can use it to store raw asset files. Files that you save here are
+    compiled into an <code>.apk</code> file as-is, and the original filename is preserved. You can navigate this
+    directory in the same way as a typical file system using URIs and read files as a stream of
+    bytes using the the {@link android.content.res.AssetManager}. For example, this is a good
+    location for textures and game data.</dd>
+
+    <dt><code>res/</code></dt>
+
+    <dd>
+      Contains application resources, such as drawable files, layout files, and string values. See
+      <a href="{@docRoot}guide/topics/resources/index.html">Application Resources</a> for more
+      information.
+
+      <dl>
+        <dt><code>anim/</code></dt>
+
+        <dd>For XML files that are compiled into animation objects. See the <a href=
+        "{@docRoot}guide/topics/resources/animation-resource.html">Animation</a> resource
+        type.</dd>
+
+        <dt><code>color/</code></dt>
+
+        <dd>For XML files that describe colors. See the <a href=
+        "{@docRoot}guide/topics/resources/color-list-resource.html">Color Values</a> resource
+        type.</dd>
+
+        <dt><code>drawable/</code></dt>
+
+        <dd>For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML files that describe
+        Drawable shapes or a Drawable objects that contain multiple states (normal, pressed, or
+        focused). See the <a href=
+        "{@docRoot}guide/topics/resources/drawable-resource.html">Drawable</a> resource type.</dd>
+
+        <dt><code>layout/</code></dt>
+
+        <dd>XML files that are compiled into screen layouts (or part of a screen). See the <a href=
+        "{@docRoot}guide/topics/resources/layout-resource.html">Layout</a> resource type.</dd>
+
+        <dt><code>menu/</code></dt>
+
+        <dd>For XML files that define application menus. 
+        See the <a href="{@docRoot}guide/topics/resources/menu-resource.html">Menus</a>
+        resource type.</dd>
+
+        <dt><code>raw/</code></dt>
+
+        <dd>For arbitrary raw asset files. Saving asset files here instead of in the
+        <code>assets/</code> directory only differs in the way that you access them. These files
+        are processed by aapt and must be referenced from the application using a resource
+        identifier in the {@code R} class. For example, this is a good place for media, such as MP3
+        or Ogg files.</dd>
+
+        <dt><code>values/</code></dt>
+
+        <dd>For XML files that are compiled into many kinds of resource. Unlike other resources in
+        the <code>res/</code> directory, resources written to XML files in this folder are not
+        referenced by the file name. Instead, the XML element type controls how the resources is
+        defined within them are placed into the {@code R} class.</dd>
+
+        <dt><code>xml/</code></dt>
+
+        <dd>For miscellaneous XML files that configure application components. For example, an XML
+        file that defines a {@link android.preference.PreferenceScreen}, {@link
+        android.appwidget.AppWidgetProviderInfo}, or <a href=
+        "{@docRoot}reference/android/app/SearchManager.html#SearchabilityMetadata">Searchability
+        Metadata</a>. See <a href="{@docRoot}guide/topics/resources/index.html">Application Resources</a>
+        for more information about configuring these application components.</dd>
+      </dl>
+    </dd>
+
+    <dt><code>libs/</code></dt>
+
+    <dd>Contains private libraries.</dd>
+
+    <dt><code>AndroidManifest.xml</code></dt>
+
+    <dd>The control file that describes the nature of the application and each of its components.
+    For instance, it describes: certain qualities about the activities, services, intent receivers,
+    and content providers; what permissions are requested; what external libraries are needed; what
+    device features are required, what API Levels are supported or required; and others. See the
+    <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>
+    documentation for more information</dd>
+
+    <dt><code>build.properties</code></dt>
+
+    <dd>Customizable properties for the build system. You can edit this file to override default
+    build settings used by Ant and provide a pointer to your keystore and key alias so that the
+    build tools can sign your application when built in release mode. If you use Eclipse, this file
+    is not used.</dd>
+
+    <dt><code>build.xml</code></dt>
+
+    <dd>The Ant build file for your project. This is only applicable for projects that
+    you create on the command line.</dd>
+
+    <dt><code>default.properties</code></dt>
+
+    <dd>This file contains project settings, such as the build target. This files is integral to
+    the project, as such, it should be maintained in a Source Revision Control system. Do not edit
+    the file manually.</dd>
+  </dl>
+
+  <h2 id="LibraryProjects">Library Projects</h2>
+
+  <div class="sidebox-wrapper">
+    <div class="sidebox">
+      <h2>Library project example code</h2>
+
+      <p>The SDK includes an example application called <code>TicTacToeMain</code> that shows how a dependent
+      application can use code and resources from an Android Library project. The TicTacToeMain
+      application uses code and resources from an example library project called TicTacToeLib.</p>
+
+      <p>To download the sample applications and run them as projects in
+      your environment, use the <em>Android SDK and AVD Manager</em> to download the "Samples for
+      SDK API 8" component into your SDK.</p>
+
+      <p>For more information and to browse the code of the samples, see
+      the <a href="{@docRoot}resources/samples/TicTacToeMain/index.html">TicTacToeMain
+      application</a>.</p>
+    </div>
+  </div>
+
+    <p>An Android <em>library project</em> is a development project that holds shared Android
+    source code and resources. Other Android application projects can reference the library project
+    and, at build time, include its compiled sources in their <code>.apk</code> files. Multiple
+    application projects can reference the same library project and any single application project
+    can reference multiple library projects.</p>
+
+    <p>If you have source code and resources that are common to multiple Android projects, you
+    can move them to a library project so that it is easier to maintain across applications and
+    versions. Here are some common scenarios in which you could make use of library projects:</p>
+
+    <ul>
+      <li>If you are developing multiple related applications that use some of the same components,
+      you move the redundant components out of their respective application projects and create a
+      single, reuseable set of the same components in a library project.</li>
+
+      <li>If you are creating an application that exists in both free and paid versions. You move
+      the part of the application that is common to both versions into a library project. The two
+      dependent projects, with their different package names, will reference the library project
+      and provide only the difference between the two application versions.</li>
+    </ul>
+
+    <p>Structurally, a library project is similar to a standard Android application project. For
+    example, it includes a manifest file at the project root, as well as <code>src/</code>,
+    <code>res/</code> and similar directories. The project can contain the same types of source
+    code and resources as a standard Android project, stored in the same way. For example, source
+    code in the library project can access its own resources through its <code>R</code> class.</p>
+
+    <p>However, a library project differs from an standard Android application project in that you
+    cannot compile it directly to its own <code>.apk</code> and run it on an Android device.
+    Similarly, you cannot export the library project to a self-contained JAR file, as you would do
+    for a true library. Instead, you must compile the library indirectly, by referencing the
+    library in the dependent application and building that application.</p>
+
+    <p>When you build an application that depends on a library project, the SDK tools compile the
+    library and merge its sources with those in the main project, then use the result to generate
+    the <code>.apk</code>. In cases where a resource ID is defined in both the application and the
+    library, the tools ensure that the resource declared in the application gets priority and that
+    the resource in the library project is not compiled into the application <code>.apk</code>.
+    This gives your application the flexibility to either use or redefine any resource behaviors or
+    values that are defined in any library.</p>
+
+    <p>To organize your code further, your application can add references to multiple library
+    projects, then specify the relative priority of the resources in each library. This lets you
+    build up the resources actually used in your application in a cumulative manner. When two
+    libraries referenced from an application define the same resource ID, the tools select the
+    resource from the library with higher priority and discard the other.</p>
+
+    <p>Once you have added references to library projects to your Android project, 
+    you can set their relative priority. At build time, the
+    libraries are merged with the application one at a time, starting from the lowest priority to
+    the highest.</p>
+
+    <p>Note that a library project cannot itself reference another library project and that, at
+    build time, library projects are <em>not</em> merged with each other before being merged with
+    the application. However, note that a library can import an external library (JAR) in the
+    normal way.</p>
+
+  <h3 id="libraryReqts">Development requirements</h3>
+
+  <p>Android library projects are a build-time construct, so you can use them to build a final
+  application <code>.apk</code> that targets any API level and is compiled against any version of
+  the Android library.</p>
+
+  <p>However, to use library projects, you need to update your development environment to use the
+  latest tools and platforms, since older releases of the tools and platforms do not support
+  building with library projects. Specifically, you need to download and install the versions
+  listed below:</p>
+
+  <p class="table-caption"><strong>Table 1.</strong> Minimum versions of SDK tools and platforms on
+  which you can develop library projects.</p>
+
+  <table>
+    <tr>
+      <th>Component</th>
+
+      <th>Minimum Version</th>
+    </tr>
+
+    <tr>
+      <td>SDK Tools</td>
+
+      <td>r6 (or higher)</td>
+    </tr>
+
+    <tr>
+      <td>Android 2.2 platform</td>
+
+      <td>r1 (or higher)</td>
+    </tr>
+
+    <tr>
+      <td>Android 2.1 platform</td>
+
+      <td>r2 (or higher)</td>
+    </tr>
+
+    <tr>
+      <td style="color:gray">Android 2.0.1 platform</td>
+
+      <td style="color:gray"><em>not supported</em></td>
+    </tr>
+
+    <tr>
+      <td style="color:gray">Android 2.0 platform</td>
+
+      <td style="color:gray"><em>not supported</em></td>
+    </tr>
+
+    <tr>
+      <td>Android 1.6 platform</td>
+
+      <td>r3 (or higher)</td>
+    </tr>
+
+    <tr>
+      <td>Android 1.5 platform</td>
+
+      <td>r4 (or higher)</td>
+    </tr>
+
+    <tr>
+      <td>ADT Plugin</td>
+
+      <td>0.9.7 (or higher)</td>
+    </tr>
+  </table>
+
+  <p>You can download the tools and platforms using the <em>Android SDK and AVD Manager</em>, as
+  described in <a href="{@docRoot}sdk/adding-components.html">Adding SDK Components</a>.</p>
+
+  <h3 id="considerations">Development considerations</h3>
+
+  <p>As you develop your library project and dependent applications, keep the points listed below
+  in mind:</p>
+  
+  <ul>
+  <li><p><strong>Resource conflicts</strong></p>
+  <p>Since the tools merge the resources of a library project with those of a dependent application
+  project, a given resource ID might be defined in both projects. In this case, the tools select
+  the resource from the application, or the library with highest priority, and discard the other
+  resource. As you develop your applications, be aware that common resource IDs are likely to be
+  defined in more than one project and will be merged, with the resource from the application or
+  highest-priority library taking precedence.</p>
+  </li>
+  
+  <li><p><strong>Use prefixes to avoid resource conflicts</strong></p>
+
+  <p>To avoid resource conflicts for common resource IDs, consider using a prefix or other
+  consistent naming scheme that is unique to the project (or is unique across all projects).</p></li>
+  
+  <li><p><strong>You cannot export a library project to a JAR file</strong></p>
+
+  <p>A library cannot be distributed as a binary file (such as a jar file). This is because the
+  library project is compiled by the main project to use the correct resource IDs.</p></li>
+  <li><p><strong>One library project cannot reference another</strong></p>
+
+  <p>A library cannot depend on another library</p></li>
+  
+  <li><p><strong>A library project can include a JAR library</strong></p>
+
+  <p>You can develop a library project that itself includes a JAR library, however you need to
+  manually edit the dependent application project's build path and add a path to the JAR file.</p></li>
+  
+  <li><p><strong>A library project can depend on an external JAR library</strong></p>
+
+  <p>You can develop a library project that depends on an external library (for example, the Maps
+  external library). In this case, the dependent application must build against a target that
+  includes the external library (for example, the Google APIs Add-On). Note also that both the
+  library project and the dependent application must declare the external library in their manifest
+  files, in a <a href=
+  "{@docRoot}guide/topics/manifest/uses-library-element.html"><code>&lt;uses-library&gt;</code></a>
+  element.</p></li>
+  <li><p><strong>Library project cannot include AIDL files</strong></p>
+
+  <p>The tools do not support the use of AIDL files in a library project. Any AIDL files used by an
+  application must be stored in the application project itself.</p></li>
+  
+  <li> <p><strong>Library projects cannot include raw assets</strong></p>
+
+  <p>The tools do not support the use of raw asset files (saved in the <code>assets/</code> directory)
+  in a library project. Any asset resources
+  used by an application must be stored in the <code>assets/</code> directory of the application
+  project itself. However, resource files saved in the
+  <code>res/</code> directory are supported.</p></li>
+  
+  <li><p><strong>Platform version must be lower than or equal to the Android project</strong></p>
+
+  <p>A library is compiled as part of the dependent application project, so the API used in the
+  library project must be compatible with the version of the Android library used to compile the
+  application project. In general, the library project should use an <a href=
+  "{@docRoot}guide/appendix/api-levels.html">API level</a> that is the same as &mdash; or lower
+  than &mdash; that used by the application. If the library project uses an API level that is
+  higher than that of the application, the application project will not compile. It is
+  perfectly acceptable to have a library that uses the Android 1.5 API (API level 3) and that is
+  used in an Android 1.6 (API level 4) or Android 2.1 (API level 7) project, for instance.</p></li>
+  
+  <li> <p><strong>No restriction on library package names</strong></p>
+
+  <p>There is no requirement for the package name of a library to be the same as that of
+  applications that use it.</p></li>
+  
+  <li><p><strong>Each library project creates its own R class </strong></p>
+
+  <p>When you build the dependent application project, library projects are compiled and
+  merged with the application project. Each library has its own <code>R</code> class, named according
+  to the library's package name. The <code>R</code> class generated from main
+  project and the library project is created in all the packages that are needed including the main
+  project's package and the libraries' packages.</p></li>
+  
+  <li><p><strong>Library project storage location</strong></p>
+
+  <p>There are no specific requirements on where you should store a library project, relative to a
+  dependent application project, as long as the application project can reference the library
+  project by a relative link. What is important is that the main
+  project can reference the library project through a relative link.</p></li>
+  </ul>
+  
+
+  <h2 id="TestProjects">Test Projects</h2>
+
+  <p>Test projects contain Android applications that you write using the 
+  <a href="{@docRoot}guide/topics/testing/index.html">Testing and
+  Instrumentation framework</a>. The framework is an extension of the JUnit test framework and adds
+  access to Android system objects. The file structure of a test project is the same as an
+  Android project.</p>
+
+  <dl>
+    <dt><code>src/</code></dt>
+
+    <dd>Includes your test source files. Test projects do not require an Activity <code>.java</code>
+    file, but can include one.</dd>
+
+    <dt><code>gen/</code></dt>
+
+    <dd>This contains the Java files generated by ADT, such as your <code>R.java</code> file and
+    interfaces created from AIDL files.</dd>
+
+    <dt><code>assets/</code></dt>
+
+    <dd>This is empty. You can use it to store raw asset files.</dd>
+
+    <dt><code>res/</code></dt>
+
+    <dd>A folder for your application resources, such as drawable files, layout files, string
+    values, etc. See <a href="{@docRoot}guide/topics/resources/index.html">Application
+    Resources</a>.</dd>
+
+    <dt><code>AndroidManifest.xml</code></dt>
+
+    <dd>The Android Manifest for your project. See <a href=
+    "{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a>. Test
+    Projects have a special <a href=
+    "{@docRoot}guide/topics/manifest/instrumentation-element.html">
+    <code>&lt;instrumentation&gt;</code></a>
+    element that connects the test project with the application project.</dd>
+
+    <dt><code>build.properties</code></dt>
+
+    <dd>Customizable properties for the build system. You can edit this file to override default
+    build settings used by Ant and provide a pointer to your keystore and key alias so that the
+    build tools can sign your application when built in release mode.</dd>
+
+    <dt><code>build.xml</code></dt>
+
+    <dd>The Ant build file for your project.</dd>
+
+    <dt><code>default.properties</code></dt>
+
+    <dd>This file contains project settings, such as the build target. This files is integral to
+    the project, as such, it should be maintained in a Source Revision Control system. It should
+    never be edited manually &mdash; to edit project properties, right-click the project folder and
+    select "Properties".</dd>
+  </dl>For more information, see the <a href=
+  "{@docRoot}guide/developing/testing/index.html">Testing</a> section.
+
+
+  <h2>Testing a library project</h2>
+
+  <p>There are two recommended ways of setting up testing on code and resources in a library
+  project:</p>
+
+  <ul>
+    <li>You can set up a <a href="{@docRoot}guide/developing/testing/testing_otheride.html">test
+    project</a> that instruments an application project that depends on the library project. You
+    can then add tests to the project for library-specific features.</li>
+
+    <li>You can set up a set up a standard application project that depends on the library and put
+    the instrumentation in that project. This lets you create a self-contained project that
+    contains both the tests/instrumentations and the code to test.</li>
+  </ul>
\ No newline at end of file
diff --git a/docs/html/guide/developing/projects/projects-cmdline.jd b/docs/html/guide/developing/projects/projects-cmdline.jd
new file mode 100644
index 0000000..de67b29
--- /dev/null
+++ b/docs/html/guide/developing/projects/projects-cmdline.jd
@@ -0,0 +1,285 @@
+page.title=Managing Projects on the Command Line
+@jd:body
+
+  <div id="qv-wrapper">
+    <div id="qv">
+      <h2>In this document</h2>
+
+      <ol>
+        <li><a href="#CreatingAProject">Creating an Android Project</a></li>
+
+        <li><a href="#UpdatingAProject">Updating a Project</a></li>
+
+        <li><a href="#SettingUpLibraryProject">Setting up a Library Project</a></li>
+
+        <li><a href="#ReferencingLibraryProject">Referencing a Library Project from an
+        Application</a></li>
+      </ol>
+
+      <h2>See also</h2>
+
+      <ol>
+        <li><a href=
+        "{@docRoot}guide/developing/testing/testing_otheride.html#CreateTestProjectCommand">Testing
+        in Other IDEs</a></li>
+      </ol>
+    </div>
+  </div>
+
+  <p>The <code>android</code> tool provides you with commands to create all three types of
+  projects. An Android project contains all of the files and resources that are needed to build a
+  project into an .apk file for installation. 
+  
+  <ul>
+    <li>An Android project contains all of the files and resources that are needed to build a project into
+  an .apk file for installation. You need to create an Android project for any application that you
+  want to eventually install on a device.</li>
+
+  <li>You can also designate an Android project as a library project, which allows it to be shared
+  with other projects that depend on it. Once an Android project is designated as a library
+  project, it cannot be installed onto a device.</li>
+
+  <li>Test projects extend JUnit test functionality to include Android specific functionality. For
+  more information on creating a test project, see <a href=
+  "{@docRoot}guide/developing/testing/testing_otheride.html">Testing in other IDEs</a>.</li>
+  </ul>
+
+
+  <h2 id="CreatingAProject">Creating an Android Project</h2>
+
+  <p>To create an Android project, you must use the <code>android</code> tool. When you create a
+  new project with <code>android</code>, it will generate a project directory with some default
+  application files, stub files, configuration files and a build file.</p>
+
+  <p>To create a new Android project, open a command-line, navigate to the <code>tools/</code>
+  directory of your SDK and run:</p>
+  <pre>
+android create project \
+--target &lt;target_ID&gt; \
+--name &lt;your_project_name&gt; \
+--path path/to/your/project \
+--activity &lt;your_activity_name&gt; \
+--package &lt;your_package_namespace&gt;
+</pre>
+
+  <ul>
+    <li><code>target</code> is the "build target" for your application. It corresponds to an
+    Android platform library (including any add-ons, such as Google APIs) that you would like to
+    build your project against. To see a list of available targets and their corresponding IDs,
+    execute: <code>android list targets</code>.</li>
+
+    <li><code>name</code> is the name for your project. This is optional. If provided, this name
+    will be used for your .apk filename when you build your application.</li>
+
+    <li><code>path</code> is the location of your project directory. If the directory does not
+    exist, it will be created for you.</li>
+
+    <li><code>activity</code> is the name for your default {@link android.app.Activity} class. This
+    class file will be created for you inside
+    <code><em>&lt;path_to_your_project&gt;</em>/src/<em>&lt;your_package_namespace_path&gt;</em>/</code>
+    . This will also be used for your .apk filename unless you provide a <code>name</code>.</li>
+
+    <li><code>package</code> is the package namespace for your project, following the same rules as
+    for packages in the Java programming language.</li>
+  </ul>
+
+  <p>Here's an example:</p>
+  <pre>
+android create project \
+--target 1 \
+--name MyAndroidApp \
+--path ./MyAndroidAppProject \
+--activity MyAndroidAppActivity \
+--package com.example.myandroid
+</pre>
+
+  <p>Once you've created your project, you're ready to begin development. You can move your project
+  folder wherever you want for development, but keep in mind that you must use the <a href=
+  "{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a> (adb) &mdash; located in the
+  SDK <code>platform-tools/</code> directory &mdash; to send your application to the emulator (discussed
+  later). So you need access between your project solution and the <code>platform-tools/</code> folder.</p>
+ 
+  <p class="note"><strong>Tip:</strong> Add the <code>platform-tools/</code> as well as the <code>tools/</code> directory
+  to your <code>PATH</code> environment variable.</p>
+  
+  <p class="caution"><strong>Caution:</strong> You should refrain from moving the location of the
+  SDK directory, because this will break the build scripts. (They will need to be manually updated
+  to reflect the new SDK location before they will work again.)</p>
+
+  <h2 id="UpdatingAProject">Updating a project</h2>
+
+  <p>If you're upgrading a project from an older version of the Android SDK or want to create a new
+  project from existing code, use the <code>android update project</code> command to update the
+  project to the new development environment. You can also use this command to revise the build
+  target of an existing project (with the <code>--target</code> option) and the project name (with
+  the <code>--name</code> option). The <code>android</code> tool will generate any files and
+  folders (listed in the previous section) that are either missing or need to be updated, as needed
+  for the Android project.</p>
+
+  <p>To update an existing Android project, open a command-line and navigate to the
+  <code>tools/</code> directory of your SDK. Now run:</p>
+  <pre>
+android update project --name &lt;project_name&gt; --target &lt;target_ID&gt;
+--path &lt;path_to_your_project&gt;
+</pre>
+
+  <ul>
+    <li><code>target</code> is the "build target" for your application. It corresponds to an
+    Android platform library (including any add-ons, such as Google APIs) that you would like to
+    build your project against. To see a list of available targets and their corresponding IDs,
+    execute: <code>android list targets</code>.</li>
+
+    <li><code>path</code> is the location of your project directory.</li>
+
+    <li><code>name</code> is the name for the project. This is optional&mdash;if you're not
+    changing the project name, you don't need this.</li>
+  </ul>
+
+  <p>Here's an example:</p>
+  <pre>
+android update project --name MyApp --target 2 --path ./MyAppProject
+</pre>
+
+  <h2 id="SettingUpLibraryProject">Setting up a library project</h2>
+
+  <p>A library project is a standard Android project, so you can create a new one in the same way
+  as you would a new application project. Specifically, you can use the <code>android</code> tool
+  to generate a new library project with all of the necessary files and folders.</p>
+
+  <p>To create a new library project, navigate to the <code>&lt;sdk&gt;/tools/</code> directory and
+  use this command:</p>
+  <pre class="no-pretty-print">
+android create lib-project --name &lt;your_project_name&gt; \
+--target &lt;target_ID&gt; \
+--path path/to/your/project \
+--package &lt;your_library_package_namespace&gt;
+</pre>
+
+  <p>The <code>create lib-project</code> command creates a standard project structure that includes
+  preset property that indicates to the build system that the project is a library. It does this by
+  adding this line to the project's <code>default.properties</code> file:</p>
+  <pre class="no-pretty-print">
+android.library=true
+</pre>
+
+  <p>Once the command completes, the library project is created and you can begin moving source
+  code and resources into it, as described in the sections below.</p>
+
+  <p>If you want to convert an existing application project to a library project, so that other
+  applications can use it, you can do so by adding a the <code>android.library=true</code> property
+  to the application's <code>default.properties</code> file.</p>
+
+  <h4>Creating the manifest file</h4>
+
+  <p>A library project's manifest file must declare all of the shared components that it includes,
+  just as would a standard Android application. For more information, see the documentation for
+  <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+  <p>For example, the <a href=
+  "{@docRoot}resources/samples/TicTacToeLib/AndroidManifest.html">TicTacToeLib</a> example library
+  project declares the Activity <code>GameActivity</code>:</p>
+  <pre>
+&lt;manifest&gt;
+  ...
+  &lt;application&gt;
+    ...
+    &lt;activity android:name="GameActivity" /&gt;
+    ...
+  &lt;/application&gt;
+&lt;/manifest&gt;
+</pre>
+
+  <h4>Updating a library project</h4>
+
+  <p>If you want to update the build properties (build target, location) of the library project,
+  use this command:</p>
+  <pre>
+android update lib-project \
+--target <em>&lt;target_ID&gt;</em> \
+--path <em>path/to/your/project</em>
+</pre>
+
+  <h2 id="ReferencingLibraryProject">Referencing a Library Project</h2>
+
+  <p>If you are developing an application and want to include the shared code or resources from a
+  library project, you can do so easily by adding a reference to the library project in the
+  application project's build properties.</p>
+
+  <p>To add a reference to a library project, navigate to the <code>&lt;sdk&gt;/tools/</code>
+  directory and use this command:</p>
+  <pre>
+android update lib-project \
+--target <em>&lt;target_ID&gt;</em> \
+--path <em>path/to/your/project</em>
+--library <em>path/to/library_projectA</em>
+</pre>
+
+  <p>This command updates the application project's build properties to include a reference to the
+  library project. Specifically, it adds an <code>android.library.reference.<em>n</em></code>
+  property to the project's <code>default.properties</code> file. For example:</p>
+  <pre class="no-pretty-print">
+android.library.reference.1=path/to/library_projectA
+</pre>
+
+  <p>If you are adding references to multiple libraries, note that you can set their relative
+  priority (and merge order) by manually editing the <code>default.properties</code> file and
+  adjusting the each reference's <code>.<em>n</em></code> index as appropriate. For example, assume
+  these references:</p>
+  <pre class="no-pretty-print">
+android.library.reference.1=path/to/library_projectA
+android.library.reference.2=path/to/library_projectB
+android.library.reference.3=path/to/library_projectC
+</pre>
+
+  <p>You can reorder the references to give highest priority to <code>library_projectC</code> in
+  this way:</p>
+  <pre class="no-pretty-print">
+android.library.reference.2=path/to/library_projectA
+android.library.reference.3=path/to/library_projectB
+android.library.reference.1=path/to/library_projectC
+</pre>
+
+  <p>Note that the <code>.<em>n</em></code> index in the references must begin at "1" and increase
+  uniformly without "holes". References appearing in the index after a hole are ignored.</p>
+
+  <p>At build time, the libraries are merged with the application one at a time, starting from the
+  lowest priority to the highest. Note that a library cannot itself reference another library and
+  that, at build time, libraries are not merged with each other before being merged with the
+  application.</p>
+
+  <h3>Declaring library components in the the manifest file</h3>
+
+  <p>In the manifest file of the application project, you must add declarations of all components
+  that the application will use that are imported from a library project. For example, you must
+  declare any <code>&lt;activity&gt;</code>, <code>&lt;service&gt;</code>,
+  <code>&lt;receiver&gt;</code>, <code>&lt;provider&gt;</code>, and so on, as well as
+  <code>&lt;permission&gt;</code>, <code>&lt;uses-library&gt;</code>, and similar elements.</p>
+
+  <p>Declarations should reference the library components by their fully-qualified package names,
+  where appropriate.</p>
+
+  <p>For example, the <a href=
+  "{@docRoot}resources/samples/TicTacToeMain/AndroidManifest.html">TicTacToeMain</a> example
+  application declares the library Activity <code>GameActivity</code> like this:</p>
+  <pre>
+&lt;manifest&gt;
+  ...
+  &lt;application&gt;
+    ...
+    &lt;activity android:name="com.example.android.tictactoe.library.GameActivity" /&gt;
+    ...
+  &lt;/application&gt;
+&lt;/manifest&gt;
+</pre>
+
+  <p>For more information about the manifest file, see the documentation for
+  <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+  <h3 id="depAppBuild">Building a dependent application</h3>
+
+  <p>To build an application project that depends on one or more library projects, you can use the
+  standard Ant build commands and compile modes, as described in <a href=
+  "{@docRoot}guide/developing/building/index.html">Building Your Application</a>, earlier in this
+  document. The tools compile and merge all libraries referenced by the application as part of
+  compiling the dependent application project. No additional commands or steps are necessary.</p>
+
diff --git a/docs/html/guide/developing/projects/projects-eclipse.jd b/docs/html/guide/developing/projects/projects-eclipse.jd
new file mode 100644
index 0000000..45111f3
--- /dev/null
+++ b/docs/html/guide/developing/projects/projects-eclipse.jd
@@ -0,0 +1,235 @@
+page.title=Managing Projects in Eclipse
+@jd:body
+
+ <div id="qv-wrapper">
+    <div id="qv">
+      <h2>In this document</h2>
+
+      <ol>
+        <li><a href="#CreatingAProject">Creating an Android Project</a></li>
+
+        <li><a href="#SettingUpLibraryProject">Setting up a Library Project</a></li>
+
+        <li><a href="#ReferencingLibraryProject">Referencing a Library Project</a></li>
+      </ol>
+
+      <h2>See also</h2>
+
+      <ol>
+        <li><a href=
+        "{@docRoot}guide/developing/testing/testing_eclipse.html#CreateTestProjectEclipse">Testing
+        in Eclipse, with ADT</a></li>
+      </ol>
+    </div>
+  </div>
+
+  <p>Eclipse and the ADT plugin provide GUIs and wizards to create all three types of projects
+  (Android project, Library project, and Test project):
+  
+  <ul>
+    <li>An Android project contains all of the files and resources that are needed to build a project into
+  an .apk file for installation. You need to create an Android project for any application that you
+  want to eventually install on a device.</li>
+
+  <li>You can also designate an Android project as a library project, which allows it to be shared
+  with other projects that depend on it. Once an Android project is designated as a library
+  project, it cannot be installed onto a device.</li>
+
+  <li>Test projects extend JUnit test functionality to include Android specific functionality. For
+  more information on creating a test project, see <a href=
+  "{@docRoot}guide/developing/testing/testing_eclipse.html">Testing in Eclipse</a></li>
+  </ul>
+
+  <h2 id="CreatingAProject">Creating an Android Project</h2>
+
+  <p>The ADT plugin provides a <em>New Project Wizard</em> that you can use to quickly create a new Android
+  project (or a project from existing code). To create a new project:</p>
+
+  <ol>
+    <li>Select <strong>File</strong> &gt; <strong>New</strong> &gt; <strong>Project</strong>.</li>
+
+    <li>Select <strong>Android</strong> &gt; <strong>Android Project</strong>, and click
+    <strong>Next</strong>.</li>
+
+    <li>Select the contents for the project:
+
+      <ul>
+        <li>Enter a <em>Project Name</em>. This will be the name of the folder where your project
+        is created.</li>
+
+        <li>Under Contents, select <strong>Create new project in workspace</strong>. Select your
+        project workspace location.</li>
+
+        <li>Under Target, select an Android target to be used as the project's Build Target. The
+        Build Target specifies which Android platform you'd like your application built against.
+
+          <p>Select the lowest platform with which your application is compatible.</p>
+
+          <p class="note"><strong>Note:</strong> You can change your the Build Target for your
+          project at any time: Right-click the project in the Package Explorer, select
+          <strong>Properties</strong>, select <strong>Android</strong> and then check the desired
+          Project Target.</p>
+        </li>
+
+        <li>Under Properties, fill in all necessary fields.
+
+          <ul>
+            <li>Enter an <em>Application name</em>. This is the human-readable title for your
+            application &mdash; the name that will appear on the Android device.</li>
+
+            <li>Enter a <em>Package name</em>. This is the package namespace (following the same
+            rules as for packages in the Java programming language) where all your source code will
+            reside.</li>
+
+            <li>Select <em>Create Activity</em> (optional, of course, but common) and enter a name
+            for your main Activity class.</li>
+
+            <li>Enter a <em>Min SDK Version</em>. This is an integer that indicates the minimum API
+            Level required to properly run your application. Entering this here automatically sets
+            the <code>minSdkVersion</code> attribute in the <a href=
+            "{@docRoot}guide/topics/manifest/uses-sdk-element.html">&lt;uses-sdk&gt;</a> of your
+            Android Manifest file. If you're unsure of the appropriate <a href=
+            "{@docRoot}guide/appendix/api-levels.html">API Level</a> to use, copy the API Level
+            listed for the Build Target you selected in the Target tab.</li>
+          </ul>
+        </li>
+      </ul>
+    </li>
+
+    <li>Click <strong>Finish</strong>.</li>
+  </ol>
+
+  <p class="note"><strong>Tip:</strong> You can also start the New Project Wizard from the
+  <em>New</em> icon in the toolbar.</p>
+
+  <h2 id="SettingUpLibraryProject">Setting up a Library Project</h2>
+
+  <p>A library project is a standard Android project, so you can create a new one in the same way
+  as you would a new application project.</p>
+
+  <p>When you are creating the library project, you can select any application name, package, and
+  set other fields as needed, as shown in figure 1.</p>
+
+  <p>Next, set the project's properties to indicate that it is a library project:</p>
+
+  <ol>
+    <li>In the <strong>Package Explorer</strong>, right-click the library project and select
+    <strong>Properties</strong>.</li>
+
+    <li>In the <strong>Properties</strong> window, select the "Android" properties group at left
+    and locate the <strong>Library</strong> properties at right.</li>
+
+    <li>Select the "is Library" checkbox and click <strong>Apply</strong>.</li>
+
+    <li>Click <strong>OK</strong> to close the <em>Properties</em> window.</li>
+  </ol>
+
+  <p>The new project is now marked as a library project. You can begin moving source code and
+  resources into it, as described in the sections below.</p>
+
+  <p>You can also convert an existing application project into a library. To do so, simply open the
+  Properties for the project and select the "is Library" checkbox. Other application projects can
+  now reference the existing project as a library project.</p>
+  
+  <img src= "{@docRoot}images/developing/adt-props-isLib.png">
+
+  <p class="img-caption"><strong>Figure 1.</strong> Marking a project as an
+     Android library project.</p>
+
+  <h3>Creating the manifest file</h3>
+
+  <p>A library project's manifest file must declare all of the shared components that it includes,
+  just as would a standard Android application. For more information, see the documentation for
+  <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+  <p>For example, the <a href=
+  "{@docRoot}resources/samples/TicTacToeLib/AndroidManifest.html">TicTacToeLib</a> example library
+  project declares the Activity <code>GameActivity</code>:</p>
+  <pre>
+&lt;manifest&gt;
+  ...
+  &lt;application&gt;
+    ...
+    &lt;activity android:name="GameActivity" /&gt;
+    ...
+  &lt;/application&gt;
+&lt;/manifest&gt;
+</pre>
+
+  <h2 id="ReferencingLibraryProject">Referencing a library project</h2>
+
+  <p>If you are developing an application and want to include the shared code or resources from a
+  library project, you can do so easily by adding a reference to the library project in the
+  application project's Properties.</p>
+
+  <p>To add a reference to a library project, follow these steps:</p>
+
+  <ol>
+    <li>In the <strong>Package Explorer</strong>, right-click the dependent project and select
+    <strong>Properties</strong>.</li>
+
+    <li>In the <strong>Properties</strong> window, select the "Android" properties group at left
+    and locate the <strong>Library</strong> properties at right.</li>
+
+    <li>Click <strong>Add</strong> to open the <strong>Project Selection</strong> dialog.</li>
+
+    <li>From the list of available library projects, select a project and click
+    <strong>OK</strong>.</li>
+
+    <li>When the dialog closes, click <strong>Apply</strong> in the <strong>Properties</strong>
+    window.</li>
+
+    <li>Click <strong>OK</strong> to close the <strong>Properties</strong> window.</li>
+  </ol>
+
+  <p>As soon as the Properties dialog closes, Eclipse rebuilds the project, including the contents
+  of the library project.</p>
+
+  <p>Figure 2 shows the Properties dialog that lets you add library references and move
+  them up and down in priority.</p><img src="{@docRoot}images/developing/adt-props-libRef.png">
+
+  <p class="img-caption"><strong>Figure 2.</strong> Adding a reference to a
+     library project in the properties of an application project.</p>
+
+  <p>If you are adding references to multiple libraries, note that you can set their relative
+  priority (and merge order) by selecting a library and using the <strong>Up</strong> and
+  <strong>Down</strong> controls. The tools merge the referenced libraries with your application
+  starting from lowest priority (bottom of the list) to highest (top of the list). If more than one
+  library defines the same resource ID, the tools select the resource from the library with higher
+  priority. The application itself has highest priority and its resources are always used in
+  preference to identical resource IDs defined in libraries.</p>
+
+  <h3>Declaring library components in the the manifest file</h3>
+
+  <p>In the manifest file of the application project, you must add declarations of all components
+  that the application will use that are imported from a library project. For example, you must
+  declare any <code>&lt;activity&gt;</code>, <code>&lt;service&gt;</code>,
+  <code>&lt;receiver&gt;</code>, <code>&lt;provider&gt;</code>, and so on, as well as
+  <code>&lt;permission&gt;</code>, <code>&lt;uses-library&gt;</code>, and similar elements.</p>
+
+  <p>Declarations should reference the library components by their fully-qualified package names,
+  where appropriate.</p>
+
+  <p>For example, the <a href=
+  "{@docRoot}resources/samples/TicTacToeMain/AndroidManifest.html">TicTacToeMain</a> example
+  application declares the library Activity <code>GameActivity</code> like this:</p>
+  <pre>
+&lt;manifest&gt;
+  ...
+  &lt;application&gt;
+    ...
+    &lt;activity android:name="com.example.android.tictactoe.library.GameActivity" /&gt;
+    ...
+  &lt;/application&gt;
+&lt;/manifest&gt;
+</pre>
+
+  <p>For more information about the manifest file, see the documentation for <a href=
+  "{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+
+
+
+
+
+
diff --git a/docs/html/guide/topics/media/index.jd b/docs/html/guide/topics/media/index.jd
index 8e18754..e355212 100644
--- a/docs/html/guide/topics/media/index.jd
+++ b/docs/html/guide/topics/media/index.jd
@@ -115,9 +115,8 @@
 <p>{@link android.media.MediaPlayer#stop() stop()} and 
 {@link android.media.MediaPlayer#pause() pause()} work the same as discussed
 above.</p>
-  <p class="note"><strong>Note:</strong> It is possible that <code>mp</code> could be
-  null, so good code should <code>null</code> check after the <code>new</code>.
-  Also, <code>IllegalArgumentException</code> and <code>IOException</code> either
+  <p class="note"><strong>Note:</strong>
+  <code>IllegalArgumentException</code> and <code>IOException</code> either
   need to be caught or passed on when using <code>setDataSource()</code>, since
   the file you are referencing may not exist.</p>
 <p class="note"><strong>Note:</strong>
diff --git a/docs/html/guide/topics/resources/drawable-resource.jd b/docs/html/guide/topics/resources/drawable-resource.jd
index 129462e..d9f619f 100644
--- a/docs/html/guide/topics/resources/drawable-resource.jd
+++ b/docs/html/guide/topics/resources/drawable-resource.jd
@@ -474,7 +474,7 @@
         android:right="<em>dimension</em>"
         android:bottom="<em>dimension</em>"
         android:left="<em>dimension</em>" /&gt;
-&lt;/selector>
+&lt;/layer-list>
 </pre>
 </dd>
 
@@ -906,7 +906,7 @@
         android:right="<em>dimension</em>"
         android:bottom="<em>dimension</em>"
         android:left="<em>dimension</em>" /&gt;
-&lt;/selector>
+&lt;/transition>
 </pre>
 </dd>
 
@@ -926,8 +926,8 @@
       </dl>
     </dd>
   <dt id="transition-item-element"><code>&lt;item&gt;</code></dt>
-    <dd>Defines a drawable to place in the layer drawable, in a position defined by its attributes.
-Must be a child of a <code>&lt;selector&gt;</code> element. Accepts child {@code &lt;bitmap&gt;}
+    <dd>Defines a drawable to use as part of the drawable transition.
+Must be a child of a <code>&lt;transition&gt;</code> element. Accepts child {@code &lt;bitmap&gt;}
 elements.
       <p class="caps">attributes:</p>
       <dl class="atn-list">
@@ -963,7 +963,7 @@
 &lt;transition xmlns:android="http://schemas.android.com/apk/res/android"&gt;
     &lt;item android:drawable="@drawable/on" /&gt;
     &lt;item android:drawable="@drawable/off" /&gt;
-&lt;/layer-list&gt;
+&lt;/transition&gt;
 </pre>
 
 <p>This layout XML applies the drawable to a View:</p>
@@ -1226,11 +1226,11 @@
 <dd>XML file saved at <code>res/drawable/clip.xml</code>:
 <pre>
 &lt;?xml version="1.0" encoding="utf-8"?>
-&lt;shape xmlns:android="http://schemas.android.com/apk/res/android"
+&lt;clip xmlns:android="http://schemas.android.com/apk/res/android"
     android:drawable="@drawable/android"
     android:clipOrientation="horizontal"
     android:gravity="left" /&gt;
-&lt;/shape>
+&lt;/clip>
 </pre>
     <p>The following layout XML applies the clip drawable to a View:</p>
 <pre>
diff --git a/docs/html/images/avd-manager.png b/docs/html/images/avd-manager.png
new file mode 100644
index 0000000..69ce972
--- /dev/null
+++ b/docs/html/images/avd-manager.png
Binary files differ
diff --git a/docs/html/images/build-simplified.png b/docs/html/images/build-simplified.png
new file mode 100644
index 0000000..73e3452
--- /dev/null
+++ b/docs/html/images/build-simplified.png
Binary files differ
diff --git a/docs/html/images/build.png b/docs/html/images/build.png
new file mode 100644
index 0000000..bf4cf4e
--- /dev/null
+++ b/docs/html/images/build.png
Binary files differ
diff --git a/docs/html/sdk/android-2.3.jd b/docs/html/sdk/android-2.3.jd
index a0b7c99..e00674f 100644
--- a/docs/html/sdk/android-2.3.jd
+++ b/docs/html/sdk/android-2.3.jd
@@ -238,9 +238,8 @@
 <ul>
 <li>New {@link android.hardware.Camera.CameraInfo} class stores a camera's
 positional characteristics (orientation, front-facing or back-facing).</li>
-<li>New {@link android.hardware.Camera#getNumberOfCameras()}, {@link
-android.hardware.Camera#getCameraInfo(int,CameraInfo) getCameraInfo()}, and
-{@link android.hardware.Camera#getNumberOfCameras()} methods in the {@link
+<li>New {@link android.hardware.Camera#getNumberOfCameras()} and {@link
+android.hardware.Camera#getCameraInfo(int,CameraInfo) getCameraInfo()} methods in the {@link
 android.hardware.Camera} class let applications query for the cameras available
 and open the camera that they need.</li>
 <li>New {@link android.media.CamcorderProfile get(int,int) method lets
@@ -691,7 +690,7 @@
 <li><code>"reverseLandscape"</code> &mdash; The Activity would like to have the
 screen in landscape orientation, turned in the opposite direction from normal
 landscape.</li>
-<li><code>"reversePortait"</code> &mdash; The Activity would like to have the
+<li><code>"reversePortrait"</code> &mdash; The Activity would like to have the
 screen in portrait orientation, turned in the opposite direction from normal
 portrait.</li>
 <li><code>"sensorLandscape"</code> &mdash; The Activity would like to have the
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index fe723f2..8309f7a 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -213,19 +213,6 @@
         public boolean inInputShareable;
 
         /**
-         * Normally bitmap allocations count against the dalvik heap, which
-         * means they help trigger GCs when a lot have been allocated. However,
-         * in rare cases, the caller may want to allocate the bitmap outside of
-         * that heap. To request that, set inNativeAlloc to true. In these
-         * rare instances, it is solely up to the caller to ensure that OOM is
-         * managed explicitly by calling bitmap.recycle() as soon as such a
-         * bitmap is no longer needed.
-         *
-         * @hide pending API council approval
-         */
-        public boolean inNativeAlloc;
-
-        /**
          * If inPreferQualityOverSpeed is set to true, the decoder will try to
          * decode the reconstructed image to a higher quality even at the
          * expense of the decoding speed. Currently the field only affects JPEG
diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java
index 4ba679b..f74d0ef 100644
--- a/graphics/java/android/graphics/BitmapShader.java
+++ b/graphics/java/android/graphics/BitmapShader.java
@@ -23,9 +23,10 @@
 public class BitmapShader extends Shader {
     /**
      * Prevent garbage collection.
+     * @hide
      */
     @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
-    private final Bitmap mBitmap;
+    public final Bitmap mBitmap;
 
     /**
      * Call this to create a new shader that will draw with a bitmap.
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index 3ff483d..0dbc204 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -102,12 +102,6 @@
         mRS.nAllocationSyncAll(getID(), srcLocation);
     }
 
-    public void uploadToBufferObject() {
-        mRS.validate();
-        mRS.nAllocationUploadToBufferObject(getID());
-    }
-
-
     public void copyFrom(BaseObj[] d) {
         mRS.validate();
         if (d.length != mType.getCount()) {
@@ -516,19 +510,6 @@
                                         USAGE_GRAPHICS_TEXTURE);
     }
 
-/*
-    static public Allocation createFromBitmapResource(RenderScript rs,
-                                                      Resources res,
-                                                      int id,
-                                                      Element dstFmt,
-                                                      boolean genMips) {
-        MipmapControl mc = MipmapControl.MIPMAP_NONE;
-        if (genMips) {
-            mc = MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE;
-        }
-        return createFromBitmapResource(rs, res, id, mc, USAGE_GRAPHICS_TEXTURE);
-    }
-*/
     static public Allocation createFromString(RenderScript rs,
                                               String str,
                                               int usage) {
diff --git a/graphics/java/android/renderscript/FieldPacker.java b/graphics/java/android/renderscript/FieldPacker.java
index ff3e22b..2a585fd 100644
--- a/graphics/java/android/renderscript/FieldPacker.java
+++ b/graphics/java/android/renderscript/FieldPacker.java
@@ -248,19 +248,19 @@
         addU32(v.w);
     }
 
-    public void addObj(Matrix4f v) {
+    public void addMatrix(Matrix4f v) {
         for (int i=0; i < v.mMat.length; i++) {
             addF32(v.mMat[i]);
         }
     }
 
-    public void addObj(Matrix3f v) {
+    public void addMatrix(Matrix3f v) {
         for (int i=0; i < v.mMat.length; i++) {
             addF32(v.mMat[i]);
         }
     }
 
-    public void addObj(Matrix2f v) {
+    public void addMatrix(Matrix2f v) {
         for (int i=0; i < v.mMat.length; i++) {
             addF32(v.mMat[i]);
         }
diff --git a/graphics/java/android/renderscript/FileA3D.java b/graphics/java/android/renderscript/FileA3D.java
index af85d8e..c3e5faf 100644
--- a/graphics/java/android/renderscript/FileA3D.java
+++ b/graphics/java/android/renderscript/FileA3D.java
@@ -16,11 +16,12 @@
 
 package android.renderscript;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 
-import android.content.res.Resources;
 import android.content.res.AssetManager;
+import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.util.Log;
@@ -32,28 +33,33 @@
  **/
 public class FileA3D extends BaseObj {
 
+    // This will go away in the clean up pass,
+    // trying to avoid multiproject submits
     public enum ClassID {
 
         UNKNOWN,
-        MESH,
-        TYPE,
-        ELEMENT,
-        ALLOCATION,
-        PROGRAM_VERTEX,
-        PROGRAM_RASTER,
-        PROGRAM_FRAGMENT,
-        PROGRAM_STORE,
-        SAMPLER,
-        ANIMATION,
-        ADAPTER_1D,
-        ADAPTER_2D,
-        SCRIPT_C;
+        MESH;
 
         public static ClassID toClassID(int intID) {
             return ClassID.values()[intID];
         }
     }
 
+    public enum EntryType {
+
+        UNKNOWN (0),
+        MESH (1);
+
+        int mID;
+        EntryType(int id) {
+            mID = id;
+        }
+
+        static EntryType toEntryType(int intID) {
+            return EntryType.values()[intID];
+        }
+    }
+
     // Read only class with index entries
     public static class IndexEntry {
         RenderScript mRS;
@@ -61,6 +67,7 @@
         int mID;
         String mName;
         ClassID mClassID;
+        EntryType mEntryType;
         BaseObj mLoadedObj;
 
         public String getName() {
@@ -71,18 +78,27 @@
             return mClassID;
         }
 
+        public EntryType getEntryType() {
+            return mEntryType;
+        }
+
         public BaseObj getObject() {
             mRS.validate();
             BaseObj obj = internalCreate(mRS, this);
             return obj;
         }
 
+        public Mesh getMesh() {
+            return (Mesh)getObject();
+        }
+
         static synchronized BaseObj internalCreate(RenderScript rs, IndexEntry entry) {
             if(entry.mLoadedObj != null) {
                 return entry.mLoadedObj;
             }
 
-            if(entry.mClassID == ClassID.UNKNOWN) {
+            // to be purged on cleanup
+            if(entry.mEntryType == EntryType.UNKNOWN) {
                 return null;
             }
 
@@ -91,51 +107,23 @@
                 return null;
             }
 
-            switch (entry.mClassID) {
+            switch (entry.mEntryType) {
             case MESH:
                 entry.mLoadedObj = new Mesh(objectID, rs);
                 break;
-            case TYPE:
-                entry.mLoadedObj = new Type(objectID, rs);
-                break;
-            case ELEMENT:
-                entry.mLoadedObj = null;
-                break;
-            case ALLOCATION:
-                entry.mLoadedObj = null;
-                break;
-            case PROGRAM_VERTEX:
-                entry.mLoadedObj = new ProgramVertex(objectID, rs);
-                break;
-            case PROGRAM_RASTER:
-                break;
-            case PROGRAM_FRAGMENT:
-                break;
-            case PROGRAM_STORE:
-                break;
-            case SAMPLER:
-                break;
-            case ANIMATION:
-                break;
-            case ADAPTER_1D:
-                break;
-            case ADAPTER_2D:
-                break;
-            case SCRIPT_C:
-                break;
             }
 
             entry.mLoadedObj.updateFromNative();
-
             return entry.mLoadedObj;
         }
 
-        IndexEntry(RenderScript rs, int index, int id, String name, ClassID classID) {
+        IndexEntry(RenderScript rs, int index, int id, String name, EntryType type) {
             mRS = rs;
             mIndex = index;
             mID = id;
             mName = name;
-            mClassID = classID;
+            mEntryType = type;
+            mClassID = mEntryType == EntryType.MESH ? ClassID.MESH : ClassID.UNKNOWN;
             mLoadedObj = null;
         }
     }
@@ -161,11 +149,11 @@
         mRS.nFileA3DGetIndexEntries(getID(), numFileEntries, ids, names);
 
         for(int i = 0; i < numFileEntries; i ++) {
-            mFileEntries[i] = new IndexEntry(mRS, i, getID(), names[i], ClassID.toClassID(ids[i]));
+            mFileEntries[i] = new IndexEntry(mRS, i, getID(), names[i], EntryType.toEntryType(ids[i]));
         }
     }
 
-    public int getNumIndexEntries() {
+    public int getIndexEntryCount() {
         if(mFileEntries == null) {
             return 0;
         }
@@ -173,12 +161,29 @@
     }
 
     public IndexEntry getIndexEntry(int index) {
-        if(getNumIndexEntries() == 0 || index < 0 || index >= mFileEntries.length) {
+        if(getIndexEntryCount() == 0 || index < 0 || index >= mFileEntries.length) {
             return null;
         }
         return mFileEntries[index];
     }
 
+    // API cleanup stand-ins
+    // TODO: implement ermaining loading mechanisms
+    static public FileA3D createFromAsset(RenderScript rs, AssetManager mgr, String path)
+        throws IllegalArgumentException {
+        return null;
+    }
+
+    static public FileA3D createFromFile(RenderScript rs, String path)
+        throws IllegalArgumentException {
+        return null;
+    }
+
+    static public FileA3D createFromFile(RenderScript rs, File path)
+        throws IllegalArgumentException {
+        return createFromFile(rs, path.getAbsolutePath());
+    }
+
     static public FileA3D createFromResource(RenderScript rs, Resources res, int id)
         throws IllegalArgumentException {
 
diff --git a/graphics/java/android/renderscript/Font.java b/graphics/java/android/renderscript/Font.java
index de25014..0f7c24d 100644
--- a/graphics/java/android/renderscript/Font.java
+++ b/graphics/java/android/renderscript/Font.java
@@ -16,13 +16,16 @@
 
 package android.renderscript;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Map;
 import java.util.HashMap;
+import java.util.Map;
 
-import android.content.res.Resources;
+import android.os.Environment;
+
 import android.content.res.AssetManager;
+import android.content.res.Resources;
 import android.util.Log;
 import android.util.TypedValue;
 
@@ -126,13 +129,13 @@
     /**
      * Takes a specific file name as an argument
      */
-    static public Font create(RenderScript rs, Resources res, String fileName, int size)
+    static public Font createFromFile(RenderScript rs, Resources res, String path, float pointSize)
         throws IllegalArgumentException {
 
         rs.validate();
         try {
             int dpi = res.getDisplayMetrics().densityDpi;
-            int fontId = rs.nFontCreateFromFile(fileName, size, dpi);
+            int fontId = rs.nFontCreateFromFile(path, pointSize, dpi);
 
             if(fontId == 0) {
                 throw new IllegalStateException("Failed loading a font");
@@ -148,6 +151,21 @@
         return null;
     }
 
+    static public Font createFromFile(RenderScript rs, Resources res, File path, float pointSize)
+        throws IllegalArgumentException {
+        return createFromFile(rs, res, path.getAbsolutePath(), pointSize);
+    }
+
+    static public Font createFromAsset(RenderScript rs, Resources res, AssetManager mgr, String path, float pointSize)
+        throws IllegalArgumentException {
+        return null;
+    }
+
+    static public Font createFromResource(RenderScript rs, Resources res, int id, float pointSize)
+        throws IllegalArgumentException {
+        return null;
+    }
+
     /**
      * Accepts one of the following family names as an argument
      * and will attemp to produce the best match with a system font
@@ -157,9 +175,12 @@
      * "monospace" "courier" "courier new" "monaco"
      * Returns default font if no match could be found
      */
-    static public Font createFromFamily(RenderScript rs, Resources res, String familyName, Style fontStyle, int size)
+    static public Font create(RenderScript rs, Resources res, String familyName, Style fontStyle, float pointSize)
     throws IllegalArgumentException {
         String fileName = getFontFileName(familyName, fontStyle);
-        return create(rs, res, fileName, size);
+        String fontPath = Environment.getRootDirectory().getAbsolutePath();
+        fontPath += "/fonts/" + fileName;
+        return createFromFile(rs, res, fontPath, pointSize);
     }
+
 }
diff --git a/graphics/java/android/renderscript/Matrix2f.java b/graphics/java/android/renderscript/Matrix2f.java
index 99d23db..6aa7d1b 100644
--- a/graphics/java/android/renderscript/Matrix2f.java
+++ b/graphics/java/android/renderscript/Matrix2f.java
@@ -31,6 +31,15 @@
         loadIdentity();
     }
 
+    public Matrix2f(float[] dataArray) {
+        mMat = new float[2];
+        System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
+    }
+
+    public float[] getArray() {
+        return mMat;
+    }
+
     public float get(int i, int j) {
         return mMat[i*2 + j];
     }
@@ -48,7 +57,7 @@
     }
 
     public void load(Matrix2f src) {
-        System.arraycopy(mMat, 0, src, 0, 4);
+        System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
     }
 
     public void loadRotate(float rot) {
diff --git a/graphics/java/android/renderscript/Matrix3f.java b/graphics/java/android/renderscript/Matrix3f.java
index 961bc5d..2d227a5 100644
--- a/graphics/java/android/renderscript/Matrix3f.java
+++ b/graphics/java/android/renderscript/Matrix3f.java
@@ -31,6 +31,15 @@
         loadIdentity();
     }
 
+    public Matrix3f(float[] dataArray) {
+        mMat = new float[9];
+        System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
+    }
+
+    public float[] getArray() {
+        return mMat;
+    }
+
     public float get(int i, int j) {
         return mMat[i*3 + j];
     }
@@ -54,7 +63,7 @@
     }
 
     public void load(Matrix3f src) {
-        System.arraycopy(mMat, 0, src, 0, 9);
+        System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
     }
 
     public void loadRotate(float rot, float x, float y, float z) {
diff --git a/graphics/java/android/renderscript/Matrix4f.java b/graphics/java/android/renderscript/Matrix4f.java
index 5ffc21a..144a9a3 100644
--- a/graphics/java/android/renderscript/Matrix4f.java
+++ b/graphics/java/android/renderscript/Matrix4f.java
@@ -31,6 +31,15 @@
         loadIdentity();
     }
 
+    public Matrix4f(float[] dataArray) {
+        mMat = new float[16];
+        System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
+    }
+
+    public float[] getArray() {
+        return mMat;
+    }
+
     public float get(int i, int j) {
         return mMat[i*4 + j];
     }
@@ -62,7 +71,7 @@
     }
 
     public void load(Matrix4f src) {
-        System.arraycopy(mMat, 0, src, 0, 16);
+        System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
     }
 
     public void loadRotate(float rot, float x, float y, float z) {
@@ -147,6 +156,10 @@
         mMat[14]= -(f + n) / (f - n);
     }
 
+    public void loadOrthoWindow(int w, int h) {
+        loadOrtho(0,w, h,0, -1,1);
+    }
+
     public void loadFrustum(float l, float r, float b, float t, float n, float f) {
         loadIdentity();
         mMat[0] = 2 * n / (r - l);
@@ -159,6 +172,40 @@
         mMat[15]= 0;
     }
 
+    public void loadPerspective(float fovy, float aspect, float near, float far) {
+        float top = near * (float)Math.tan((float) (fovy * Math.PI / 360.0f));
+        float bottom = -top;
+        float left = bottom * aspect;
+        float right = top * aspect;
+        loadFrustum(left, right, bottom, top, near, far);
+    }
+
+    public void loadProjectionNormalized(int w, int h) {
+        // range -1,1 in the narrow axis at z = 0.
+        Matrix4f m1 = new Matrix4f();
+        Matrix4f m2 = new Matrix4f();
+
+        if(w > h) {
+            float aspect = ((float)w) / h;
+            m1.loadFrustum(-aspect,aspect,  -1,1,  1,100);
+        } else {
+            float aspect = ((float)h) / w;
+            m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
+        }
+
+        m2.loadRotate(180, 0, 1, 0);
+        m1.loadMultiply(m1, m2);
+
+        m2.loadScale(-2, 2, 1);
+        m1.loadMultiply(m1, m2);
+
+        m2.loadTranslate(0, 0, 2);
+        m1.loadMultiply(m1, m2);
+
+        load(m1);
+    }
+
+
     public void multiply(Matrix4f rhs) {
         Matrix4f tmp = new Matrix4f();
         tmp.loadMultiply(this, rhs);
diff --git a/graphics/java/android/renderscript/Mesh.java b/graphics/java/android/renderscript/Mesh.java
index b103af4..59e3dd9 100644
--- a/graphics/java/android/renderscript/Mesh.java
+++ b/graphics/java/android/renderscript/Mesh.java
@@ -27,6 +27,20 @@
  **/
 public class Mesh extends BaseObj {
 
+    public enum Primitive {
+        POINT (0),
+        LINE (1),
+        LINE_STRIP (2),
+        TRIANGLE (3),
+        TRIANGLE_STRIP (4),
+        TRIANGLE_FAN (5);
+
+        int mID;
+        Primitive(int id) {
+            mID = id;
+        }
+    }
+
     Allocation[] mVertexBuffers;
     Allocation[] mIndexBuffers;
     Primitive[] mPrimitives;
@@ -51,7 +65,7 @@
         }
         return mIndexBuffers.length;
     }
-    public Allocation getIndexAllocation(int slot) {
+    public Allocation getIndexSetAllocation(int slot) {
         return mIndexBuffers[slot];
     }
     public Primitive getPrimitive(int slot) {
@@ -93,83 +107,89 @@
 
     public static class Builder {
         RenderScript mRS;
+        int mUsage;
 
         class Entry {
             Type t;
             Element e;
             int size;
             Primitive prim;
+            int usage;
         }
 
         int mVertexTypeCount;
         Entry[] mVertexTypes;
         Vector mIndexTypes;
 
-        public Builder(RenderScript rs) {
+        public Builder(RenderScript rs, int usage) {
             mRS = rs;
+            mUsage = usage;
             mVertexTypeCount = 0;
             mVertexTypes = new Entry[16];
             mIndexTypes = new Vector();
         }
 
-        public int addVertexType(Type t) throws IllegalStateException {
+        public int getCurrentVertexTypeIndex() {
+            return mVertexTypeCount - 1;
+        }
+
+        public int getCurrentIndexSetIndex() {
+            return mIndexTypes.size() - 1;
+        }
+
+        public Builder addVertexType(Type t) throws IllegalStateException {
             if (mVertexTypeCount >= mVertexTypes.length) {
                 throw new IllegalStateException("Max vertex types exceeded.");
             }
 
-            int addedIndex = mVertexTypeCount;
             mVertexTypes[mVertexTypeCount] = new Entry();
             mVertexTypes[mVertexTypeCount].t = t;
             mVertexTypes[mVertexTypeCount].e = null;
             mVertexTypeCount++;
-            return addedIndex;
+            return this;
         }
 
-        public int addVertexType(Element e, int size) throws IllegalStateException {
+        public Builder addVertexType(Element e, int size) throws IllegalStateException {
             if (mVertexTypeCount >= mVertexTypes.length) {
                 throw new IllegalStateException("Max vertex types exceeded.");
             }
 
-            int addedIndex = mVertexTypeCount;
             mVertexTypes[mVertexTypeCount] = new Entry();
             mVertexTypes[mVertexTypeCount].t = null;
             mVertexTypes[mVertexTypeCount].e = e;
             mVertexTypes[mVertexTypeCount].size = size;
             mVertexTypeCount++;
-            return addedIndex;
+            return this;
         }
 
-        public int addIndexType(Type t, Primitive p) {
-            int addedIndex  = mIndexTypes.size();
+        public Builder addIndexSetType(Type t, Primitive p) {
             Entry indexType = new Entry();
             indexType.t = t;
             indexType.e = null;
             indexType.size = 0;
             indexType.prim = p;
             mIndexTypes.addElement(indexType);
-            return addedIndex;
+            return this;
         }
 
-        public int addIndexType(Primitive p) {
-            int addedIndex  = mIndexTypes.size();
+        public Builder addIndexSetType(Primitive p) {
             Entry indexType = new Entry();
             indexType.t = null;
             indexType.e = null;
             indexType.size = 0;
             indexType.prim = p;
             mIndexTypes.addElement(indexType);
-            return addedIndex;
+            return this;
         }
 
-        public int addIndexType(Element e, int size, Primitive p) {
-            int addedIndex  = mIndexTypes.size();
+        public Builder addIndexSetType(Element e, int size, Primitive p) {
             Entry indexType = new Entry();
             indexType.t = null;
             indexType.e = e;
             indexType.size = size;
             indexType.prim = p;
             mIndexTypes.addElement(indexType);
-            return addedIndex;
+            return this;
         }
 
         Type newType(Element e, int size) {
@@ -190,10 +210,10 @@
                 Allocation alloc = null;
                 Entry entry = (Entry)b.mIndexTypes.elementAt(ct);
                 if (entry.t != null) {
-                    alloc = Allocation.createTyped(rs, entry.t);
+                    alloc = Allocation.createTyped(rs, entry.t, b.mUsage);
                 }
                 else if(entry.e != null) {
-                    alloc = Allocation.createSized(rs, entry.e, entry.size);
+                    alloc = Allocation.createSized(rs, entry.e, entry.size, b.mUsage);
                 }
                 int allocID = (alloc == null) ? 0 : alloc.getID();
                 rs.nMeshBindIndex(id, allocID, entry.prim.mID, ct);
@@ -205,9 +225,9 @@
                 Allocation alloc = null;
                 Entry entry = b.mVertexTypes[ct];
                 if (entry.t != null) {
-                    alloc = Allocation.createTyped(rs, entry.t);
+                    alloc = Allocation.createTyped(rs, entry.t, b.mUsage);
                 } else if(entry.e != null) {
-                    alloc = Allocation.createSized(rs, entry.e, entry.size);
+                    alloc = Allocation.createSized(rs, entry.e, entry.size, b.mUsage);
                 }
                 rs.nMeshBindVertex(id, alloc.getID(), ct);
                 newMesh.mVertexBuffers[ct] = alloc;
@@ -244,34 +264,39 @@
             mIndexTypes = new Vector();
         }
 
-        public int addVertexAllocation(Allocation a) throws IllegalStateException {
+        public int getCurrentVertexTypeIndex() {
+            return mVertexTypeCount - 1;
+        }
+
+        public int getCurrentIndexSetIndex() {
+            return mIndexTypes.size() - 1;
+        }
+
+        public AllocationBuilder addVertexAllocation(Allocation a) throws IllegalStateException {
             if (mVertexTypeCount >= mVertexTypes.length) {
                 throw new IllegalStateException("Max vertex types exceeded.");
             }
 
-            int addedIndex = mVertexTypeCount;
             mVertexTypes[mVertexTypeCount] = new Entry();
             mVertexTypes[mVertexTypeCount].a = a;
             mVertexTypeCount++;
-            return addedIndex;
+            return this;
         }
 
-        public int addIndexAllocation(Allocation a, Primitive p) {
-            int addedIndex  = mIndexTypes.size();
+        public AllocationBuilder addIndexSetAllocation(Allocation a, Primitive p) {
             Entry indexType = new Entry();
             indexType.a = a;
             indexType.prim = p;
             mIndexTypes.addElement(indexType);
-            return addedIndex;
+            return this;
         }
 
-        public int addIndexType(Primitive p) {
-            int addedIndex  = mIndexTypes.size();
+        public AllocationBuilder addIndexSetType(Primitive p) {
             Entry indexType = new Entry();
             indexType.a = null;
             indexType.prim = p;
             mIndexTypes.addElement(indexType);
-            return addedIndex;
+            return this;
         }
 
         static synchronized Mesh internalCreate(RenderScript rs, AllocationBuilder b) {
@@ -376,7 +401,7 @@
             }
         }
 
-        public void addVertex(float x, float y) {
+        public TriangleMeshBuilder addVertex(float x, float y) {
             if (mVtxSize != 2) {
                 throw new IllegalStateException("add mistmatch with declared components.");
             }
@@ -384,9 +409,10 @@
             mVtxData[mVtxCount++] = x;
             mVtxData[mVtxCount++] = y;
             latch();
+            return this;
         }
 
-        public void addVertex(float x, float y, float z) {
+        public TriangleMeshBuilder addVertex(float x, float y, float z) {
             if (mVtxSize != 3) {
                 throw new IllegalStateException("add mistmatch with declared components.");
             }
@@ -395,26 +421,29 @@
             mVtxData[mVtxCount++] = y;
             mVtxData[mVtxCount++] = z;
             latch();
+            return this;
         }
 
-        public void setTexture(float s, float t) {
+        public TriangleMeshBuilder setTexture(float s, float t) {
             if ((mFlags & TEXTURE_0) == 0) {
                 throw new IllegalStateException("add mistmatch with declared components.");
             }
             mS0 = s;
             mT0 = t;
+            return this;
         }
 
-        public void setNormal(float x, float y, float z) {
+        public TriangleMeshBuilder setNormal(float x, float y, float z) {
             if ((mFlags & NORMAL) == 0) {
                 throw new IllegalStateException("add mistmatch with declared components.");
             }
             mNX = x;
             mNY = y;
             mNZ = z;
+            return this;
         }
 
-        public void setColor(float r, float g, float b, float a) {
+        public TriangleMeshBuilder setColor(float r, float g, float b, float a) {
             if ((mFlags & COLOR) == 0) {
                 throw new IllegalStateException("add mistmatch with declared components.");
             }
@@ -422,9 +451,10 @@
             mG = g;
             mB = b;
             mA = a;
+            return this;
         }
 
-        public void addTriangle(int idx1, int idx2, int idx3) {
+        public TriangleMeshBuilder addTriangle(int idx1, int idx2, int idx3) {
             if((idx1 >= mVtxCount) || (idx1 < 0) ||
                (idx2 >= mVtxCount) || (idx2 < 0) ||
                (idx3 >= mVtxCount) || (idx3 < 0)) {
@@ -438,6 +468,7 @@
             mIndexData[mIndexCount++] = (short)idx1;
             mIndexData[mIndexCount++] = (short)idx2;
             mIndexData[mIndexCount++] = (short)idx3;
+            return this;
         }
 
         public Mesh create(boolean uploadToBufferObject) {
@@ -460,19 +491,28 @@
             }
             mElement = b.create();
 
-            Builder smb = new Builder(mRS);
+            int usage = Allocation.USAGE_SCRIPT;
+            if (uploadToBufferObject) {
+                usage |= Allocation.USAGE_GRAPHICS_VERTEX;
+            }
+
+            Builder smb = new Builder(mRS, usage);
             smb.addVertexType(mElement, mVtxCount / floatCount);
-            smb.addIndexType(Element.U16(mRS), mIndexCount, Primitive.TRIANGLE);
+            smb.addIndexSetType(Element.U16(mRS), mIndexCount, Primitive.TRIANGLE);
 
             Mesh sm = smb.create();
 
             sm.getVertexAllocation(0).copyFrom(mVtxData);
             if(uploadToBufferObject) {
-                sm.getVertexAllocation(0).uploadToBufferObject();
+                if (uploadToBufferObject) {
+                    sm.getVertexAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
+                }
             }
 
-            sm.getIndexAllocation(0).copyFrom(mIndexData);
-            sm.getIndexAllocation(0).uploadToBufferObject();
+            sm.getIndexSetAllocation(0).copyFrom(mIndexData);
+            if (uploadToBufferObject) {
+                sm.getIndexSetAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
+            }
 
             return sm;
         }
diff --git a/graphics/java/android/renderscript/Primitive.java b/graphics/java/android/renderscript/Primitive.java
deleted file mode 100644
index 7925cac..0000000
--- a/graphics/java/android/renderscript/Primitive.java
+++ /dev/null
@@ -1,37 +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 android.renderscript;
-
-/**
- * @hide
- **/
-public enum Primitive {
-    POINT (0),
-    LINE (1),
-    LINE_STRIP (2),
-    TRIANGLE (3),
-    TRIANGLE_STRIP (4),
-    TRIANGLE_FAN (5);
-
-    int mID;
-    Primitive(int id) {
-        mID = id;
-    }
-}
-
-
-
diff --git a/graphics/java/android/renderscript/Program.java b/graphics/java/android/renderscript/Program.java
index c3536c3..a9eaec3 100644
--- a/graphics/java/android/renderscript/Program.java
+++ b/graphics/java/android/renderscript/Program.java
@@ -177,36 +177,15 @@
             return this;
         }
 
-        public void addInput(Element e) throws IllegalStateException {
-            // Should check for consistant and non-conflicting names...
-            if(mInputCount >= MAX_INPUT) {
-                throw new RSIllegalArgumentException("Max input count exceeded.");
-            }
-            if (e.isComplex()) {
-                throw new RSIllegalArgumentException("Complex elements not allowed.");
-            }
-            mInputs[mInputCount++] = e;
+        public int getCurrentConstantIndex() {
+            return mConstantCount - 1;
         }
 
-        public void addOutput(Element e) throws IllegalStateException {
-            // Should check for consistant and non-conflicting names...
-            if(mOutputCount >= MAX_OUTPUT) {
-                throw new RSIllegalArgumentException("Max output count exceeded.");
-            }
-            if (e.isComplex()) {
-                throw new RSIllegalArgumentException("Complex elements not allowed.");
-            }
-            mOutputs[mOutputCount++] = e;
+        public int getCurrentTextureIndex() {
+            return mTextureCount - 1;
         }
 
-        void resetConstant() {
-            mConstantCount = 0;
-            for(int i = 0; i < MAX_CONSTANT; i ++) {
-                mConstants[i] = null;
-            }
-        }
-
-        public int addConstant(Type t) throws IllegalStateException {
+        public BaseProgramBuilder addConstant(Type t) throws IllegalStateException {
             // Should check for consistant and non-conflicting names...
             if(mConstantCount >= MAX_CONSTANT) {
                 throw new RSIllegalArgumentException("Max input count exceeded.");
@@ -215,18 +194,7 @@
                 throw new RSIllegalArgumentException("Complex elements not allowed.");
             }
             mConstants[mConstantCount] = t;
-            return mConstantCount++;
-        }
-
-        public BaseProgramBuilder setTextureCount(int count) throws IllegalArgumentException {
-            // Should check for consistant and non-conflicting names...
-            if(count >= MAX_TEXTURE) {
-                throw new IllegalArgumentException("Max texture count exceeded.");
-            }
-            mTextureCount = count;
-            for (int i = 0; i < mTextureCount; i ++) {
-                mTextureTypes[i] = TextureType.TEXTURE_2D;
-            }
+            mConstantCount++;
             return this;
         }
 
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java
index 074c393..59d4967 100644
--- a/graphics/java/android/renderscript/ProgramFragment.java
+++ b/graphics/java/android/renderscript/ProgramFragment.java
@@ -30,8 +30,8 @@
         super(id, rs);
     }
 
-    public static class ShaderBuilder extends BaseProgramBuilder {
-        public ShaderBuilder(RenderScript rs) {
+    public static class Builder extends BaseProgramBuilder {
+        public Builder(RenderScript rs) {
             super(rs);
         }
 
@@ -63,169 +63,6 @@
             return pf;
         }
     }
-
-    public static class Builder extends ShaderBuilder {
-        public static final int MAX_TEXTURE = 2;
-        int mNumTextures;
-        boolean mPointSpriteEnable;
-        boolean mVaryingColorEnable;
-
-        public enum EnvMode {
-            REPLACE (1),
-            MODULATE (2),
-            DECAL (3);
-
-            int mID;
-            EnvMode(int id) {
-                mID = id;
-            }
-        }
-
-        public enum Format {
-            ALPHA (1),
-            LUMINANCE_ALPHA (2),
-            RGB (3),
-            RGBA (4);
-
-            int mID;
-            Format(int id) {
-                mID = id;
-            }
-        }
-
-        private class Slot {
-            EnvMode env;
-            Format format;
-            Slot(EnvMode _env, Format _fmt) {
-                env = _env;
-                format = _fmt;
-            }
-        }
-        Slot[] mSlots;
-
-        private void buildShaderString() {
-            mShader  = "//rs_shader_internal\n";
-            mShader += "varying lowp vec4 varColor;\n";
-            mShader += "varying vec2 varTex0;\n";
-
-            mShader += "void main() {\n";
-            if (mVaryingColorEnable) {
-                mShader += "  lowp vec4 col = varColor;\n";
-            } else {
-                mShader += "  lowp vec4 col = UNI_Color;\n";
-            }
-
-            if (mNumTextures != 0) {
-                if (mPointSpriteEnable) {
-                    mShader += "  vec2 t0 = gl_PointCoord;\n";
-                } else {
-                    mShader += "  vec2 t0 = varTex0.xy;\n";
-                }
-            }
-
-            for(int i = 0; i < mNumTextures; i ++) {
-                switch(mSlots[i].env) {
-                case REPLACE:
-                    switch (mSlots[i].format) {
-                    case ALPHA:
-                        mShader += "  col.a = texture2D(UNI_Tex0, t0).a;\n";
-                        break;
-                    case LUMINANCE_ALPHA:
-                        mShader += "  col.rgba = texture2D(UNI_Tex0, t0).rgba;\n";
-                        break;
-                    case RGB:
-                        mShader += "  col.rgb = texture2D(UNI_Tex0, t0).rgb;\n";
-                        break;
-                    case RGBA:
-                        mShader += "  col.rgba = texture2D(UNI_Tex0, t0).rgba;\n";
-                        break;
-                    }
-                    break;
-                case MODULATE:
-                    switch (mSlots[i].format) {
-                    case ALPHA:
-                        mShader += "  col.a *= texture2D(UNI_Tex0, t0).a;\n";
-                        break;
-                    case LUMINANCE_ALPHA:
-                        mShader += "  col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n";
-                        break;
-                    case RGB:
-                        mShader += "  col.rgb *= texture2D(UNI_Tex0, t0).rgb;\n";
-                        break;
-                    case RGBA:
-                        mShader += "  col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n";
-                        break;
-                    }
-                    break;
-                case DECAL:
-                    mShader += "  col = texture2D(UNI_Tex0, t0);\n";
-                    break;
-                }
-            }
-
-            mShader += "  gl_FragColor = col;\n";
-            mShader += "}\n";
-        }
-
-        public Builder(RenderScript rs) {
-            super(rs);
-            mRS = rs;
-            mSlots = new Slot[MAX_TEXTURE];
-            mPointSpriteEnable = false;
-        }
-
-        public Builder setTexture(EnvMode env, Format fmt, int slot)
-            throws IllegalArgumentException {
-            if((slot < 0) || (slot >= MAX_TEXTURE)) {
-                throw new IllegalArgumentException("MAX_TEXTURE exceeded.");
-            }
-            mSlots[slot] = new Slot(env, fmt);
-            return this;
-        }
-
-        public Builder setPointSpriteTexCoordinateReplacement(boolean enable) {
-            mPointSpriteEnable = enable;
-            return this;
-        }
-
-        public Builder setVaryingColor(boolean enable) {
-            mVaryingColorEnable = enable;
-            return this;
-        }
-
-        @Override
-        public ProgramFragment create() {
-            mNumTextures = 0;
-            for(int i = 0; i < MAX_TEXTURE; i ++) {
-                if(mSlots[i] != null) {
-                    mNumTextures ++;
-                }
-            }
-            resetConstant();
-            buildShaderString();
-            Type constType = null;
-            if (!mVaryingColorEnable) {
-                Element.Builder b = new Element.Builder(mRS);
-                b.add(Element.F32_4(mRS), "Color");
-                Type.Builder typeBuilder = new Type.Builder(mRS, b.create());
-                typeBuilder.setX(1);
-                constType = typeBuilder.create();
-                addConstant(constType);
-            }
-            setTextureCount(mNumTextures);
-
-            ProgramFragment pf = super.create();
-            pf.mTextureCount = MAX_TEXTURE;
-            if (!mVaryingColorEnable) {
-                Allocation constantData = Allocation.createTyped(mRS,constType);
-                float[] data = new float[4];
-                data[0] = data[1] = data[2] = data[3] = 1.0f;
-                constantData.copyFrom(data);
-                pf.bindConstants(constantData, 0);
-            }
-            return pf;
-        }
-    }
 }
 
 
diff --git a/graphics/java/android/renderscript/ProgramFragmentFixedFunction.java b/graphics/java/android/renderscript/ProgramFragmentFixedFunction.java
new file mode 100644
index 0000000..d011219
--- /dev/null
+++ b/graphics/java/android/renderscript/ProgramFragmentFixedFunction.java
@@ -0,0 +1,237 @@
+/*
+ * 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.renderscript;
+
+
+import android.util.Config;
+import android.util.Log;
+
+
+/**
+ * @hide
+ *
+ **/
+public class ProgramFragmentFixedFunction extends ProgramFragment {
+    ProgramFragmentFixedFunction(int id, RenderScript rs) {
+        super(id, rs);
+    }
+
+    static class InternalBuilder extends BaseProgramBuilder {
+        public InternalBuilder(RenderScript rs) {
+            super(rs);
+        }
+
+        public ProgramFragmentFixedFunction create() {
+            mRS.validate();
+            int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
+            int idx = 0;
+
+            for (int i=0; i < mInputCount; i++) {
+                tmp[idx++] = ProgramParam.INPUT.mID;
+                tmp[idx++] = mInputs[i].getID();
+            }
+            for (int i=0; i < mOutputCount; i++) {
+                tmp[idx++] = ProgramParam.OUTPUT.mID;
+                tmp[idx++] = mOutputs[i].getID();
+            }
+            for (int i=0; i < mConstantCount; i++) {
+                tmp[idx++] = ProgramParam.CONSTANT.mID;
+                tmp[idx++] = mConstants[i].getID();
+            }
+            for (int i=0; i < mTextureCount; i++) {
+                tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID;
+                tmp[idx++] = mTextureTypes[i].mID;
+            }
+
+            int id = mRS.nProgramFragmentCreate(mShader, tmp);
+            ProgramFragmentFixedFunction pf = new ProgramFragmentFixedFunction(id, mRS);
+            initProgram(pf);
+            return pf;
+        }
+    }
+
+    public static class Builder {
+        public static final int MAX_TEXTURE = 2;
+        int mNumTextures;
+        boolean mPointSpriteEnable;
+        boolean mVaryingColorEnable;
+        String mShader;
+        RenderScript mRS;
+
+        public enum EnvMode {
+            REPLACE (1),
+            MODULATE (2),
+            DECAL (3);
+
+            int mID;
+            EnvMode(int id) {
+                mID = id;
+            }
+        }
+
+        public enum Format {
+            ALPHA (1),
+            LUMINANCE_ALPHA (2),
+            RGB (3),
+            RGBA (4);
+
+            int mID;
+            Format(int id) {
+                mID = id;
+            }
+        }
+
+        private class Slot {
+            EnvMode env;
+            Format format;
+            Slot(EnvMode _env, Format _fmt) {
+                env = _env;
+                format = _fmt;
+            }
+        }
+        Slot[] mSlots;
+
+        private void buildShaderString() {
+            mShader  = "//rs_shader_internal\n";
+            mShader += "varying lowp vec4 varColor;\n";
+            mShader += "varying vec2 varTex0;\n";
+
+            mShader += "void main() {\n";
+            if (mVaryingColorEnable) {
+                mShader += "  lowp vec4 col = varColor;\n";
+            } else {
+                mShader += "  lowp vec4 col = UNI_Color;\n";
+            }
+
+            if (mNumTextures != 0) {
+                if (mPointSpriteEnable) {
+                    mShader += "  vec2 t0 = gl_PointCoord;\n";
+                } else {
+                    mShader += "  vec2 t0 = varTex0.xy;\n";
+                }
+            }
+
+            for(int i = 0; i < mNumTextures; i ++) {
+                switch(mSlots[i].env) {
+                case REPLACE:
+                    switch (mSlots[i].format) {
+                    case ALPHA:
+                        mShader += "  col.a = texture2D(UNI_Tex0, t0).a;\n";
+                        break;
+                    case LUMINANCE_ALPHA:
+                        mShader += "  col.rgba = texture2D(UNI_Tex0, t0).rgba;\n";
+                        break;
+                    case RGB:
+                        mShader += "  col.rgb = texture2D(UNI_Tex0, t0).rgb;\n";
+                        break;
+                    case RGBA:
+                        mShader += "  col.rgba = texture2D(UNI_Tex0, t0).rgba;\n";
+                        break;
+                    }
+                    break;
+                case MODULATE:
+                    switch (mSlots[i].format) {
+                    case ALPHA:
+                        mShader += "  col.a *= texture2D(UNI_Tex0, t0).a;\n";
+                        break;
+                    case LUMINANCE_ALPHA:
+                        mShader += "  col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n";
+                        break;
+                    case RGB:
+                        mShader += "  col.rgb *= texture2D(UNI_Tex0, t0).rgb;\n";
+                        break;
+                    case RGBA:
+                        mShader += "  col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n";
+                        break;
+                    }
+                    break;
+                case DECAL:
+                    mShader += "  col = texture2D(UNI_Tex0, t0);\n";
+                    break;
+                }
+            }
+
+            mShader += "  gl_FragColor = col;\n";
+            mShader += "}\n";
+        }
+
+        public Builder(RenderScript rs) {
+            mRS = rs;
+            mSlots = new Slot[MAX_TEXTURE];
+            mPointSpriteEnable = false;
+        }
+
+        public Builder setTexture(EnvMode env, Format fmt, int slot)
+            throws IllegalArgumentException {
+            if((slot < 0) || (slot >= MAX_TEXTURE)) {
+                throw new IllegalArgumentException("MAX_TEXTURE exceeded.");
+            }
+            mSlots[slot] = new Slot(env, fmt);
+            return this;
+        }
+
+        public Builder setPointSpriteTexCoordinateReplacement(boolean enable) {
+            mPointSpriteEnable = enable;
+            return this;
+        }
+
+        public Builder setVaryingColor(boolean enable) {
+            mVaryingColorEnable = enable;
+            return this;
+        }
+
+        public ProgramFragmentFixedFunction create() {
+            InternalBuilder sb = new InternalBuilder(mRS);
+            mNumTextures = 0;
+            for(int i = 0; i < MAX_TEXTURE; i ++) {
+                if(mSlots[i] != null) {
+                    mNumTextures ++;
+                }
+            }
+            buildShaderString();
+            sb.setShader(mShader);
+
+            Type constType = null;
+            if (!mVaryingColorEnable) {
+                Element.Builder b = new Element.Builder(mRS);
+                b.add(Element.F32_4(mRS), "Color");
+                Type.Builder typeBuilder = new Type.Builder(mRS, b.create());
+                typeBuilder.setX(1);
+                constType = typeBuilder.create();
+                sb.addConstant(constType);
+            }
+            for (int i = 0; i < mNumTextures; i ++) {
+                sb.addTexture(TextureType.TEXTURE_2D);
+            }
+
+            ProgramFragmentFixedFunction pf = sb.create();
+            pf.mTextureCount = MAX_TEXTURE;
+            if (!mVaryingColorEnable) {
+                Allocation constantData = Allocation.createTyped(mRS,constType);
+                float[] data = new float[4];
+                data[0] = data[1] = data[2] = data[3] = 1.0f;
+                constantData.copyFrom(data);
+                pf.bindConstants(constantData, 0);
+            }
+            return pf;
+        }
+    }
+}
+
+
+
+
diff --git a/graphics/java/android/renderscript/ProgramRaster.java b/graphics/java/android/renderscript/ProgramRaster.java
index 5b55015..3bdd71d 100644
--- a/graphics/java/android/renderscript/ProgramRaster.java
+++ b/graphics/java/android/renderscript/ProgramRaster.java
@@ -109,21 +109,11 @@
             mCullMode = CullMode.BACK;
         }
 
-        public Builder setPointSpriteEnable(boolean enable) {
+        public Builder setPointSpriteEnabled(boolean enable) {
             mPointSprite = enable;
             return this;
         }
 
-        public Builder setPointSmoothEnable(boolean enable) {
-            mPointSmooth = enable;
-            return this;
-        }
-
-        public Builder setLineSmoothEnable(boolean enable) {
-            mLineSmooth = enable;
-            return this;
-        }
-
         public Builder setCullMode(CullMode m) {
             mCullMode = m;
             return this;
diff --git a/graphics/java/android/renderscript/ProgramStore.java b/graphics/java/android/renderscript/ProgramStore.java
index d191b06..2d2b162 100644
--- a/graphics/java/android/renderscript/ProgramStore.java
+++ b/graphics/java/android/renderscript/ProgramStore.java
@@ -26,14 +26,14 @@
  *
  **/
 public class ProgramStore extends BaseObj {
-        public enum DepthFunc {
+    public enum DepthFunc {
         ALWAYS (0),
         LESS (1),
-        LEQUAL (2),
+        LESS_OR_EQUAL (2),
         GREATER (3),
-        GEQUAL (4),
+        GREATER_OR_EQUAL (4),
         EQUAL (5),
-        NOTEQUAL (6);
+        NOT_EQUAL (6);
 
         int mID;
         DepthFunc(int id) {
@@ -84,140 +84,49 @@
             ProgramStore.Builder builder = new ProgramStore.Builder(rs);
             builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
             builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(true);
+            builder.setDitherEnabled(false);
+            builder.setDepthMaskEnabled(true);
             rs.mProgramStore_BLEND_NONE_DEPTH_TEST = builder.create();
         }
         return rs.mProgramStore_BLEND_NONE_DEPTH_TEST;
     }
-    public static ProgramStore BLEND_NONE_DEPTH_NO_DEPTH(RenderScript rs) {
+    public static ProgramStore BLEND_NONE_DEPTH_NONE(RenderScript rs) {
         if(rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH == null) {
             ProgramStore.Builder builder = new ProgramStore.Builder(rs);
             builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
             builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(false);
+            builder.setDitherEnabled(false);
+            builder.setDepthMaskEnabled(false);
             rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH = builder.create();
         }
         return rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
     }
-    public static ProgramStore BLEND_NONE_DEPTH_NO_TEST(RenderScript rs) {
-        if(rs.mProgramStore_BLEND_NONE_DEPTH_NO_TEST == null) {
-            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
-            builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
-            builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(true);
-            rs.mProgramStore_BLEND_NONE_DEPTH_NO_TEST = builder.create();
-        }
-        return rs.mProgramStore_BLEND_NONE_DEPTH_NO_TEST;
-    }
-    public static ProgramStore BLEND_NONE_DEPTH_NO_WRITE(RenderScript rs) {
-        if(rs.mProgramStore_BLEND_NONE_DEPTH_NO_WRITE == null) {
-            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
-            builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
-            builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(false);
-            rs.mProgramStore_BLEND_NONE_DEPTH_NO_WRITE = builder.create();
-        }
-        return rs.mProgramStore_BLEND_NONE_DEPTH_NO_WRITE;
-    }
 
     public static ProgramStore BLEND_ALPHA_DEPTH_TEST(RenderScript rs) {
         if(rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST == null) {
             ProgramStore.Builder builder = new ProgramStore.Builder(rs);
             builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
             builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(true);
+            builder.setDitherEnabled(false);
+            builder.setDepthMaskEnabled(true);
             rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST = builder.create();
         }
         return rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST;
     }
-    public static ProgramStore BLEND_ALPHA_DEPTH_NO_DEPTH(RenderScript rs) {
+    public static ProgramStore BLEND_ALPHA_DEPTH_NONE(RenderScript rs) {
         if(rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH == null) {
             ProgramStore.Builder builder = new ProgramStore.Builder(rs);
             builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
             builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(false);
+            builder.setDitherEnabled(false);
+            builder.setDepthMaskEnabled(false);
             rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH = builder.create();
         }
         return rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
     }
-    public static ProgramStore BLEND_ALPHA_DEPTH_NO_TEST(RenderScript rs) {
-        if(rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST == null) {
-            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
-            builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
-            builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(true);
-            rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST = builder.create();
-        }
-        return rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST;
-    }
-    public static ProgramStore BLEND_ALPHA_DEPTH_NO_WRITE(RenderScript rs) {
-        if(rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE == null) {
-            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
-            builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
-            builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(false);
-            rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE = builder.create();
-        }
-        return rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE;
-    }
-
-    public static ProgramStore BLEND_ADD_DEPTH_TEST(RenderScript rs) {
-        if(rs.mProgramStore_BLEND_ADD_DEPTH_TEST == null) {
-            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
-            builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
-            builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(true);
-            rs.mProgramStore_BLEND_ADD_DEPTH_TEST = builder.create();
-        }
-        return rs.mProgramStore_BLEND_ADD_DEPTH_TEST;
-    }
-    public static ProgramStore BLEND_ADD_DEPTH_NO_DEPTH(RenderScript rs) {
-        if(rs.mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH == null) {
-            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
-            builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
-            builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(false);
-            rs.mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH = builder.create();
-        }
-        return rs.mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH;
-    }
-    public static ProgramStore BLEND_ADD_DEPTH_NO_TEST(RenderScript rs) {
-        if(rs.mProgramStore_BLEND_ADD_DEPTH_NO_TEST == null) {
-            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
-            builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
-            builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(true);
-            rs.mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH = builder.create();
-        }
-        return rs.mProgramStore_BLEND_ADD_DEPTH_NO_TEST;
-    }
-    public static ProgramStore BLEND_ADD_DEPTH_NO_WRITE(RenderScript rs) {
-        if(rs.mProgramStore_BLEND_ADD_DEPTH_NO_WRITE == null) {
-            ProgramStore.Builder builder = new ProgramStore.Builder(rs);
-            builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
-            builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
-            builder.setDitherEnable(false);
-            builder.setDepthMask(false);
-            rs.mProgramStore_BLEND_ADD_DEPTH_NO_WRITE = builder.create();
-        }
-        return rs.mProgramStore_BLEND_ADD_DEPTH_NO_WRITE;
-    }
 
     public static class Builder {
         RenderScript mRS;
-        Element mIn;
-        Element mOut;
         DepthFunc mDepthFunc;
         boolean mDepthMask;
         boolean mColorMaskR;
@@ -228,26 +137,8 @@
         BlendDstFunc mBlendDst;
         boolean mDither;
 
-
-
-        public Builder(RenderScript rs, Element in, Element out) {
-            mRS = rs;
-            mIn = in;
-            mOut = out;
-            mDepthFunc = DepthFunc.ALWAYS;
-            mDepthMask = false;
-            mColorMaskR = true;
-            mColorMaskG = true;
-            mColorMaskB = true;
-            mColorMaskA = true;
-            mBlendSrc = BlendSrcFunc.ONE;
-            mBlendDst = BlendDstFunc.ZERO;
-        }
-
         public Builder(RenderScript rs) {
             mRS = rs;
-            mIn = null;
-            mOut = null;
             mDepthFunc = DepthFunc.ALWAYS;
             mDepthMask = false;
             mColorMaskR = true;
@@ -263,12 +154,12 @@
             return this;
         }
 
-        public Builder setDepthMask(boolean enable) {
+        public Builder setDepthMaskEnabled(boolean enable) {
             mDepthMask = enable;
             return this;
         }
 
-        public Builder setColorMask(boolean r, boolean g, boolean b, boolean a) {
+        public Builder setColorMaskEnabled(boolean r, boolean g, boolean b, boolean a) {
             mColorMaskR = r;
             mColorMaskG = g;
             mColorMaskB = b;
@@ -282,7 +173,7 @@
             return this;
         }
 
-        public Builder setDitherEnable(boolean enable) {
+        public Builder setDitherEnabled(boolean enable) {
             mDither = enable;
             return this;
         }
diff --git a/graphics/java/android/renderscript/ProgramVertex.java b/graphics/java/android/renderscript/ProgramVertex.java
index 5d41f63..954ac9a 100644
--- a/graphics/java/android/renderscript/ProgramVertex.java
+++ b/graphics/java/android/renderscript/ProgramVertex.java
@@ -27,23 +27,28 @@
  *
  **/
 public class ProgramVertex extends Program {
-    public static final int MAX_LIGHT = 8;
-
 
     ProgramVertex(int id, RenderScript rs) {
         super(id, rs);
     }
 
-    public void bindAllocation(MatrixAllocation va) {
-        mRS.validate();
-        bindConstants(va.mAlloc, 0);
-    }
-
-    public static class ShaderBuilder extends BaseProgramBuilder {
-        public ShaderBuilder(RenderScript rs) {
+    public static class Builder extends BaseProgramBuilder {
+        public Builder(RenderScript rs) {
             super(rs);
         }
 
+        public Builder addInput(Element e) throws IllegalStateException {
+            // Should check for consistant and non-conflicting names...
+            if(mInputCount >= MAX_INPUT) {
+                throw new RSIllegalArgumentException("Max input count exceeded.");
+            }
+            if (e.isComplex()) {
+                throw new RSIllegalArgumentException("Complex elements not allowed.");
+            }
+            mInputs[mInputCount++] = e;
+            return this;
+        }
+
         public ProgramVertex create() {
             mRS.validate();
             int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
@@ -73,165 +78,4 @@
         }
     }
 
-    public static class Builder extends ShaderBuilder {
-        boolean mTextureMatrixEnable;
-
-        public Builder(RenderScript rs, Element in, Element out) {
-            super(rs);
-        }
-        public Builder(RenderScript rs) {
-            super(rs);
-        }
-
-        public Builder setTextureMatrixEnable(boolean enable) {
-            mTextureMatrixEnable = enable;
-            return this;
-        }
-        static Type getConstantInputType(RenderScript rs) {
-            Element.Builder b = new Element.Builder(rs);
-            b.add(Element.MATRIX4X4(rs), "MV");
-            b.add(Element.MATRIX4X4(rs), "P");
-            b.add(Element.MATRIX4X4(rs), "TexMatrix");
-            b.add(Element.MATRIX4X4(rs), "MVP");
-
-            Type.Builder typeBuilder = new Type.Builder(rs, b.create());
-            typeBuilder.setX(1);
-            return typeBuilder.create();
-        }
-
-        private void buildShaderString() {
-
-            mShader  = "//rs_shader_internal\n";
-            mShader += "varying vec4 varColor;\n";
-            mShader += "varying vec2 varTex0;\n";
-
-            mShader += "void main() {\n";
-            mShader += "  gl_Position = UNI_MVP * ATTRIB_position;\n";
-            mShader += "  gl_PointSize = 1.0;\n";
-
-            mShader += "  varColor = ATTRIB_color;\n";
-            if (mTextureMatrixEnable) {
-                mShader += "  varTex0 = (UNI_TexMatrix * vec4(ATTRIB_texture0, 0.0, 1.0)).xy;\n";
-            } else {
-                mShader += "  varTex0 = ATTRIB_texture0;\n";
-            }
-            mShader += "}\n";
-        }
-
-        @Override
-        public ProgramVertex create() {
-            buildShaderString();
-
-            addConstant(getConstantInputType(mRS));
-
-            Element.Builder b = new Element.Builder(mRS);
-            b.add(Element.F32_4(mRS), "position");
-            b.add(Element.F32_4(mRS), "color");
-            b.add(Element.F32_3(mRS), "normal");
-            b.add(Element.F32_2(mRS), "texture0");
-            addInput(b.create());
-
-            return super.create();
-        }
-    }
-
-
-
-    public static class MatrixAllocation {
-        static final int MODELVIEW_OFFSET = 0;
-        static final int PROJECTION_OFFSET = 16;
-        static final int TEXTURE_OFFSET = 32;
-
-        Matrix4f mModel;
-        Matrix4f mProjection;
-        Matrix4f mTexture;
-
-        public Allocation mAlloc;
-        private FieldPacker mIOBuffer;
-
-        public MatrixAllocation(RenderScript rs) {
-            Type constInputType = ProgramVertex.Builder.getConstantInputType(rs);
-            mAlloc = Allocation.createTyped(rs, constInputType);
-            int bufferSize = constInputType.getElement().getSizeBytes()*
-                             constInputType.getCount();
-            mIOBuffer = new FieldPacker(bufferSize);
-            loadModelview(new Matrix4f());
-            loadProjection(new Matrix4f());
-            loadTexture(new Matrix4f());
-        }
-
-        public void destroy() {
-            mAlloc.destroy();
-            mAlloc = null;
-        }
-
-        private void addToBuffer(int offset, Matrix4f m) {
-            mIOBuffer.reset(offset);
-            for(int i = 0; i < 16; i ++) {
-                mIOBuffer.addF32(m.mMat[i]);
-            }
-            mAlloc.copyFrom(mIOBuffer.getData());
-        }
-
-        public void loadModelview(Matrix4f m) {
-            mModel = m;
-            addToBuffer(MODELVIEW_OFFSET*4, m);
-        }
-
-        public void loadProjection(Matrix4f m) {
-            mProjection = m;
-            addToBuffer(PROJECTION_OFFSET*4, m);
-        }
-
-        public void loadTexture(Matrix4f m) {
-            mTexture = m;
-            addToBuffer(TEXTURE_OFFSET*4, m);
-        }
-
-        public void setupOrthoWindow(int w, int h) {
-            mProjection.loadOrtho(0,w, h,0, -1,1);
-            addToBuffer(PROJECTION_OFFSET*4, mProjection);
-        }
-
-        public void setupOrthoNormalized(int w, int h) {
-            // range -1,1 in the narrow axis.
-            if(w > h) {
-                float aspect = ((float)w) / h;
-                mProjection.loadOrtho(-aspect,aspect,  -1,1,  -1,1);
-            } else {
-                float aspect = ((float)h) / w;
-                mProjection.loadOrtho(-1,1, -aspect,aspect,  -1,1);
-            }
-            addToBuffer(PROJECTION_OFFSET*4, mProjection);
-        }
-
-        public void setupProjectionNormalized(int w, int h) {
-            // range -1,1 in the narrow axis at z = 0.
-            Matrix4f m1 = new Matrix4f();
-            Matrix4f m2 = new Matrix4f();
-
-            if(w > h) {
-                float aspect = ((float)w) / h;
-                m1.loadFrustum(-aspect,aspect,  -1,1,  1,100);
-            } else {
-                float aspect = ((float)h) / w;
-                m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
-            }
-
-            m2.loadRotate(180, 0, 1, 0);
-            m1.loadMultiply(m1, m2);
-
-            m2.loadScale(-2, 2, 1);
-            m1.loadMultiply(m1, m2);
-
-            m2.loadTranslate(0, 0, 2);
-            m1.loadMultiply(m1, m2);
-
-            mProjection = m1;
-            addToBuffer(PROJECTION_OFFSET*4, mProjection);
-        }
-
-    }
-
 }
-
diff --git a/graphics/java/android/renderscript/ProgramVertexFixedFunction.java b/graphics/java/android/renderscript/ProgramVertexFixedFunction.java
new file mode 100644
index 0000000..2240dd7
--- /dev/null
+++ b/graphics/java/android/renderscript/ProgramVertexFixedFunction.java
@@ -0,0 +1,205 @@
+/*
+ * 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.renderscript;
+
+
+import android.graphics.Matrix;
+import android.util.Config;
+import android.util.Log;
+
+
+/**
+ * @hide
+ *
+ **/
+public class ProgramVertexFixedFunction extends ProgramVertex {
+
+    ProgramVertexFixedFunction(int id, RenderScript rs) {
+        super(id, rs);
+    }
+
+    public void bindConstants(Constants va) {
+        mRS.validate();
+        bindConstants(va.getAllocation(), 0);
+    }
+
+    static class InternalBuilder extends BaseProgramBuilder {
+        public InternalBuilder(RenderScript rs) {
+            super(rs);
+        }
+
+        public InternalBuilder addInput(Element e) throws IllegalStateException {
+            // Should check for consistant and non-conflicting names...
+            if(mInputCount >= MAX_INPUT) {
+                throw new RSIllegalArgumentException("Max input count exceeded.");
+            }
+            if (e.isComplex()) {
+                throw new RSIllegalArgumentException("Complex elements not allowed.");
+            }
+            mInputs[mInputCount++] = e;
+            return this;
+        }
+
+        public ProgramVertexFixedFunction create() {
+            mRS.validate();
+            int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
+            int idx = 0;
+
+            for (int i=0; i < mInputCount; i++) {
+                tmp[idx++] = ProgramParam.INPUT.mID;
+                tmp[idx++] = mInputs[i].getID();
+            }
+            for (int i=0; i < mOutputCount; i++) {
+                tmp[idx++] = ProgramParam.OUTPUT.mID;
+                tmp[idx++] = mOutputs[i].getID();
+            }
+            for (int i=0; i < mConstantCount; i++) {
+                tmp[idx++] = ProgramParam.CONSTANT.mID;
+                tmp[idx++] = mConstants[i].getID();
+            }
+            for (int i=0; i < mTextureCount; i++) {
+                tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID;
+                tmp[idx++] = mTextureTypes[i].mID;
+            }
+
+            int id = mRS.nProgramVertexCreate(mShader, tmp);
+            ProgramVertexFixedFunction pv = new ProgramVertexFixedFunction(id, mRS);
+            initProgram(pv);
+            return pv;
+        }
+    }
+
+    public static class Builder {
+        boolean mTextureMatrixEnable;
+        String mShader;
+        RenderScript mRS;
+
+        public Builder(RenderScript rs) {
+            mRS = rs;
+        }
+
+        public Builder setTextureMatrixEnable(boolean enable) {
+            mTextureMatrixEnable = enable;
+            return this;
+        }
+        static Type getConstantInputType(RenderScript rs) {
+            Element.Builder b = new Element.Builder(rs);
+            b.add(Element.MATRIX4X4(rs), "MV");
+            b.add(Element.MATRIX4X4(rs), "P");
+            b.add(Element.MATRIX4X4(rs), "TexMatrix");
+            b.add(Element.MATRIX4X4(rs), "MVP");
+
+            Type.Builder typeBuilder = new Type.Builder(rs, b.create());
+            typeBuilder.setX(1);
+            return typeBuilder.create();
+        }
+
+        private void buildShaderString() {
+
+            mShader  = "//rs_shader_internal\n";
+            mShader += "varying vec4 varColor;\n";
+            mShader += "varying vec2 varTex0;\n";
+
+            mShader += "void main() {\n";
+            mShader += "  gl_Position = UNI_MVP * ATTRIB_position;\n";
+            mShader += "  gl_PointSize = 1.0;\n";
+
+            mShader += "  varColor = ATTRIB_color;\n";
+            if (mTextureMatrixEnable) {
+                mShader += "  varTex0 = (UNI_TexMatrix * vec4(ATTRIB_texture0, 0.0, 1.0)).xy;\n";
+            } else {
+                mShader += "  varTex0 = ATTRIB_texture0;\n";
+            }
+            mShader += "}\n";
+        }
+
+        public ProgramVertexFixedFunction create() {
+            buildShaderString();
+
+            InternalBuilder sb = new InternalBuilder(mRS);
+            sb.setShader(mShader);
+            sb.addConstant(getConstantInputType(mRS));
+
+            Element.Builder b = new Element.Builder(mRS);
+            b.add(Element.F32_4(mRS), "position");
+            b.add(Element.F32_4(mRS), "color");
+            b.add(Element.F32_3(mRS), "normal");
+            b.add(Element.F32_2(mRS), "texture0");
+            sb.addInput(b.create());
+
+            return sb.create();
+        }
+    }
+
+    public static class Constants {
+        static final int MODELVIEW_OFFSET = 0;
+        static final int PROJECTION_OFFSET = 16;
+        static final int TEXTURE_OFFSET = 32;
+
+        Matrix4f mModel;
+        Matrix4f mProjection;
+        Matrix4f mTexture;
+
+        Allocation mAlloc;
+        Allocation getAllocation() {
+            return mAlloc;
+        }
+        private FieldPacker mIOBuffer;
+
+        public Constants(RenderScript rs) {
+            Type constInputType = ProgramVertexFixedFunction.Builder.getConstantInputType(rs);
+            mAlloc = Allocation.createTyped(rs, constInputType);
+            int bufferSize = constInputType.getElement().getSizeBytes()*
+                             constInputType.getCount();
+            mIOBuffer = new FieldPacker(bufferSize);
+            mModel = new Matrix4f();
+            mProjection = new Matrix4f();
+            mTexture = new Matrix4f();
+            setModelview(new Matrix4f());
+            setProjection(new Matrix4f());
+            setTexture(new Matrix4f());
+        }
+
+        public void destroy() {
+            mAlloc.destroy();
+            mAlloc = null;
+        }
+
+        private void addToBuffer(int offset, Matrix4f m) {
+            mIOBuffer.reset(offset);
+            for(int i = 0; i < 16; i ++) {
+                mIOBuffer.addF32(m.mMat[i]);
+            }
+            mAlloc.copyFrom(mIOBuffer.getData());
+        }
+
+        public void setModelview(Matrix4f m) {
+            mModel.load(m);
+            addToBuffer(MODELVIEW_OFFSET*4, m);
+        }
+
+        public void setProjection(Matrix4f m) {
+            mProjection.load(m);
+            addToBuffer(PROJECTION_OFFSET*4, m);
+        }
+
+        public void setTexture(Matrix4f m) {
+            mTexture.load(m);
+            addToBuffer(TEXTURE_OFFSET*4, m);
+        }
+    }
+}
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 5f93f5b..2d16e32 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -305,8 +305,8 @@
         return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
     }
 
-    native int  rsnFontCreateFromFile(int con, String fileName, int size, int dpi);
-    synchronized int nFontCreateFromFile(String fileName, int size, int dpi) {
+    native int  rsnFontCreateFromFile(int con, String fileName, float size, int dpi);
+    synchronized int nFontCreateFromFile(String fileName, float size, int dpi) {
         return rsnFontCreateFromFile(mContext, fileName, size, dpi);
     }
 
@@ -417,9 +417,9 @@
     synchronized void nScriptCSetScript(byte[] script, int offset, int length) {
         rsnScriptCSetScript(mContext, script, offset, length);
     }
-    native int  rsnScriptCCreate(int con, String val, String cacheDir);
-    synchronized int nScriptCCreate(String resName, String cacheDir) {
-      return rsnScriptCCreate(mContext, resName, cacheDir);
+    native int  rsnScriptCCreate(int con, String packageName, String resName, String cacheDir);
+    synchronized int nScriptCCreate(String packageName, String resName, String cacheDir) {
+        return rsnScriptCCreate(mContext, packageName, resName, cacheDir);
     }
 
     native void rsnSamplerBegin(int con);
@@ -589,16 +589,8 @@
 
     ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
     ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
-    ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_TEST;
-    ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_WRITE;
     ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
     ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
-    ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST;
-    ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE;
-    ProgramStore mProgramStore_BLEND_ADD_DEPTH_TEST;
-    ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH;
-    ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_TEST;
-    ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_WRITE;
 
     ProgramRaster mProgramRaster_CULL_BACK;
     ProgramRaster mProgramRaster_CULL_FRONT;
diff --git a/graphics/java/android/renderscript/Sampler.java b/graphics/java/android/renderscript/Sampler.java
index 45a3949..6faa206 100644
--- a/graphics/java/android/renderscript/Sampler.java
+++ b/graphics/java/android/renderscript/Sampler.java
@@ -65,8 +65,8 @@
     public static Sampler CLAMP_NEAREST(RenderScript rs) {
         if(rs.mSampler_CLAMP_NEAREST == null) {
             Builder b = new Builder(rs);
-            b.setMin(Value.NEAREST);
-            b.setMag(Value.NEAREST);
+            b.setMinification(Value.NEAREST);
+            b.setMagnification(Value.NEAREST);
             b.setWrapS(Value.CLAMP);
             b.setWrapT(Value.CLAMP);
             rs.mSampler_CLAMP_NEAREST = b.create();
@@ -85,8 +85,8 @@
     public static Sampler CLAMP_LINEAR(RenderScript rs) {
         if(rs.mSampler_CLAMP_LINEAR == null) {
             Builder b = new Builder(rs);
-            b.setMin(Value.LINEAR);
-            b.setMag(Value.LINEAR);
+            b.setMinification(Value.LINEAR);
+            b.setMagnification(Value.LINEAR);
             b.setWrapS(Value.CLAMP);
             b.setWrapT(Value.CLAMP);
             rs.mSampler_CLAMP_LINEAR = b.create();
@@ -105,8 +105,8 @@
     public static Sampler CLAMP_LINEAR_MIP_LINEAR(RenderScript rs) {
         if(rs.mSampler_CLAMP_LINEAR_MIP_LINEAR == null) {
             Builder b = new Builder(rs);
-            b.setMin(Value.LINEAR_MIP_LINEAR);
-            b.setMag(Value.LINEAR);
+            b.setMinification(Value.LINEAR_MIP_LINEAR);
+            b.setMagnification(Value.LINEAR);
             b.setWrapS(Value.CLAMP);
             b.setWrapT(Value.CLAMP);
             rs.mSampler_CLAMP_LINEAR_MIP_LINEAR = b.create();
@@ -125,8 +125,8 @@
     public static Sampler WRAP_NEAREST(RenderScript rs) {
         if(rs.mSampler_WRAP_NEAREST == null) {
             Builder b = new Builder(rs);
-            b.setMin(Value.NEAREST);
-            b.setMag(Value.NEAREST);
+            b.setMinification(Value.NEAREST);
+            b.setMagnification(Value.NEAREST);
             b.setWrapS(Value.WRAP);
             b.setWrapT(Value.WRAP);
             rs.mSampler_WRAP_NEAREST = b.create();
@@ -145,8 +145,8 @@
     public static Sampler WRAP_LINEAR(RenderScript rs) {
         if(rs.mSampler_WRAP_LINEAR == null) {
             Builder b = new Builder(rs);
-            b.setMin(Value.LINEAR);
-            b.setMag(Value.LINEAR);
+            b.setMinification(Value.LINEAR);
+            b.setMagnification(Value.LINEAR);
             b.setWrapS(Value.WRAP);
             b.setWrapT(Value.WRAP);
             rs.mSampler_WRAP_LINEAR = b.create();
@@ -165,8 +165,8 @@
     public static Sampler WRAP_LINEAR_MIP_LINEAR(RenderScript rs) {
         if(rs.mSampler_WRAP_LINEAR_MIP_LINEAR == null) {
             Builder b = new Builder(rs);
-            b.setMin(Value.LINEAR_MIP_LINEAR);
-            b.setMag(Value.LINEAR);
+            b.setMinification(Value.LINEAR_MIP_LINEAR);
+            b.setMagnification(Value.LINEAR);
             b.setWrapS(Value.WRAP);
             b.setWrapT(Value.WRAP);
             rs.mSampler_WRAP_LINEAR_MIP_LINEAR = b.create();
@@ -199,7 +199,7 @@
             mAniso = 1.0f;
         }
 
-        public void setMin(Value v) {
+        public void setMinification(Value v) {
             if (v == Value.NEAREST ||
                 v == Value.LINEAR ||
                 v == Value.LINEAR_MIP_LINEAR ||
@@ -210,7 +210,7 @@
             }
         }
 
-        public void setMag(Value v) {
+        public void setMagnification(Value v) {
             if (v == Value.NEAREST || v == Value.LINEAR) {
                 mMag = v;
             } else {
@@ -234,14 +234,6 @@
             }
         }
 
-        public void setWrapR(Value v) {
-            if (v == Value.WRAP || v == Value.CLAMP) {
-                mWrapR = v;
-            } else {
-                throw new IllegalArgumentException("Invalid value");
-            }
-        }
-
         public void setAnisotropy(float v) {
             if(v >= 0.0f) {
                 mAniso = v;
diff --git a/graphics/java/android/renderscript/ScriptC.java b/graphics/java/android/renderscript/ScriptC.java
index b10247c..c1e4358 100644
--- a/graphics/java/android/renderscript/ScriptC.java
+++ b/graphics/java/android/renderscript/ScriptC.java
@@ -77,8 +77,14 @@
 
         rs.nScriptCBegin();
         rs.nScriptCSetScript(pgm, 0, pgmLength);
-        Log.v(TAG, "Create script for resource = " + resources.getResourceName(resourceID));
+
+        // E.g, /system/apps/Fountain.apk
+        String packageName = rs.getApplicationContext().getPackageResourcePath();
+        // For res/raw/fountain.bc, it wil be /com.android.fountain:raw/fountain
+        String resName = resources.getResourceName(resourceID);
         String cacheDir = rs.getApplicationContext().getCacheDir().toString();
-        return rs.nScriptCCreate(resources.getResourceName(resourceID), cacheDir);
+
+        Log.v(TAG, "Create script for resource = " + resName);
+        return rs.nScriptCCreate(packageName, resName, cacheDir);
     }
 }
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index a8343b3..9da4428 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -623,7 +623,7 @@
 // -----------------------------------
 
 static int
-nFontCreateFromFile(JNIEnv *_env, jobject _this, RsContext con, jstring fileName, jint fontSize, jint dpi)
+nFontCreateFromFile(JNIEnv *_env, jobject _this, RsContext con, jstring fileName, jfloat fontSize, jint dpi)
 {
     const char* fileNameUTF = _env->GetStringUTFChars(fileName, NULL);
 
@@ -902,12 +902,14 @@
 }
 
 static jint
-nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring resName, jstring cacheDir)
+nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring packageName, jstring resName, jstring cacheDir)
 {
     LOG_API("nScriptCCreate, con(%p)", con);
+    const char* packageNameUTF = _env->GetStringUTFChars(packageName, NULL);
     const char* resNameUTF = _env->GetStringUTFChars(resName, NULL);
     const char* cacheDirUTF = _env->GetStringUTFChars(cacheDir, NULL);
-    jint i = (jint)rsScriptCCreate(con, resNameUTF, cacheDirUTF);
+    jint i = (jint)rsScriptCCreate(con, packageNameUTF, resNameUTF, cacheDirUTF);
+    _env->ReleaseStringUTFChars(packageName, packageNameUTF);
     _env->ReleaseStringUTFChars(resName, resNameUTF);
     _env->ReleaseStringUTFChars(cacheDir, cacheDirUTF);
     return i;
@@ -1239,7 +1241,7 @@
 {"rsnFileA3DGetIndexEntries",        "(III[I[Ljava/lang/String;)V",           (void*)nFileA3DGetIndexEntries },
 {"rsnFileA3DGetEntryByIndex",        "(III)I",                                (void*)nFileA3DGetEntryByIndex },
 
-{"rsnFontCreateFromFile",            "(ILjava/lang/String;II)I",              (void*)nFontCreateFromFile },
+{"rsnFontCreateFromFile",            "(ILjava/lang/String;FI)I",              (void*)nFontCreateFromFile },
 
 {"rsnElementCreate",                 "(IIIZI)I",                              (void*)nElementCreate },
 {"rsnElementCreate2",                "(I[I[Ljava/lang/String;[I)I",           (void*)nElementCreate2 },
@@ -1301,7 +1303,7 @@
 
 {"rsnScriptCBegin",                  "(I)V",                                  (void*)nScriptCBegin },
 {"rsnScriptCSetScript",              "(I[BII)V",                              (void*)nScriptCSetScript },
-{"rsnScriptCCreate",                 "(ILjava/lang/String;Ljava/lang/String;)I",  (void*)nScriptCCreate },
+{"rsnScriptCCreate",                 "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",  (void*)nScriptCCreate },
 
 {"rsnProgramStoreBegin",             "(III)V",                                (void*)nProgramStoreBegin },
 {"rsnProgramStoreDepthFunc",         "(II)V",                                 (void*)nProgramStoreDepthFunc },
diff --git a/include/binder/CursorWindow.h b/include/binder/CursorWindow.h
index 4fbff2a..f0b2909 100644
--- a/include/binder/CursorWindow.h
+++ b/include/binder/CursorWindow.h
@@ -25,7 +25,6 @@
 #include <utils/RefBase.h>
 
 #define DEFAULT_WINDOW_SIZE 4096
-#define MAX_WINDOW_SIZE (1024 * 1024)
 #define WINDOW_ALLOCATION_SIZE 4096
 
 #define ROW_SLOT_CHUNK_NUM_ROWS 16
diff --git a/include/media/mediascanner.h b/include/media/mediascanner.h
index 74c9d5d..df5be32 100644
--- a/include/media/mediascanner.h
+++ b/include/media/mediascanner.h
@@ -71,7 +71,8 @@
     bool addStringTag(const char* name, const char* value);
     void endFile();
 
-    virtual bool scanFile(const char* path, long long lastModified, long long fileSize) = 0;
+    virtual bool scanFile(const char* path, long long lastModified,
+            long long fileSize, bool isDirectory) = 0;
     virtual bool handleStringTag(const char* name, const char* value) = 0;
     virtual bool setMimeType(const char* mimeType) = 0;
     virtual bool addNoMediaFolder(const char* path) = 0;
diff --git a/include/ui/EventHub.h b/include/ui/EventHub.h
index 6c6c297..8f922a5 100644
--- a/include/ui/EventHub.h
+++ b/include/ui/EventHub.h
@@ -109,8 +109,8 @@
     /* The input device is a touchscreen (either single-touch or multi-touch). */
     INPUT_DEVICE_CLASS_TOUCHSCREEN   = 0x00000004,
 
-    /* The input device is a trackball. */
-    INPUT_DEVICE_CLASS_TRACKBALL     = 0x00000008,
+    /* The input device is a cursor device such as a trackball or mouse. */
+    INPUT_DEVICE_CLASS_CURSOR        = 0x00000008,
 
     /* The input device is a multi-touch touchscreen. */
     INPUT_DEVICE_CLASS_TOUCHSCREEN_MT= 0x00000010,
diff --git a/include/ui/InputReader.h b/include/ui/InputReader.h
index b466ff1..00a06be 100644
--- a/include/ui/InputReader.h
+++ b/include/ui/InputReader.h
@@ -20,6 +20,7 @@
 #include <ui/EventHub.h>
 #include <ui/Input.h>
 #include <ui/InputDispatcher.h>
+#include <ui/PointerController.h>
 #include <utils/KeyedVector.h>
 #include <utils/threads.h>
 #include <utils/Timers.h>
@@ -77,6 +78,9 @@
 
     /* Gets the excluded device names for the platform. */
     virtual void getExcludedDeviceNames(Vector<String8>& outExcludedDeviceNames) = 0;
+
+    /* Gets a pointer controller associated with the specified cursor device (ie. a mouse). */
+    virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) = 0;
 };
 
 
@@ -421,10 +425,10 @@
 };
 
 
-class TrackballInputMapper : public InputMapper {
+class CursorInputMapper : public InputMapper {
 public:
-    TrackballInputMapper(InputDevice* device);
-    virtual ~TrackballInputMapper();
+    CursorInputMapper(InputDevice* device);
+    virtual ~CursorInputMapper();
 
     virtual uint32_t getSources();
     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
@@ -443,6 +447,12 @@
 
     // Immutable configuration parameters.
     struct Parameters {
+        enum Mode {
+            MODE_POINTER,
+            MODE_NAVIGATION,
+        };
+
+        Mode mode;
         int32_t associatedDisplayId;
         bool orientationAware;
     } mParameters;
@@ -465,10 +475,12 @@
         }
     } mAccumulator;
 
+    int32_t mSources;
     float mXScale;
     float mYScale;
     float mXPrecision;
     float mYPrecision;
+    sp<PointerControllerInterface> mPointerController;
 
     struct LockedState {
         bool down;
@@ -572,6 +584,9 @@
         }
     };
 
+    // Input sources supported by the device.
+    int32_t mSources;
+
     // Immutable configuration parameters.
     struct Parameters {
         enum DeviceType {
diff --git a/include/ui/PointerController.h b/include/ui/PointerController.h
new file mode 100644
index 0000000..4db24e5
--- /dev/null
+++ b/include/ui/PointerController.h
@@ -0,0 +1,63 @@
+/*
+ * 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.
+ */
+
+#ifndef _UI_POINTER_CONTROLLER_H
+#define _UI_POINTER_CONTROLLER_H
+
+#include <utils/RefBase.h>
+
+namespace android {
+
+enum {
+    POINTER_BUTTON_1 = 1 << 0,
+};
+
+/**
+ * Interface for tracking a single (mouse) pointer.
+ *
+ * The pointer controller is responsible for providing synchronization and for tracking
+ * display orientation changes if needed.
+ */
+class PointerControllerInterface : public virtual RefBase {
+protected:
+    PointerControllerInterface() { }
+    virtual ~PointerControllerInterface() { }
+
+public:
+    /* Gets the bounds of the region that the pointer can traverse.
+     * Returns true if the bounds are available. */
+    virtual bool getBounds(float* outMinX, float* outMinY,
+            float* outMaxX, float* outMaxY) const = 0;
+
+    /* Move the pointer. */
+    virtual void move(float deltaX, float deltaY) = 0;
+
+    /* Sets a mask that indicates which buttons are pressed. */
+    virtual void setButtonState(uint32_t buttonState) = 0;
+
+    /* Gets a mask that indicates which buttons are pressed. */
+    virtual uint32_t getButtonState() const = 0;
+
+    /* Sets the absolute location of the pointer. */
+    virtual void setPosition(float x, float y) = 0;
+
+    /* Gets the absolute location of the pointer. */
+    virtual void getPosition(float* outX, float* outY) const = 0;
+};
+
+} // namespace android
+
+#endif // _UI_POINTER_CONTROLLER_H
diff --git a/include/utils/PropertyMap.h b/include/utils/PropertyMap.h
index a54f819..a9e674f 100644
--- a/include/utils/PropertyMap.h
+++ b/include/utils/PropertyMap.h
@@ -71,6 +71,12 @@
     bool tryGetProperty(const String8& key, int32_t& outValue) const;
     bool tryGetProperty(const String8& key, float& outValue) const;
 
+    /* Adds all values from the specified property map. */
+    void addAll(const PropertyMap* map);
+
+    /* Gets the underlying property map. */
+    inline const KeyedVector<String8, String8>& getProperties() const { return mProperties; }
+
     /* Loads a property map from a file. */
     static status_t load(const String8& filename, PropertyMap** outMap);
 
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index f329ac4..d57f2c9 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -619,7 +619,10 @@
 status_t Parcel::writeString8(const String8& str)
 {
     status_t err = writeInt32(str.bytes());
-    if (err == NO_ERROR) {
+    // only write string if its length is more than zero characters,
+    // as readString8 will only read if the length field is non-zero.
+    // this is slightly different from how writeString16 works.
+    if (str.bytes() > 0 && err == NO_ERROR) {
         err = write(str.string(), str.bytes()+1);
     }
     return err;
diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp
index 1c93ea6..00de39b 100644
--- a/libs/hwui/ResourceCache.cpp
+++ b/libs/hwui/ResourceCache.cpp
@@ -60,9 +60,7 @@
 }
 
 void ResourceCache::incrementRefcount(SkBitmap* bitmapResource) {
-    SkPixelRef* pixref = bitmapResource->pixelRef();
-    if (pixref) pixref->globalRef();
-
+    bitmapResource->pixelRef()->safeRef();
     bitmapResource->getColorTable()->safeRef();
     incrementRefcount((void*)bitmapResource, kBitmap);
 }
@@ -91,9 +89,7 @@
 }
 
 void ResourceCache::decrementRefcount(SkBitmap* bitmapResource) {
-    SkPixelRef* pixref = bitmapResource->pixelRef();
-    if (pixref) pixref->globalUnref();
-
+    bitmapResource->pixelRef()->safeUnref();
     bitmapResource->getColorTable()->safeUnref();
     decrementRefcount((void*)bitmapResource);
 }
diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk
index 2ec003f..c2e58b6 100644
--- a/libs/rs/Android.mk
+++ b/libs/rs/Android.mk
@@ -113,11 +113,11 @@
 	rsVertexArray.cpp
 
 
-LOCAL_SHARED_LIBRARIES += libcutils libutils libEGL libGLESv1_CM libGLESv2 libui libbcc
+LOCAL_SHARED_LIBRARIES += libz libcutils libutils libEGL libGLESv1_CM libGLESv2 libui libbcc
 
-LOCAL_STATIC_LIBRARIES := libft2 librslib_rt
+LOCAL_STATIC_LIBRARIES := libdex libft2 librslib_rt
 
-LOCAL_C_INCLUDES += external/freetype/include
+LOCAL_C_INCLUDES += external/freetype/include external/zlib dalvik
 
 LOCAL_LDLIBS := -lpthread -ldl
 LOCAL_MODULE:= libRS
diff --git a/libs/rs/java/Balls/src/com/android/balls/BallsRS.java b/libs/rs/java/Balls/src/com/android/balls/BallsRS.java
index 0a06394..50ee921 100644
--- a/libs/rs/java/Balls/src/com/android/balls/BallsRS.java
+++ b/libs/rs/java/Balls/src/com/android/balls/BallsRS.java
@@ -50,7 +50,7 @@
     private void createProgramVertex() {
         updateProjectionMatrices();
 
-        ProgramVertex.ShaderBuilder sb = new ProgramVertex.ShaderBuilder(mRS);
+        ProgramVertex.Builder sb = new ProgramVertex.Builder(mRS);
         String t =  "varying vec4 varColor;\n" +
                     "void main() {\n" +
                     "  vec4 pos = vec4(0.0, 0.0, 0.0, 1.0);\n" +
@@ -75,18 +75,27 @@
         return allocation;
     }
 
+    ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
+        ProgramStore.Builder builder = new ProgramStore.Builder(rs);
+        builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
+        builder.setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ONE);
+        builder.setDitherEnabled(false);
+        builder.setDepthMaskEnabled(false);
+        return builder.create();
+    }
+
     public void init(RenderScriptGL rs, Resources res, int width, int height) {
         mRS = rs;
         mRes = res;
 
-        ProgramFragment.Builder pfb = new ProgramFragment.Builder(rs);
+        ProgramFragmentFixedFunction.Builder pfb = new ProgramFragmentFixedFunction.Builder(rs);
         pfb.setPointSpriteTexCoordinateReplacement(true);
-        pfb.setTexture(ProgramFragment.Builder.EnvMode.MODULATE,
-                           ProgramFragment.Builder.Format.RGBA, 0);
+        pfb.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.MODULATE,
+                           ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
         pfb.setVaryingColor(true);
         mPFPoints = pfb.create();
 
-        pfb = new ProgramFragment.Builder(rs);
+        pfb = new ProgramFragmentFixedFunction.Builder(rs);
         pfb.setVaryingColor(true);
         mPFLines = pfb.create();
 
@@ -97,7 +106,7 @@
 
         Mesh.AllocationBuilder smb = new Mesh.AllocationBuilder(mRS);
         smb.addVertexAllocation(mPoints.getAllocation());
-        smb.addIndexType(Primitive.POINT);
+        smb.addIndexSetType(Mesh.Primitive.POINT);
         Mesh smP = smb.create();
 
         mPhysicsScript = new ScriptC_ball_physics(mRS, mRes, R.raw.ball_physics);
@@ -113,7 +122,7 @@
         mScript.set_gPFPoints(mPFPoints);
         createProgramVertex();
 
-        mRS.bindProgramStore(ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS));
+        mRS.bindProgramStore(BLEND_ADD_DEPTH_NONE(mRS));
 
         mPhysicsScript.set_gMinPos(new Float2(5, 5));
         mPhysicsScript.set_gMaxPos(new Float2(width - 5, height - 5));
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
index a5d06e9..be2f9ca 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
@@ -34,7 +34,7 @@
         mRS = rs;
         mRes = res;
 
-        ProgramFragment.Builder pfb = new ProgramFragment.Builder(rs);
+        ProgramFragmentFixedFunction.Builder pfb = new ProgramFragmentFixedFunction.Builder(rs);
         pfb.setVaryingColor(true);
         rs.bindProgramFragment(pfb.create());
 
@@ -43,7 +43,7 @@
 
         Mesh.AllocationBuilder smb = new Mesh.AllocationBuilder(mRS);
         smb.addVertexAllocation(points.getAllocation());
-        smb.addIndexType(Primitive.POINT);
+        smb.addIndexSetType(Mesh.Primitive.POINT);
         Mesh sm = smb.create();
 
         mScript = new ScriptC_fountain(mRS, mRes, R.raw.fountain);
diff --git a/libs/rs/java/ModelViewer/src/com/android/modelviewer/SceneGraphRS.java b/libs/rs/java/ModelViewer/src/com/android/modelviewer/SceneGraphRS.java
index 6cb50b8..f91f31e 100644
--- a/libs/rs/java/ModelViewer/src/com/android/modelviewer/SceneGraphRS.java
+++ b/libs/rs/java/ModelViewer/src/com/android/modelviewer/SceneGraphRS.java
@@ -23,6 +23,7 @@
 import android.content.res.Resources;
 import android.renderscript.*;
 import android.renderscript.Element.Builder;
+import android.renderscript.Font.Style;
 import android.renderscript.ProgramStore.DepthFunc;
 import android.util.Log;
 
@@ -53,7 +54,7 @@
     private ProgramStore mPSBackground;
     private ProgramFragment mPFBackground;
     private ProgramVertex mPVBackground;
-    private ProgramVertex.MatrixAllocation mPVA;
+    private ProgramVertexFixedFunction.Constants mPVA;
 
     private Allocation mGridImage;
     private Allocation mAllocPV;
@@ -93,8 +94,8 @@
         ProgramStore.Builder b = new ProgramStore.Builder(mRS);
 
         b.setDepthFunc(ProgramStore.DepthFunc.LESS);
-        b.setDitherEnable(false);
-        b.setDepthMask(true);
+        b.setDitherEnabled(false);
+        b.setDepthMaskEnabled(true);
         mPSBackground = b.create();
 
         mScript.set_gPFSBackground(mPSBackground);
@@ -102,15 +103,15 @@
 
     private void initPF() {
         Sampler.Builder bs = new Sampler.Builder(mRS);
-        bs.setMin(Sampler.Value.LINEAR);
-        bs.setMag(Sampler.Value.LINEAR);
+        bs.setMinification(Sampler.Value.LINEAR);
+        bs.setMagnification(Sampler.Value.LINEAR);
         bs.setWrapS(Sampler.Value.CLAMP);
         bs.setWrapT(Sampler.Value.CLAMP);
         mSampler = bs.create();
 
-        ProgramFragment.Builder b = new ProgramFragment.Builder(mRS);
-        b.setTexture(ProgramFragment.Builder.EnvMode.REPLACE,
-                     ProgramFragment.Builder.Format.RGBA, 0);
+        ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
+        b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
+                     ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
         mPFBackground = b.create();
         mPFBackground.bindSampler(mSampler, 0);
 
@@ -118,11 +119,11 @@
     }
 
     private void initPV() {
-        ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS);
+        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
         mPVBackground = pvb.create();
 
-        mPVA = new ProgramVertex.MatrixAllocation(mRS);
-        mPVBackground.bindAllocation(mPVA);
+        mPVA = new ProgramVertexFixedFunction.Constants(mRS);
+        ((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
 
         mScript.set_gPVBackground(mPVBackground);
     }
@@ -186,22 +187,20 @@
 
         FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
         FileA3D.IndexEntry entry = model.getIndexEntry(0);
-        if (entry == null || entry.getClassID() != FileA3D.ClassID.MESH) {
+        if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
             Log.e("rs", "could not load model");
         } else {
             mMesh = (Mesh)entry.getObject();
             mScript.set_gTestMesh(mMesh);
         }
 
-        mItalic = Font.create(mRS, mRes, "DroidSerif-Italic.ttf", 8);
+        mItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
         mScript.set_gItalic(mItalic);
 
         initTextAllocation();
 
         initTransformHierarchy();
 
-        Log.v("========SceneGraph========", "transform hierarchy initialized");
-
         mScript.bind_gRootNode(mRootTransform.getField());
 
         mScript.bind_gGroup(mGroup1.mParent.mChildField);
diff --git a/libs/rs/java/ModelViewer/src/com/android/modelviewer/SimpleModelRS.java b/libs/rs/java/ModelViewer/src/com/android/modelviewer/SimpleModelRS.java
index 747463a..b18a327 100644
--- a/libs/rs/java/ModelViewer/src/com/android/modelviewer/SimpleModelRS.java
+++ b/libs/rs/java/ModelViewer/src/com/android/modelviewer/SimpleModelRS.java
@@ -50,7 +50,7 @@
     private ProgramStore mPSBackground;
     private ProgramFragment mPFBackground;
     private ProgramVertex mPVBackground;
-    private ProgramVertex.MatrixAllocation mPVA;
+    private ProgramVertexFixedFunction.Constants mPVA;
 
     private Allocation mGridImage;
     private Allocation mAllocPV;
@@ -89,8 +89,8 @@
         ProgramStore.Builder b = new ProgramStore.Builder(mRS);
 
         b.setDepthFunc(ProgramStore.DepthFunc.LESS);
-        b.setDitherEnable(false);
-        b.setDepthMask(true);
+        b.setDitherEnabled(false);
+        b.setDepthMaskEnabled(true);
         mPSBackground = b.create();
 
         mScript.set_gPFSBackground(mPSBackground);
@@ -98,15 +98,15 @@
 
     private void initPF() {
         Sampler.Builder bs = new Sampler.Builder(mRS);
-        bs.setMin(Sampler.Value.LINEAR);
-        bs.setMag(Sampler.Value.LINEAR);
+        bs.setMinification(Sampler.Value.LINEAR);
+        bs.setMagnification(Sampler.Value.LINEAR);
         bs.setWrapS(Sampler.Value.CLAMP);
         bs.setWrapT(Sampler.Value.CLAMP);
         mSampler = bs.create();
 
-        ProgramFragment.Builder b = new ProgramFragment.Builder(mRS);
-        b.setTexture(ProgramFragment.Builder.EnvMode.REPLACE,
-                     ProgramFragment.Builder.Format.RGBA, 0);
+        ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
+        b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
+                     ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
         mPFBackground = b.create();
         mPFBackground.bindSampler(mSampler, 0);
 
@@ -114,11 +114,11 @@
     }
 
     private void initPV() {
-        ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS);
+        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
         mPVBackground = pvb.create();
 
-        mPVA = new ProgramVertex.MatrixAllocation(mRS);
-        mPVBackground.bindAllocation(mPVA);
+        mPVA = new ProgramVertexFixedFunction.Constants(mRS);
+        ((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
 
         mScript.set_gPVBackground(mPVBackground);
     }
@@ -148,14 +148,14 @@
 
         FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
         FileA3D.IndexEntry entry = model.getIndexEntry(0);
-        if (entry == null || entry.getClassID() != FileA3D.ClassID.MESH) {
+        if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
             Log.e("rs", "could not load model");
         } else {
             mMesh = (Mesh)entry.getObject();
             mScript.set_gTestMesh(mMesh);
         }
 
-        mItalic = Font.create(mRS, mRes, "DroidSerif-Italic.ttf", 8);
+        mItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
         mScript.set_gItalic(mItalic);
 
         initTextAllocation();
diff --git a/libs/rs/java/Samples/src/com/android/samples/RsBenchRS.java b/libs/rs/java/Samples/src/com/android/samples/RsBenchRS.java
index ddb05b3..5430a13 100644
--- a/libs/rs/java/Samples/src/com/android/samples/RsBenchRS.java
+++ b/libs/rs/java/Samples/src/com/android/samples/RsBenchRS.java
@@ -26,6 +26,8 @@
 import android.renderscript.Allocation.MipmapControl;
 import android.renderscript.Program.TextureType;
 import android.renderscript.ProgramStore.DepthFunc;
+import android.renderscript.ProgramStore.BlendSrcFunc;
+import android.renderscript.ProgramStore.BlendDstFunc;
 import android.renderscript.Sampler.Value;
 import android.util.Log;
 
@@ -69,7 +71,7 @@
     private ProgramFragment mProgFragmentColor;
 
     private ProgramVertex mProgVertex;
-    private ProgramVertex.MatrixAllocation mPVA;
+    private ProgramVertexFixedFunction.Constants mPVA;
 
     // Custom shaders
     private ProgramVertex mProgVertexCustom;
@@ -122,6 +124,15 @@
         mScript.set_gDisplayMode(mMode);
     }
 
+    ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
+        ProgramStore.Builder builder = new ProgramStore.Builder(rs);
+        builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
+        builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
+        builder.setDitherEnabled(false);
+        builder.setDepthMaskEnabled(false);
+        return builder.create();
+    }
+
     private Mesh getMbyNMesh(float width, float height, int wResolution, int hResolution) {
 
         Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
@@ -155,18 +166,18 @@
     private void initProgramStore() {
         // Use stock the stock program store object
         mProgStoreBlendNoneDepth = ProgramStore.BLEND_NONE_DEPTH_TEST(mRS);
-        mProgStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NO_DEPTH(mRS);
+        mProgStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(mRS);
 
         // Create a custom program store
         ProgramStore.Builder builder = new ProgramStore.Builder(mRS);
         builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
         builder.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
                              ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-        builder.setDitherEnable(false);
-        builder.setDepthMask(false);
+        builder.setDitherEnabled(false);
+        builder.setDepthMaskEnabled(false);
         mProgStoreBlendAlpha = builder.create();
 
-        mProgStoreBlendAdd = ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS);
+        mProgStoreBlendAdd = BLEND_ADD_DEPTH_NONE(mRS);
 
         mScript.set_gProgStoreBlendNoneDepth(mProgStoreBlendNoneDepth);
         mScript.set_gProgStoreBlendNone(mProgStoreBlendNone);
@@ -176,13 +187,13 @@
 
     private void initProgramFragment() {
 
-        ProgramFragment.Builder texBuilder = new ProgramFragment.Builder(mRS);
-        texBuilder.setTexture(ProgramFragment.Builder.EnvMode.REPLACE,
-                              ProgramFragment.Builder.Format.RGBA, 0);
+        ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
+        texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
+                              ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
         mProgFragmentTexture = texBuilder.create();
         mProgFragmentTexture.bindSampler(mLinearClamp, 0);
 
-        ProgramFragment.Builder colBuilder = new ProgramFragment.Builder(mRS);
+        ProgramFragmentFixedFunction.Builder colBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
         colBuilder.setVaryingColor(false);
         mProgFragmentColor = colBuilder.create();
 
@@ -191,12 +202,14 @@
     }
 
     private void initProgramVertex() {
-        ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS);
+        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
         mProgVertex = pvb.create();
 
-        mPVA = new ProgramVertex.MatrixAllocation(mRS);
-        mProgVertex.bindAllocation(mPVA);
-        mPVA.setupOrthoWindow(mWidth, mHeight);
+        mPVA = new ProgramVertexFixedFunction.Constants(mRS);
+        ((ProgramVertexFixedFunction)mProgVertex).bindConstants(mPVA);
+        Matrix4f proj = new Matrix4f();
+        proj.loadOrthoWindow(mWidth, mHeight);
+        mPVA.setProjection(proj);
 
         mScript.set_gProgVertex(mProgVertex);
     }
@@ -213,7 +226,7 @@
         mScript.bind_gFSConstPixel(mFSConstPixel);
 
         // Initialize the shader builder
-        ProgramVertex.ShaderBuilder pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
+        ProgramVertex.Builder pvbCustom = new ProgramVertex.Builder(mRS);
         // Specify the resource that contains the shader string
         pvbCustom.setShader(mRes, R.raw.shaderv);
         // Use a script field to specify the input layout
@@ -224,7 +237,7 @@
         // Bind the source of constant data
         mProgVertexCustom.bindConstants(mVSConst.getAllocation(), 0);
 
-        ProgramFragment.ShaderBuilder pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
+        ProgramFragment.Builder pfbCustom = new ProgramFragment.Builder(mRS);
         // Specify the resource that contains the shader string
         pfbCustom.setShader(mRes, R.raw.shaderf);
         // Tell the builder how many textures we have
@@ -236,42 +249,44 @@
         mProgFragmentCustom.bindConstants(mFSConst.getAllocation(), 0);
 
         // Cubemap test shaders
-        pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
+        pvbCustom = new ProgramVertex.Builder(mRS);
         pvbCustom.setShader(mRes, R.raw.shadercubev);
         pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
         pvbCustom.addConstant(mVSConst.getAllocation().getType());
         mProgVertexCube = pvbCustom.create();
         mProgVertexCube.bindConstants(mVSConst.getAllocation(), 0);
 
-        pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
+        pfbCustom = new ProgramFragment.Builder(mRS);
         pfbCustom.setShader(mRes, R.raw.shadercubef);
         pfbCustom.addTexture(Program.TextureType.TEXTURE_CUBE);
         mProgFragmentCube = pfbCustom.create();
 
-        pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
+        pvbCustom = new ProgramVertex.Builder(mRS);
         pvbCustom.setShader(mRes, R.raw.shader2v);
         pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
         pvbCustom.addConstant(mVSConstPixel.getAllocation().getType());
         mProgVertexPixelLight = pvbCustom.create();
         mProgVertexPixelLight.bindConstants(mVSConstPixel.getAllocation(), 0);
 
-        pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
+        pvbCustom = new ProgramVertex.Builder(mRS);
         pvbCustom.setShader(mRes, R.raw.shader2movev);
         pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
         pvbCustom.addConstant(mVSConstPixel.getAllocation().getType());
         mProgVertexPixelLightMove = pvbCustom.create();
         mProgVertexPixelLightMove.bindConstants(mVSConstPixel.getAllocation(), 0);
 
-        pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
+        pfbCustom = new ProgramFragment.Builder(mRS);
         pfbCustom.setShader(mRes, R.raw.shader2f);
         pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
         pfbCustom.addConstant(mFSConstPixel.getAllocation().getType());
         mProgFragmentPixelLight = pfbCustom.create();
         mProgFragmentPixelLight.bindConstants(mFSConstPixel.getAllocation(), 0);
 
-        pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
+        pfbCustom = new ProgramFragment.Builder(mRS);
         pfbCustom.setShader(mRes, R.raw.multitexf);
-        pfbCustom.setTextureCount(3);
+        for (int texCount = 0; texCount < 3; texCount ++) {
+            pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
+        }
         mProgFragmentMultitex = pfbCustom.create();
 
         mScript.set_gProgVertexCustom(mProgVertexCustom);
@@ -315,22 +330,15 @@
 
     private void initFonts() {
         // Sans font by family name
-        mFontSans = Font.createFromFamily(mRS, mRes, "sans-serif",
-                                          Font.Style.NORMAL, 8);
-        // Create font by file name
-        mFontSerif = Font.create(mRS, mRes, "DroidSerif-Regular.ttf", 8);
+        mFontSans = Font.create(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8);
+        mFontSerif = Font.create(mRS, mRes, "serif", Font.Style.NORMAL, 8);
         // Create fonts by family and style
-        mFontSerifBold = Font.createFromFamily(mRS, mRes, "serif",
-                                               Font.Style.BOLD, 8);
-        mFontSerifItalic = Font.createFromFamily(mRS, mRes, "serif",
-                                                 Font.Style.ITALIC, 8);
-        mFontSerifBoldItalic = Font.createFromFamily(mRS, mRes, "serif",
-                                                     Font.Style.BOLD_ITALIC, 8);
-        mFontMono = Font.createFromFamily(mRS, mRes, "mono",
-                                          Font.Style.NORMAL, 8);
+        mFontSerifBold = Font.create(mRS, mRes, "serif", Font.Style.BOLD, 8);
+        mFontSerifItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
+        mFontSerifBoldItalic = Font.create(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8);
+        mFontMono = Font.create(mRS, mRes, "mono", Font.Style.NORMAL, 8);
 
-        mTextAlloc = Allocation.createFromString(mRS, "String from allocation",
-                                                 Allocation.USAGE_SCRIPT);
+        mTextAlloc = Allocation.createFromString(mRS, "String from allocation", Allocation.USAGE_SCRIPT);
 
         mScript.set_gFontSans(mFontSans);
         mScript.set_gFontSerif(mFontSerif);
@@ -351,7 +359,7 @@
 
         FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.torus);
         FileA3D.IndexEntry entry = model.getIndexEntry(0);
-        if (entry == null || entry.getClassID() != FileA3D.ClassID.MESH) {
+        if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
             Log.e("rs", "could not load model");
         } else {
             mTorus = (Mesh)entry.getObject();
@@ -361,8 +369,8 @@
 
     private void initSamplers() {
         Sampler.Builder bs = new Sampler.Builder(mRS);
-        bs.setMin(Sampler.Value.LINEAR);
-        bs.setMag(Sampler.Value.LINEAR);
+        bs.setMinification(Sampler.Value.LINEAR);
+        bs.setMagnification(Sampler.Value.LINEAR);
         bs.setWrapS(Sampler.Value.WRAP);
         bs.setWrapT(Sampler.Value.WRAP);
         mLinearWrap = bs.create();
@@ -372,8 +380,8 @@
         mMipLinearWrap = Sampler.WRAP_LINEAR_MIP_LINEAR(mRS);
 
         bs = new Sampler.Builder(mRS);
-        bs.setMin(Sampler.Value.LINEAR_MIP_LINEAR);
-        bs.setMag(Sampler.Value.LINEAR);
+        bs.setMinification(Sampler.Value.LINEAR_MIP_LINEAR);
+        bs.setMagnification(Sampler.Value.LINEAR);
         bs.setWrapS(Sampler.Value.WRAP);
         bs.setWrapT(Sampler.Value.WRAP);
         bs.setAnisotropy(8.0f);
diff --git a/libs/rs/java/Samples/src/com/android/samples/RsListRS.java b/libs/rs/java/Samples/src/com/android/samples/RsListRS.java
index 223f552..8e2d51f 100644
--- a/libs/rs/java/Samples/src/com/android/samples/RsListRS.java
+++ b/libs/rs/java/Samples/src/com/android/samples/RsListRS.java
@@ -134,7 +134,7 @@
 
         mScript.bind_gList(mListAllocs);
 
-        mItalic = Font.createFromFamily(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8);
+        mItalic = Font.create(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8);
         mScript.set_gItalic(mItalic);
 
         mRS.bindRootScript(mScript);
diff --git a/libs/rs/java/Samples/src/com/android/samples/RsRenderStatesRS.java b/libs/rs/java/Samples/src/com/android/samples/RsRenderStatesRS.java
index 75e8d99..cac105a 100644
--- a/libs/rs/java/Samples/src/com/android/samples/RsRenderStatesRS.java
+++ b/libs/rs/java/Samples/src/com/android/samples/RsRenderStatesRS.java
@@ -23,8 +23,11 @@
 import android.graphics.BitmapFactory;
 import android.renderscript.*;
 import android.renderscript.Allocation.CubemapLayout;
+import android.renderscript.Font.Style;
 import android.renderscript.Program.TextureType;
 import android.renderscript.ProgramStore.DepthFunc;
+import android.renderscript.ProgramStore.BlendSrcFunc;
+import android.renderscript.ProgramStore.BlendDstFunc;
 import android.renderscript.Sampler.Value;
 import android.util.Log;
 
@@ -68,7 +71,7 @@
     private ProgramFragment mProgFragmentColor;
 
     private ProgramVertex mProgVertex;
-    private ProgramVertex.MatrixAllocation mPVA;
+    private ProgramVertexFixedFunction.Constants mPVA;
 
     // Custom shaders
     private ProgramVertex mProgVertexCustom;
@@ -119,6 +122,15 @@
         mScript.set_gDisplayMode(mMode);
     }
 
+    ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
+        ProgramStore.Builder builder = new ProgramStore.Builder(rs);
+        builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
+        builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
+        builder.setDitherEnabled(false);
+        builder.setDepthMaskEnabled(false);
+        return builder.create();
+    }
+
     private Mesh getMbyNMesh(float width, float height, int wResolution, int hResolution) {
 
         Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
@@ -152,18 +164,18 @@
     private void initProgramStore() {
         // Use stock the stock program store object
         mProgStoreBlendNoneDepth = ProgramStore.BLEND_NONE_DEPTH_TEST(mRS);
-        mProgStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NO_DEPTH(mRS);
+        mProgStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(mRS);
 
         // Create a custom program store
         ProgramStore.Builder builder = new ProgramStore.Builder(mRS);
         builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
         builder.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
                              ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-        builder.setDitherEnable(false);
-        builder.setDepthMask(false);
+        builder.setDitherEnabled(false);
+        builder.setDepthMaskEnabled(false);
         mProgStoreBlendAlpha = builder.create();
 
-        mProgStoreBlendAdd = ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS);
+        mProgStoreBlendAdd = BLEND_ADD_DEPTH_NONE(mRS);
 
         mScript.set_gProgStoreBlendNoneDepth(mProgStoreBlendNoneDepth);
         mScript.set_gProgStoreBlendNone(mProgStoreBlendNone);
@@ -173,13 +185,13 @@
 
     private void initProgramFragment() {
 
-        ProgramFragment.Builder texBuilder = new ProgramFragment.Builder(mRS);
-        texBuilder.setTexture(ProgramFragment.Builder.EnvMode.REPLACE,
-                              ProgramFragment.Builder.Format.RGBA, 0);
+        ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
+        texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
+                              ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
         mProgFragmentTexture = texBuilder.create();
         mProgFragmentTexture.bindSampler(mLinearClamp, 0);
 
-        ProgramFragment.Builder colBuilder = new ProgramFragment.Builder(mRS);
+        ProgramFragmentFixedFunction.Builder colBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
         colBuilder.setVaryingColor(false);
         mProgFragmentColor = colBuilder.create();
 
@@ -188,12 +200,14 @@
     }
 
     private void initProgramVertex() {
-        ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS);
+        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
         mProgVertex = pvb.create();
 
-        mPVA = new ProgramVertex.MatrixAllocation(mRS);
-        mProgVertex.bindAllocation(mPVA);
-        mPVA.setupOrthoWindow(mWidth, mHeight);
+        mPVA = new ProgramVertexFixedFunction.Constants(mRS);
+        ((ProgramVertexFixedFunction)mProgVertex).bindConstants(mPVA);
+        Matrix4f proj = new Matrix4f();
+        proj.loadOrthoWindow(mWidth, mHeight);
+        mPVA.setProjection(proj);
 
         mScript.set_gProgVertex(mProgVertex);
     }
@@ -210,7 +224,7 @@
         mScript.bind_gFSConstants2(mFSConst2);
 
         // Initialize the shader builder
-        ProgramVertex.ShaderBuilder pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
+        ProgramVertex.Builder pvbCustom = new ProgramVertex.Builder(mRS);
         // Specify the resource that contains the shader string
         pvbCustom.setShader(mRes, R.raw.shaderv);
         // Use a script field to spcify the input layout
@@ -221,47 +235,49 @@
         // Bind the source of constant data
         mProgVertexCustom.bindConstants(mVSConst.getAllocation(), 0);
 
-        ProgramFragment.ShaderBuilder pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
+        ProgramFragment.Builder pfbCustom = new ProgramFragment.Builder(mRS);
         // Specify the resource that contains the shader string
         pfbCustom.setShader(mRes, R.raw.shaderf);
         //Tell the builder how many textures we have
-        pfbCustom.setTextureCount(1);
+        pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
         // Define the constant input layout
         pfbCustom.addConstant(mFSConst.getAllocation().getType());
         mProgFragmentCustom = pfbCustom.create();
         // Bind the source of constant data
         mProgFragmentCustom.bindConstants(mFSConst.getAllocation(), 0);
 
-        pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
+        pvbCustom = new ProgramVertex.Builder(mRS);
         pvbCustom.setShader(mRes, R.raw.shaderarrayv);
         pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
         pvbCustom.addConstant(mVSConst2.getAllocation().getType());
         mProgVertexCustom2 = pvbCustom.create();
         mProgVertexCustom2.bindConstants(mVSConst2.getAllocation(), 0);
 
-        pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
+        pfbCustom = new ProgramFragment.Builder(mRS);
         pfbCustom.setShader(mRes, R.raw.shaderarrayf);
-        pfbCustom.setTextureCount(1);
+        pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
         pfbCustom.addConstant(mFSConst2.getAllocation().getType());
         mProgFragmentCustom2 = pfbCustom.create();
         mProgFragmentCustom2.bindConstants(mFSConst2.getAllocation(), 0);
 
         // Cubemap test shaders
-        pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
+        pvbCustom = new ProgramVertex.Builder(mRS);
         pvbCustom.setShader(mRes, R.raw.shadercubev);
         pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
         pvbCustom.addConstant(mVSConst.getAllocation().getType());
         mProgVertexCube = pvbCustom.create();
         mProgVertexCube.bindConstants(mVSConst.getAllocation(), 0);
 
-        pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
+        pfbCustom = new ProgramFragment.Builder(mRS);
         pfbCustom.setShader(mRes, R.raw.shadercubef);
         pfbCustom.addTexture(Program.TextureType.TEXTURE_CUBE);
         mProgFragmentCube = pfbCustom.create();
 
-        pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
+        pfbCustom = new ProgramFragment.Builder(mRS);
         pfbCustom.setShader(mRes, R.raw.multitexf);
-        pfbCustom.setTextureCount(3);
+        for (int texCount = 0; texCount < 3; texCount ++) {
+            pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
+        }
         mProgFragmentMultitex = pfbCustom.create();
 
         mScript.set_gProgVertexCustom(mProgVertexCustom);
@@ -304,14 +320,13 @@
 
     private void initFonts() {
         // Sans font by family name
-        mFontSans = Font.createFromFamily(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8);
-        // Create font by file name
-        mFontSerif = Font.create(mRS, mRes, "DroidSerif-Regular.ttf", 8);
+        mFontSans = Font.create(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8);
+        mFontSerif = Font.create(mRS, mRes, "serif", Font.Style.NORMAL, 8);
         // Create fonts by family and style
-        mFontSerifBold = Font.createFromFamily(mRS, mRes, "serif", Font.Style.BOLD, 8);
-        mFontSerifItalic = Font.createFromFamily(mRS, mRes, "serif", Font.Style.ITALIC, 8);
-        mFontSerifBoldItalic = Font.createFromFamily(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8);
-        mFontMono = Font.createFromFamily(mRS, mRes, "mono", Font.Style.NORMAL, 8);
+        mFontSerifBold = Font.create(mRS, mRes, "serif", Font.Style.BOLD, 8);
+        mFontSerifItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
+        mFontSerifBoldItalic = Font.create(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8);
+        mFontMono = Font.create(mRS, mRes, "mono", Font.Style.NORMAL, 8);
 
         mTextAlloc = Allocation.createFromString(mRS, "String from allocation", Allocation.USAGE_SCRIPT);
 
@@ -330,7 +345,7 @@
 
         FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.torus);
         FileA3D.IndexEntry entry = model.getIndexEntry(0);
-        if (entry == null || entry.getClassID() != FileA3D.ClassID.MESH) {
+        if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
             Log.e("rs", "could not load model");
         } else {
             mTorus = (Mesh)entry.getObject();
@@ -340,8 +355,8 @@
 
     private void initSamplers() {
         Sampler.Builder bs = new Sampler.Builder(mRS);
-        bs.setMin(Sampler.Value.LINEAR);
-        bs.setMag(Sampler.Value.LINEAR);
+        bs.setMinification(Sampler.Value.LINEAR);
+        bs.setMagnification(Sampler.Value.LINEAR);
         bs.setWrapS(Sampler.Value.WRAP);
         bs.setWrapT(Sampler.Value.WRAP);
         mLinearWrap = bs.create();
@@ -351,8 +366,8 @@
         mMipLinearWrap = Sampler.WRAP_LINEAR_MIP_LINEAR(mRS);
 
         bs = new Sampler.Builder(mRS);
-        bs.setMin(Sampler.Value.LINEAR_MIP_LINEAR);
-        bs.setMag(Sampler.Value.LINEAR);
+        bs.setMinification(Sampler.Value.LINEAR_MIP_LINEAR);
+        bs.setMagnification(Sampler.Value.LINEAR);
         bs.setWrapS(Sampler.Value.WRAP);
         bs.setWrapT(Sampler.Value.WRAP);
         bs.setAnisotropy(8.0f);
diff --git a/libs/rs/java/tests/src/com/android/rs/test/RSTestCore.java b/libs/rs/java/tests/src/com/android/rs/test/RSTestCore.java
index 265e1d6..a50321e 100644
--- a/libs/rs/java/tests/src/com/android/rs/test/RSTestCore.java
+++ b/libs/rs/java/tests/src/com/android/rs/test/RSTestCore.java
@@ -94,7 +94,7 @@
 
         mScript.bind_gList(mListAllocs);
 
-        mFont = Font.createFromFamily(mRS, mRes, "serif", Font.Style.BOLD, 8);
+        mFont = Font.create(mRS, mRes, "serif", Font.Style.BOLD, 8);
         mScript.set_gFont(mFont);
 
         mRS.bindRootScript(mScript);
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 5daba08..a5810d4 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -47,7 +47,7 @@
 	param int32_t priority
 	}
 
-ContextDestroy {
+ContextDestroyWorker {
 }
 
 AssignName {
@@ -321,6 +321,7 @@
 	}
 
 ScriptCCreate {
+        param const char * packageName
         param const char * resName
         param const char * cacheDir
 	ret RsScript
@@ -420,7 +421,7 @@
 
 FontCreateFromFile {
 	param const char *name
-	param uint32_t fontSize
+	param float fontSize
 	param uint32_t dpi
 	ret RsFont
 	}
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index 77e8032..ec1f684 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -135,7 +135,6 @@
 }
 
 void Allocation::freeScriptMemory() {
-    rsAssert(!(mUsageFlags & RS_ALLOCATION_USAGE_SCRIPT));
     if (mPtr) {
         free(mPtr);
         mPtr = NULL;
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 2988950..22c73fe 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -509,20 +509,6 @@
      }
 
      LOGV("%p, RS Thread exiting", rsc);
-     if (rsc->mIsGraphicsContext) {
-         rsc->mRaster.clear();
-         rsc->mFragment.clear();
-         rsc->mVertex.clear();
-         rsc->mFragmentStore.clear();
-         rsc->mFont.clear();
-         rsc->mRootScript.clear();
-         rsc->mStateRaster.deinit(rsc);
-         rsc->mStateVertex.deinit(rsc);
-         rsc->mStateFragment.deinit(rsc);
-         rsc->mStateFragmentStore.deinit(rsc);
-         rsc->mStateFont.deinit(rsc);
-     }
-     ObjectBase::zeroAllUserRef(rsc);
 
      if (rsc->mIsGraphicsContext) {
          pthread_mutex_lock(&gInitMutex);
@@ -535,6 +521,25 @@
      return NULL;
 }
 
+void Context::destroyWorkerThreadResources() {
+    LOGV("destroyWorkerThreadResources 1");
+    if (mIsGraphicsContext) {
+         mRaster.clear();
+         mFragment.clear();
+         mVertex.clear();
+         mFragmentStore.clear();
+         mFont.clear();
+         mRootScript.clear();
+         mStateRaster.deinit(this);
+         mStateVertex.deinit(this);
+         mStateFragment.deinit(this);
+         mStateFragmentStore.deinit(this);
+         mStateFont.deinit(this);
+    }
+    ObjectBase::zeroAllUserRef(this);
+    LOGV("destroyWorkerThreadResources 2");
+}
+
 void * Context::helperThreadProc(void *vrsc) {
      Context *rsc = static_cast<Context *>(vrsc);
      uint32_t idx = (uint32_t)android_atomic_inc(&rsc->mWorkers.mLaunchCount);
@@ -725,6 +730,7 @@
         mDev = NULL;
     }
     pthread_mutex_unlock(&gInitMutex);
+    LOGV("Context::~Context done");
 }
 
 void Context::setSurface(uint32_t w, uint32_t h, ANativeWindow *sur) {
@@ -1019,14 +1025,23 @@
     ObjectBase::dumpAll(rsc);
 }
 
-void rsi_ContextDestroy(Context *rsc) {
+void rsi_ContextDestroyWorker(Context *rsc) {
+    LOGE("rsi_ContextDestroyWorker 1");
+    rsc->destroyWorkerThreadResources();;
+    LOGE("rsi_ContextDestroyWorker 2");
+}
+
+}
+}
+
+void rsContextDestroy(RsContext vcon) {
+    LOGV("rsContextDestroy %p", vcon);
+    Context *rsc = static_cast<Context *>(vcon);
+    rsContextDestroyWorker(rsc);
     delete rsc;
+    LOGV("rsContextDestroy 2 %p", vcon);
 }
 
-}
-}
-
-
 RsContext rsContextCreate(RsDevice vdev, uint32_t version) {
     LOGV("rsContextCreate %p", vdev);
     Device * dev = static_cast<Device *>(vdev);
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 49ee676..3c402c4 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -137,6 +137,7 @@
     void resume();
     void setSurface(uint32_t w, uint32_t h, ANativeWindow *sur);
     void setPriority(int32_t p);
+    void destroyWorkerThreadResources();
 
     void assignName(ObjectBase *obj, const char *name, uint32_t len);
     void removeName(ObjectBase *obj);
diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp
index 2fa1f0a..80bca43 100644
--- a/libs/rs/rsFont.cpp
+++ b/libs/rs/rsFont.cpp
@@ -40,20 +40,15 @@
     mFace = NULL;
 }
 
-bool Font::init(const char *name, uint32_t fontSize, uint32_t dpi) {
+bool Font::init(const char *name, float fontSize, uint32_t dpi) {
     if (mInitialized) {
         LOGE("Reinitialization of fonts not supported");
         return false;
     }
 
-    String8 fontsDir("/fonts/");
-    String8 fullPath(getenv("ANDROID_ROOT"));
-    fullPath += fontsDir;
-    fullPath += name;
-
-    FT_Error error = FT_New_Face(mRSC->mStateFont.getLib(), fullPath.string(), 0, &mFace);
+    FT_Error error = FT_New_Face(mRSC->mStateFont.getLib(), name, 0, &mFace);
     if (error) {
-        LOGE("Unable to initialize font %s", fullPath.string());
+        LOGE("Unable to initialize font %s", name);
         return false;
     }
 
@@ -61,9 +56,9 @@
     mFontSize = fontSize;
     mDpi = dpi;
 
-    error = FT_Set_Char_Size(mFace, fontSize * 64, 0, dpi, 0);
+    error = FT_Set_Char_Size(mFace, (FT_F26Dot6)(fontSize * 64.0f), 0, dpi, 0);
     if (error) {
-        LOGE("Unable to set font size on %s", fullPath.string());
+        LOGE("Unable to set font size on %s", name);
         return false;
     }
 
@@ -278,7 +273,7 @@
     return newGlyph;
 }
 
-Font * Font::create(Context *rsc, const char *name, uint32_t fontSize, uint32_t dpi) {
+Font * Font::create(Context *rsc, const char *name, float fontSize, uint32_t dpi) {
     rsc->mStateFont.checkInit();
     Vector<Font*> &activeFonts = rsc->mStateFont.mActiveFonts;
 
@@ -332,31 +327,20 @@
     // Get the gamma
     float gamma = DEFAULT_TEXT_GAMMA;
     if (property_get(PROPERTY_TEXT_GAMMA, property, NULL) > 0) {
-        LOGD("  Setting text gamma to %s", property);
         gamma = atof(property);
-    } else {
-        LOGD("  Using default text gamma of %.2f", DEFAULT_TEXT_GAMMA);
     }
 
     // Get the black gamma threshold
     int32_t blackThreshold = DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD;
     if (property_get(PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD, property, NULL) > 0) {
-        LOGD("  Setting text black gamma threshold to %s", property);
         blackThreshold = atoi(property);
-    } else {
-        LOGD("  Using default text black gamma threshold of %d",
-                DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD);
     }
     mBlackThreshold = (float)(blackThreshold) / 255.0f;
 
     // Get the white gamma threshold
     int32_t whiteThreshold = DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD;
     if (property_get(PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD, property, NULL) > 0) {
-        LOGD("  Setting text white gamma threshold to %s", property);
         whiteThreshold = atoi(property);
-    } else {
-        LOGD("  Using default white black gamma threshold of %d",
-                DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD);
     }
     mWhiteThreshold = (float)(whiteThreshold) / 255.0f;
 
@@ -735,7 +719,11 @@
     Font *currentFont = mRSC->getFont();
     if (!currentFont) {
         if (!mDefault.get()) {
-            mDefault.set(Font::create(mRSC, "DroidSans.ttf", 16, 96));
+            String8 fontsDir("/fonts/DroidSans.ttf");
+            String8 fullPath(getenv("ANDROID_ROOT"));
+            fullPath += fontsDir;
+
+            mDefault.set(Font::create(mRSC, fullPath.string(), 16, 96));
         }
         currentFont = mDefault.get();
     }
@@ -815,7 +803,7 @@
 namespace android {
 namespace renderscript {
 
-RsFont rsi_FontCreateFromFile(Context *rsc, char const *name, uint32_t fontSize, uint32_t dpi) {
+RsFont rsi_FontCreateFromFile(Context *rsc, char const *name, float fontSize, uint32_t dpi) {
     Font *newFont = Font::create(rsc, name, fontSize, dpi);
     if (newFont) {
         newFont->incUserRef();
diff --git a/libs/rs/rsFont.h b/libs/rs/rsFont.h
index 0f6815d..c24c9f1 100644
--- a/libs/rs/rsFont.h
+++ b/libs/rs/rsFont.h
@@ -73,7 +73,7 @@
         return RS_A3D_CLASS_ID_UNKNOWN;
     }
 
-    static Font * create(Context *rsc, const char *name, uint32_t fontSize, uint32_t dpi);
+    static Font * create(Context *rsc, const char *name, float fontSize, uint32_t dpi);
 
 protected:
 
@@ -112,11 +112,11 @@
     };
 
     String8 mFontName;
-    uint32_t mFontSize;
+    float mFontSize;
     uint32_t mDpi;
 
     Font(Context *rsc);
-    bool init(const char *name, uint32_t fontSize, uint32_t dpi);
+    bool init(const char *name, float fontSize, uint32_t dpi);
 
     FT_Face mFace;
     bool mInitialized;
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 0ae85cb..ef06033 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -20,6 +20,9 @@
 #include "../../compile/libbcc/include/bcc/bcc.h"
 #include "utils/Timers.h"
 #include "utils/StopWatch.h"
+extern "C" {
+#include "libdex/ZipArchive.h"
+}
 
 #include <GLES/gl.h>
 #include <GLES/glext.h>
@@ -34,13 +37,16 @@
 
 
 ScriptC::ScriptC(Context *rsc) : Script(rsc) {
+    LOGD(">>>> ScriptC ctor called, obj=%p", this);
     mBccScript = NULL;
     memset(&mProgram, 0, sizeof(mProgram));
 }
 
 ScriptC::~ScriptC() {
+    LOGD(">>>> ~ScriptC() mBccScript = %p", mBccScript);
     if (mBccScript) {
         bccDeleteScript(mBccScript);
+        LOGD(">>>> ~ScriptC(mBCCScript)");
     }
     free(mEnviroment.mScriptText);
     mEnviroment.mScriptText = NULL;
@@ -402,7 +408,12 @@
 extern const char rs_runtime_lib_bc[];
 extern unsigned rs_runtime_lib_bc_size;
 
-void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir) {
+void ScriptCState::runCompiler(Context *rsc,
+                               ScriptC *s,
+                               long modWhen,
+                               long crc32,
+                               const char *resName,
+                               const char *cacheDir) {
     {
         s->mBccScript = bccCreateScript();
         s->mEnviroment.mIsThreadable = true;
@@ -413,6 +424,8 @@
         if (bccReadBC(s->mBccScript,
                       s->mEnviroment.mScriptText,
                       s->mEnviroment.mScriptTextLength,
+                      modWhen,
+                      crc32,
                       resName,
                       cacheDir) >= 0) {
           //bccLinkBC(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size);
@@ -424,7 +437,9 @@
             bccReadBC(s->mBccScript,
                       s->mEnviroment.mScriptText,
                       s->mEnviroment.mScriptTextLength,
-                      NULL,
+                      modWhen,
+                      crc32,
+                      resName,
                       cacheDir);
             bccCompileBC(s->mBccScript);
           }
@@ -542,7 +557,11 @@
     ss->mScript->mEnviroment.mScriptTextLength = len;
 }
 
-RsScript rsi_ScriptCCreate(Context * rsc, const char *resName, const char *cacheDir)
+
+RsScript rsi_ScriptCCreate(Context *rsc,
+                           const char *packageName,
+                           const char *resName,
+                           const char *cacheDir)
 {
     ScriptCState *ss = &rsc->mScriptC;
 
@@ -550,7 +569,34 @@
     ss->mScript.clear();
     s->incUserRef();
 
-    ss->runCompiler(rsc, s.get(), resName, cacheDir);
+    // Open the apk and return the ZipArchive:
+    //  int dexZipOpenArchive(const char* fileName, ZipArchive* pArchive)
+    ZipArchive archive;
+    long modWhen;
+    long crc32;
+    if (!dexZipOpenArchive(packageName, &archive)) {  // Success
+      ZipEntry entry = dexZipFindEntry(&archive, resName);
+
+      int method;
+      size_t uncompLen;
+      size_t compLen;
+      off_t offset;
+      if (!dexZipGetEntryInfo(&archive,
+                              entry,
+                              &method,
+                              &uncompLen,
+                              &compLen,
+                              &offset,
+                              &modWhen,
+                              &crc32)) {
+      } else {
+        LOGI("Coudn't get entry info for the bitcode in an apk");
+      }
+    } else {
+      LOGI("Couldn't open the archive and read the bitcode");
+    }
+
+    ss->runCompiler(rsc, s.get(), modWhen, crc32, resName, cacheDir);
     ss->clear(rsc);
     return s.get();
 }
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index a714132..4cb5ade 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -83,7 +83,7 @@
     void init(Context *rsc);
 
     void clear(Context *rsc);
-    void runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir);
+    void runCompiler(Context *rsc, ScriptC *s, long modWhen, long crc32, const char *resName, const char *cacheDir);
 
     struct SymbolTable_t {
         const char * mName;
diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp
index fb5980a..48a0969 100644
--- a/libs/rs/rsScriptC_LibGL.cpp
+++ b/libs/rs/rsScriptC_LibGL.cpp
@@ -287,24 +287,6 @@
     static_cast<Allocation *>(va)->syncAll(rsc, source);
 }
 
-static void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel) {
-    CHECK_OBJ(va);
-    GET_TLS();
-    rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
-}
-
-static void SC_uploadToTexture(RsAllocation va) {
-    CHECK_OBJ(va);
-    GET_TLS();
-    rsi_AllocationUploadToTexture(rsc, va, false, 0);
-}
-
-static void SC_uploadToBufferObject(RsAllocation va) {
-    CHECK_OBJ(va);
-    GET_TLS();
-    rsi_AllocationUploadToBufferObject(rsc, va);
-}
-
 static void SC_ClearColor(float r, float g, float b, float a) {
     GET_TLS();
     rsc->setupProgramStore();
@@ -439,10 +421,6 @@
 
     { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_allocationSyncAll, false },
 
-    { "_Z18rsgUploadToTexture13rs_allocationj", (void *)&SC_uploadToTexture2, false },
-    { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture, false },
-    { "_Z23rsgUploadToBufferObject13rs_allocation", (void *)&SC_uploadToBufferObject, false },
-
     { "_Z11rsgDrawRectfffff", (void *)&SC_drawRect, false },
     { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_drawQuad, false },
     { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_drawQuadTexCoords, false },
diff --git a/libs/rs/scriptc/rs_graphics.rsh b/libs/rs/scriptc/rs_graphics.rsh
index 3e708aa..3868f24 100644
--- a/libs/rs/scriptc/rs_graphics.rsh
+++ b/libs/rs/scriptc/rs_graphics.rsh
@@ -38,13 +38,6 @@
     rsgAllocationSyncAll(rs_allocation);
 
 extern void __attribute__((overloadable))
-    rsgUploadToTexture(rs_allocation);
-extern void __attribute__((overloadable))
-    rsgUploadToTexture(rs_allocation, uint mipLevel);
-extern void __attribute__((overloadable))
-    rsgUploadToBufferObject(rs_allocation);
-
-extern void __attribute__((overloadable))
     rsgDrawRect(float x1, float y1, float x2, float y2, float z);
 extern void __attribute__((overloadable))
     rsgDrawQuad(float x1, float y1, float z1,
diff --git a/libs/ui/EventHub.cpp b/libs/ui/EventHub.cpp
index 8f4bac6..4e9fad0 100644
--- a/libs/ui/EventHub.cpp
+++ b/libs/ui/EventHub.cpp
@@ -755,14 +755,14 @@
         }
     }
     
-    // See if this is a trackball (or mouse).
+    // See if this is a cursor device such as a trackball or mouse.
     if (test_bit(BTN_MOUSE, key_bitmask)) {
         uint8_t rel_bitmask[sizeof_bit_array(REL_MAX + 1)];
         memset(rel_bitmask, 0, sizeof(rel_bitmask));
         LOGV("Getting relative controllers...");
         if (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(rel_bitmask)), rel_bitmask) >= 0) {
             if (test_bit(REL_X, rel_bitmask) && test_bit(REL_Y, rel_bitmask)) {
-                device->classes |= INPUT_DEVICE_CLASS_TRACKBALL;
+                device->classes |= INPUT_DEVICE_CLASS_CURSOR;
             }
         }
     }
diff --git a/libs/ui/InputDispatcher.cpp b/libs/ui/InputDispatcher.cpp
index ed0cb8e..0548e61 100644
--- a/libs/ui/InputDispatcher.cpp
+++ b/libs/ui/InputDispatcher.cpp
@@ -1443,11 +1443,11 @@
 #if DEBUG_DISPATCH_CYCLE
     LOGD("channel '%s' ~ prepareDispatchCycle - flags=%d, "
             "xOffset=%f, yOffset=%f, "
-            "windowType=%d, pointerIds=0x%x, "
+            "pointerIds=0x%x, "
             "resumeWithAppendedMotionSample=%s",
             connection->getInputChannelName(), inputTarget->flags,
             inputTarget->xOffset, inputTarget->yOffset,
-            inputTarget->windowType, inputTarget->pointerIds.value,
+            inputTarget->pointerIds.value,
             toString(resumeWithAppendedMotionSample));
 #endif
 
@@ -1826,8 +1826,8 @@
 void InputDispatcher::abortBrokenDispatchCycleLocked(nsecs_t currentTime,
         const sp<Connection>& connection) {
 #if DEBUG_DISPATCH_CYCLE
-    LOGD("channel '%s' ~ abortBrokenDispatchCycle - broken=%s",
-            connection->getInputChannelName(), toString(broken));
+    LOGD("channel '%s' ~ abortBrokenDispatchCycle",
+            connection->getInputChannelName());
 #endif
 
     // Clear the outbound queue.
diff --git a/libs/ui/InputReader.cpp b/libs/ui/InputReader.cpp
index 51ed09f..a11a010 100644
--- a/libs/ui/InputReader.cpp
+++ b/libs/ui/InputReader.cpp
@@ -239,9 +239,9 @@
         device->addMapper(new KeyboardInputMapper(device, keyboardSources, keyboardType));
     }
 
-    // Trackball-like devices.
-    if (classes & INPUT_DEVICE_CLASS_TRACKBALL) {
-        device->addMapper(new TrackballInputMapper(device));
+    // Cursor-like devices.
+    if (classes & INPUT_DEVICE_CLASS_CURSOR) {
+        device->addMapper(new CursorInputMapper(device));
     }
 
     // Touchscreen-like devices.
@@ -914,7 +914,7 @@
     if (policyFlags & POLICY_FLAG_FUNCTION) {
         newMetaState |= AMETA_FUNCTION_ON;
     }
-    getDispatcher()->notifyKey(when, getDeviceId(), AINPUT_SOURCE_KEYBOARD, policyFlags,
+    getDispatcher()->notifyKey(when, getDeviceId(), mSources, policyFlags,
             down ? AKEY_EVENT_ACTION_DOWN : AKEY_EVENT_ACTION_UP,
             AKEY_EVENT_FLAG_FROM_SYSTEM, keyCode, scanCode, newMetaState, downTime);
 }
@@ -983,36 +983,40 @@
 }
 
 
-// --- TrackballInputMapper ---
+// --- CursorInputMapper ---
 
-TrackballInputMapper::TrackballInputMapper(InputDevice* device) :
+CursorInputMapper::CursorInputMapper(InputDevice* device) :
         InputMapper(device) {
-    mXPrecision = TRACKBALL_MOVEMENT_THRESHOLD;
-    mYPrecision = TRACKBALL_MOVEMENT_THRESHOLD;
-    mXScale = 1.0f / TRACKBALL_MOVEMENT_THRESHOLD;
-    mYScale = 1.0f / TRACKBALL_MOVEMENT_THRESHOLD;
-
     initializeLocked();
 }
 
-TrackballInputMapper::~TrackballInputMapper() {
+CursorInputMapper::~CursorInputMapper() {
 }
 
-uint32_t TrackballInputMapper::getSources() {
-    return AINPUT_SOURCE_TRACKBALL;
+uint32_t CursorInputMapper::getSources() {
+    return mSources;
 }
 
-void TrackballInputMapper::populateDeviceInfo(InputDeviceInfo* info) {
+void CursorInputMapper::populateDeviceInfo(InputDeviceInfo* info) {
     InputMapper::populateDeviceInfo(info);
 
-    info->addMotionRange(AINPUT_MOTION_RANGE_X, -1.0f, 1.0f, 0.0f, mXScale);
-    info->addMotionRange(AINPUT_MOTION_RANGE_Y, -1.0f, 1.0f, 0.0f, mYScale);
+    if (mParameters.mode == Parameters::MODE_POINTER) {
+        float minX, minY, maxX, maxY;
+        if (mPointerController->getBounds(&minX, &minY, &maxX, &maxY)) {
+            info->addMotionRange(AINPUT_MOTION_RANGE_X, minX, maxX, 0.0f, 0.0f);
+            info->addMotionRange(AINPUT_MOTION_RANGE_Y, minY, maxY, 0.0f, 0.0f);
+        }
+    } else {
+        info->addMotionRange(AINPUT_MOTION_RANGE_X, -1.0f, 1.0f, 0.0f, mXScale);
+        info->addMotionRange(AINPUT_MOTION_RANGE_Y, -1.0f, 1.0f, 0.0f, mYScale);
+    }
+    info->addMotionRange(AINPUT_MOTION_RANGE_PRESSURE, 0.0f, 1.0f, 0.0f, 0.0f);
 }
 
-void TrackballInputMapper::dump(String8& dump) {
+void CursorInputMapper::dump(String8& dump) {
     { // acquire lock
         AutoMutex _l(mLock);
-        dump.append(INDENT2 "Trackball Input Mapper:\n");
+        dump.append(INDENT2 "Cursor Input Mapper:\n");
         dumpParameters(dump);
         dump.appendFormat(INDENT3 "XPrecision: %0.3f\n", mXPrecision);
         dump.appendFormat(INDENT3 "YPrecision: %0.3f\n", mYPrecision);
@@ -1021,37 +1025,79 @@
     } // release lock
 }
 
-void TrackballInputMapper::configure() {
+void CursorInputMapper::configure() {
     InputMapper::configure();
 
     // Configure basic parameters.
     configureParameters();
+
+    // Configure device mode.
+    switch (mParameters.mode) {
+    case Parameters::MODE_POINTER:
+        mSources = AINPUT_SOURCE_MOUSE;
+        mXPrecision = 1.0f;
+        mYPrecision = 1.0f;
+        mXScale = 1.0f;
+        mYScale = 1.0f;
+        mPointerController = getPolicy()->obtainPointerController(getDeviceId());
+        break;
+    case Parameters::MODE_NAVIGATION:
+        mSources = AINPUT_SOURCE_TRACKBALL;
+        mXPrecision = TRACKBALL_MOVEMENT_THRESHOLD;
+        mYPrecision = TRACKBALL_MOVEMENT_THRESHOLD;
+        mXScale = 1.0f / TRACKBALL_MOVEMENT_THRESHOLD;
+        mYScale = 1.0f / TRACKBALL_MOVEMENT_THRESHOLD;
+        break;
+    }
 }
 
-void TrackballInputMapper::configureParameters() {
+void CursorInputMapper::configureParameters() {
+    mParameters.mode = Parameters::MODE_POINTER;
+    String8 cursorModeString;
+    if (getDevice()->getConfiguration().tryGetProperty(String8("cursor.mode"), cursorModeString)) {
+        if (cursorModeString == "navigation") {
+            mParameters.mode = Parameters::MODE_NAVIGATION;
+        } else if (cursorModeString != "pointer" && cursorModeString != "default") {
+            LOGW("Invalid value for cursor.mode: '%s'", cursorModeString.string());
+        }
+    }
+
     mParameters.orientationAware = false;
-    getDevice()->getConfiguration().tryGetProperty(String8("trackball.orientationAware"),
+    getDevice()->getConfiguration().tryGetProperty(String8("cursor.orientationAware"),
             mParameters.orientationAware);
 
-    mParameters.associatedDisplayId = mParameters.orientationAware ? 0 : -1;
+    mParameters.associatedDisplayId = mParameters.mode == Parameters::MODE_POINTER
+            || mParameters.orientationAware ? 0 : -1;
 }
 
-void TrackballInputMapper::dumpParameters(String8& dump) {
+void CursorInputMapper::dumpParameters(String8& dump) {
     dump.append(INDENT3 "Parameters:\n");
     dump.appendFormat(INDENT4 "AssociatedDisplayId: %d\n",
             mParameters.associatedDisplayId);
+
+    switch (mParameters.mode) {
+    case Parameters::MODE_POINTER:
+        dump.append(INDENT4 "Mode: pointer\n");
+        break;
+    case Parameters::MODE_NAVIGATION:
+        dump.append(INDENT4 "Mode: navigation\n");
+        break;
+    default:
+        assert(false);
+    }
+
     dump.appendFormat(INDENT4 "OrientationAware: %s\n",
             toString(mParameters.orientationAware));
 }
 
-void TrackballInputMapper::initializeLocked() {
+void CursorInputMapper::initializeLocked() {
     mAccumulator.clear();
 
     mLocked.down = false;
     mLocked.downTime = 0;
 }
 
-void TrackballInputMapper::reset() {
+void CursorInputMapper::reset() {
     for (;;) {
         { // acquire lock
             AutoMutex _l(mLock);
@@ -1062,7 +1108,7 @@
             }
         } // release lock
 
-        // Synthesize trackball button up event on reset.
+        // Synthesize button up event on reset.
         nsecs_t when = systemTime(SYSTEM_TIME_MONOTONIC);
         mAccumulator.fields = Accumulator::FIELD_BTN_MOUSE;
         mAccumulator.btnMouse = false;
@@ -1072,7 +1118,7 @@
     InputMapper::reset();
 }
 
-void TrackballInputMapper::process(const RawEvent* rawEvent) {
+void CursorInputMapper::process(const RawEvent* rawEvent) {
     switch (rawEvent->type) {
     case EV_KEY:
         switch (rawEvent->scanCode) {
@@ -1109,7 +1155,7 @@
     }
 }
 
-void TrackballInputMapper::sync(nsecs_t when) {
+void CursorInputMapper::sync(nsecs_t when) {
     uint32_t fields = mAccumulator.fields;
     if (fields == 0) {
         return; // no new state changes, so nothing to do
@@ -1133,8 +1179,8 @@
         }
 
         downTime = mLocked.downTime;
-        float x = fields & Accumulator::FIELD_REL_X ? mAccumulator.relX * mXScale : 0.0f;
-        float y = fields & Accumulator::FIELD_REL_Y ? mAccumulator.relY * mYScale : 0.0f;
+        float deltaX = fields & Accumulator::FIELD_REL_X ? mAccumulator.relX * mXScale : 0.0f;
+        float deltaY = fields & Accumulator::FIELD_REL_Y ? mAccumulator.relY * mYScale : 0.0f;
 
         if (downChanged) {
             motionEventAction = mLocked.down ? AMOTION_EVENT_ACTION_DOWN : AMOTION_EVENT_ACTION_UP;
@@ -1142,18 +1188,8 @@
             motionEventAction = AMOTION_EVENT_ACTION_MOVE;
         }
 
-        pointerCoords.x = x;
-        pointerCoords.y = y;
-        pointerCoords.pressure = mLocked.down ? 1.0f : 0.0f;
-        pointerCoords.size = 0;
-        pointerCoords.touchMajor = 0;
-        pointerCoords.touchMinor = 0;
-        pointerCoords.toolMajor = 0;
-        pointerCoords.toolMinor = 0;
-        pointerCoords.orientation = 0;
-
         if (mParameters.orientationAware && mParameters.associatedDisplayId >= 0
-                && (x != 0.0f || y != 0.0f)) {
+                && (deltaX != 0.0f || deltaY != 0.0f)) {
             // Rotate motion based on display orientation if needed.
             // Note: getDisplayInfo is non-reentrant so we can continue holding the lock.
             int32_t orientation;
@@ -1165,35 +1201,54 @@
             float temp;
             switch (orientation) {
             case InputReaderPolicyInterface::ROTATION_90:
-                temp = pointerCoords.x;
-                pointerCoords.x = pointerCoords.y;
-                pointerCoords.y = - temp;
+                temp = deltaX;
+                deltaX = deltaY;
+                deltaY = -temp;
                 break;
 
             case InputReaderPolicyInterface::ROTATION_180:
-                pointerCoords.x = - pointerCoords.x;
-                pointerCoords.y = - pointerCoords.y;
+                deltaX = -deltaX;
+                deltaY = -deltaY;
                 break;
 
             case InputReaderPolicyInterface::ROTATION_270:
-                temp = pointerCoords.x;
-                pointerCoords.x = - pointerCoords.y;
-                pointerCoords.y = temp;
+                temp = deltaX;
+                deltaX = -deltaY;
+                deltaY = temp;
                 break;
             }
         }
+
+        if (mPointerController != NULL) {
+            mPointerController->move(deltaX, deltaY);
+            if (downChanged) {
+                mPointerController->setButtonState(mLocked.down ? POINTER_BUTTON_1 : 0);
+            }
+            mPointerController->getPosition(&pointerCoords.x, &pointerCoords.y);
+        } else {
+            pointerCoords.x = deltaX;
+            pointerCoords.y = deltaY;
+        }
+
+        pointerCoords.pressure = mLocked.down ? 1.0f : 0.0f;
+        pointerCoords.size = 0;
+        pointerCoords.touchMajor = 0;
+        pointerCoords.touchMinor = 0;
+        pointerCoords.toolMajor = 0;
+        pointerCoords.toolMinor = 0;
+        pointerCoords.orientation = 0;
     } // release lock
 
     int32_t metaState = mContext->getGlobalMetaState();
     int32_t pointerId = 0;
-    getDispatcher()->notifyMotion(when, getDeviceId(), AINPUT_SOURCE_TRACKBALL, 0,
+    getDispatcher()->notifyMotion(when, getDeviceId(), mSources, 0,
             motionEventAction, 0, metaState, AMOTION_EVENT_EDGE_FLAG_NONE,
             1, &pointerId, &pointerCoords, mXPrecision, mYPrecision, downTime);
 
     mAccumulator.clear();
 }
 
-int32_t TrackballInputMapper::getScanCodeState(uint32_t sourceMask, int32_t scanCode) {
+int32_t CursorInputMapper::getScanCodeState(uint32_t sourceMask, int32_t scanCode) {
     if (scanCode >= BTN_MOUSE && scanCode < BTN_JOYSTICK) {
         return getEventHub()->getScanCodeState(getDeviceId(), scanCode);
     } else {
@@ -1217,15 +1272,7 @@
 }
 
 uint32_t TouchInputMapper::getSources() {
-    switch (mParameters.deviceType) {
-    case Parameters::DEVICE_TYPE_TOUCH_SCREEN:
-        return AINPUT_SOURCE_TOUCHSCREEN;
-    case Parameters::DEVICE_TYPE_TOUCH_PAD:
-        return AINPUT_SOURCE_TOUCHPAD;
-    default:
-        assert(false);
-        return AINPUT_SOURCE_UNKNOWN;
-    }
+    return mSources;
 }
 
 void TouchInputMapper::populateDeviceInfo(InputDeviceInfo* info) {
@@ -1326,6 +1373,18 @@
     // Configure basic parameters.
     configureParameters();
 
+    // Configure sources.
+    switch (mParameters.deviceType) {
+    case Parameters::DEVICE_TYPE_TOUCH_SCREEN:
+        mSources = AINPUT_SOURCE_TOUCHSCREEN;
+        break;
+    case Parameters::DEVICE_TYPE_TOUCH_PAD:
+        mSources = AINPUT_SOURCE_TOUCHPAD;
+        break;
+    default:
+        assert(false);
+    }
+
     // Configure absolute axis information.
     configureRawAxes();
 
@@ -2560,7 +2619,7 @@
         yPrecision = mLocked.orientedYPrecision;
     } // release lock
 
-    getDispatcher()->notifyMotion(when, getDeviceId(), getSources(), policyFlags,
+    getDispatcher()->notifyMotion(when, getDeviceId(), mSources, policyFlags,
             motionEventAction, 0, getContext()->getGlobalMetaState(), motionEventEdgeFlags,
             pointerCount, pointerIds, pointerCoords,
             xPrecision, yPrecision, mDownTime);
diff --git a/libs/ui/tests/InputReader_test.cpp b/libs/ui/tests/InputReader_test.cpp
index 97cbc25..50d3383 100644
--- a/libs/ui/tests/InputReader_test.cpp
+++ b/libs/ui/tests/InputReader_test.cpp
@@ -30,6 +30,56 @@
 }
 
 
+// --- FakePointerController ---
+
+class FakePointerController : public PointerControllerInterface {
+    bool mHaveBounds;
+    float mMinX, mMinY, mMaxX, mMaxY;
+
+protected:
+    virtual ~FakePointerController() { }
+
+public:
+    FakePointerController() {
+    }
+
+    void setBounds(float minX, float minY, float maxX, float maxY) {
+        mHaveBounds = true;
+        mMinX = minX;
+        mMinY = minY;
+        mMaxX = maxX;
+        mMaxY = maxY;
+    }
+
+private:
+    virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
+        *outMinX = mMinX;
+        *outMaxX = mMinX;
+        *outMinY = mMinY;
+        *outMaxY = mMaxY;
+        return mHaveBounds;
+    }
+
+    virtual void move(float deltaX, float deltaY) {
+    }
+
+    virtual void setButtonState(uint32_t buttonState) {
+    }
+
+    virtual uint32_t getButtonState() const {
+        return 0;
+    }
+
+    virtual void setPosition(float x, float y) {
+    }
+
+    virtual void getPosition(float* outX, float* outY) const {
+        *outX = 0;
+        *outY = 0;
+    }
+};
+
+
 // --- FakeInputReaderPolicy ---
 
 class FakeInputReaderPolicy : public InputReaderPolicyInterface {
@@ -43,6 +93,7 @@
     bool mFilterTouchEvents;
     bool mFilterJumpyTouchEvents;
     Vector<String8> mExcludedDeviceNames;
+    KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
 
 protected:
     virtual ~FakeInputReaderPolicy() { }
@@ -78,6 +129,10 @@
         mExcludedDeviceNames.push(deviceName);
     }
 
+    void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
+        mPointerControllers.add(deviceId, controller);
+    }
+
 private:
     virtual bool getDisplayInfo(int32_t displayId,
             int32_t* width, int32_t* height, int32_t* orientation) {
@@ -109,6 +164,10 @@
     virtual void getExcludedDeviceNames(Vector<String8>& outExcludedDeviceNames) {
         outExcludedDeviceNames.appendVector(mExcludedDeviceNames);
     }
+
+    virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
+        return mPointerControllers.valueFor(deviceId);
+    }
 };
 
 
@@ -381,6 +440,11 @@
         device->configuration.addProperty(key, value);
     }
 
+    void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
+        Device* device = getDevice(deviceId);
+        device->configuration.addAll(configuration);
+    }
+
     void addAxis(int32_t deviceId, int axis,
             int32_t minValue, int32_t maxValue, int flat, int fuzz) {
         Device* device = getDevice(deviceId);
@@ -851,8 +915,12 @@
         mFakeEventHub.clear();
     }
 
-    void addDevice(int32_t deviceId, const String8& name, uint32_t classes) {
+    void addDevice(int32_t deviceId, const String8& name, uint32_t classes,
+            const PropertyMap* configuration) {
         mFakeEventHub->addDevice(deviceId, name, classes);
+        if (configuration) {
+            mFakeEventHub->addConfigurationMap(deviceId, configuration);
+        }
         mFakeEventHub->finishDeviceScan();
         mReader->loopOnce();
         mReader->loopOnce();
@@ -860,12 +928,13 @@
     }
 
     FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId,
-            const String8& name, uint32_t classes, uint32_t sources) {
+            const String8& name, uint32_t classes, uint32_t sources,
+            const PropertyMap* configuration) {
         InputDevice* device = new InputDevice(mReader.get(), deviceId, name);
         FakeInputMapper* mapper = new FakeInputMapper(device, sources);
         device->addMapper(mapper);
         mReader->setNextDevice(device);
-        addDevice(deviceId, name, classes);
+        addDevice(deviceId, name, classes, configuration);
         return mapper;
     }
 };
@@ -881,7 +950,7 @@
 
 TEST_F(InputReaderTest, GetInputConfiguration_WhenAlphabeticKeyboardPresent_ReturnsQwertyKeyboard) {
     ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("keyboard"),
-            INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_ALPHAKEY));
+            INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_ALPHAKEY, NULL));
 
     InputConfiguration config;
     mReader->getInputConfiguration(&config);
@@ -893,7 +962,7 @@
 
 TEST_F(InputReaderTest, GetInputConfiguration_WhenTouchScreenPresent_ReturnsFingerTouchScreen) {
     ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("touchscreen"),
-            INPUT_DEVICE_CLASS_TOUCHSCREEN));
+            INPUT_DEVICE_CLASS_TOUCHSCREEN, NULL));
 
     InputConfiguration config;
     mReader->getInputConfiguration(&config);
@@ -903,9 +972,25 @@
     ASSERT_EQ(InputConfiguration::TOUCHSCREEN_FINGER, config.touchScreen);
 }
 
+TEST_F(InputReaderTest, GetInputConfiguration_WhenMousePresent_ReturnsNoNavigation) {
+    PropertyMap configuration;
+    configuration.addProperty(String8("cursor.mode"), String8("pointer"));
+    ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("mouse"),
+            INPUT_DEVICE_CLASS_CURSOR, &configuration));
+
+    InputConfiguration config;
+    mReader->getInputConfiguration(&config);
+
+    ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
+    ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation);
+    ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
+}
+
 TEST_F(InputReaderTest, GetInputConfiguration_WhenTrackballPresent_ReturnsTrackballNavigation) {
+    PropertyMap configuration;
+    configuration.addProperty(String8("cursor.mode"), String8("navigation"));
     ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("trackball"),
-            INPUT_DEVICE_CLASS_TRACKBALL));
+            INPUT_DEVICE_CLASS_CURSOR, &configuration));
 
     InputConfiguration config;
     mReader->getInputConfiguration(&config);
@@ -917,7 +1002,7 @@
 
 TEST_F(InputReaderTest, GetInputConfiguration_WhenDPadPresent_ReturnsDPadNavigation) {
     ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("dpad"),
-            INPUT_DEVICE_CLASS_DPAD));
+            INPUT_DEVICE_CLASS_DPAD, NULL));
 
     InputConfiguration config;
     mReader->getInputConfiguration(&config);
@@ -929,7 +1014,7 @@
 
 TEST_F(InputReaderTest, GetInputDeviceInfo_WhenDeviceIdIsValid) {
     ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"),
-            INPUT_DEVICE_CLASS_KEYBOARD));
+            INPUT_DEVICE_CLASS_KEYBOARD, NULL));
 
     InputDeviceInfo info;
     status_t result = mReader->getInputDeviceInfo(1, &info);
@@ -950,7 +1035,7 @@
 }
 
 TEST_F(InputReaderTest, GetInputDeviceInfo_WhenDeviceIdIsIgnored) {
-    addDevice(1, String8("ignored"), 0); // no classes so device will be ignored
+    addDevice(1, String8("ignored"), 0, NULL); // no classes so device will be ignored
 
     InputDeviceInfo info;
     status_t result = mReader->getInputDeviceInfo(1, &info);
@@ -960,9 +1045,9 @@
 
 TEST_F(InputReaderTest, GetInputDeviceIds) {
     ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"),
-            INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_ALPHAKEY));
-    ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("trackball"),
-            INPUT_DEVICE_CLASS_TRACKBALL));
+            INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_ALPHAKEY, NULL));
+    ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("mouse"),
+            INPUT_DEVICE_CLASS_CURSOR, NULL));
 
     Vector<int32_t> ids;
     mReader->getInputDeviceIds(ids);
@@ -975,7 +1060,7 @@
 TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
     FakeInputMapper* mapper = NULL;
     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
-            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
+            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
     mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
 
     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
@@ -1002,7 +1087,7 @@
 TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
     FakeInputMapper* mapper = NULL;
     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
-            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
+            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
     mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
 
     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
@@ -1029,7 +1114,7 @@
 TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
     FakeInputMapper* mapper = NULL;
     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
-            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
+            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
     mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
 
     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
@@ -1056,7 +1141,7 @@
 TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
     FakeInputMapper* mapper = NULL;
     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
-            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
+            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
     mapper->addSupportedKeyCode(AKEYCODE_A);
     mapper->addSupportedKeyCode(AKEYCODE_B);
 
@@ -1089,7 +1174,7 @@
 }
 
 TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
-    addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD);
+    addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD, NULL);
 
     FakeInputDispatcher::NotifyConfigurationChangedArgs args;
     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyConfigurationChangedWasCalled(&args));
@@ -1099,7 +1184,7 @@
 TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
     FakeInputMapper* mapper = NULL;
     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
-            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
+            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
 
     mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, AKEYCODE_A, 1, POLICY_FLAG_WAKE);
     mReader->loopOnce();
@@ -1792,19 +1877,28 @@
 }
 
 
-// --- TrackballInputMapperTest ---
+// --- CursorInputMapperTest ---
 
-class TrackballInputMapperTest : public InputMapperTest {
+class CursorInputMapperTest : public InputMapperTest {
 protected:
     static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
 
-    void testMotionRotation(TrackballInputMapper* mapper,
+    sp<FakePointerController> mFakePointerController;
+
+    virtual void SetUp() {
+        InputMapperTest::SetUp();
+
+        mFakePointerController = new FakePointerController();
+        mFakePolicy->setPointerController(DEVICE_ID, mFakePointerController);
+    }
+
+    void testMotionRotation(CursorInputMapper* mapper,
             int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
 };
 
-const int32_t TrackballInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
+const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
 
-void TrackballInputMapperTest::testMotionRotation(TrackballInputMapper* mapper,
+void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
         int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
     FakeInputDispatcher::NotifyMotionArgs args;
 
@@ -1819,15 +1913,53 @@
             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
 }
 
-TEST_F(TrackballInputMapperTest, GetSources) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
+TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "pointer");
+    addMapperAndConfigure(mapper);
+
+    ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
+}
+
+TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
     addMapperAndConfigure(mapper);
 
     ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
 }
 
-TEST_F(TrackballInputMapperTest, PopulateDeviceInfo) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
+TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "pointer");
+    addMapperAndConfigure(mapper);
+
+    InputDeviceInfo info;
+    mapper->populateDeviceInfo(&info);
+
+    // Initially there may not be a valid motion range.
+    ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_X));
+    ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_Y));
+    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, AINPUT_MOTION_RANGE_PRESSURE,
+            0.0f, 1.0f, 0.0f, 1.0f));
+
+    // When the bounds are set, then there should be a valid motion range.
+    mFakePointerController->setBounds(1, 2, 800, 480);
+
+    InputDeviceInfo info2;
+    mapper->populateDeviceInfo(&info2);
+
+    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, AINPUT_MOTION_RANGE_X,
+            1, 800, 0.0f, 1.0f));
+    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, AINPUT_MOTION_RANGE_Y,
+            2, 480, 0.0f, 1.0f));
+    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, AINPUT_MOTION_RANGE_PRESSURE,
+            0.0f, 1.0f, 0.0f, 1.0f));
+}
+
+TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
     addMapperAndConfigure(mapper);
 
     InputDeviceInfo info;
@@ -1839,8 +1971,9 @@
             -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
 }
 
-TEST_F(TrackballInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
+TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
     addMapperAndConfigure(mapper);
 
     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
@@ -1887,8 +2020,9 @@
     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
 }
 
-TEST_F(TrackballInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
+TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
     addMapperAndConfigure(mapper);
 
     FakeInputDispatcher::NotifyMotionArgs args;
@@ -1911,8 +2045,9 @@
             0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
 }
 
-TEST_F(TrackballInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
+TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
     addMapperAndConfigure(mapper);
 
     FakeInputDispatcher::NotifyMotionArgs args;
@@ -1932,8 +2067,9 @@
             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
 }
 
-TEST_F(TrackballInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
+TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
     addMapperAndConfigure(mapper);
 
     FakeInputDispatcher::NotifyMotionArgs args;
@@ -1967,8 +2103,9 @@
             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
 }
 
-TEST_F(TrackballInputMapperTest, Reset_WhenButtonIsNotDown_ShouldNotSynthesizeButtonUp) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
+TEST_F(CursorInputMapperTest, Reset_WhenButtonIsNotDown_ShouldNotSynthesizeButtonUp) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
     addMapperAndConfigure(mapper);
 
     FakeInputDispatcher::NotifyMotionArgs args;
@@ -1987,8 +2124,9 @@
     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasNotCalled());
 }
 
-TEST_F(TrackballInputMapperTest, Reset_WhenButtonIsDown_ShouldSynthesizeButtonUp) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
+TEST_F(CursorInputMapperTest, Reset_WhenButtonIsDown_ShouldSynthesizeButtonUp) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
     addMapperAndConfigure(mapper);
 
     FakeInputDispatcher::NotifyMotionArgs args;
@@ -2006,8 +2144,9 @@
             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
 }
 
-TEST_F(TrackballInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
+TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
     addMapperAndConfigure(mapper);
 
     mFakePolicy->setDisplayInfo(DISPLAY_ID,
@@ -2023,9 +2162,10 @@
     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1,  1));
 }
 
-TEST_F(TrackballInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
-    TrackballInputMapper* mapper = new TrackballInputMapper(mDevice);
-    addConfigurationProperty("trackball.orientationAware", "1");
+TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
+    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
+    addConfigurationProperty("cursor.mode", "navigation");
+    addConfigurationProperty("cursor.orientationAware", "1");
     addMapperAndConfigure(mapper);
 
     mFakePolicy->setDisplayInfo(DISPLAY_ID,
diff --git a/libs/utils/PropertyMap.cpp b/libs/utils/PropertyMap.cpp
index fd7edec..d472d45 100644
--- a/libs/utils/PropertyMap.cpp
+++ b/libs/utils/PropertyMap.cpp
@@ -109,6 +109,12 @@
     return true;
 }
 
+void PropertyMap::addAll(const PropertyMap* map) {
+    for (size_t i = 0; i < map->mProperties.size(); i++) {
+        mProperties.add(map->mProperties.keyAt(i), map->mProperties.valueAt(i));
+    }
+}
+
 status_t PropertyMap::load(const String8& filename, PropertyMap** outMap) {
     *outMap = NULL;
 
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 39c4a28..db308c7 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -188,11 +188,12 @@
 
         /** The following formats are audio only .aac or .amr formats **/
         /** @deprecated  Deprecated in favor of AMR_NB */
-        /** TODO: change link when AMR_NB is exposed. Deprecated in favor of MediaRecorder.OutputFormat.AMR_NB */
+        /** Deprecated in favor of MediaRecorder.OutputFormat.AMR_NB */
+        /** AMR NB file format */
         public static final int RAW_AMR = 3;
-        /** @hide AMR NB file format */
+        /** AMR NB file format */
         public static final int AMR_NB = 3;
-        /** @hide AMR WB file format */
+        /** AMR WB file format */
         public static final int AMR_WB = 4;
         /** @hide AAC ADIF file format */
         public static final int AAC_ADIF = 5;
@@ -218,9 +219,9 @@
         public static final int DEFAULT = 0;
         /** AMR (Narrowband) audio codec */
         public static final int AMR_NB = 1;
-        /** @hide AMR (Wideband) audio codec */
+        /** AMR (Wideband) audio codec */
         public static final int AMR_WB = 2;
-        /** @hide AAC audio codec */
+        /** AAC audio codec */
         public static final int AAC = 3;
         /** @hide enhanced AAC audio codec */
         public static final int AAC_PLUS = 4;
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 63ec6b2..ae6dd61 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -388,7 +388,14 @@
         String prop = SystemProperties.get("drm.service.enabled");
         return prop != null && prop.equals("true");
     }
-    
+
+    private final String mediaToExternalPath(String path) {
+        if (mMediaStoragePath != null && path.startsWith(mMediaStoragePath)) {
+            path = mExternalStoragePath + path.substring(mMediaStoragePath.length());
+        }
+        return path;
+    }
+
     private class MyMediaScannerClient implements MediaScannerClient {
 
         private String mArtist;
@@ -407,70 +414,74 @@
         private long mFileSize;
         private String mWriter;
 
-        public FileCacheEntry beginFile(String path, String mimeType, long lastModified, long fileSize) {
-
-            // special case certain file names
-            // I use regionMatches() instead of substring() below
-            // to avoid memory allocation
-            int lastSlash = path.lastIndexOf('/');
-            if (lastSlash >= 0 && lastSlash + 2 < path.length()) {
-                // ignore those ._* files created by MacOS
-                if (path.regionMatches(lastSlash + 1, "._", 0, 2)) {
-                    return null;
-                }
-
-                // ignore album art files created by Windows Media Player:
-                // Folder.jpg, AlbumArtSmall.jpg, AlbumArt_{...}_Large.jpg and AlbumArt_{...}_Small.jpg
-                if (path.regionMatches(true, path.length() - 4, ".jpg", 0, 4)) {
-                    if (path.regionMatches(true, lastSlash + 1, "AlbumArt_{", 0, 10) ||
-                            path.regionMatches(true, lastSlash + 1, "AlbumArt.", 0, 9)) {
-                        return null;
-                    }
-                    int length = path.length() - lastSlash - 1;
-                    if ((length == 17 && path.regionMatches(true, lastSlash + 1, "AlbumArtSmall", 0, 13)) ||
-                            (length == 10 && path.regionMatches(true, lastSlash + 1, "Folder", 0, 6))) {
-                        return null;
-                    }
-                }
-            }
-
+        public FileCacheEntry beginFile(String path, String mimeType, long lastModified,
+                long fileSize, boolean isDirectory) {
             mMimeType = mimeType;
             mFileType = 0;
             mFileSize = fileSize;
 
-            // try mimeType first, if it is specified
-            if (mimeType != null) {
-                mFileType = MediaFile.getFileTypeForMimeType(mimeType);
-            }
-
-            // if mimeType was not specified, compute file type based on file extension.
-            if (mFileType == 0) {
-                MediaFile.MediaFileType mediaFileType = MediaFile.getFileType(path);
-                if (mediaFileType != null) {
-                    mFileType = mediaFileType.fileType;
-                    if (mMimeType == null) {
-                        mMimeType = mediaFileType.mimeType;
+            if (!isDirectory) {
+                // special case certain file names
+                // I use regionMatches() instead of substring() below
+                // to avoid memory allocation
+                int lastSlash = path.lastIndexOf('/');
+                if (lastSlash >= 0 && lastSlash + 2 < path.length()) {
+                    // ignore those ._* files created by MacOS
+                    if (path.regionMatches(lastSlash + 1, "._", 0, 2)) {
+                        return null;
                     }
+
+                    // ignore album art files created by Windows Media Player:
+                    // Folder.jpg, AlbumArtSmall.jpg, AlbumArt_{...}_Large.jpg
+                    // and AlbumArt_{...}_Small.jpg
+                    if (path.regionMatches(true, path.length() - 4, ".jpg", 0, 4)) {
+                        if (path.regionMatches(true, lastSlash + 1, "AlbumArt_{", 0, 10) ||
+                                path.regionMatches(true, lastSlash + 1, "AlbumArt.", 0, 9)) {
+                            return null;
+                        }
+                        int length = path.length() - lastSlash - 1;
+                        if ((length == 17 && path.regionMatches(
+                                true, lastSlash + 1, "AlbumArtSmall", 0, 13)) ||
+                                (length == 10
+                                 && path.regionMatches(true, lastSlash + 1, "Folder", 0, 6))) {
+                            return null;
+                        }
+                    }
+                }
+
+                // try mimeType first, if it is specified
+                if (mimeType != null) {
+                    mFileType = MediaFile.getFileTypeForMimeType(mimeType);
+                }
+
+                // if mimeType was not specified, compute file type based on file extension.
+                if (mFileType == 0) {
+                    MediaFile.MediaFileType mediaFileType = MediaFile.getFileType(path);
+                    if (mediaFileType != null) {
+                        mFileType = mediaFileType.fileType;
+                        if (mMimeType == null) {
+                            mMimeType = mediaFileType.mimeType;
+                        }
+                    }
+                }
+
+                if (isDrmEnabled() && MediaFile.isDrmFileType(mFileType)) {
+                    mFileType = getFileTypeFromDrm(path);
                 }
             }
 
-            if (isDrmEnabled() && MediaFile.isDrmFileType(mFileType)) {
-                mFileType = getFileTypeFromDrm(path);
-            }
-
-            String key = path;
-            if (mMediaStoragePath != null && key.startsWith(mMediaStoragePath)) {
-                // MediaProvider uses external variant of path for _data, so we need to match
-                // against that path instead.
-                key = mExternalStoragePath + key.substring(mMediaStoragePath.length());
-            }
+            // MediaProvider uses external variant of path for _data, so we need to match
+            // against that path instead.
+            String key = mediaToExternalPath(path);
             if (mCaseInsensitivePaths) {
                 key = path.toLowerCase();
             }
             FileCacheEntry entry = mFileCache.get(key);
             if (entry == null) {
                 Uri tableUri;
-                if (MediaFile.isVideoFileType(mFileType)) {
+                if (isDirectory) {
+                    tableUri = mFilesUri;
+                } else if (MediaFile.isVideoFileType(mFileType)) {
                     tableUri = mVideoUri;
                 } else if (MediaFile.isImageFileType(mFileType)) {
                     tableUri = mImagesUri;
@@ -479,7 +490,8 @@
                 } else {
                     tableUri = mFilesUri;
                 }
-                entry = new FileCacheEntry(tableUri, 0, path, 0, 0);
+                entry = new FileCacheEntry(tableUri, 0, path, 0,
+                        (isDirectory ? MtpConstants.FORMAT_ASSOCIATION : 0));
                 mFileCache.put(key, entry);
             }
             entry.mSeenInFileSystem = true;
@@ -514,22 +526,19 @@
             return entry;
         }
 
-        public void scanFile(String path, long lastModified, long fileSize) {
+        public void scanFile(String path, long lastModified, long fileSize, boolean isDirectory) {
             // This is the callback funtion from native codes.
             // Log.v(TAG, "scanFile: "+path);
-            doScanFile(path, null, lastModified, fileSize, false);
-        }
-
-        public void scanFile(String path, String mimeType, long lastModified, long fileSize) {
-            doScanFile(path, mimeType, lastModified, fileSize, false);
+            doScanFile(path, null, lastModified, fileSize, isDirectory, false);
         }
 
         public Uri doScanFile(String path, String mimeType, long lastModified,
-                long fileSize, boolean scanAlways) {
+                long fileSize, boolean isDirectory, boolean scanAlways) {
             Uri result = null;
 //            long t1 = System.currentTimeMillis();
             try {
-                FileCacheEntry entry = beginFile(path, mimeType, lastModified, fileSize);
+                FileCacheEntry entry = beginFile(path, mimeType, lastModified,
+                        fileSize, isDirectory);
                 // rescan for metadata if file was modified since last scan
                 if (entry != null && (entry.mLastModifiedChanged || scanAlways)) {
                     String lowpath = path.toLowerCase();
@@ -775,7 +784,11 @@
                     values.put(MediaStore.MediaColumns.MEDIA_SCANNER_NEW_OBJECT_ID, mMtpObjectHandle);
                 }
                 if (tableUri == mFilesUri) {
-                    values.put(Files.FileColumns.FORMAT, MediaFile.getFormatCode(entry.mPath, mMimeType));
+                    int format = entry.mFormat;
+                    if (format == 0) {
+                        format = MediaFile.getFormatCode(entry.mPath, mMimeType);
+                    }
+                    values.put(Files.FileColumns.FORMAT, format);
                 }
                 // new file, insert it
                 result = mMediaProvider.insert(tableUri, values);
@@ -872,6 +885,8 @@
         }
 
         public void addNoMediaFolder(String path) {
+            path = mediaToExternalPath(path);
+
             ContentValues values = new ContentValues();
             values.put(MediaStore.Images.ImageColumns.DATA, "");
             String [] pathSpec = new String[] {path + '%'};
@@ -930,11 +945,9 @@
         }
 
         if (filePath != null) {
-            if (mMediaStoragePath != null && filePath.startsWith(mMediaStoragePath)) {
-                // MediaProvider uses external variant of path for _data, so we need to query
-                // using that path instead.
-                filePath = mExternalStoragePath + filePath.substring(mMediaStoragePath.length());
-            }
+            // MediaProvider uses external variant of path for _data, so we need to query
+            // using that path instead.
+            filePath = mediaToExternalPath(filePath);
 
             // query for only one file
             where = Files.FileColumns.DATA + "=?";
@@ -1060,8 +1073,7 @@
             boolean fileMissing = false;
 
             if (!entry.mSeenInFileSystem && !MtpConstants.isAbstractObject(entry.mFormat)) {
-                if (entry.mFormat != MtpConstants.FORMAT_ASSOCIATION &&
-                        inScanDirectory(path, directories)) {
+                if (inScanDirectory(path, directories)) {
                     // we didn't see this file in the scan directory.
                     fileMissing = true;
                 } else {
@@ -1180,7 +1192,7 @@
             long lastModifiedSeconds = file.lastModified() / 1000;
 
             // always scan the file, so we can return the content://media Uri for existing files
-            return mClient.doScanFile(path, mimeType, lastModifiedSeconds, file.length(), true);
+            return mClient.doScanFile(path, mimeType, lastModifiedSeconds, file.length(),false, true);
         } catch (RemoteException e) {
             Log.e(TAG, "RemoteException in MediaScanner.scanFile()", e);
             return null;
@@ -1204,12 +1216,9 @@
                 // build file cache so we can look up tracks in the playlist
                 prescan(null, true);
 
-                String key = path;
-                if (mMediaStoragePath != null && key.startsWith(mMediaStoragePath)) {
-                    // MediaProvider uses external variant of path for _data, so we need to match
-                    // against that path instead.
-                    key = mExternalStoragePath + key.substring(mMediaStoragePath.length());
-                }
+                // MediaProvider uses external variant of path for _data, so we need to match
+                // against that path instead.
+                String key = mediaToExternalPath(path);
                 if (mCaseInsensitivePaths) {
                     key = path.toLowerCase();
                 }
@@ -1227,7 +1236,8 @@
                 long lastModifiedSeconds = file.lastModified() / 1000;
 
                 // always scan the file, so we can return the content://media Uri for existing files
-                mClient.doScanFile(path, mediaFileType.mimeType, lastModifiedSeconds, file.length(), true);
+                mClient.doScanFile(path, mediaFileType.mimeType, lastModifiedSeconds, file.length(),
+                    (format == MtpConstants.FORMAT_ASSOCIATION), true);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "RemoteException in MediaScanner.scanFile()", e);
diff --git a/media/java/android/media/MediaScannerClient.java b/media/java/android/media/MediaScannerClient.java
index 258c3b4..ac326ef 100644
--- a/media/java/android/media/MediaScannerClient.java
+++ b/media/java/android/media/MediaScannerClient.java
@@ -21,9 +21,7 @@
  */
 public interface MediaScannerClient
 {    
-    public void scanFile(String path, long lastModified, long fileSize);
-    
-    public void scanFile(String path, String mimeType, long lastModified, long fileSize);
+    public void scanFile(String path, long lastModified, long fileSize, boolean isDirectory);
 
     public void addNoMediaFolder(String path);
 
diff --git a/media/jni/Android.mk b/media/jni/Android.mk
index fbdfa67..d3604b0 100644
--- a/media/jni/Android.mk
+++ b/media/jni/Android.mk
@@ -9,10 +9,10 @@
     android_media_ResampleInputStream.cpp \
     android_media_MediaProfiles.cpp \
     android_media_AmrInputStream.cpp \
-	android_media_MtpDatabase.cpp \
-	android_media_MtpServer.cpp \
-	android_media_PtpClient.cpp \
-	android_media_PtpCursor.cpp \
+    android_media_MtpDatabase.cpp \
+    android_media_MtpServer.cpp \
+    android_media_PtpClient.cpp \
+    android_media_PtpCursor.cpp \
 
 LOCAL_SHARED_LIBRARIES := \
     libandroid_runtime \
@@ -26,11 +26,9 @@
     libsurfaceflinger_client \
     libstagefright \
     libcamera_client \
-	libsqlite
-
-ifneq ($(TARGET_SIMULATOR),true)
-LOCAL_STATIC_LIBRARIES := libmtp libusbhost
-endif
+    libsqlite \
+    libmtp \
+    libusbhost
 
 LOCAL_C_INCLUDES += \
     external/tremor/Tremor \
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index 9662817..4ccdd9a 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -22,6 +22,20 @@
 #include <utils/Log.h>
 #include <utils/threads.h>
 #include <core/SkBitmap.h>
+
+// Please do not enable "USE_PRIVATE_NATIVE_BITMAP_CONSTUCTOR"
+// This mode will be removed and it is kept here for
+// convenient comparsion just in case. Will be removed soon.
+// Tests show that this mode is also ~30ms slower,
+// when rotation is involved.
+#define USE_PRIVATE_NATIVE_BITMAP_CONSTUCTOR 0
+
+#if (!USE_PRIVATE_NATIVE_BITMAP_CONSTUCTOR)
+#include <core/SkCanvas.h>
+#include <core/SkDevice.h>
+#include <core/SkScalar.h>
+#endif
+
 #include <media/mediametadataretriever.h>
 #include <private/media/VideoFrame.h>
 
@@ -35,8 +49,15 @@
 struct fields_t {
     jfieldID context;
     jclass bitmapClazz;
+#if USE_PRIVATE_NATIVE_BITMAP_CONSTUCTOR
     jmethodID bitmapConstructor;
+    jmethodID createBitmapRotationMethod;
+#else
+    jfieldID nativeBitmap;
     jmethodID createBitmapMethod;
+    jclass configClazz;
+    jmethodID createConfigMethod;
+#endif
 };
 
 static fields_t fields;
@@ -162,6 +183,12 @@
         return NULL;
     }
 
+    LOGV("Dimension = %dx%d and bytes = %d",
+            videoFrame->mDisplayWidth,
+            videoFrame->mDisplayHeight,
+            videoFrame->mSize);
+
+#if USE_PRIVATE_NATIVE_BITMAP_CONSTUCTOR
     jobject matrix = NULL;
     if (videoFrame->mRotationAngle != 0) {
         LOGD("Create a rotation matrix: %d degrees", videoFrame->mRotationAngle);
@@ -217,9 +244,9 @@
     jobject jSrcBitmap = env->NewObject(fields.bitmapClazz,
             fields.bitmapConstructor, (int) bitmap, NULL, true, NULL, -1);
 
-    LOGV("Return a new bitmap constructed with the rotation matrix");
-    return env->CallStaticObjectMethod(
-                fields.bitmapClazz, fields.createBitmapMethod,
+    jobject jBitmap = env->CallStaticObjectMethod(
+                fields.bitmapClazz,
+                fields.createBitmapRotationMethod,
                 jSrcBitmap,                     // source Bitmap
                 0,                              // x
                 0,                              // y
@@ -227,6 +254,39 @@
                 videoFrame->mDisplayHeight,     // height
                 matrix,                         // transform matrix
                 false);                         // filter
+
+#else
+
+    jobject config = env->CallStaticObjectMethod(
+                        fields.configClazz,
+                        fields.createConfigMethod,
+                        SkBitmap::kRGB_565_Config);
+
+    jobject jBitmap = env->CallStaticObjectMethod(
+                            fields.bitmapClazz,
+                            fields.createBitmapMethod,
+                            videoFrame->mDisplayWidth,
+                            videoFrame->mDisplayHeight,
+                            config);
+    SkBitmap *bitmap =
+            (SkBitmap *) env->GetIntField(jBitmap, fields.nativeBitmap);
+
+    bitmap->lockPixels();
+
+    memcpy((uint8_t*)bitmap->getPixels(),
+            (uint8_t*)videoFrame + sizeof(VideoFrame), videoFrame->mSize);
+
+    bitmap->unlockPixels();
+
+    if (videoFrame->mRotationAngle != 0) {
+        SkDevice device(*bitmap);
+        SkCanvas canvas(&device);
+        canvas.rotate((SkScalar) (videoFrame->mRotationAngle * 1.0));
+        canvas.drawBitmap(*bitmap, 0, 0);
+    }
+#endif
+    LOGV("Return a new bitmap constructed with the rotation matrix");
+    return jBitmap;
 }
 
 static jbyteArray android_media_MediaMetadataRetriever_extractAlbumArt(JNIEnv *env, jobject thiz)
@@ -293,7 +353,6 @@
 static void android_media_MediaMetadataRetriever_native_finalize(JNIEnv *env, jobject thiz)
 {
     LOGV("native_finalize");
-    
     // No lock is needed, since android_media_MediaMetadataRetriever_release() is protected
     android_media_MediaMetadataRetriever_release(env, thiz);
 }
@@ -320,21 +379,52 @@
         jniThrowException(env, "java/lang/RuntimeException", "Can't find android/graphics/Bitmap");
         return;
     }
-
+#if USE_PRIVATE_NATIVE_BITMAP_CONSTUCTOR
     fields.bitmapConstructor = env->GetMethodID(fields.bitmapClazz, "<init>", "(I[BZ[BI)V");
     if (fields.bitmapConstructor == NULL) {
         jniThrowException(env, "java/lang/RuntimeException", "Can't find Bitmap constructor");
         return;
     }
-    fields.createBitmapMethod =
+    fields.createBitmapRotationMethod =
             env->GetStaticMethodID(fields.bitmapClazz, "createBitmap",
                     "(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)"
                     "Landroid/graphics/Bitmap;");
-    if (fields.createBitmapMethod == NULL) {
+    if (fields.createBitmapRotationMethod == NULL) {
         jniThrowException(env, "java/lang/RuntimeException",
                 "Can't find Bitmap.createBitmap method");
         return;
     }
+#else
+    fields.createBitmapMethod =
+            env->GetStaticMethodID(fields.bitmapClazz, "createBitmap",
+                    "(IILandroid/graphics/Bitmap$Config;)"
+                    "Landroid/graphics/Bitmap;");
+    if (fields.createBitmapMethod == NULL) {
+        jniThrowException(env, "java/lang/RuntimeException",
+                "Can't find Bitmap.createBitmap(int, int, Config)  method");
+        return;
+    }
+    fields.nativeBitmap = env->GetFieldID(fields.bitmapClazz, "mNativeBitmap", "I");
+    if (fields.nativeBitmap == NULL) {
+        jniThrowException(env, "java/lang/RuntimeException",
+                "Can't find Bitmap.mNativeBitmap field");
+    }
+
+    fields.configClazz = env->FindClass("android/graphics/Bitmap$Config");
+    if (fields.configClazz == NULL) {
+        jniThrowException(env, "java/lang/RuntimeException",
+                               "Can't find Bitmap$Config class");
+        return;
+    }
+    fields.createConfigMethod =
+            env->GetStaticMethodID(fields.configClazz, "nativeToConfig",
+                    "(I)Landroid/graphics/Bitmap$Config;");
+    if (fields.createConfigMethod == NULL) {
+        jniThrowException(env, "java/lang/RuntimeException",
+                "Can't find Bitmap$Config.nativeToConfig(int)  method");
+        return;
+    }
+#endif
 }
 
 static void android_media_MediaMetadataRetriever_native_setup(JNIEnv *env, jobject thiz)
diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp
index fd0b233..a5176fa 100644
--- a/media/jni/android_media_MediaScanner.cpp
+++ b/media/jni/android_media_MediaScanner.cpp
@@ -62,7 +62,7 @@
         }
         else {
             mScanFileMethodID = env->GetMethodID(mediaScannerClientInterface, "scanFile",
-                                                     "(Ljava/lang/String;JJ)V");
+                                                     "(Ljava/lang/String;JJZ)V");
             mHandleStringTagMethodID = env->GetMethodID(mediaScannerClientInterface, "handleStringTag",
                                                      "(Ljava/lang/String;Ljava/lang/String;)V");
             mSetMimeTypeMethodID = env->GetMethodID(mediaScannerClientInterface, "setMimeType",
@@ -78,12 +78,14 @@
     }
     
     // returns true if it succeeded, false if an exception occured in the Java code
-    virtual bool scanFile(const char* path, long long lastModified, long long fileSize)
+    virtual bool scanFile(const char* path, long long lastModified,
+            long long fileSize, bool isDirectory)
     {
         jstring pathStr;
         if ((pathStr = mEnv->NewStringUTF(path)) == NULL) return false;
 
-        mEnv->CallVoidMethod(mClient, mScanFileMethodID, pathStr, lastModified, fileSize);
+        mEnv->CallVoidMethod(mClient, mScanFileMethodID, pathStr, lastModified,
+                fileSize, isDirectory);
 
         mEnv->DeleteLocalRef(pathStr);
         return (!mEnv->ExceptionCheck());
diff --git a/media/libmedia/MediaScanner.cpp b/media/libmedia/MediaScanner.cpp
index c31b622..5ec573e 100644
--- a/media/libmedia/MediaScanner.cpp
+++ b/media/libmedia/MediaScanner.cpp
@@ -84,6 +84,7 @@
     // place to copy file or directory name
     char* fileSpot = path + strlen(path);
     struct dirent* entry;
+    struct stat statbuf;
 
     // ignore directories that contain a  ".nomedia" file
     if (pathRemaining >= 8 /* strlen(".nomedia") */ ) {
@@ -125,7 +126,6 @@
             // If the type is unknown, stat() the file instead.
             // This is sometimes necessary when accessing NFS mounted filesystems, but
             // could be needed in other cases well.
-            struct stat statbuf;
             if (stat(path, &statbuf) == 0) {
                 if (S_ISREG(statbuf.st_mode)) {
                     type = DT_REG;
@@ -142,8 +142,15 @@
                 // for example, the Mac ".Trashes" directory
                 if (name[0] == '.') continue;
 
+                // report the directory to the client
+                if (stat(path, &statbuf) == 0) {
+                    client.scanFile(path, statbuf.st_mtime, 0, true);
+                }
+
+                // and now process its contents
                 strcat(fileSpot, "/");
-                int err = doProcessDirectory(path, pathRemaining - nameLength - 1, client, exceptionCheck, exceptionEnv);
+                int err = doProcessDirectory(path, pathRemaining - nameLength - 1, client,
+                        exceptionCheck, exceptionEnv);
                 if (err) {
                     // pass exceptions up - ignore other errors
                     if (exceptionCheck && exceptionCheck(exceptionEnv)) goto failure;
@@ -151,11 +158,8 @@
                     continue;
                 }
             } else {
-                struct stat statbuf;
                 stat(path, &statbuf);
-                if (statbuf.st_size > 0) {
-                    client.scanFile(path, statbuf.st_mtime, statbuf.st_size);
-                }
+                client.scanFile(path, statbuf.st_mtime, statbuf.st_size, false);
                 if (exceptionCheck && exceptionCheck(exceptionEnv)) goto failure;
             }
         }
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 6f011ce..97c541a 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -732,6 +732,21 @@
         return TEST_PLAYER;
     }
 
+    char value[PROPERTY_VALUE_MAX];
+    if (property_get("media.httplive.enable-nuplayer", value, NULL)
+            && (!strcasecmp(value, "true") || !strcmp(value, "1"))) {
+        if (!strncasecmp("http://", url, 7)) {
+            size_t len = strlen(url);
+            if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
+                return NU_PLAYER;
+            }
+
+            if (strstr(url,"m3u8")) {
+                return NU_PLAYER;
+            }
+        }
+    }
+
     // use MidiFile for MIDI extensions
     int lenURL = strlen(url);
     for (int i = 0; i < NELEM(FILE_EXTS); ++i) {
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 576b009..d372ee6 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -358,6 +358,8 @@
 
 status_t StagefrightRecorder::setParamMaxFileDurationUs(int64_t timeUs) {
     LOGV("setParamMaxFileDurationUs: %lld us", timeUs);
+
+    // This is meant for backward compatibility for MediaRecorder.java
     if (timeUs <= 0) {
         LOGW("Max file duration is not positive: %lld us. Disabling duration limit.", timeUs);
         timeUs = 0; // Disable the duration limit for zero or negative values.
@@ -375,7 +377,13 @@
 
 status_t StagefrightRecorder::setParamMaxFileSizeBytes(int64_t bytes) {
     LOGV("setParamMaxFileSizeBytes: %lld bytes", bytes);
-    if (bytes <= 1024) {  // XXX: 1 kB
+
+    // This is meant for backward compatibility for MediaRecorder.java
+    if (bytes <= 0) {
+        LOGW("Max file size is not positive: %lld bytes. "
+             "Disabling file size limit.", bytes);
+        bytes = 0; // Disable the file size limit for zero or negative values.
+    } else if (bytes <= 1024) {  // XXX: 1 kB
         LOGE("Max file size is too small: %lld bytes", bytes);
         return BAD_VALUE;
     }
diff --git a/media/libmediaplayerservice/nuplayer/Android.mk b/media/libmediaplayerservice/nuplayer/Android.mk
index c4f3764..c20e279 100644
--- a/media/libmediaplayerservice/nuplayer/Android.mk
+++ b/media/libmediaplayerservice/nuplayer/Android.mk
@@ -2,17 +2,20 @@
 include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES:=                       \
+        HTTPLiveSource.cpp              \
         NuPlayer.cpp                    \
         NuPlayerDecoder.cpp             \
         NuPlayerDriver.cpp              \
         NuPlayerRenderer.cpp            \
         NuPlayerStreamListener.cpp      \
         DecoderWrapper.cpp              \
+        StreamingSource.cpp             \
 
 LOCAL_C_INCLUDES := \
         $(TOP)/frameworks/base/include/media/stagefright/openmax        \
 	$(TOP)/frameworks/base/media/libstagefright/include             \
         $(TOP)/frameworks/base/media/libstagefright/mpeg2ts             \
+        $(TOP)/frameworks/base/media/libstagefright/httplive            \
 
 LOCAL_MODULE:= libstagefright_nuplayer
 
diff --git a/media/libmediaplayerservice/nuplayer/DecoderWrapper.cpp b/media/libmediaplayerservice/nuplayer/DecoderWrapper.cpp
index 9738e33..4d4cd8d 100644
--- a/media/libmediaplayerservice/nuplayer/DecoderWrapper.cpp
+++ b/media/libmediaplayerservice/nuplayer/DecoderWrapper.cpp
@@ -151,6 +151,7 @@
             const sp<AMessage> &notify);
 
     void start();
+    void stop();
     void readMore(bool flush = false);
 
 protected:
@@ -189,6 +190,10 @@
     readMore();
 }
 
+void DecoderWrapper::WrapperReader::stop() {
+    CHECK_EQ(mDecoder->stop(), (status_t)OK);
+}
+
 void DecoderWrapper::WrapperReader::readMore(bool flush) {
     if (!flush && mEOS) {
         return;
@@ -351,6 +356,10 @@
             onSetup(msg);
             break;
 
+        case kWhatShutdown:
+            onShutdown();
+            break;
+
         case kWhatInputDataRequested:
         {
             postFillBuffer();
@@ -493,6 +502,25 @@
     ++mNumPendingDecodes;
 }
 
+void DecoderWrapper::onShutdown() {
+    mReaderLooper->stop();
+    mReaderLooper.clear();
+
+    mReader->stop();
+    mReader.clear();
+
+    mSource.clear();
+
+    mNumOutstandingInputBuffers = 0;
+    mNumOutstandingOutputBuffers = 0;
+    mNumPendingDecodes = 0;
+    mFlushing = false;
+
+    sp<AMessage> notify = mNotify->dup();
+    notify->setInt32("what", ACodec::kWhatShutdownCompleted);
+    notify->post();
+}
+
 void DecoderWrapper::postFillBuffer() {
     sp<AMessage> notify = mNotify->dup();
     notify->setInt32("what", ACodec::kWhatFillThisBuffer);
diff --git a/media/libmediaplayerservice/nuplayer/DecoderWrapper.h b/media/libmediaplayerservice/nuplayer/DecoderWrapper.h
index 883b356..b9be12c 100644
--- a/media/libmediaplayerservice/nuplayer/DecoderWrapper.h
+++ b/media/libmediaplayerservice/nuplayer/DecoderWrapper.h
@@ -66,6 +66,7 @@
     bool mFlushing;
 
     void onSetup(const sp<AMessage> &msg);
+    void onShutdown();
     void onFlush();
     void onResume();
 
diff --git a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
new file mode 100644
index 0000000..c656e69
--- /dev/null
+++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
@@ -0,0 +1,132 @@
+/*
+ * 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "HTTPLiveSource"
+#include <utils/Log.h>
+
+#include "HTTPLiveSource.h"
+
+#include "ATSParser.h"
+#include "AnotherPacketSource.h"
+#include "LiveDataSource.h"
+#include "LiveSession.h"
+
+#include <media/stagefright/foundation/ABuffer.h>
+#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/MediaErrors.h>
+#include <media/stagefright/MetaData.h>
+
+namespace android {
+
+NuPlayer::HTTPLiveSource::HTTPLiveSource(const char *url)
+    : mURL(url),
+      mEOS(false),
+      mOffset(0) {
+}
+
+NuPlayer::HTTPLiveSource::~HTTPLiveSource() {
+    mLiveSession->disconnect();
+    mLiveLooper->stop();
+}
+
+void NuPlayer::HTTPLiveSource::start() {
+    mLiveLooper = new ALooper;
+    mLiveLooper->setName("http live");
+    mLiveLooper->start();
+
+    mLiveSession = new LiveSession;
+    mLiveLooper->registerHandler(mLiveSession);
+
+    mLiveSession->connect(mURL.c_str());
+
+    mTSParser = new ATSParser;
+}
+
+sp<MetaData> NuPlayer::HTTPLiveSource::getFormat(bool audio) {
+    ATSParser::SourceType type =
+        audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO;
+
+    sp<AnotherPacketSource> source =
+        static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get());
+
+    if (source == NULL) {
+        return NULL;
+    }
+
+    return source->getFormat();
+}
+
+bool NuPlayer::HTTPLiveSource::feedMoreTSData() {
+    if (mEOS) {
+        return false;
+    }
+
+    sp<LiveDataSource> source =
+        static_cast<LiveDataSource *>(mLiveSession->getDataSource().get());
+
+    for (int32_t i = 0; i < 10; ++i) {
+        char buffer[188];
+        ssize_t n = source->readAtNonBlocking(mOffset, buffer, sizeof(buffer));
+
+        if (n == -EWOULDBLOCK) {
+            break;
+        } else if (n < 0) {
+            LOGI("input data EOS reached.");
+            mTSParser->signalEOS(ERROR_END_OF_STREAM);
+            mEOS = true;
+            break;
+        } else {
+            if (buffer[0] == 0x00) {
+                // XXX legacy
+                mTSParser->signalDiscontinuity(
+                        buffer[1] == 0x00
+                            ? ATSParser::DISCONTINUITY_SEEK
+                            : ATSParser::DISCONTINUITY_FORMATCHANGE);
+            } else {
+                mTSParser->feedTSPacket(buffer, sizeof(buffer));
+            }
+
+            mOffset += n;
+        }
+    }
+
+    return true;
+}
+
+status_t NuPlayer::HTTPLiveSource::dequeueAccessUnit(
+        bool audio, sp<ABuffer> *accessUnit) {
+    ATSParser::SourceType type =
+        audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO;
+
+    sp<AnotherPacketSource> source =
+        static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get());
+
+    if (source == NULL) {
+        return -EWOULDBLOCK;
+    }
+
+    status_t finalResult;
+    if (!source->hasBufferAvailable(&finalResult)) {
+        return finalResult == OK ? -EWOULDBLOCK : finalResult;
+    }
+
+    return source->dequeueAccessUnit(accessUnit);
+}
+
+}  // namespace android
+
diff --git a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h
new file mode 100644
index 0000000..1b97699
--- /dev/null
+++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+#ifndef HTTP_LIVE_SOURCE_H_
+
+#define HTTP_LIVE_SOURCE_H_
+
+#include "NuPlayer.h"
+#include "NuPlayerSource.h"
+
+namespace android {
+
+struct ATSParser;
+struct LiveSession;
+
+struct NuPlayer::HTTPLiveSource : public NuPlayer::Source {
+    HTTPLiveSource(const char *url);
+
+    void start();
+
+    // Returns true iff more data was available, false on EOS.
+    bool feedMoreTSData();
+
+    sp<MetaData> getFormat(bool audio);
+    status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
+
+protected:
+    virtual ~HTTPLiveSource();
+
+private:
+    AString mURL;
+    bool mEOS;
+    off64_t mOffset;
+    sp<ALooper> mLiveLooper;
+    sp<LiveSession> mLiveSession;
+    sp<ATSParser> mTSParser;
+
+    DISALLOW_EVIL_CONSTRUCTORS(HTTPLiveSource);
+};
+
+}  // namespace android
+
+#endif  // HTTP_LIVE_SOURCE_H_
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index e99c24a..24efa35 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -19,10 +19,16 @@
 #include <utils/Log.h>
 
 #include "NuPlayer.h"
+
+#include "HTTPLiveSource.h"
 #include "NuPlayerDecoder.h"
 #include "NuPlayerRenderer.h"
-#include "NuPlayerStreamListener.h"
+#include "NuPlayerSource.h"
+#include "StreamingSource.h"
 
+#include "ATSParser.h"
+
+#include <media/stagefright/foundation/hexdump.h>
 #include <media/stagefright/foundation/ABuffer.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AMessage.h>
@@ -36,9 +42,9 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 NuPlayer::NuPlayer()
-    : mEOS(false),
-      mAudioEOS(false),
+    : mAudioEOS(false),
       mVideoEOS(false),
+      mScanSourcesPending(false),
       mFlushingAudio(NONE),
       mFlushingVideo(NONE) {
 }
@@ -53,9 +59,15 @@
 void NuPlayer::setDataSource(const sp<IStreamSource> &source) {
     sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
 
-    source->incStrong(this);
-    msg->setPointer("source", source.get());  // XXX unsafe.
+    msg->setObject("source", new StreamingSource(source));
+    msg->post();
+}
 
+void NuPlayer::setDataSource(
+        const char *url, const KeyedVector<String8, String8> *headers) {
+    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
+
+    msg->setObject("source", new HTTPLiveSource(url));
     msg->post();
 }
 
@@ -75,6 +87,26 @@
     (new AMessage(kWhatStart, id()))->post();
 }
 
+// static
+bool NuPlayer::IsFlushingState(FlushStatus state, bool *formatChange) {
+    switch (state) {
+        case FLUSHING_DECODER:
+            if (formatChange != NULL) {
+                *formatChange = false;
+            }
+            return true;
+
+        case FLUSHING_DECODER_FORMATCHANGE:
+            if (formatChange != NULL) {
+                *formatChange = true;
+            }
+            return true;
+
+        default:
+            return false;
+    }
+}
+
 void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
     switch (msg->what()) {
         case kWhatSetDataSource:
@@ -83,14 +115,10 @@
 
             CHECK(mSource == NULL);
 
-            void *ptr;
-            CHECK(msg->findPointer("source", &ptr));
+            sp<RefBase> obj;
+            CHECK(msg->findObject("source", &obj));
 
-            mSource = static_cast<IStreamSource *>(ptr);
-            mSource->decStrong(this);
-
-            mStreamListener = new NuPlayerStreamListener(mSource, id());
-            mTSParser = new ATSParser;
+            mSource = static_cast<Source *>(obj.get());
             break;
         }
 
@@ -118,7 +146,7 @@
 
         case kWhatStart:
         {
-            mStreamListener->start();
+            mSource->start();
 
             mRenderer = new Renderer(
                     mAudioSink,
@@ -127,25 +155,27 @@
             looper()->registerHandler(mRenderer);
 
             (new AMessage(kWhatScanSources, id()))->post();
+            mScanSourcesPending = true;
             break;
         }
 
         case kWhatScanSources:
         {
+            mScanSourcesPending = false;
+
             instantiateDecoder(false, &mVideoDecoder);
 
             if (mAudioSink != NULL) {
                 instantiateDecoder(true, &mAudioDecoder);
             }
 
-            if (mEOS) {
+            if (!mSource->feedMoreTSData()) {
                 break;
             }
 
-            feedMoreTSData();
-
             if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
                 msg->post(100000ll);
+                mScanSourcesPending = true;
             }
             break;
         }
@@ -165,39 +195,40 @@
                 status_t err = feedDecoderInputData(
                         audio, codecRequest);
 
-                if (err == -EWOULDBLOCK && !mEOS) {
-                    feedMoreTSData();
-                    msg->post();
+                if (err == -EWOULDBLOCK) {
+                    if (mSource->feedMoreTSData()) {
+                        msg->post();
+                    }
                 }
             } else if (what == ACodec::kWhatEOS) {
                 mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
             } else if (what == ACodec::kWhatFlushCompleted) {
+                bool formatChange;
+
                 if (audio) {
-                    CHECK_EQ((int)mFlushingAudio, (int)FLUSHING_DECODER);
+                    CHECK(IsFlushingState(mFlushingAudio, &formatChange));
                     mFlushingAudio = FLUSHED;
                 } else {
-                    CHECK_EQ((int)mFlushingVideo, (int)FLUSHING_DECODER);
+                    CHECK(IsFlushingState(mFlushingVideo, &formatChange));
                     mFlushingVideo = FLUSHED;
                 }
 
                 LOGI("decoder %s flush completed", audio ? "audio" : "video");
 
-                if (mFlushingAudio == FLUSHED && mFlushingVideo == FLUSHED) {
-                    LOGI("both audio and video are flushed now.");
+                if (formatChange) {
+                    LOGI("initiating %s decoder shutdown",
+                         audio ? "audio" : "video");
 
-                    mRenderer->signalTimeDiscontinuity();
+                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
 
-                    if (mAudioDecoder != NULL) {
-                        mAudioDecoder->signalResume();
+                    if (audio) {
+                        mFlushingAudio = SHUTTING_DOWN_DECODER;
+                    } else {
+                        mFlushingVideo = SHUTTING_DOWN_DECODER;
                     }
-
-                    if (mVideoDecoder != NULL) {
-                        mVideoDecoder->signalResume();
-                    }
-
-                    mFlushingAudio = NONE;
-                    mFlushingVideo = NONE;
                 }
+
+                finishFlushIfPossible();
             } else if (what == ACodec::kWhatOutputFormatChanged) {
                 CHECK(audio);
 
@@ -213,6 +244,23 @@
                 mAudioSink->close();
                 CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK);
                 mAudioSink->start();
+
+                mRenderer->signalAudioSinkChanged();
+            } else if (what == ACodec::kWhatShutdownCompleted) {
+                LOGI("%s shutdown completed", audio ? "audio" : "video");
+                if (audio) {
+                    mAudioDecoder.clear();
+
+                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
+                    mFlushingAudio = SHUT_DOWN;
+                } else {
+                    mVideoDecoder.clear();
+
+                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
+                    mFlushingVideo = SHUT_DOWN;
+                }
+
+                finishFlushIfPossible();
             } else {
                 CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer);
 
@@ -265,108 +313,50 @@
     }
 }
 
-void NuPlayer::feedMoreTSData() {
-    CHECK(!mEOS);
+void NuPlayer::finishFlushIfPossible() {
+    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
+        return;
+    }
 
-    for (int32_t i = 0; i < 10; ++i) {
-        char buffer[188];
-        ssize_t n = mStreamListener->read(buffer, sizeof(buffer));
+    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
+        return;
+    }
 
-        if (n == 0) {
-            LOGI("input data EOS reached.");
-            mTSParser->signalEOS(ERROR_END_OF_STREAM);
-            mEOS = true;
-            break;
-        } else if (n == INFO_DISCONTINUITY) {
-            mTSParser->signalDiscontinuity(ATSParser::DISCONTINUITY_SEEK);
-        } else if (n < 0) {
-            CHECK_EQ(n, -EWOULDBLOCK);
-            break;
-        } else {
-            if (buffer[0] == 0x00) {
-                // XXX legacy
-                mTSParser->signalDiscontinuity(ATSParser::DISCONTINUITY_SEEK);
-            } else {
-                mTSParser->feedTSPacket(buffer, sizeof(buffer));
-            }
-        }
+    LOGI("both audio and video are flushed now.");
+
+    mRenderer->signalTimeDiscontinuity();
+
+    bool scanSourcesAgain = false;
+
+    if (mFlushingAudio == SHUT_DOWN) {
+        scanSourcesAgain = true;
+    } else if (mAudioDecoder != NULL) {
+        mAudioDecoder->signalResume();
+    }
+
+    if (mFlushingVideo == SHUT_DOWN) {
+        scanSourcesAgain = true;
+    } else if (mVideoDecoder != NULL) {
+        mVideoDecoder->signalResume();
+    }
+
+    mFlushingAudio = NONE;
+    mFlushingVideo = NONE;
+
+    if (scanSourcesAgain && !mScanSourcesPending) {
+        mScanSourcesPending = true;
+        (new AMessage(kWhatScanSources, id()))->post();
     }
 }
 
-status_t NuPlayer::dequeueNextAccessUnit(
-        ATSParser::SourceType *type, sp<ABuffer> *accessUnit) {
-    accessUnit->clear();
-
-    status_t audioErr = -EWOULDBLOCK;
-    int64_t audioTimeUs;
-
-    sp<AnotherPacketSource> audioSource =
-        static_cast<AnotherPacketSource *>(
-                mTSParser->getSource(ATSParser::MPEG2ADTS_AUDIO).get());
-
-    if (audioSource != NULL) {
-        audioErr = audioSource->nextBufferTime(&audioTimeUs);
-    }
-
-    status_t videoErr = -EWOULDBLOCK;
-    int64_t videoTimeUs;
-
-    sp<AnotherPacketSource> videoSource =
-        static_cast<AnotherPacketSource *>(
-                mTSParser->getSource(ATSParser::AVC_VIDEO).get());
-
-    if (videoSource != NULL) {
-        videoErr = videoSource->nextBufferTime(&videoTimeUs);
-    }
-
-    if (audioErr == -EWOULDBLOCK || videoErr == -EWOULDBLOCK) {
-        return -EWOULDBLOCK;
-    }
-
-    if (audioErr != OK && videoErr != OK) {
-        return audioErr;
-    }
-
-    if (videoErr != OK || (audioErr == OK && audioTimeUs < videoTimeUs)) {
-        *type = ATSParser::MPEG2ADTS_AUDIO;
-        return audioSource->dequeueAccessUnit(accessUnit);
-    } else {
-        *type = ATSParser::AVC_VIDEO;
-        return videoSource->dequeueAccessUnit(accessUnit);
-    }
-}
-
-status_t NuPlayer::dequeueAccessUnit(
-        ATSParser::SourceType type, sp<ABuffer> *accessUnit) {
-    sp<AnotherPacketSource> source =
-        static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get());
-
-    if (source == NULL) {
-        return -EWOULDBLOCK;
-    }
-
-    status_t finalResult;
-    if (!source->hasBufferAvailable(&finalResult)) {
-        return finalResult == OK ? -EWOULDBLOCK : finalResult;
-    }
-
-    return source->dequeueAccessUnit(accessUnit);
-}
-
-status_t NuPlayer::instantiateDecoder(
-        bool audio, sp<Decoder> *decoder) {
+status_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
     if (*decoder != NULL) {
         return OK;
     }
 
-    ATSParser::SourceType type =
-        audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO;
+    sp<MetaData> meta = mSource->getFormat(audio);
 
-    sp<AnotherPacketSource> source =
-        static_cast<AnotherPacketSource *>(
-                mTSParser->getSource(type).get());
-
-    if (source == NULL) {
+    if (meta == NULL) {
         return -EWOULDBLOCK;
     }
 
@@ -377,7 +367,6 @@
     *decoder = new Decoder(notify, audio ? NULL : mSurface);
     looper()->registerHandler(*decoder);
 
-    const sp<MetaData> &meta = source->getFormat();
     (*decoder)->configure(meta);
 
     return OK;
@@ -387,30 +376,39 @@
     sp<AMessage> reply;
     CHECK(msg->findMessage("reply", &reply));
 
-    if ((audio && mFlushingAudio == FLUSHING_DECODER)
-            || (!audio && mFlushingVideo == FLUSHING_DECODER)) {
+    if ((audio && IsFlushingState(mFlushingAudio))
+            || (!audio && IsFlushingState(mFlushingVideo))) {
         reply->setInt32("err", INFO_DISCONTINUITY);
         reply->post();
         return OK;
     }
 
     sp<ABuffer> accessUnit;
-    status_t err = dequeueAccessUnit(
-            audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO,
-            &accessUnit);
+    status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
 
     if (err == -EWOULDBLOCK) {
         return err;
     } else if (err != OK) {
         if (err == INFO_DISCONTINUITY) {
-            LOGI("%s discontinuity", audio ? "audio" : "video");
+            int32_t type;
+            CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
+
+            bool formatChange =
+                type == ATSParser::DISCONTINUITY_FORMATCHANGE;
+
+            LOGI("%s discontinuity (formatChange=%d)",
+                 audio ? "audio" : "video", formatChange);
+
             (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
             mRenderer->flush(audio);
 
             if (audio) {
                 CHECK(mFlushingAudio == NONE
                         || mFlushingAudio == AWAITING_DISCONTINUITY);
-                mFlushingAudio = FLUSHING_DECODER;
+
+                mFlushingAudio = formatChange
+                    ? FLUSHING_DECODER_FORMATCHANGE : FLUSHING_DECODER;
+
                 if (mFlushingVideo == NONE) {
                     mFlushingVideo = (mVideoDecoder != NULL)
                         ? AWAITING_DISCONTINUITY
@@ -419,7 +417,10 @@
             } else {
                 CHECK(mFlushingVideo == NONE
                         || mFlushingVideo == AWAITING_DISCONTINUITY);
-                mFlushingVideo = FLUSHING_DECODER;
+
+                mFlushingVideo = formatChange
+                    ? FLUSHING_DECODER_FORMATCHANGE : FLUSHING_DECODER;
+
                 if (mFlushingAudio == NONE) {
                     mFlushingAudio = (mAudioDecoder != NULL)
                         ? AWAITING_DISCONTINUITY
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h
index 9a5a6c4..172a962 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h
@@ -21,9 +21,6 @@
 #include <media/MediaPlayerInterface.h>
 #include <media/stagefright/foundation/AHandler.h>
 
-#include "ATSParser.h"
-#include "AnotherPacketSource.h"
-
 namespace android {
 
 struct ACodec;
@@ -35,6 +32,10 @@
     void setListener(const wp<MediaPlayerBase> &listener);
 
     void setDataSource(const sp<IStreamSource> &source);
+
+    void setDataSource(
+            const char *url, const KeyedVector<String8, String8> *headers);
+
     void setVideoSurface(const sp<Surface> &surface);
     void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink);
     void start();
@@ -45,9 +46,12 @@
     virtual void onMessageReceived(const sp<AMessage> &msg);
 
 private:
-    struct Renderer;
     struct Decoder;
+    struct HTTPLiveSource;
     struct NuPlayerStreamListener;
+    struct Renderer;
+    struct Source;
+    struct StreamingSource;
 
     enum {
         kWhatSetDataSource,
@@ -62,11 +66,9 @@
     };
 
     wp<MediaPlayerBase> mListener;
-    sp<IStreamSource> mSource;
+    sp<Source> mSource;
     sp<Surface> mSurface;
     sp<MediaPlayerBase::AudioSink> mAudioSink;
-    sp<NuPlayerStreamListener> mStreamListener;
-    sp<ATSParser> mTSParser;
     sp<Decoder> mVideoDecoder;
     sp<Decoder> mAudioDecoder;
     sp<Renderer> mRenderer;
@@ -75,31 +77,32 @@
     bool mAudioEOS;
     bool mVideoEOS;
 
+    bool mScanSourcesPending;
+
     enum FlushStatus {
         NONE,
         AWAITING_DISCONTINUITY,
         FLUSHING_DECODER,
-        FLUSHED
+        FLUSHING_DECODER_FORMATCHANGE,
+        SHUTTING_DOWN_DECODER,
+        FLUSHED,
+        SHUT_DOWN,
     };
 
     FlushStatus mFlushingAudio;
     FlushStatus mFlushingVideo;
 
-    status_t instantiateDecoder(
-            bool audio, sp<Decoder> *decoder);
+    status_t instantiateDecoder(bool audio, sp<Decoder> *decoder);
 
     status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg);
     void renderBuffer(bool audio, const sp<AMessage> &msg);
 
-    status_t dequeueNextAccessUnit(
-            ATSParser::SourceType *type, sp<ABuffer> *accessUnit);
-
-    status_t dequeueAccessUnit(
-            ATSParser::SourceType type, sp<ABuffer> *accessUnit);
-
-    void feedMoreTSData();
     void notifyListener(int msg, int ext1, int ext2);
 
+    void finishFlushIfPossible();
+
+    static bool IsFlushingState(FlushStatus state, bool *formatChange = NULL);
+
     DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
 };
 
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
index d1ed222..761dfa4 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
@@ -25,6 +25,7 @@
 
 #include <media/stagefright/foundation/ABuffer.h>
 #include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/AMessage.h>
 #include <media/stagefright/ACodec.h>
 #include <media/stagefright/MediaDefs.h>
 #include <media/stagefright/MetaData.h>
@@ -123,6 +124,13 @@
         msg->setInt32("sample-rate", sampleRate);
     }
 
+    int32_t maxInputSize;
+    if (meta->findInt32(kKeyMaxInputSize, &maxInputSize)) {
+        msg->setInt32("max-input-size", maxInputSize);
+    }
+
+    mCSDIndex = 0;
+
     uint32_t type;
     const void *data;
     size_t size;
@@ -228,13 +236,6 @@
 #endif
     }
 
-    int32_t maxInputSize;
-    if (meta->findInt32(kKeyMaxInputSize, &maxInputSize)) {
-        msg->setInt32("max-input-size", maxInputSize);
-    }
-
-    mCSDIndex = 0;
-
     return msg;
 }
 
@@ -282,5 +283,14 @@
     }
 }
 
+void NuPlayer::Decoder::initiateShutdown() {
+    if (mCodec != NULL) {
+        mCodec->initiateShutdown();
+    } else {
+        CHECK(mWrapper != NULL);
+        mWrapper->initiateShutdown();
+    }
+}
+
 }  // namespace android
 
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h
index 77800be..3874cfe 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h
@@ -24,14 +24,17 @@
 
 namespace android {
 
+struct ABuffer;
 struct DecoderWrapper;
 
 struct NuPlayer::Decoder : public AHandler {
     Decoder(const sp<AMessage> &notify, const sp<Surface> &surface = NULL);
 
     void configure(const sp<MetaData> &meta);
+
     void signalFlush();
     void signalResume();
+    void initiateShutdown();
 
 protected:
     virtual ~Decoder();
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
index b79251a..d21d4ff 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
@@ -27,7 +27,8 @@
 namespace android {
 
 NuPlayerDriver::NuPlayerDriver()
-    : mLooper(new ALooper) {
+    : mLooper(new ALooper),
+      mPlayer(false) {
     mLooper->setName("NuPlayerDriver Looper");
 
     mLooper->start(
@@ -51,7 +52,9 @@
 
 status_t NuPlayerDriver::setDataSource(
         const char *url, const KeyedVector<String8, String8> *headers) {
-    return INVALID_OPERATION;
+    mPlayer->setDataSource(url, headers);
+
+    return OK;
 }
 
 status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
@@ -75,25 +78,30 @@
 }
 
 status_t NuPlayerDriver::prepareAsync() {
+    sendEvent(MEDIA_PREPARED);
+
     return OK;
 }
 
 status_t NuPlayerDriver::start() {
     mPlayer->start();
+    mPlaying = true;
 
     return OK;
 }
 
 status_t NuPlayerDriver::stop() {
+    mPlaying = false;
     return OK;
 }
 
 status_t NuPlayerDriver::pause() {
+    mPlaying = false;
     return OK;
 }
 
 bool NuPlayerDriver::isPlaying() {
-    return false;
+    return mPlaying;
 }
 
 status_t NuPlayerDriver::seekTo(int msec) {
@@ -101,11 +109,15 @@
 }
 
 status_t NuPlayerDriver::getCurrentPosition(int *msec) {
-    return INVALID_OPERATION;
+    *msec = 0;
+
+    return OK;
 }
 
 status_t NuPlayerDriver::getDuration(int *msec) {
-    return INVALID_OPERATION;
+    *msec = 0;
+
+    return OK;
 }
 
 status_t NuPlayerDriver::reset() {
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
index 245f1dd..44ae3bf 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
@@ -60,6 +60,7 @@
 private:
     sp<ALooper> mLooper;
     sp<NuPlayer> mPlayer;
+    bool mPlaying;
 
     DISALLOW_EVIL_CONSTRUCTORS(NuPlayerDriver);
 };
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index 855bc0ae..00cbec2 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -22,6 +22,7 @@
 
 #include <media/stagefright/foundation/ABuffer.h>
 #include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/AMessage.h>
 
 namespace android {
 
@@ -39,7 +40,9 @@
       mAnchorTimeRealUs(-1),
       mFlushingAudio(false),
       mFlushingVideo(false),
-      mSyncQueues(true) {
+      mHasAudio(mAudioSink != NULL),
+      mHasVideo(true),
+      mSyncQueues(mHasAudio && mHasVideo) {
 }
 
 NuPlayer::Renderer::~Renderer() {
@@ -87,7 +90,7 @@
     CHECK(mVideoQueue.empty());
     mAnchorTimeMediaUs = -1;
     mAnchorTimeRealUs = -1;
-    mSyncQueues = true;
+    mSyncQueues = mHasAudio && mHasVideo;
 }
 
 void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
@@ -142,6 +145,12 @@
             break;
         }
 
+        case kWhatAudioSinkChanged:
+        {
+            onAudioSinkChanged();
+            break;
+        }
+
         default:
             TRESPASS();
             break;
@@ -163,6 +172,10 @@
     msg->post(10000);
 }
 
+void NuPlayer::Renderer::signalAudioSinkChanged() {
+    (new AMessage(kWhatAudioSinkChanged, id()))->post();
+}
+
 void NuPlayer::Renderer::onDrainAudioQueue() {
     uint32_t numFramesPlayed;
     CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK);
@@ -264,7 +277,7 @@
         if (mAnchorTimeMediaUs < 0) {
             delayUs = 0;
 
-            if (mAudioSink == NULL) {
+            if (!mHasAudio) {
                 mAnchorTimeMediaUs = mediaTimeUs;
                 mAnchorTimeRealUs = ALooper::GetNowUs();
             }
@@ -492,5 +505,10 @@
     return true;
 }
 
+void NuPlayer::Renderer::onAudioSinkChanged() {
+    CHECK(!mDrainAudioQueuePending);
+    mNumFramesWritten = 0;
+}
+
 }  // namespace android
 
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
index 834ddc5..fb3903c 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
@@ -22,6 +22,8 @@
 
 namespace android {
 
+struct ABuffer;
+
 struct NuPlayer::Renderer : public AHandler {
     Renderer(const sp<MediaPlayerBase::AudioSink> &sink,
              const sp<AMessage> &notify);
@@ -37,6 +39,8 @@
 
     void signalTimeDiscontinuity();
 
+    void signalAudioSinkChanged();
+
     enum {
         kWhatEOS,
         kWhatFlushComplete,
@@ -54,6 +58,7 @@
         kWhatQueueBuffer,
         kWhatQueueEOS,
         kWhatFlush,
+        kWhatAudioSinkChanged,
     };
 
     struct QueueEntry {
@@ -81,6 +86,8 @@
     bool mFlushingAudio;
     bool mFlushingVideo;
 
+    bool mHasAudio;
+    bool mHasVideo;
     bool mSyncQueues;
 
     void onDrainAudioQueue();
@@ -92,6 +99,7 @@
     void onQueueBuffer(const sp<AMessage> &msg);
     void onQueueEOS(const sp<AMessage> &msg);
     void onFlush(const sp<AMessage> &msg);
+    void onAudioSinkChanged();
 
     void notifyEOS(bool audio);
     void notifyFlushComplete(bool audio);
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
new file mode 100644
index 0000000..044e202
--- /dev/null
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+#ifndef NUPLAYER_SOURCE_H_
+
+#define NUPLAYER_SOURCE_H_
+
+#include "NuPlayer.h"
+
+namespace android {
+
+struct ABuffer;
+
+struct NuPlayer::Source : public RefBase {
+    Source() {}
+
+    virtual void start() = 0;
+
+    // Returns true iff more data was available, false on EOS.
+    virtual bool feedMoreTSData() = 0;
+
+    virtual sp<MetaData> getFormat(bool audio) = 0;
+
+    virtual status_t dequeueAccessUnit(
+            bool audio, sp<ABuffer> *accessUnit) = 0;
+
+protected:
+    virtual ~Source() {}
+
+private:
+    DISALLOW_EVIL_CONSTRUCTORS(Source);
+};
+
+}  // namespace android
+
+#endif  // NUPLAYER_SOURCE_H_
+
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.cpp
index 92642a8..a23beb7 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.cpp
@@ -22,6 +22,8 @@
 
 #include <binder/MemoryDealer.h>
 #include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/MediaErrors.h>
 
 namespace android {
 
@@ -62,7 +64,10 @@
 
     if (mSendDataNotification) {
         mSendDataNotification = false;
-        (new AMessage(kWhatMoreDataQueued, mTargetID))->post();
+
+        if (mTargetID != 0) {
+            (new AMessage(kWhatMoreDataQueued, mTargetID))->post();
+        }
     }
 }
 
@@ -80,7 +85,10 @@
 
     if (mSendDataNotification) {
         mSendDataNotification = false;
-        (new AMessage(kWhatMoreDataQueued, mTargetID))->post();
+
+        if (mTargetID != 0) {
+            (new AMessage(kWhatMoreDataQueued, mTargetID))->post();
+        }
     }
 }
 
diff --git a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
new file mode 100644
index 0000000..b85ac9f
--- /dev/null
+++ b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
@@ -0,0 +1,120 @@
+/*
+ * 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "StreamingSource"
+#include <utils/Log.h>
+
+#include "StreamingSource.h"
+
+#include "ATSParser.h"
+#include "AnotherPacketSource.h"
+#include "NuPlayerStreamListener.h"
+
+#include <media/stagefright/foundation/ABuffer.h>
+#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/MediaSource.h>
+#include <media/stagefright/MetaData.h>
+
+namespace android {
+
+NuPlayer::StreamingSource::StreamingSource(const sp<IStreamSource> &source)
+    : mSource(source),
+      mEOS(false) {
+}
+
+NuPlayer::StreamingSource::~StreamingSource() {
+}
+
+void NuPlayer::StreamingSource::start() {
+    mStreamListener = new NuPlayerStreamListener(mSource, 0);
+    mTSParser = new ATSParser;
+
+    mStreamListener->start();
+}
+
+bool NuPlayer::StreamingSource::feedMoreTSData() {
+    if (mEOS) {
+        return false;
+    }
+
+    for (int32_t i = 0; i < 10; ++i) {
+        char buffer[188];
+        ssize_t n = mStreamListener->read(buffer, sizeof(buffer));
+
+        if (n == 0) {
+            LOGI("input data EOS reached.");
+            mTSParser->signalEOS(ERROR_END_OF_STREAM);
+            mEOS = true;
+            break;
+        } else if (n == INFO_DISCONTINUITY) {
+            mTSParser->signalDiscontinuity(ATSParser::DISCONTINUITY_SEEK);
+        } else if (n < 0) {
+            CHECK_EQ(n, -EWOULDBLOCK);
+            break;
+        } else {
+            if (buffer[0] == 0x00) {
+                // XXX legacy
+                mTSParser->signalDiscontinuity(
+                        buffer[1] == 0x00
+                            ? ATSParser::DISCONTINUITY_SEEK
+                            : ATSParser::DISCONTINUITY_FORMATCHANGE);
+            } else {
+                mTSParser->feedTSPacket(buffer, sizeof(buffer));
+            }
+        }
+    }
+
+    return true;
+}
+
+sp<MetaData> NuPlayer::StreamingSource::getFormat(bool audio) {
+    ATSParser::SourceType type =
+        audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO;
+
+    sp<AnotherPacketSource> source =
+        static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get());
+
+    if (source == NULL) {
+        return NULL;
+    }
+
+    return source->getFormat();
+}
+
+status_t NuPlayer::StreamingSource::dequeueAccessUnit(
+        bool audio, sp<ABuffer> *accessUnit) {
+    ATSParser::SourceType type =
+        audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO;
+
+    sp<AnotherPacketSource> source =
+        static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get());
+
+    if (source == NULL) {
+        return -EWOULDBLOCK;
+    }
+
+    status_t finalResult;
+    if (!source->hasBufferAvailable(&finalResult)) {
+        return finalResult == OK ? -EWOULDBLOCK : finalResult;
+    }
+
+    return source->dequeueAccessUnit(accessUnit);
+}
+
+}  // namespace android
+
diff --git a/media/libmediaplayerservice/nuplayer/StreamingSource.h b/media/libmediaplayerservice/nuplayer/StreamingSource.h
new file mode 100644
index 0000000..5f0a9dd
--- /dev/null
+++ b/media/libmediaplayerservice/nuplayer/StreamingSource.h
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+#ifndef STREAMING_SOURCE_H_
+
+#define STREAMING_SOURCE_H_
+
+#include "NuPlayer.h"
+#include "NuPlayerSource.h"
+
+namespace android {
+
+struct ABuffer;
+struct ATSParser;
+
+struct NuPlayer::StreamingSource : public NuPlayer::Source {
+    StreamingSource(const sp<IStreamSource> &source);
+
+    void start();
+
+    // Returns true iff more data was available, false on EOS.
+    bool feedMoreTSData();
+
+    sp<MetaData> getFormat(bool audio);
+    status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
+
+protected:
+    virtual ~StreamingSource();
+
+private:
+    sp<IStreamSource> mSource;
+    bool mEOS;
+    sp<NuPlayerStreamListener> mStreamListener;
+    sp<ATSParser> mTSParser;
+
+    DISALLOW_EVIL_CONSTRUCTORS(StreamingSource);
+};
+
+}  // namespace android
+
+#endif  // STREAMING_SOURCE_H_
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 77276ab..39e0c51 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -1082,7 +1082,7 @@
 bool ACodec::BaseState::onOMXEvent(
         OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
     if (event != OMX_EventError) {
-        LOGI("[%s] EVENT(%d, 0x%08lx, 0x%08lx)",
+        LOGV("[%s] EVENT(%d, 0x%08lx, 0x%08lx)",
              mCodec->mComponentName.c_str(), event, data1, data2);
 
         return false;
@@ -1157,6 +1157,9 @@
     if (!msg->findObject("buffer", &obj)) {
         CHECK(msg->findInt32("err", &err));
 
+        LOGV("[%s] saw error %d instead of an input buffer",
+             mCodec->mComponentName.c_str(), err);
+
         obj.clear();
     }
 
@@ -1517,7 +1520,7 @@
 }
 
 void ACodec::LoadedToIdleState::stateEntered() {
-    LOGI("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str());
+    LOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str());
 
     CHECK_EQ(allocateBuffers(), (status_t)OK);
 }
@@ -1574,7 +1577,7 @@
 }
 
 void ACodec::IdleToExecutingState::stateEntered() {
-    LOGI("[%s] Now Idle->Executing", mCodec->mComponentName.c_str());
+    LOGV("[%s] Now Idle->Executing", mCodec->mComponentName.c_str());
 }
 
 bool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) {
@@ -1658,7 +1661,7 @@
 }
 
 void ACodec::ExecutingState::stateEntered() {
-    LOGI("[%s] Now Executing", mCodec->mComponentName.c_str());
+    LOGV("[%s] Now Executing", mCodec->mComponentName.c_str());
 
     mCodec->processDeferredMessages();
 }
@@ -1784,7 +1787,7 @@
 }
 
 void ACodec::OutputPortSettingsChangedState::stateEntered() {
-    LOGI("[%s] Now handling output port settings change",
+    LOGV("[%s] Now handling output port settings change",
          mCodec->mComponentName.c_str());
 }
 
@@ -1865,7 +1868,7 @@
 }
 
 void ACodec::ExecutingToIdleState::stateEntered() {
-    LOGI("[%s] Now Executing->Idle", mCodec->mComponentName.c_str());
+    LOGV("[%s] Now Executing->Idle", mCodec->mComponentName.c_str());
 }
 
 bool ACodec::ExecutingToIdleState::onOMXEvent(
@@ -1947,7 +1950,7 @@
 }
 
 void ACodec::IdleToLoadedState::stateEntered() {
-    LOGI("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str());
+    LOGV("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str());
 }
 
 bool ACodec::IdleToLoadedState::onOMXEvent(
@@ -1958,7 +1961,7 @@
             CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet);
             CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded);
 
-            LOGI("[%s] Now Loaded", mCodec->mComponentName.c_str());
+            LOGV("[%s] Now Loaded", mCodec->mComponentName.c_str());
 
             CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK);
 
@@ -1992,12 +1995,12 @@
 }
 
 void ACodec::ErrorState::stateEntered() {
-    LOGI("[%s] Now in ErrorState", mCodec->mComponentName.c_str());
+    LOGV("[%s] Now in ErrorState", mCodec->mComponentName.c_str());
 }
 
 bool ACodec::ErrorState::onOMXEvent(
         OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
-    LOGI("EVENT(%d, 0x%08lx, 0x%08lx)", event, data1, data2);
+    LOGV("EVENT(%d, 0x%08lx, 0x%08lx)", event, data1, data2);
     return true;
 }
 
@@ -2008,7 +2011,7 @@
 }
 
 void ACodec::FlushingState::stateEntered() {
-    LOGI("[%s] Now Flushing", mCodec->mComponentName.c_str());
+    LOGV("[%s] Now Flushing", mCodec->mComponentName.c_str());
 
     mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false;
 }
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp
index 2f3353b..b1c6b18 100644
--- a/media/libstagefright/CameraSource.cpp
+++ b/media/libstagefright/CameraSource.cpp
@@ -573,7 +573,7 @@
 }
 
 status_t CameraSource::stop() {
-    LOGV("stop");
+    LOGD("stop: E");
     Mutex::Autolock autoLock(mLock);
     mStarted = false;
     mFrameAvailableCondition.signal();
@@ -581,9 +581,11 @@
     int64_t token = IPCThreadState::self()->clearCallingIdentity();
     releaseQueuedFrames();
     while (!mFramesBeingEncoded.empty()) {
-        LOGI("Waiting for outstanding frames being encoded: %d",
+        if (NO_ERROR !=
+            mFrameCompleteCondition.waitRelative(mLock, 3000000000LL)) {
+            LOGW("Timed out waiting for outstanding frames being encoded: %d",
                 mFramesBeingEncoded.size());
-        mFrameCompleteCondition.wait(mLock);
+        }
     }
     stopCameraRecording();
     releaseCamera();
@@ -601,6 +603,7 @@
     }
 
     CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped);
+    LOGD("stop: X");
     return OK;
 }
 
@@ -666,7 +669,11 @@
     {
         Mutex::Autolock autoLock(mLock);
         while (mStarted && mFramesReceived.empty()) {
-            mFrameAvailableCondition.wait(mLock);
+            if (NO_ERROR !=
+                mFrameAvailableCondition.waitRelative(mLock, 3000000000LL)) {
+                LOGW("Timed out waiting for incoming camera video frames: %lld us",
+                    mLastFrameTimestampUs);
+            }
         }
         if (!mStarted) {
             return OK;
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 69ab75a..f63774a 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -1536,7 +1536,9 @@
     }
 
     err = allocateBuffers();
-    CHECK_EQ(err, (status_t)OK);
+    if (err != (status_t)OK) {
+        return err;
+    }
 
     if (mQuirks & kRequiresLoadedToIdleAfterAllocation) {
         err = mOMX->sendCommand(mNode, OMX_CommandStateSet, OMX_StateIdle);
@@ -3359,7 +3361,15 @@
     }
 
     while (mState != ERROR && !mNoMoreOutputData && mFilledBuffers.empty()) {
-        mBufferFilled.wait(mLock);
+        if (mIsEncoder) {
+            if (NO_ERROR != mBufferFilled.waitRelative(mLock, 3000000000LL)) {
+                LOGW("Timed out waiting for buffers from video encoder: %d/%d",
+                    countBuffersWeOwn(mPortBuffers[kPortIndexInput]),
+                    countBuffersWeOwn(mPortBuffers[kPortIndexOutput]));
+            }
+        } else {
+            mBufferFilled.wait(mLock);
+        }
     }
 
     if (mState == ERROR) {
diff --git a/media/libstagefright/avc_utils.cpp b/media/libstagefright/avc_utils.cpp
index 2fe5e18..fa12cf0 100644
--- a/media/libstagefright/avc_utils.cpp
+++ b/media/libstagefright/avc_utils.cpp
@@ -14,6 +14,10 @@
  * limitations under the License.
  */
 
+//#define LOG_NDEBUG 0
+#define LOG_TAG "avc_utils"
+#include <utils/Log.h>
+
 #include "include/avc_utils.h"
 
 #include <media/stagefright/foundation/ABitReader.h>
diff --git a/media/libstagefright/httplive/LiveDataSource.cpp b/media/libstagefright/httplive/LiveDataSource.cpp
index 25e2902..5f5c6d4 100644
--- a/media/libstagefright/httplive/LiveDataSource.cpp
+++ b/media/libstagefright/httplive/LiveDataSource.cpp
@@ -54,7 +54,8 @@
     return mBufferQueue.size();
 }
 
-ssize_t LiveDataSource::readAt(off64_t offset, void *data, size_t size) {
+ssize_t LiveDataSource::readAtNonBlocking(
+        off64_t offset, void *data, size_t size) {
     Mutex::Autolock autoLock(mLock);
 
     if (offset != mOffset) {
@@ -62,6 +63,36 @@
         return -EPIPE;
     }
 
+    size_t totalAvailable = 0;
+    for (List<sp<ABuffer> >::iterator it = mBufferQueue.begin();
+         it != mBufferQueue.end(); ++it) {
+        sp<ABuffer> buffer = *it;
+
+        totalAvailable += buffer->size();
+
+        if (totalAvailable >= size) {
+            break;
+        }
+    }
+
+    if (totalAvailable < size) {
+        return mFinalResult == OK ? -EWOULDBLOCK : mFinalResult;
+    }
+
+    return readAt_l(offset, data, size);
+}
+
+ssize_t LiveDataSource::readAt(off64_t offset, void *data, size_t size) {
+    Mutex::Autolock autoLock(mLock);
+    return readAt_l(offset, data, size);
+}
+
+ssize_t LiveDataSource::readAt_l(off64_t offset, void *data, size_t size) {
+    if (offset != mOffset) {
+        LOGE("Attempt at reading non-sequentially from LiveDataSource.");
+        return -EPIPE;
+    }
+
     size_t sizeDone = 0;
 
     while (sizeDone < size) {
diff --git a/media/libstagefright/httplive/LiveDataSource.h b/media/libstagefright/httplive/LiveDataSource.h
index a489ec6..b7be637 100644
--- a/media/libstagefright/httplive/LiveDataSource.h
+++ b/media/libstagefright/httplive/LiveDataSource.h
@@ -33,6 +33,7 @@
     virtual status_t initCheck() const;
 
     virtual ssize_t readAt(off64_t offset, void *data, size_t size);
+    ssize_t readAtNonBlocking(off64_t offset, void *data, size_t size);
 
     void queueBuffer(const sp<ABuffer> &buffer);
     void queueEOS(status_t finalResult);
@@ -53,6 +54,8 @@
 
     FILE *mBackupFile;
 
+    ssize_t readAt_l(off64_t offset, void *data, size_t size);
+
     DISALLOW_EVIL_CONSTRUCTORS(LiveDataSource);
 };
 
diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp
index 30ac404..5b1f14d 100644
--- a/media/libstagefright/httplive/LiveSession.cpp
+++ b/media/libstagefright/httplive/LiveSession.cpp
@@ -157,9 +157,16 @@
 
         mBandwidthItems.sort(SortByBandwidth);
 
-        if (mBandwidthItems.size() > 1) {
-            // XXX Remove the lowest bitrate stream for now...
-            mBandwidthItems.removeAt(0);
+        char value[PROPERTY_VALUE_MAX];
+        if (!property_get("media.httplive.enable-nuplayer", value, NULL)
+                || (strcasecmp(value, "true") && strcmp(value, "1"))) {
+            // The "legacy" player cannot deal with audio format changes,
+            // some streams use different audio encoding parameters for
+            // their lowest bandwidth stream.
+            if (mBandwidthItems.size() > 1) {
+                // XXX Remove the lowest bitrate stream for now...
+                mBandwidthItems.removeAt(0);
+            }
         }
     }
 
@@ -179,9 +186,9 @@
 
     if (!strncasecmp(url, "file://", 7)) {
         source = new FileSource(url + 7);
+    } else if (strncasecmp(url, "http://", 7)) {
+        return ERROR_UNSUPPORTED;
     } else {
-        CHECK(!strncasecmp(url, "http://", 7));
-
         status_t err = mHTTPDataSource->connect(url);
 
         if (err != OK) {
@@ -421,7 +428,7 @@
             ++mNumRetries;
 
             mLastPlaylistFetchTimeUs = -1;
-            postMonitorQueue(1000000ll);
+            postMonitorQueue(3000000ll);
             return;
         }
 
@@ -468,13 +475,16 @@
         return;
     }
 
-    if (explicitDiscontinuity
-            || (mPrevBandwidthIndex >= 0
-                && (size_t)mPrevBandwidthIndex != bandwidthIndex)) {
+    bool bandwidthChanged =
+        mPrevBandwidthIndex >= 0
+            && (size_t)mPrevBandwidthIndex != bandwidthIndex;
+
+    if (explicitDiscontinuity || bandwidthChanged) {
         // Signal discontinuity.
 
         sp<ABuffer> tmp = new ABuffer(188);
         memset(tmp->data(), 0, tmp->size());
+        tmp->data()[1] = bandwidthChanged;
 
         mDataSource->queueBuffer(tmp);
     }
diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp
index 38a7cc5..95f6741 100644
--- a/media/libstagefright/httplive/M3UParser.cpp
+++ b/media/libstagefright/httplive/M3UParser.cpp
@@ -84,12 +84,13 @@
     out->clear();
 
     if (strncasecmp("http://", baseURL, 7)
+            && strncasecmp("https://", baseURL, 8)
             && strncasecmp("file://", baseURL, 7)) {
         // Base URL must be absolute
         return false;
     }
 
-    if (!strncasecmp("http://", url, 7)) {
+    if (!strncasecmp("http://", url, 7) || !strncasecmp("https://", url, 8)) {
         // "url" is already an absolute URL, ignore base URL.
         out->setTo(url);
 
diff --git a/media/libstagefright/include/LiveSession.h b/media/libstagefright/include/LiveSession.h
index 50c0a99..3873d5d 100644
--- a/media/libstagefright/include/LiveSession.h
+++ b/media/libstagefright/include/LiveSession.h
@@ -50,7 +50,7 @@
 private:
     enum {
         kMaxNumQueuedFragments = 2,
-        kMaxNumRetries         = 3,
+        kMaxNumRetries         = 5,
     };
 
     static const int64_t kMaxPlaylistAgeUs;
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp
index de6346b..7c81ffd 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.cpp
+++ b/media/libstagefright/mpeg2ts/ATSParser.cpp
@@ -284,7 +284,7 @@
     : mProgram(program),
       mElementaryPID(elementaryPID),
       mStreamType(streamType),
-      mBuffer(new ABuffer(128 * 1024)),
+      mBuffer(new ABuffer(192 * 1024)),
       mPayloadStarted(false),
       mQueue(streamType == 0x1b
               ? ElementaryStreamQueue::H264 : ElementaryStreamQueue::AAC) {
@@ -334,7 +334,7 @@
 
             if (mStreamType == 0x1b && mSource != NULL) {
                 // Don't signal discontinuities on audio streams.
-                mSource->queueDiscontinuity();
+                mSource->queueDiscontinuity(type);
             }
             break;
         }
@@ -348,7 +348,7 @@
 
             if (mSource != NULL) {
                 mSource->clear();
-                mSource->queueDiscontinuity();
+                mSource->queueDiscontinuity(type);
             }
             break;
         }
@@ -561,6 +561,10 @@
             // After a discontinuity we invalidate the queue's format
             // and won't enqueue any access units to the source until
             // the queue has reestablished the new format.
+
+            if (mSource->getFormat() == NULL) {
+                mSource->setFormat(mQueue.getFormat());
+            }
             mSource->queueAccessUnit(accessUnit);
         }
     }
diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
index 7a1d5b0..c6edf0a 100644
--- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
+++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
@@ -33,6 +33,11 @@
       mEOSResult(OK) {
 }
 
+void AnotherPacketSource::setFormat(const sp<MetaData> &meta) {
+    CHECK(mFormat == NULL);
+    mFormat = meta;
+}
+
 AnotherPacketSource::~AnotherPacketSource() {
 }
 
@@ -61,9 +66,11 @@
         mBuffers.erase(mBuffers.begin());
 
         int32_t discontinuity;
-        if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)
-                && discontinuity) {
-            buffer->clear();
+        if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) {
+
+            if (discontinuity == ATSParser::DISCONTINUITY_FORMATCHANGE) {
+                mFormat.clear();
+            }
 
             return INFO_DISCONTINUITY;
         }
@@ -88,8 +95,11 @@
         mBuffers.erase(mBuffers.begin());
 
         int32_t discontinuity;
-        if (buffer->meta()->findInt32("discontinuity", &discontinuity)
-                && discontinuity) {
+        if (buffer->meta()->findInt32("discontinuity", &discontinuity)) {
+            if (discontinuity == ATSParser::DISCONTINUITY_FORMATCHANGE) {
+                mFormat.clear();
+            }
+
             return INFO_DISCONTINUITY;
         } else {
             int64_t timeUs;
@@ -125,9 +135,10 @@
     mCondition.signal();
 }
 
-void AnotherPacketSource::queueDiscontinuity() {
+void AnotherPacketSource::queueDiscontinuity(
+        ATSParser::DiscontinuityType type) {
     sp<ABuffer> buffer = new ABuffer(0);
-    buffer->meta()->setInt32("discontinuity", true);
+    buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
 
     Mutex::Autolock autoLock(mLock);
 
diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.h b/media/libstagefright/mpeg2ts/AnotherPacketSource.h
index 2bc7404..c20fca3 100644
--- a/media/libstagefright/mpeg2ts/AnotherPacketSource.h
+++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.h
@@ -23,6 +23,8 @@
 #include <utils/threads.h>
 #include <utils/List.h>
 
+#include "ATSParser.h"
+
 namespace android {
 
 struct ABuffer;
@@ -30,6 +32,8 @@
 struct AnotherPacketSource : public MediaSource {
     AnotherPacketSource(const sp<MetaData> &meta);
 
+    void setFormat(const sp<MetaData> &meta);
+
     virtual status_t start(MetaData *params = NULL);
     virtual status_t stop();
     virtual sp<MetaData> getFormat();
@@ -42,7 +46,7 @@
     status_t nextBufferTime(int64_t *timeUs);
 
     void queueAccessUnit(const sp<ABuffer> &buffer);
-    void queueDiscontinuity();
+    void queueDiscontinuity(ATSParser::DiscontinuityType type);
     void signalEOS(status_t result);
 
     void clear();
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp
index 4e7759d..73efdfe 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.cpp
+++ b/media/libstagefright/mpeg2ts/ESQueue.cpp
@@ -225,6 +225,14 @@
 
             mFormat = MakeAACCodecSpecificData(
                     profile, sampling_freq_index, channel_configuration);
+
+            int32_t sampleRate;
+            int32_t numChannels;
+            CHECK(mFormat->findInt32(kKeySampleRate, &sampleRate));
+            CHECK(mFormat->findInt32(kKeyChannelCount, &numChannels));
+
+            LOGI("found AAC codec config (%d Hz, %d channels)",
+                 sampleRate, numChannels);
         } else {
             // profile_ObjectType, sampling_frequency_index, private_bits,
             // channel_configuration, original_copy, home
diff --git a/media/libstagefright/yuv/Android.mk b/media/libstagefright/yuv/Android.mk
index 0794ad1..7697e3c 100644
--- a/media/libstagefright/yuv/Android.mk
+++ b/media/libstagefright/yuv/Android.mk
@@ -10,4 +10,6 @@
 
 LOCAL_MODULE:= libstagefright_yuv
 
+LOCAL_PRELINK_MODULE := false
+
 include $(BUILD_SHARED_LIBRARY)
diff --git a/media/mtp/Android.mk b/media/mtp/Android.mk
index e285847..93e70e4 100644
--- a/media/mtp/Android.mk
+++ b/media/mtp/Android.mk
@@ -43,7 +43,9 @@
 
 LOCAL_CFLAGS := -DMTP_DEVICE -DMTP_HOST
 
-include $(BUILD_STATIC_LIBRARY)
+LOCAL_SHARED_LIBRARIES := libutils libcutils libusbhost libbinder
+
+include $(BUILD_SHARED_LIBRARY)
 
 endif
 
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index 7acce02..386cc5d 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -895,7 +895,7 @@
     dp->refs--;
     dp->numTotalConfigs = 0;
     delete [] dp->configs;
-    clearTLS();
+
     return res;
 }
 
@@ -1231,6 +1231,27 @@
     return result;
 }
 
+static void loseCurrent(egl_context_t * cur_c)
+{
+    if (cur_c) {
+        egl_surface_t * cur_r = get_surface(cur_c->read);
+        egl_surface_t * cur_d = get_surface(cur_c->draw);
+
+        // by construction, these are either 0 or valid (possibly terminated)
+        // it should be impossible for these to be invalid
+        ContextRef _cur_c(cur_c);
+        SurfaceRef _cur_r(cur_r);
+        SurfaceRef _cur_d(cur_d);
+
+        cur_c->read = NULL;
+        cur_c->draw = NULL;
+
+        _cur_c.release();
+        _cur_r.release();
+        _cur_d.release();
+    }
+}
+
 EGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
                             EGLSurface read, EGLContext ctx)
 {
@@ -1259,13 +1280,9 @@
 
     // these are the current objects structs
     egl_context_t * cur_c = get_context(getContext());
-    egl_surface_t * cur_r = NULL;
-    egl_surface_t * cur_d = NULL;
     
     if (ctx != EGL_NO_CONTEXT) {
         c = get_context(ctx);
-        cur_r = get_surface(c->read);
-        cur_d = get_surface(c->draw);
         impl_ctx = c->context;
     } else {
         // no context given, use the implementation of the current context
@@ -1311,30 +1328,21 @@
     }
 
     if (result == EGL_TRUE) {
-        // by construction, these are either 0 or valid (possibly terminated)
-        // it should be impossible for these to be invalid
-        ContextRef _cur_c(cur_c);
-        SurfaceRef _cur_r(cur_r);
-        SurfaceRef _cur_d(cur_d);
 
-        // cur_c has to be valid here (but could be terminated)
+        loseCurrent(cur_c);
+
         if (ctx != EGL_NO_CONTEXT) {
             setGLHooksThreadSpecific(c->cnx->hooks[c->version]);
             setContext(ctx);
             _c.acquire();
+            _r.acquire();
+            _d.acquire();
+            c->read = read;
+            c->draw = draw;
         } else {
             setGLHooksThreadSpecific(&gHooksNoContext);
             setContext(EGL_NO_CONTEXT);
         }
-        _cur_c.release();
-
-        _r.acquire();
-        _cur_r.release();
-        if (c) c->read = read;
-
-        _d.acquire();
-        _cur_d.release();
-        if (c) c->draw = draw;
     }
     return result;
 }
@@ -1721,6 +1729,9 @@
 
 EGLBoolean eglReleaseThread(void)
 {
+    // If there is context bound to the thread, release it
+    loseCurrent(get_context(getContext()));
+
     for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
         egl_connection_t* const cnx = &gEGLImpl[i];
         if (cnx->dso) {
diff --git a/packages/DefaultContainerService/res/values-ar/strings.xml b/packages/DefaultContainerService/res/values-ar/strings.xml
index b9c27b7..823e472 100644
--- a/packages/DefaultContainerService/res/values-ar/strings.xml
+++ b/packages/DefaultContainerService/res/values-ar/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"خدمة حاوية الوسائط"</string>
+    <string name="service_name" msgid="4841491635055379553">"مساعد الدخول إلى الحزمة"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-bg/strings.xml b/packages/DefaultContainerService/res/values-bg/strings.xml
index 3546c03..7f8939a 100644
--- a/packages/DefaultContainerService/res/values-bg/strings.xml
+++ b/packages/DefaultContainerService/res/values-bg/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Услуга за контейнер за мултимедия"</string>
+    <string name="service_name" msgid="4841491635055379553">"Помощ в достъпа до пакети"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-ca/strings.xml b/packages/DefaultContainerService/res/values-ca/strings.xml
index 218de71..3af2c55 100644
--- a/packages/DefaultContainerService/res/values-ca/strings.xml
+++ b/packages/DefaultContainerService/res/values-ca/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Servei de contenidor multimèdia"</string>
+    <string name="service_name" msgid="4841491635055379553">"Assistent d\'accés a paquets"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-en-rGB/strings.xml b/packages/DefaultContainerService/res/values-en-rGB/strings.xml
index a84e111..216d715 100644
--- a/packages/DefaultContainerService/res/values-en-rGB/strings.xml
+++ b/packages/DefaultContainerService/res/values-en-rGB/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+    <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-fa/strings.xml b/packages/DefaultContainerService/res/values-fa/strings.xml
index ac70971..8c1a5d4 100644
--- a/packages/DefaultContainerService/res/values-fa/strings.xml
+++ b/packages/DefaultContainerService/res/values-fa/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"سرویس محفظه رسانه"</string>
+    <string name="service_name" msgid="4841491635055379553">"راهنمای دسترسی به بسته"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-fi/strings.xml b/packages/DefaultContainerService/res/values-fi/strings.xml
index a012b61..216d715 100644
--- a/packages/DefaultContainerService/res/values-fi/strings.xml
+++ b/packages/DefaultContainerService/res/values-fi/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Media Container -palvelu"</string>
+    <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-hr/strings.xml b/packages/DefaultContainerService/res/values-hr/strings.xml
index 1ed69b4..56b7db1 100644
--- a/packages/DefaultContainerService/res/values-hr/strings.xml
+++ b/packages/DefaultContainerService/res/values-hr/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Usluga spremnika za medije"</string>
+    <string name="service_name" msgid="4841491635055379553">"Pomoćnik pristupa paketu"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-hu/strings.xml b/packages/DefaultContainerService/res/values-hu/strings.xml
index 0446603..78ca9fa 100644
--- a/packages/DefaultContainerService/res/values-hu/strings.xml
+++ b/packages/DefaultContainerService/res/values-hu/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Médiatároló szolgáltatás"</string>
+    <string name="service_name" msgid="4841491635055379553">"Csomaghozzáférés-segéd"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-in/strings.xml b/packages/DefaultContainerService/res/values-in/strings.xml
index 2f830b1..da6bf8b 100644
--- a/packages/DefaultContainerService/res/values-in/strings.xml
+++ b/packages/DefaultContainerService/res/values-in/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Layanan Kontainer Media"</string>
+    <string name="service_name" msgid="4841491635055379553">"Pembantu Akses Paket"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-iw/strings.xml b/packages/DefaultContainerService/res/values-iw/strings.xml
index ede8178..c6756d6 100644
--- a/packages/DefaultContainerService/res/values-iw/strings.xml
+++ b/packages/DefaultContainerService/res/values-iw/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"שירות גורם מכיל של מדיה"</string>
+    <string name="service_name" msgid="4841491635055379553">"מסייע גישה לחבילה"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-lt/strings.xml b/packages/DefaultContainerService/res/values-lt/strings.xml
index 0ba10a4..df5ffef 100644
--- a/packages/DefaultContainerService/res/values-lt/strings.xml
+++ b/packages/DefaultContainerService/res/values-lt/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Medijos konteinerio paslauga"</string>
+    <string name="service_name" msgid="4841491635055379553">"Prieig. prie paketo pagalb. priem."</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-lv/strings.xml b/packages/DefaultContainerService/res/values-lv/strings.xml
index a84e111..63beee5 100644
--- a/packages/DefaultContainerService/res/values-lv/strings.xml
+++ b/packages/DefaultContainerService/res/values-lv/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+    <string name="service_name" msgid="4841491635055379553">"Pakotnes piekļuves palīgs"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-ro/strings.xml b/packages/DefaultContainerService/res/values-ro/strings.xml
index a84e111..69de00f 100644
--- a/packages/DefaultContainerService/res/values-ro/strings.xml
+++ b/packages/DefaultContainerService/res/values-ro/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+    <string name="service_name" msgid="4841491635055379553">"Ajutor accesare pachet"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-sk/strings.xml b/packages/DefaultContainerService/res/values-sk/strings.xml
index a84e111..216d715 100644
--- a/packages/DefaultContainerService/res/values-sk/strings.xml
+++ b/packages/DefaultContainerService/res/values-sk/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+    <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-sl/strings.xml b/packages/DefaultContainerService/res/values-sl/strings.xml
index a84e111..af2b13c 100644
--- a/packages/DefaultContainerService/res/values-sl/strings.xml
+++ b/packages/DefaultContainerService/res/values-sl/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Media Container Service"</string>
+    <string name="service_name" msgid="4841491635055379553">"Pomočnik za dostop do paketa"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-sr/strings.xml b/packages/DefaultContainerService/res/values-sr/strings.xml
index 7400eab..b5d77ac 100644
--- a/packages/DefaultContainerService/res/values-sr/strings.xml
+++ b/packages/DefaultContainerService/res/values-sr/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Услуга контејнера за медије"</string>
+    <string name="service_name" msgid="4841491635055379553">"Помоћник за приступ пакету"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-th/strings.xml b/packages/DefaultContainerService/res/values-th/strings.xml
index fac3585..3a7080c 100644
--- a/packages/DefaultContainerService/res/values-th/strings.xml
+++ b/packages/DefaultContainerService/res/values-th/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"บริการพื้นที่จัดเก็บสื่อ"</string>
+    <string name="service_name" msgid="4841491635055379553">"ตัวช่วยเหลือของการเข้าถึงแพคเกจ"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-tl/strings.xml b/packages/DefaultContainerService/res/values-tl/strings.xml
index e080364..216d715 100644
--- a/packages/DefaultContainerService/res/values-tl/strings.xml
+++ b/packages/DefaultContainerService/res/values-tl/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Serbisyo ng Media Container"</string>
+    <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-uk/strings.xml b/packages/DefaultContainerService/res/values-uk/strings.xml
index 7becba1..216d715 100644
--- a/packages/DefaultContainerService/res/values-uk/strings.xml
+++ b/packages/DefaultContainerService/res/values-uk/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Служба зберіг. медіа"</string>
+    <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string>
 </resources>
diff --git a/packages/DefaultContainerService/res/values-vi/strings.xml b/packages/DefaultContainerService/res/values-vi/strings.xml
index a22d61d..63f1199 100644
--- a/packages/DefaultContainerService/res/values-vi/strings.xml
+++ b/packages/DefaultContainerService/res/values-vi/strings.xml
@@ -20,5 +20,5 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- outdated translation 2260781993795858516 -->     <string name="service_name" msgid="4841491635055379553">"Dịch vụ Bộ chứa Phương tiện"</string>
+    <string name="service_name" msgid="4841491635055379553">"Trình t.giúp truy cập gói"</string>
 </resources>
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_recent_item.xml b/packages/SystemUI/res/layout-xlarge/status_bar_recent_item.xml
index 2989be0..3fdfdbb 100644
--- a/packages/SystemUI/res/layout-xlarge/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-xlarge/status_bar_recent_item.xml
@@ -31,7 +31,6 @@
         android:layout_alignParentTop="true"
         android:layout_marginLeft="105dip"
         android:scaleType="center"
-        android:background="@drawable/recents_thumbnail_bg"
     />
 
     <ImageView android:id="@+id/app_icon"
diff --git a/packages/SystemUI/res/values-ar-land/strings.xml b/packages/SystemUI/res/values-ar-land/strings.xml
new file mode 100644
index 0000000..4a9ffc4
--- /dev/null
+++ b/packages/SystemUI/res/values-ar-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"تم قفل الشاشة الآن في الاتجاه الأفقي"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ar-port/strings.xml b/packages/SystemUI/res/values-ar-port/strings.xml
new file mode 100644
index 0000000..8a11d46
--- /dev/null
+++ b/packages/SystemUI/res/values-ar-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"تم قفل الشاشة الآن في الاتجاه العمودي."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ar-xlarge/strings.xml b/packages/SystemUI/res/values-ar-xlarge/strings.xml
index 44e911a..be4334f 100644
--- a/packages/SystemUI/res/values-ar-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-ar-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"محو الكل"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"لا اتصال بالإنترنت"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi متصل"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 4ee82d3..85c6d72 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"واجهة مستخدم النظام"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"محو"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"عدم الإزعاج"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"إظهار التنبيهات"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي تنبيهات"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"التنبيهات"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"الرجاء توصيل الشاحن"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"البطارية منخفضة:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"تأمين اتجاه الشاشة"</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="recent_tasks_title" msgid="3691764623638127888">"حديثة"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"ليس هناك أية تطبيقات حديثة."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"سيتم تدوير الشاشة تلقائيًا."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"تم قفل تدوير الشاشة الآن."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-bg-land/strings.xml b/packages/SystemUI/res/values-bg-land/strings.xml
new file mode 100644
index 0000000..0a66f5a
--- /dev/null
+++ b/packages/SystemUI/res/values-bg-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Екранът е заключен в хоризонтална ориентация."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-bg-port/strings.xml b/packages/SystemUI/res/values-bg-port/strings.xml
new file mode 100644
index 0000000..34a7c1d
--- /dev/null
+++ b/packages/SystemUI/res/values-bg-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Екранът е заключен във вертикална ориентация."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-bg-xlarge/strings.xml b/packages/SystemUI/res/values-bg-xlarge/strings.xml
index db572ec..8dd6d7c 100644
--- a/packages/SystemUI/res/values-bg-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-bg-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Изчистване на всичко"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Няма връзка с интернет"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: има връзка"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 9d7b807..54314c7 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"Системен ПИ"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Изчистване"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Не ме безпокойте"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Показване на известията"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Няма известия"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"В момента"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Известия"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Моля, включете зарядно устройство"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Батерията се изтощава:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"Заключване на ориентацията"</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="recent_tasks_title" msgid="3691764623638127888">"Скорошни"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Няма скорошни приложения."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Екранът ще се завърта автоматично."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Завъртането на екрана е заключено."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ca-land/strings.xml b/packages/SystemUI/res/values-ca-land/strings.xml
new file mode 100644
index 0000000..e592e17
--- /dev/null
+++ b/packages/SystemUI/res/values-ca-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Ara la pantalla està bloquejada en orientació horitzontal."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ca-port/strings.xml b/packages/SystemUI/res/values-ca-port/strings.xml
new file mode 100644
index 0000000..c98c170
--- /dev/null
+++ b/packages/SystemUI/res/values-ca-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Ara la pantalla està bloquejada en orientació vertical."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ca-xlarge/strings.xml b/packages/SystemUI/res/values-ca-xlarge/strings.xml
index 2e3baf5..289a2a3 100644
--- a/packages/SystemUI/res/values-ca-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-ca-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Esborra-ho tot"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"No connexió Internet"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: connectat"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index be0407d..77f3b30 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"IU del sistema"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Esborra"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"No molesteu"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostra notificacions"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Cap notificació"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continu"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacions"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Connecteu el carregador"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Comença a quedar poca bateria:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"La bateria comença a estar baixa."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> restant"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"Càrrega d\'USB no admesa."\n"Utilitza només el carregador proporcionat."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Ús de la bateria"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configuració"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode d\'avió"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Bloquejar orientació pantalla"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"Silen."</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificacions"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recents"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"No hi ha aplicacions recents."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"La pantalla girarà automàticament."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Ara la rotació de pantalla està bloquejada."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index f7d4864..e2a35e0 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"Nabíjení pomocí rozhraní USB není podporováno."\n"Používejte pouze nabíječku, která byla dodána se zařízením."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Využití baterie"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavení"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Režim V letadle"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Uzamknout orientaci obrazovky"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ZTLUM."</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index dad6736..50ffd23 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"Opladning via USB understøttes ikke."\n"Brug kun den medfølgende oplader."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Batteriforbrug"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Indstillinger"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flytilstand"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Lås skærmretning"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"LYDLØS"</string>
diff --git a/packages/SystemUI/res/values-de-xlarge/strings.xml b/packages/SystemUI/res/values-de-xlarge/strings.xml
index a617d7d..73c563c 100644
--- a/packages/SystemUI/res/values-de-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-de-xlarge/strings.xml
@@ -22,5 +22,5 @@
     <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
     <skip />
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Keine Internetverbindung"</string>
-    <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"WLAN verbunden"</string>
+    <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Mit WLAN verbunden"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index a76fe3d..a4194ad 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"USB-Aufladung wird nicht unterstützt."\n"Verwenden Sie das mitgelieferte Aufladegerät."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Akkuverbrauch"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Einstellungen"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WLAN"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flugmodus"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Bildschirmausrichtung sperren"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"STUMM"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 4fd5e30..8eb8f22 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -32,8 +32,7 @@
     <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"Κλείδωμα προσανατολ. οθόνης"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ΣΙΓΑΣΗ"</string>
diff --git a/packages/SystemUI/res/values-en-rGB-land/strings.xml b/packages/SystemUI/res/values-en-rGB-land/strings.xml
new file mode 100644
index 0000000..ba773b8
--- /dev/null
+++ b/packages/SystemUI/res/values-en-rGB-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Screen is now locked in landscape orientation."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-en-rGB-port/strings.xml b/packages/SystemUI/res/values-en-rGB-port/strings.xml
new file mode 100644
index 0000000..d8ddce1
--- /dev/null
+++ b/packages/SystemUI/res/values-en-rGB-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Screen is now locked in portrait orientation."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-en-rGB-xlarge/strings.xml b/packages/SystemUI/res/values-en-rGB-xlarge/strings.xml
index b6a9844..fac0137 100644
--- a/packages/SystemUI/res/values-en-rGB-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Clear all"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"No Internet connection"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi connected"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 25bceb8..92a693b 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"System UI"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Clear"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Do not disturb"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Show notifications"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No notifications"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Please connect charger"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"The battery is getting low:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"The battery is getting low."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> remaining"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"USB charging not supported."\n"Use only the supplied charger."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Battery use"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Settings"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Airplane mode"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Lock screen orientation"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notifications"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"No recent applications."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Screen will rotate automatically."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Screen rotation is now locked."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 20c9484..ed5be32 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"No admite la carga USB."\n"Usa sólo el cargador provisto."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Uso de la batería"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configuración"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avión"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Bloq orient de pant"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SILENC"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 9e5ede4..04e3d5f 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"No se admite la carga por USB."\n"Utiliza solo el cargador proporcionado."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Uso de la batería"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ajustes"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avión"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Bloquear orientación pantalla"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SILENC"</string>
diff --git a/packages/SystemUI/res/values-fa-land/strings.xml b/packages/SystemUI/res/values-fa-land/strings.xml
new file mode 100644
index 0000000..adc2b11
--- /dev/null
+++ b/packages/SystemUI/res/values-fa-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"صفحه اکنون در جهت افقی قفل است."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-fa-port/strings.xml b/packages/SystemUI/res/values-fa-port/strings.xml
new file mode 100644
index 0000000..609c944
--- /dev/null
+++ b/packages/SystemUI/res/values-fa-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"صفحه اکنون در جهت عمودی قفل است."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-fa-xlarge/strings.xml b/packages/SystemUI/res/values-fa-xlarge/strings.xml
index 5583f8e..47312a5 100644
--- a/packages/SystemUI/res/values-fa-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-fa-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"پاک کردن همه"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"اتصال اینترنت موجود نیست"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi متصل شد"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 936236f..ac9fbf1 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"رابط کاربر سیستم"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"پاک کردن"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"مزاحم نشوید"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"نمایش اعلان ها"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"اعلانی موجود نیست"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"در حال انجام"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"اعلان ها"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"لطفاً شارژر را وصل کنید"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"باتری در حال کم شدن است:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"قفل جهت صفحه"</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="recent_tasks_title" msgid="3691764623638127888">"اخیر"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"برنامه اخیری موجود نیست."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"صفحه به صورت خودکار می چرخد."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"چرخش صفحه اکنون قفل است."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-fi-land/strings.xml b/packages/SystemUI/res/values-fi-land/strings.xml
new file mode 100644
index 0000000..e1b8a74
--- /dev/null
+++ b/packages/SystemUI/res/values-fi-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Ruutu on nyt lukittu vaakasuuntaan."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-fi-port/strings.xml b/packages/SystemUI/res/values-fi-port/strings.xml
new file mode 100644
index 0000000..1e190ff
--- /dev/null
+++ b/packages/SystemUI/res/values-fi-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Ruutu on nyt lukittu pystysuuntaan."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-fi-xlarge/strings.xml b/packages/SystemUI/res/values-fi-xlarge/strings.xml
index b33d37e..8b1d91d 100644
--- a/packages/SystemUI/res/values-fi-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-fi-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Poista kaikki"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Ei internetyhteyttä"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wifi yhdistetty"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 9b3632c..ca22c63 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"Käyttöliitt."</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Tyhjennä"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Varattu"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Näytä ilmoitukset"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ei ilmoituksia"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Käynnissä olevat"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ilmoitukset"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Kytke laturi"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Akun virta on vähissä:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Akun virta on vähissä."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> jäljellä"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"USB-latausta ei tueta."\n"Käytä laitteen mukana tullutta laturia."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Akun käyttö"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Asetukset"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WiFi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lentokonetila"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Lukitse ruudun suunta"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ÄÄNET."</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Ilmoitukset"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Viimeisimmät"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Ei viimeaikaisia sovelluksia."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Ruutu kiertyy automaattisesti."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Ruudun kierto on lukittu."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index db28b04..b610fd2 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"Chargement USB non disponible."\n"Vous devez utiliser le chargeur fourni."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Utilisation de la batterie"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Paramètres"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode Avion"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Verrouiller orientation écran"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUET"</string>
diff --git a/packages/SystemUI/res/values-hr-land/strings.xml b/packages/SystemUI/res/values-hr-land/strings.xml
new file mode 100644
index 0000000..ce850a9
--- /dev/null
+++ b/packages/SystemUI/res/values-hr-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Zaslona je sada zaključan u pejzažnoj orijentaciji."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-hr-port/strings.xml b/packages/SystemUI/res/values-hr-port/strings.xml
new file mode 100644
index 0000000..31d27ad
--- /dev/null
+++ b/packages/SystemUI/res/values-hr-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Zaslona je sada zaključan u portretnoj orijentaciji."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-hr-xlarge/strings.xml b/packages/SystemUI/res/values-hr-xlarge/strings.xml
index 59c8e3a..cac702a 100644
--- a/packages/SystemUI/res/values-hr-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-hr-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Izbriši sve"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Nema int. veze"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: povezano"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index e7f4869..9b4f0e7 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"UI sustava"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Očisti"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Ne uznemiravaj"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Prikaži obavijesti"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bez obavijesti"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"U tijeku"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obavijesti"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Priključite punjač"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterija će uskoro biti potrošena:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterija će uskoro biti potrošena."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> preostalo"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"USB punjenje nije podržano."\n"Upotrijebite samo priloženi punjač."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Iskorištenost baterije"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Postavke"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Način rada u zrakoplovu"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Zaključaj orijentaciju zaslona"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"Bez zv."</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Obavijesti"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavni"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Nema nedavnih aplikacija."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Zaslon će se rotirati automatski."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Rotacija zaslona sada je zaključana."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-hu-land/strings.xml b/packages/SystemUI/res/values-hu-land/strings.xml
new file mode 100644
index 0000000..2b9ab55
--- /dev/null
+++ b/packages/SystemUI/res/values-hu-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"A képernyő zárolva van fekvő tájolásban."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-hu-port/strings.xml b/packages/SystemUI/res/values-hu-port/strings.xml
new file mode 100644
index 0000000..6d7294f
--- /dev/null
+++ b/packages/SystemUI/res/values-hu-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"A képernyő zárolva van álló tájolásban."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-hu-xlarge/strings.xml b/packages/SystemUI/res/values-hu-xlarge/strings.xml
index 510ba75..d49266f 100644
--- a/packages/SystemUI/res/values-hu-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-hu-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Az összes törlése"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Nincs internetkapcs."</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi csatlakozva"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index e8a6521..3988934 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"Rendszer UI"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Törlés"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Ne zavarjanak"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Értesítések megjelenítése"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nincs értesítés"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Folyamatban van"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Értesítések"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Kérjük, csatlakoztassa a töltőt"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Akkufeszültség alacsony:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Az akkufeszültség alacsony."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> maradt"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"Az USB-n keresztüli töltés nincs támogatva."\n"Használja a kapott töltőt."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Akkumulátorhasználat"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Beállítások"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Repülőgép üzemmód"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Telefon tájolásának zárolása"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"NÉMÍT"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Értesítések"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Legutóbbiak"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Nincsenek nemrég használt alkalmazások"</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"A képernyő automatikusan forogni fog."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"A képernyőforgatás zárolva van."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-in-land/strings.xml b/packages/SystemUI/res/values-in-land/strings.xml
new file mode 100644
index 0000000..ebdbb78
--- /dev/null
+++ b/packages/SystemUI/res/values-in-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Sekarang layar dikunci dalam orientasi lanskap."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-in-port/strings.xml b/packages/SystemUI/res/values-in-port/strings.xml
new file mode 100644
index 0000000..5907e6d
--- /dev/null
+++ b/packages/SystemUI/res/values-in-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Sekarang layar dikunci dalam orientasi potret."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-in-xlarge/strings.xml b/packages/SystemUI/res/values-in-xlarge/strings.xml
index 3be43db..81b3d479 100644
--- a/packages/SystemUI/res/values-in-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-in-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Hapus semua"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Tidak ada sambungan internet"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi tersambung"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 94f93fe..5eaad75 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"Sistem UI"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Bersihkan"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Jangan ganggu"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Tampilkan pemberitahuan"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tidak ada pemberitahuan"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Berkelanjutan"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Harap hubungkan ke pengisi daya"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterai kekurangan daya:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterai semakin lemah."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> tersisa"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"Pengisian daya USB tidak didukung."\n"Gunakan hanya pengisi daya yang disediakan."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Penggunaan baterai"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Setelan"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode pesawat"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Kunci orientasi layar"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"BISUKAN"</string>
-    <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"OTOMATIS"</string>
+    <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Pemberitahuan"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Terbaru"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Tidak ada aplikasi terbaru."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Layar akan diputar secara otomatis."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Sekarang layar rotasi dikunci."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 91c6d31..022af67 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"Ricarica tramite USB non supportata."\n"Utilizza solo il caricatore in dotazione."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Utilizzo batteria"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Impostazioni"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modalità aereo"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Blocca orientamento schermo"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string>
diff --git a/packages/SystemUI/res/values-iw-land/strings.xml b/packages/SystemUI/res/values-iw-land/strings.xml
new file mode 100644
index 0000000..9568fc8
--- /dev/null
+++ b/packages/SystemUI/res/values-iw-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"המסך נעול כעת לרוחב."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-iw-port/strings.xml b/packages/SystemUI/res/values-iw-port/strings.xml
new file mode 100644
index 0000000..f951bf6
--- /dev/null
+++ b/packages/SystemUI/res/values-iw-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"המסך נעול כעת לאורך"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-iw-xlarge/strings.xml b/packages/SystemUI/res/values-iw-xlarge/strings.xml
index 5356165..80043b1 100644
--- a/packages/SystemUI/res/values-iw-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-iw-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"נקה הכל"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"אין חיבור לאינטרנט"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi מחובר"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 9896ab0..75c53a9 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"ממשק משתמש של המערכת"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"נקה"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"נא לא להפריע"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"הצג התראות"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"אין התראות"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"מתבצע"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"התראות"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"חבר מטען"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"הסוללה נחלשת:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"נעל כיוון מסך"</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="recent_tasks_title" msgid="3691764623638127888">"אחרונות"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"אין יישומים חדשים."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"המסך יסתובב באופן אוטומטי."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"סיבוב המסך נעול כעת."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index ad36f2b..11ed8a0 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -32,8 +32,7 @@
     <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"画面の向きをロック"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ミュート"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index f0fec0e..1c4b476 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -32,11 +32,10 @@
     <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"화면 방향 잠금"</string>
-    <string name="status_bar_settings_mute_label" msgid="554682549917429396">"밝기 무시"</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="recent_tasks_title" msgid="3691764623638127888">"최근 사용한 앱"</string>
diff --git a/packages/SystemUI/res/values-lt-land/strings.xml b/packages/SystemUI/res/values-lt-land/strings.xml
new file mode 100644
index 0000000..3d976c5
--- /dev/null
+++ b/packages/SystemUI/res/values-lt-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Dabar ekranas užrakintas horizontalioje pozicijoje."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lt-port/strings.xml b/packages/SystemUI/res/values-lt-port/strings.xml
new file mode 100644
index 0000000..149dbec
--- /dev/null
+++ b/packages/SystemUI/res/values-lt-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Dabar ekranas užrakintas vertikalioje pozicijoje."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lt-xlarge/strings.xml b/packages/SystemUI/res/values-lt-xlarge/strings.xml
index 398dbf2..f9b3ac1 100644
--- a/packages/SystemUI/res/values-lt-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-lt-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Išvalyti viską"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Nėra interneto ryšio"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Prisijungta prie „Wi-Fi“"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index f571515..2b74f29 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"Sistemos NS"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Išvalyti"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Netrukdyti"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Rodyti pranešimus"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nėra įspėjimų"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Vykstantys"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Įspėjimai"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Prijunkite kroviklį"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Akumuliatorius senka:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Akumuliatorius senka."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"Liko <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"USB krovimas nepalaikomas."\n"Naudokite tik pateiktą įkroviklį."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Akumuliatoriaus naudojimas"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nustatymai"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lėktuvo režimas"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Užfiksuoti ekrano orientaciją"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"NUTILD."</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Pranešimai"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Naujos"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Nėra naujausių programų."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Ekranas bus sukamas automatiškai."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Dabar ekrano sukimo funkcija užrakinta."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-lv-land/strings.xml b/packages/SystemUI/res/values-lv-land/strings.xml
new file mode 100644
index 0000000..b8fbe16
--- /dev/null
+++ b/packages/SystemUI/res/values-lv-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekrāns tagad ir bloķēts ainavas orientācijā."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lv-port/strings.xml b/packages/SystemUI/res/values-lv-port/strings.xml
new file mode 100644
index 0000000..ac68922
--- /dev/null
+++ b/packages/SystemUI/res/values-lv-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Ekrāns tagad ir bloķēts portreta orientācijā."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lv-xlarge/strings.xml b/packages/SystemUI/res/values-lv-xlarge/strings.xml
index e647046..af3423f 100644
--- a/packages/SystemUI/res/values-lv-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-lv-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Notīrīt visu"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Nav interneta sav."</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Izv. sav. ar Wi-Fi"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index b0b2567..cca94dc 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"Sistēmas UI"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Notīrīt"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Netraucēt"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Rādīt paziņojumus"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nav paziņojumu"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Notiekošs"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Paziņojumi"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Lūdzu, pievienojiet uzlādes ierīci."</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Akumulatora uzlādes līmenis kļūst zems:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Akumulators drīz izlādēsies."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"Atlicis: <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"USB lādēšana netiek atbalstīta."\n"Izmantojiet tikai komplektā iekļauto lādētāju."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Akumulatora lietojums"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Iestatījumi"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lidmašīnas režīms"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Bloķēt ekrāna orientāciju"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"IZ. SK."</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Paziņojumi"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nesens"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Nav nesenu lietojumprogrammu."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Ekrāns rotēs automātiski."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Ekrāna rotēšana tagad ir bloķēta."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 1e2e184..a9d1b3a 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"USB-lading støttes ikke."\n"Bruk kun den medfølgende laderen."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Batteribruk"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Innstillinger"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Trådløse nettverk"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flymodus"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Lås skjermretning"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"DEMPET"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index db5abfc..552f19c 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"Opladen via USB niet ondersteund."\n"Gebruik alleen de bijgeleverde oplader."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Accugebruik"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Instellingen"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Vliegmodus"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Schermstand vergrendelen"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"DEMPEN"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index ef17a47..84decd3 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"Ładowanie przy użyciu złącza USB nie jest obsługiwane."\n"Należy używać tylko dołączonej ładowarki."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Użycie baterii"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ustawienia"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Tryb samolotowy"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Zablokuj orientację ekranu"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"WYGAŚ"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 0c6220b..9734af5 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"Carregamento USB não suportado. "\n"Utilize apenas o carregador fornecido."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Utilização da bateria"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Definições"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo de avião"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Bloquear orientação do ecrã"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"D. SOM"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index de098b7..d1c5e1d 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"O carregamento via USB não é suportado."\n"Use apenas o carregador fornecido."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Uso da bateria"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configurações"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo para avião"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Bloquear orientação de tela"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUDO"</string>
diff --git a/packages/SystemUI/res/values-ro-land/strings.xml b/packages/SystemUI/res/values-ro-land/strings.xml
new file mode 100644
index 0000000..6896ec8
--- /dev/null
+++ b/packages/SystemUI/res/values-ro-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Ecranul este acum blocat în orientarea de tip peisaj."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ro-port/strings.xml b/packages/SystemUI/res/values-ro-port/strings.xml
new file mode 100644
index 0000000..5931c5e
--- /dev/null
+++ b/packages/SystemUI/res/values-ro-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Ecranul este acum blocat în orientarea de tip portret."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ro-xlarge/strings.xml b/packages/SystemUI/res/values-ro-xlarge/strings.xml
index 3a6edbd..07badf4 100644
--- a/packages/SystemUI/res/values-ro-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-ro-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Ştergeţi-le pe toate"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Fără conex. internet"</string>
-    <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Res. Wi-Fi conectată"</string>
+    <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi conectat"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index ee8734e..825b91e 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"UI sistem"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ştergeţi"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Nu deranjaţi"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Afişaţi notificări"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nicio notificare"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"În desfăşurare"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificări"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Conectaţi încărcătorul"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Bateria se termină:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Bateria este descărcată."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"Rămas: <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"Încărcarea USB nu este acceptată. "\n"Utilizaţi numai încărcătorul furnizat."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Utilizarea bateriei"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Setări"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mod Avion"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Blocaţi orientarea ecranului"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"DEZAC."</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificări"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Nu există aplicaţii recente."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Ecranul se va roti în mod automat."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Rotaţia ecranului este blocată."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index d5e2719..586ee42 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -32,8 +32,7 @@
     <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"Закрепить ориентацию экрана"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ВЫКЛ."</string>
diff --git a/packages/SystemUI/res/values-sk-land/strings.xml b/packages/SystemUI/res/values-sk-land/strings.xml
new file mode 100644
index 0000000..c0c5ba8
--- /dev/null
+++ b/packages/SystemUI/res/values-sk-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Obrazovka je teraz uzamknutá v orientácii na šírku."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-sk-port/strings.xml b/packages/SystemUI/res/values-sk-port/strings.xml
new file mode 100644
index 0000000..c943ab3
--- /dev/null
+++ b/packages/SystemUI/res/values-sk-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Obrazovka je teraz uzamknutá v orientácii na výšku."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-sk-xlarge/strings.xml b/packages/SystemUI/res/values-sk-xlarge/strings.xml
index 2c74cc6..ab01a3a 100644
--- a/packages/SystemUI/res/values-sk-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-sk-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
-    <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"bez. pripoj. k Int."</string>
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Vymazať všetky"</string>
+    <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Nepripoj. k Intern."</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi: pripojené"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 12443b1..1201f2f 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"UI systému"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazať"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Nerušiť"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Zobraziť upozornenia"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žiadne upozornenia"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Prebiehajúce"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Upozornenia"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Pripojte nabíjačku"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Batéria je skoro vybitá:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Batéria je skoro vybitá."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"Zostáva: <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"Nabíjanie pomocou rozhrania USB nie je podporované."\n"Používajte iba nabíjačku, ktorá bola dodaná spolu so zariadením."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Využitie batérie"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavenia"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Režim V lietadle"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Uzamknúť orientáciu obrazovky"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"STLMIŤ"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Upozornenia"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Najnovšie"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Žiadne nedávno použité aplikácie."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Obrazovka sa automaticky otočí."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Otáčanie obrazovky je uzamknuté."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sl-land/strings.xml b/packages/SystemUI/res/values-sl-land/strings.xml
new file mode 100644
index 0000000..a17c5f0
--- /dev/null
+++ b/packages/SystemUI/res/values-sl-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Zaslon je zaklenjen v ležeči usmerjenosti."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-sl-port/strings.xml b/packages/SystemUI/res/values-sl-port/strings.xml
new file mode 100644
index 0000000..b71a6ea
--- /dev/null
+++ b/packages/SystemUI/res/values-sl-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Zaslon je zaklenjen v pokončni usmerjenosti."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-sl-xlarge/strings.xml b/packages/SystemUI/res/values-sl-xlarge/strings.xml
index 59ce54f..ef50a67 100644
--- a/packages/SystemUI/res/values-sl-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-sl-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Počisti vse"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Brez inter. povez."</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi – povezano"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index aa6cb12..ee90450 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -19,22 +19,17 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"Sistemski uporabniški vmesnik"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Počisti"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Ne moti"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Pokaži obvestila"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ni obvestil"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Trenutno"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obvestila"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Priključite napajalnik"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterija je skoraj prazna:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Baterija je skoraj prazna."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> preostalo"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"Polnjenje po povezavi USB ni podprto."\n"Uporabite priloženi polnilnik."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Uporaba baterije"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavitve"</string>
     <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
@@ -45,12 +40,9 @@
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"SAMOD."</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Obvestila"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavno"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Ni novih programov."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Zaslon se bo samodejno zasukal."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Vrtenje zaslona je zaklenjeno."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sr-land/strings.xml b/packages/SystemUI/res/values-sr-land/strings.xml
new file mode 100644
index 0000000..3dd9774
--- /dev/null
+++ b/packages/SystemUI/res/values-sr-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Екран је сада закључан у вертикалном положају."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-sr-port/strings.xml b/packages/SystemUI/res/values-sr-port/strings.xml
new file mode 100644
index 0000000..9c305c0
--- /dev/null
+++ b/packages/SystemUI/res/values-sr-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Екран је сада закључан у хоризонталном положају."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-sr-xlarge/strings.xml b/packages/SystemUI/res/values-sr-xlarge/strings.xml
index fe14153..f5fcfbc 100644
--- a/packages/SystemUI/res/values-sr-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-sr-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Обриши све"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Нема интернет везе"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi је повезан"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index dfefae2..05dfe49 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"UI система"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Обриши"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Не узнемиравај"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Приказуј упозорења"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нема обавештења"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текуће"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Обавештења"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Прикључите пуњач"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Ниво напуњености батерије је низак:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"Закључавање положаја екрана"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"УГАСИ"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"АУТОM."</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Обавештења"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Недавно"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Нема недавних апликација"</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Екран ће се аутоматски ротирати."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Ротирање екрана је сада закључано."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 6198aac..db61d27 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"Det går inte att ladda via USB."\n"Använd endast den laddare som levererades med telefonen."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Batteriförbrukning"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Inställningar"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flygplansläge"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Lås bildskärmens riktning"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"TYST"</string>
diff --git a/packages/SystemUI/res/values-th-land/strings.xml b/packages/SystemUI/res/values-th-land/strings.xml
new file mode 100644
index 0000000..5cc5013
--- /dev/null
+++ b/packages/SystemUI/res/values-th-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"ขณะนี้หน้าจอถูกล็อกการวางแนวในแนวนอน"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-th-port/strings.xml b/packages/SystemUI/res/values-th-port/strings.xml
new file mode 100644
index 0000000..abe230b
--- /dev/null
+++ b/packages/SystemUI/res/values-th-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"ขณะนี้หน้าจอถูกล็อกการวางแนวในแนวตั้ง"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-th-xlarge/strings.xml b/packages/SystemUI/res/values-th-xlarge/strings.xml
index 7a66312..fb4cbae 100644
--- a/packages/SystemUI/res/values-th-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-th-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"ล้างทั้งหมด"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"ไม่มีการเชื่อมต่ออินเทอร์เน็ต"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"เชื่อมต่อ Wi-Fi แล้ว"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 8f226fb..9cdcaff 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"ส่วนติดต่อผู้ใช้ของระบบ"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ล้างข้อมูล"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"ห้ามรบกวน"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"แสดงการแจ้งเตือน"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ไม่มีการแจ้งเตือน"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ดำเนินอยู่"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"การแจ้งเตือน"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"โปรดเสียบอุปกรณ์ชาร์จ"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"แบตเตอรี่เหลือน้อย"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"ล็อกแนวหน้าจอ"</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="recent_tasks_title" msgid="3691764623638127888">"เมื่อเร็วๆ นี้"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"ไม่มีแอปพลิเคชันล่าสุด"</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"หน้าจอจะหมุนโดยอัตโนมัติ"</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"ขณะนี้การหมุนหน้าจอถูกล็อก"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-tl-land/strings.xml b/packages/SystemUI/res/values-tl-land/strings.xml
new file mode 100644
index 0000000..551e620
--- /dev/null
+++ b/packages/SystemUI/res/values-tl-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Naka-lock na ngayon ang screen at nasa pahigang oryentasyon."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-tl-port/strings.xml b/packages/SystemUI/res/values-tl-port/strings.xml
new file mode 100644
index 0000000..d51f19f
--- /dev/null
+++ b/packages/SystemUI/res/values-tl-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Naka-lock na ngayon ang screen at nasa patayong orientation."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-tl-xlarge/strings.xml b/packages/SystemUI/res/values-tl-xlarge/strings.xml
index 225b545..3560c96 100644
--- a/packages/SystemUI/res/values-tl-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-tl-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"I-clear ang lahat"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Wala net connection"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Konektado ang WiFi"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index d0811c5..0b7fa1d 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"UI ng System"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"I-clear"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Huwag gambalain"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Magpakita ng notification"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Walang mga notification"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Nagpapatuloy"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Mga Notification"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Pakikonekta ang charger"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Humihina ang baterya:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Humihina na ang baterya."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> natitira"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"Hindi sinusuportahan ang pag-charge sa USB."\n"Gamitin lang ang ibinigay na charger."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Paggamit ng baterya"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Mga Setting"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Airplane mode"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Naka-lock na screen orientation"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Mga Notification"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Kamakailan"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Walang kamakailang mga application."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Awtomatikong iikot ang screen."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Naka-lock na ngayon ang pag-ikot ng screen."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 69e9f3e..f015320 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -32,8 +32,7 @@
     <string name="invalid_charger" msgid="4549105996740522523">"USB üzerinden şarj desteklenmiyor."\n"Yalnızca ürünle birlikte verilen şarj cihazını kullanın."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Pil kullanımı"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ayarlar"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Kablosuz"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Uçak modu"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Ekran yönünü kilitle"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"KAPAT"</string>
diff --git a/packages/SystemUI/res/values-uk-land/strings.xml b/packages/SystemUI/res/values-uk-land/strings.xml
new file mode 100644
index 0000000..7f5b0f8
--- /dev/null
+++ b/packages/SystemUI/res/values-uk-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Екран зараз заблоковано в альбомній орієнтації."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-uk-port/strings.xml b/packages/SystemUI/res/values-uk-port/strings.xml
new file mode 100644
index 0000000..f0ea45f
--- /dev/null
+++ b/packages/SystemUI/res/values-uk-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Екран зараз заблоковано в книжковій орієнтації."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-uk-xlarge/strings.xml b/packages/SystemUI/res/values-uk-xlarge/strings.xml
index 7645f5e..47242a6 100644
--- a/packages/SystemUI/res/values-uk-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-uk-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Очистити все"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Інтернет не під\'єдн."</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi під\'єднано"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 078d81a..fd41596 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"Інтерф.сист."</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очист."</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Не турбувати"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Показувати сповіщення"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Немає сповіщень"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Поточні"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Сповіщення"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Підключ. заряд. пристрій"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Батарея виснажується:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"Заблокувати орієнтацію екрана"</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="recent_tasks_title" msgid="3691764623638127888">"Останні"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Немає останніх програм."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Екран обертатиметься автоматично."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Обертання екрана зараз заблоковано."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-vi-land/strings.xml b/packages/SystemUI/res/values-vi-land/strings.xml
new file mode 100644
index 0000000..e0c73ec
--- /dev/null
+++ b/packages/SystemUI/res/values-vi-land/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="7609673011431556092">"Màn hình hiện bị khóa theo hướng ngang."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-vi-port/strings.xml b/packages/SystemUI/res/values-vi-port/strings.xml
new file mode 100644
index 0000000..2446f77
--- /dev/null
+++ b/packages/SystemUI/res/values-vi-port/strings.xml
@@ -0,0 +1,23 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="toast_rotation_locked" msgid="1716565836190665743">"Màn hình hiện bị khóa theo hướng dọc."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-vi-xlarge/strings.xml b/packages/SystemUI/res/values-vi-xlarge/strings.xml
index eba1b72..cd390b3 100644
--- a/packages/SystemUI/res/values-vi-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-vi-xlarge/strings.xml
@@ -19,8 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
-    <skip />
+    <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Xóa tất cả"</string>
     <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Không có kết nối Internet"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Đã kết nối Wi-Fi"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index e47e519..819b3ea 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -19,38 +19,29 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for app_label (7164937344850004466) -->
-    <skip />
+    <string name="app_label" msgid="7164937344850004466">"Giao diện người dùng hệ thống"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Xoá"</string>
-    <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) -->
-    <skip />
-    <!-- no translation found for status_bar_please_disturb_button (3345398298841572813) -->
-    <skip />
+    <string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Không làm phiền"</string>
+    <string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Hiển thị thông báo"</string>
     <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Không có thông báo nào"</string>
     <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Đang diễn ra"</string>
     <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Thông báo"</string>
     <string name="battery_low_title" msgid="7923774589611311406">"Vui lòng kết nối bộ sạc"</string>
-    <!-- outdated translation 7388781709819722764 -->     <string name="battery_low_subtitle" msgid="1752040062087829196">"Pin đang yếu:"</string>
-    <!-- no translation found for battery_low_percent_format (1077244949318261761) -->
-    <skip />
-    <!-- no translation found for invalid_charger (4549105996740522523) -->
-    <skip />
+    <string name="battery_low_subtitle" msgid="1752040062087829196">"Pin đang yếu."</string>
+    <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> còn lại"</string>
+    <string name="invalid_charger" msgid="4549105996740522523">"Không hỗ trợ sạc qua USB."\n"Chỉ sử dụng bộ sạc được cung cấp."</string>
     <string name="battery_low_why" msgid="7279169609518386372">"Sử dụng pin"</string>
     <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Cài đặt"</string>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
     <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Chế độ trên máy bay"</string>
     <string name="status_bar_settings_rotation_lock" msgid="8361452930058000609">"Khóa hướng màn hình"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"TẮT TIẾNG"</string>
     <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"TỰ ĐỘNG"</string>
     <string name="status_bar_settings_notifications" msgid="397146176280905137">"Thông báo"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Gần đây"</string>
-    <!-- no translation found for recent_tasks_empty (1905484479067697884) -->
-    <skip />
+    <string name="recent_tasks_empty" msgid="1905484479067697884">"Không có ứng dụng nào gần đây."</string>
     <!-- no translation found for recent_tasks_app_label (3796483981246752469) -->
     <skip />
-    <!-- no translation found for toast_rotation_free (2700542202836832631) -->
-    <skip />
-    <!-- no translation found for toast_rotation_locked (7484691306949652450) -->
-    <skip />
+    <string name="toast_rotation_free" msgid="2700542202836832631">"Màn hinh sẽ xoay tự động."</string>
+    <string name="toast_rotation_locked" msgid="7484691306949652450">"Xoay màn hình hiện đã bị khóa."</string>
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 03cd73d..75454f3 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -32,8 +32,7 @@
     <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"锁定屏幕浏览模式"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"静音"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml b/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml
index 6e52cdf..6a8ef52 100644
--- a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml
@@ -21,6 +21,6 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- no translation found for status_bar_clear_all_button (4722520806446512408) -->
     <skip />
-    <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"沒有網際網路連線"</string>
+    <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"沒有網路連線"</string>
     <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi 已連線"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 90d8e41..5094b3e 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -32,8 +32,7 @@
     <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>
-    <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
-    <skip />
+    <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_rotation_lock" msgid="8361452930058000609">"鎖定螢幕瀏覽模式"</string>
     <string name="status_bar_settings_mute_label" msgid="554682549917429396">"關閉"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
index ddce6bf..f5e677d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
@@ -48,6 +48,11 @@
     // IME shortcut button is disabled.
     private static final int ID_IME_SHORTCUT_BUTTON = 0;
 
+    // These values are defined in Settings application.
+    private static final int ID_IME_BUTTON_VISIBILITY_AUTO = 0;
+    private static final int ID_IME_BUTTON_VISIBILITY_ALWAYS_SHOW = 1;
+    private static final int ID_IME_BUTTON_VISIBILITY_ALWAYS_HIDE = 2;
+
     // other services we wish to talk to
     private final InputMethodManager mImm;
     private final int mId;
@@ -56,14 +61,14 @@
             new HashMap<String, InputMethodInfo>();
     private ImageView mIcon;
     private IBinder mToken;
-    private boolean mKeyboardShown;
+    private boolean mKeyboardVisible = false;
+    private boolean mScreenLocked = false;
     private InputMethodInfo mShortcutInfo;
     private InputMethodSubtype mShortcutSubtype;
 
     public InputMethodButton(Context context, AttributeSet attrs) {
         super(context, attrs);
 
-        mKeyboardShown = false;
         // Resource Id of the input method button. This id is defined in status_bar.xml
         mId = getId();
         // IME hookup
@@ -94,7 +99,7 @@
     protected void onAttachedToWindow() {
         mIcon = (ImageView) findViewById(mId);
 
-        refreshStatusIcon(mKeyboardShown);
+        refreshStatusIcon();
     }
 
     private InputMethodInfo getCurrentInputMethodInfo() {
@@ -162,14 +167,24 @@
     // * There are no explicitly enabled (by the user) subtypes of the IME, or the IME doesn't have
     // its subtypes at all
     private boolean needsToShowIMEButton() {
+        if (!mKeyboardVisible || mScreenLocked) return false;
         List<InputMethodInfo> imis = mImm.getEnabledInputMethodList();
         final int size = imis.size();
-        return size > 1
-                || (size == 1 && mImm.getEnabledInputMethodSubtypeList(imis.get(0)).size() > 1);
+        final int visibility = loadInputMethodSelectorVisibility();
+        switch (visibility) {
+            case ID_IME_BUTTON_VISIBILITY_AUTO:
+                return size > 1 || (size == 1
+                        && mImm.getEnabledInputMethodSubtypeList(imis.get(0), false).size() > 1);
+            case ID_IME_BUTTON_VISIBILITY_ALWAYS_SHOW:
+                return true;
+            case ID_IME_BUTTON_VISIBILITY_ALWAYS_HIDE:
+                return false;
+        }
+        return false;
     }
 
-    private void refreshStatusIcon(boolean keyboardShown) {
-        if (!keyboardShown) {
+    private void refreshStatusIcon() {
+        if (!needsToShowIMEButton()) {
             setVisibility(View.INVISIBLE);
             return;
         } else {
@@ -196,9 +211,19 @@
         }
     }
 
-    public void setIMEButtonVisible(IBinder token, boolean visible) {
+    private int loadInputMethodSelectorVisibility() {
+        return Settings.Secure.getInt(getContext().getContentResolver(),
+                Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, ID_IME_BUTTON_VISIBILITY_AUTO);
+    }
+
+    public void setIMEButtonVisible(IBinder token, boolean keyboardVisible) {
         mToken = token;
-        mKeyboardShown = visible ? needsToShowIMEButton() : false;
-        refreshStatusIcon(mKeyboardShown);
+        mKeyboardVisible = keyboardVisible;
+        refreshStatusIcon();
+    }
+
+    public void setScreenLocked(boolean locked) {
+        mScreenLocked = locked;
+        refreshStatusIcon();
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java
index c9fd9a9..759c17c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java
@@ -39,7 +39,8 @@
 
 public class NotificationPanel extends LinearLayout implements StatusBarPanel,
         View.OnClickListener {
-    static final String TAG = "NotificationPanel";
+    static final String TAG = "Tablet/NotificationPanel";
+    static final boolean DEBUG = false;
 
     boolean mShowing;
     View mTitleArea;
@@ -248,6 +249,7 @@
         }
 
         void startAnimation(boolean visible) {
+            if (DEBUG) Slog.d(TAG, "startAnimation(visible=" + visible + ")");
             if (mBgAnim != null && mVisible != visible) {
                 mBgAnim.reverse();
                 mPositionAnim.reverse();
@@ -303,18 +305,22 @@
             if (mPanelBottom == 0) {
                 // fully closed, no animation necessary
                 setPanelBottom(0);
-            } else {
-                // a little bit visible, schedule an animation
+            } else if (mVisible) {
+                if (DEBUG) {
+                    Slog.d(TAG, "panelHeight not zero but trying to open; scheduling an anim to open fully");
+                }
                 startAnimation(true);
             }
         }
 
         public void onAnimationCancel(Animator animation) {
-            //Slog.d(TAG, "onAnimationCancel mBgAlpha=" + mBgAlpha);
+            if (DEBUG) Slog.d(TAG, "onAnimationCancel mBgAlpha=" + mBgAlpha);
+            // force this to zero so we close the window
+            mBgAlpha = 0;
         }
 
         public void onAnimationEnd(Animator animation) {
-            //Slog.d(TAG, "onAnimationEnd mBgAlpha=" + mBgAlpha);
+            if (DEBUG) Slog.d(TAG, "onAnimationEnd mBgAlpha=" + mBgAlpha);
             if (mBgAlpha == 0) {
                 setVisibility(View.GONE);
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
index e0f37ca..bd9bdb2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
@@ -23,8 +23,6 @@
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.app.ActivityManager;
-import android.app.IThumbnailReceiver;
-import android.app.ActivityManager.RunningTaskInfo;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
@@ -33,20 +31,20 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Rect;
+import android.graphics.RectF;
 import android.graphics.Shader.TileMode;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.os.RemoteException;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.animation.AccelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -55,12 +53,12 @@
 import com.android.systemui.R;
 
 public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnClickListener {
-    private static final int COLLAPSE_DURATION = 360;
+    private static final int GLOW_PADDING = 15;
     private static final String TAG = "RecentAppsPanel";
     private static final boolean DEBUG = TabletStatusBar.DEBUG;
-    private static final int DISPLAY_TASKS_PORTRAIT = 8;
+    private static final int DISPLAY_TASKS_PORTRAIT = 7; // Limited by max binder transaction size
     private static final int DISPLAY_TASKS_LANDSCAPE = 5; // number of recent tasks to display
-    private static final int MAX_TASKS = DISPLAY_TASKS_PORTRAIT + 2; // allow extra for non-apps
+    private static final int MAX_TASKS = DISPLAY_TASKS_PORTRAIT + 1; // allow extra for non-apps
     private static final int STAGGER_ANIMATION_DELAY = 30;
     private static final long ALPHA_ANIMATION_DURATION = 120;
     private TabletStatusBar mBar;
@@ -70,6 +68,7 @@
     private int mIconDpi;
     private AnimatorSet mAnimationSet;
     private View mBackgroundProtector;
+    private Bitmap mGlowBitmap;
 
     static class ActivityDescription {
         int id;
@@ -121,6 +120,7 @@
                 & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE;
 
         mIconDpi = xlarge ? DisplayMetrics.DENSITY_HIGH : res.getDisplayMetrics().densityDpi;
+        mGlowBitmap = BitmapFactory.decodeResource(res, R.drawable.recents_thumbnail_bg);
     }
 
     @Override
@@ -225,8 +225,8 @@
                 if (title != null && title.length() > 0 && icon != null) {
                     if (DEBUG) Log.v(TAG, "creating activity desc for id=" + id + ", label=" + title);
                     ActivityDescription item = new ActivityDescription(
-                            crop(recentInfo.thumbnail), icon, title, recentInfo.description,
-                            intent, id, index, info.packageName);
+                            recentInfo.thumbnail, icon, title,
+                            recentInfo.description, intent, id, index, info.packageName);
                     activityDescriptions.add(item);
                     ++index;
                 } else {
@@ -255,21 +255,22 @@
         updateUiElements(getResources().getConfiguration(), true);
     }
 
-    private Bitmap crop(Bitmap bitmap) {
-        if (bitmap == null || bitmap.getWidth() >= bitmap.getHeight()) {
-            return bitmap;
-        }
-        final int width = bitmap.getWidth();
-        final int height = bitmap.getHeight();
-        Bitmap outBitmap = Bitmap.createBitmap(height, width, bitmap.getConfig());
+    private Bitmap compositeBitmap(Bitmap background, Bitmap thumbnail) {
+        Bitmap outBitmap = background.copy(background.getConfig(), true);
         Canvas canvas = new Canvas(outBitmap);
         Paint paint = new Paint();
         paint.setAntiAlias(true);
         paint.setFilterBitmap(true);
-        canvas.drawBitmap(bitmap,
-                new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight() - height * width / height),
-                new Rect(0, 0, outBitmap.getWidth(), outBitmap.getHeight()),
-                paint);
+        paint.setAlpha(255);
+        final int srcWidth = thumbnail.getWidth();
+        final int height = thumbnail.getHeight();
+        final int srcHeight = srcWidth > height ? height : (height - height * srcWidth / height);
+        canvas.drawBitmap(thumbnail,
+                new Rect(0, 0, srcWidth-1, srcHeight-1),
+                new RectF(GLOW_PADDING,
+                        GLOW_PADDING - 4.0f,
+                        outBitmap.getWidth() - GLOW_PADDING + 2.0f,
+                        outBitmap.getHeight() - GLOW_PADDING + 3.0f), paint);
         return outBitmap;
     }
 
@@ -291,7 +292,7 @@
             TextView appLabel = (TextView) view.findViewById(R.id.app_label);
             TextView appDesc = (TextView) view.findViewById(R.id.app_description);
             final Bitmap thumb = activityDescription.thumbnail;
-            appThumbnail.setImageBitmap(crop(thumb));
+            appThumbnail.setImageBitmap(compositeBitmap(mGlowBitmap, thumb));
             appIcon.setImageDrawable(activityDescription.icon);
             appLabel.setText(activityDescription.label);
             appDesc.setText(activityDescription.description);
@@ -319,10 +320,8 @@
             anim.setDuration((last-first) * STAGGER_ANIMATION_DELAY);
             anim.setInterpolator(interp);
             anims.add(anim);
-        }
 
-        if (animate) {
-            ObjectAnimator anim = ObjectAnimator.ofFloat(mBackgroundProtector, "alpha",
+            anim = ObjectAnimator.ofFloat(mBackgroundProtector, "alpha",
                     initialAlpha, 1.0f);
             anim.setDuration(last * STAGGER_ANIMATION_DELAY);
             anim.setInterpolator(interp);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index 3201f8b0..03e33fa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -692,9 +692,11 @@
             if ((state & StatusBarManager.DISABLE_NAVIGATION) != 0) {
                 Slog.d(TAG, "DISABLE_NAVIGATION: yes");
                 mNavigationArea.setVisibility(View.GONE);
+                mInputMethodSwitchButton.setScreenLocked(true);
             } else {
                 Slog.d(TAG, "DISABLE_NAVIGATION: no");
                 mNavigationArea.setVisibility(View.VISIBLE);
+                mInputMethodSwitchButton.setScreenLocked(false);
             }
         }
     }
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index c6984a4..281ac2e 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -112,6 +112,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
+import static android.view.WindowManager.LayoutParams.TYPE_POINTER;
 import android.view.WindowManagerImpl;
 import android.view.WindowManagerPolicy;
 import android.view.animation.Animation;
@@ -176,6 +177,8 @@
     // things in here CAN NOT take focus, but are shown on top of everything else.
     static final int SYSTEM_OVERLAY_LAYER = 18;
     static final int SECURE_SYSTEM_OVERLAY_LAYER = 19;
+    // the (mouse) pointer layer
+    static final int POINTER_LAYER = 20;
 
     static final int APPLICATION_MEDIA_SUBLAYER = -2;
     static final int APPLICATION_MEDIA_OVERLAY_SUBLAYER = -1;
@@ -950,6 +953,8 @@
             return WALLPAPER_LAYER;
         case TYPE_DRAG:
             return DRAG_LAYER;
+        case TYPE_POINTER:
+            return POINTER_LAYER;
         }
         Log.e(TAG, "Unknown window type: " + type);
         return APPLICATION_LAYER;
@@ -2360,15 +2365,27 @@
             Display d = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
                     .getDefaultDisplay();
             if (d.getWidth() > d.getHeight()) {
-                mPortraitRotation = Surface.ROTATION_90;
                 mLandscapeRotation = Surface.ROTATION_0;
-                mUpsideDownRotation = Surface.ROTATION_270;
                 mSeascapeRotation = Surface.ROTATION_180;
+                if (mContext.getResources().getBoolean(
+                        com.android.internal.R.bool.config_reverseDefaultRotation)) {
+                    mPortraitRotation = Surface.ROTATION_90;
+                    mUpsideDownRotation = Surface.ROTATION_270;
+                } else {
+                    mPortraitRotation = Surface.ROTATION_270;
+                    mUpsideDownRotation = Surface.ROTATION_90;
+                }
             } else {
                 mPortraitRotation = Surface.ROTATION_0;
-                mLandscapeRotation = Surface.ROTATION_90;
                 mUpsideDownRotation = Surface.ROTATION_180;
-                mSeascapeRotation = Surface.ROTATION_270;
+                if (mContext.getResources().getBoolean(
+                        com.android.internal.R.bool.config_reverseDefaultRotation)) {
+                    mLandscapeRotation = Surface.ROTATION_270;
+                    mSeascapeRotation = Surface.ROTATION_90;
+                } else {
+                    mLandscapeRotation = Surface.ROTATION_90;
+                    mSeascapeRotation = Surface.ROTATION_270;
+                }
             }
         }
 
diff --git a/services/audioflinger/A2dpAudioInterface.cpp b/services/audioflinger/A2dpAudioInterface.cpp
index aee01ab..d926cb1 100644
--- a/services/audioflinger/A2dpAudioInterface.cpp
+++ b/services/audioflinger/A2dpAudioInterface.cpp
@@ -260,6 +260,7 @@
     if (pRate) *pRate = lRate;
 
     mDevice = device;
+    mBufferDurationUs = ((bufferSize() * 1000 )/ frameSize() / sampleRate()) * 1000;
     return NO_ERROR;
 }
 
@@ -288,6 +289,7 @@
         if (mStandby) {
             acquire_wake_lock (PARTIAL_WAKE_LOCK, sA2dpWakeLock);
             mStandby = false;
+            mLastWriteTime = systemTime();
         }
 
         status = init();
@@ -308,6 +310,15 @@
             buffer = (char *)buffer + status;
         }
 
+        // if A2DP sink runs abnormally fast, sleep a little so that audioflinger mixer thread
+        // does no spin and starve other threads.
+        // NOTE: It is likely that the A2DP headset is being disconnected
+        nsecs_t now = systemTime();
+        if ((uint32_t)ns2us(now - mLastWriteTime) < (mBufferDurationUs >> 2)) {
+            LOGV("A2DP sink runs too fast");
+            usleep(mBufferDurationUs - (uint32_t)ns2us(now - mLastWriteTime));
+        }
+        mLastWriteTime = now;
         return bytes;
 
     }
@@ -316,7 +327,7 @@
     standby();
 
     // Simulate audio output timing in case of error
-    usleep(((bytes * 1000 )/ frameSize() / sampleRate()) * 1000);
+    usleep(mBufferDurationUs);
 
     return status;
 }
diff --git a/services/audioflinger/A2dpAudioInterface.h b/services/audioflinger/A2dpAudioInterface.h
index cef1926..dbe2c6a 100644
--- a/services/audioflinger/A2dpAudioInterface.h
+++ b/services/audioflinger/A2dpAudioInterface.h
@@ -117,6 +117,8 @@
                 uint32_t    mDevice;
                 bool        mClosing;
                 bool        mSuspended;
+                nsecs_t     mLastWriteTime;
+                uint32_t    mBufferDurationUs;
     };
 
     friend class A2dpAudioStreamOut;
diff --git a/services/java/com/android/server/AccessibilityManagerService.java b/services/java/com/android/server/AccessibilityManagerService.java
index 83ce3e3..d38522c 100644
--- a/services/java/com/android/server/AccessibilityManagerService.java
+++ b/services/java/com/android/server/AccessibilityManagerService.java
@@ -240,10 +240,9 @@
                 public void onChange(boolean selfChange) {
                     super.onChange(selfChange);
 
-                    mIsEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
-                        Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
-
                     synchronized (mLock) {
+                        mIsEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
+                                Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
                         if (mIsEnabled) {
                             manageServicesLocked();
                         } else {
@@ -452,9 +451,7 @@
         } catch (RemoteException re) {
             if (re instanceof DeadObjectException) {
                 Slog.w(LOG_TAG, "Dead " + service.mService + ". Cleaning up.");
-                synchronized (mLock) {
-                    removeDeadServiceLocked(service);
-                }
+                removeDeadServiceLocked(service);
             } else {
                 Slog.e(LOG_TAG, "Error during sending " + event + " to " + service.mService, re);
             }
@@ -468,19 +465,11 @@
      * @return True if the service was removed, false otherwise.
      */
     private boolean removeDeadServiceLocked(Service service) {
-        mServices.remove(service);
-        mHandler.removeMessages(service.mId);
-
         if (Config.DEBUG) {
             Slog.i(LOG_TAG, "Dead service " + service.mService + " removed");
         }
-
-        if (mServices.isEmpty()) {
-            mIsEnabled = false;
-            updateClientsLocked();
-        }
-
-        return true;
+        mHandler.removeMessages(service.mId);
+        return mServices.remove(service);
     }
 
     /**
diff --git a/services/java/com/android/server/ClipboardService.java b/services/java/com/android/server/ClipboardService.java
index 30ea48c..bec35d1 100644
--- a/services/java/com/android/server/ClipboardService.java
+++ b/services/java/com/android/server/ClipboardService.java
@@ -115,7 +115,7 @@
 
     public ClipDescription getPrimaryClipDescription() {
         synchronized (this) {
-            return mPrimaryClip.getDescription();
+            return mPrimaryClip != null ? mPrimaryClip.getDescription() : null;
         }
     }
 
@@ -211,7 +211,7 @@
         } catch (NameNotFoundException e) {
             throw new IllegalArgumentException("Unknown package " + pkg, e);
         }
-        if (!mActivePermissionOwners.contains(pkg)) {
+        if (mPrimaryClip != null && !mActivePermissionOwners.contains(pkg)) {
             final int N = mPrimaryClip.getItemCount();
             for (int i=0; i<N; i++) {
                 grantItemLocked(mPrimaryClip.getItem(i), pkg);
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index f82a243..a84ba78 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -16,8 +16,7 @@
 
 package com.android.server;
 
-import android.app.Notification;
-import android.app.NotificationManager;
+import android.bluetooth.BluetoothTetheringDataTracker;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
@@ -26,9 +25,9 @@
 import android.net.ConnectivityManager;
 import android.net.DummyDataStateTracker;
 import android.net.IConnectivityManager;
+import android.net.LinkProperties;
 import android.net.MobileDataStateTracker;
 import android.net.NetworkInfo;
-import android.net.LinkProperties;
 import android.net.NetworkStateTracker;
 import android.net.NetworkUtils;
 import android.net.Proxy;
@@ -50,7 +49,6 @@
 import android.util.Slog;
 
 import com.android.internal.telephony.Phone;
-
 import com.android.server.connectivity.Tethering;
 
 import java.io.FileDescriptor;
@@ -58,7 +56,6 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.InetAddress;
-import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -412,6 +409,10 @@
                         mNetAttributes[netType].mName);
                 mNetTrackers[netType].startMonitoring(context, mHandler);
                 break;
+            case ConnectivityManager.TYPE_BLUETOOTH:
+                mNetTrackers[netType] = BluetoothTetheringDataTracker.getInstance();
+                mNetTrackers[netType].startMonitoring(context, mHandler);
+                break;
             default:
                 loge("Trying to create a DataStateTracker for an unknown radio type " +
                         mNetAttributes[netType].mRadio);
@@ -1097,6 +1098,7 @@
                     // gotten a positive report we don't want to overwrite, but if not we need to
                     // clear this now to turn our cellular sig strength white
                     mDefaultInetConditionPublished = 0;
+                    intent.putExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true);
                 }
                 intent.putExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO, switchTo);
             } else {
@@ -1572,11 +1574,18 @@
         }
     }
 
-    private void writePidDns(Collection <InetAddress> dnses, int pid) {
+    // return true if results in a change
+    private boolean writePidDns(Collection <InetAddress> dnses, int pid) {
         int j = 1;
+        boolean changed = false;
         for (InetAddress dns : dnses) {
-            SystemProperties.set("net.dns" + j++ + "." + pid, dns.getHostAddress());
+            String dnsString = dns.getHostAddress();
+            if (changed || !dnsString.equals(SystemProperties.get("net.dns" + j + "." + pid))) {
+                changed = true;
+                SystemProperties.set("net.dns" + j++ + "." + pid, dns.getHostAddress());
+            }
         }
+        return changed;
     }
 
     private void bumpDns() {
@@ -1607,26 +1616,40 @@
             LinkProperties p = nt.getLinkProperties();
             if (p == null) return;
             Collection<InetAddress> dnses = p.getDnses();
+            boolean changed = false;
             if (mNetAttributes[netType].isDefault()) {
                 int j = 1;
                 if (dnses.size() == 0 && mDefaultDns != null) {
-                    if (DBG) {
-                        log("no dns provided - using " + mDefaultDns.getHostAddress());
+                    String dnsString = mDefaultDns.getHostAddress();
+                    if (!dnsString.equals(SystemProperties.get("net.dns1"))) {
+                        if (DBG) {
+                            log("no dns provided - using " + dnsString);
+                        }
+                        changed = true;
+                        SystemProperties.set("net.dns1", dnsString);
                     }
-                    SystemProperties.set("net.dns1", mDefaultDns.getHostAddress());
                     j++;
                 } else {
                     for (InetAddress dns : dnses) {
+                        String dnsString = dns.getHostAddress();
+                        if (!changed && dnsString.equals(SystemProperties.get("net.dns" + j))) {
+                            j++;
+                            continue;
+                        }
                         if (DBG) {
                             log("adding dns " + dns + " for " +
                                     nt.getNetworkInfo().getTypeName());
                         }
-                        SystemProperties.set("net.dns" + j++, dns.getHostAddress());
+                        changed = true;
+                        SystemProperties.set("net.dns" + j++, dnsString);
                     }
                 }
                 for (int k=j ; k<mNumDnsEntries; k++) {
-                    if (DBG) log("erasing net.dns" + k);
-                    SystemProperties.set("net.dns" + k, "");
+                    if (changed || !TextUtils.isEmpty(SystemProperties.get("net.dns" + k))) {
+                        if (DBG) log("erasing net.dns" + k);
+                        changed = true;
+                        SystemProperties.set("net.dns" + k, "");
+                    }
                 }
                 mNumDnsEntries = j;
             } else {
@@ -1634,10 +1657,10 @@
                 List pids = mNetRequestersPids[netType];
                 for (int y=0; y< pids.size(); y++) {
                     Integer pid = (Integer)pids.get(y);
-                    writePidDns(dnses, pid.intValue());
+                    changed = writePidDns(dnses, pid.intValue());
                 }
             }
-            bumpDns();
+            if (changed) bumpDns();
         }
     }
 
@@ -2131,6 +2154,7 @@
     }
 
     private void sendProxyBroadcast(ProxyProperties proxy) {
+        if (proxy == null) proxy = new ProxyProperties("", 0, "");
         log("sending Proxy Broadcast for " + proxy);
         Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION);
         intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
diff --git a/services/java/com/android/server/InputManager.java b/services/java/com/android/server/InputManager.java
index 4c499cd..b5becb5 100644
--- a/services/java/com/android/server/InputManager.java
+++ b/services/java/com/android/server/InputManager.java
@@ -32,6 +32,7 @@
 import android.view.InputEvent;
 import android.view.KeyEvent;
 import android.view.Surface;
+import android.view.WindowManager;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -475,5 +476,13 @@
             }
             return result;
         }
+
+        @SuppressWarnings("unused")
+        public int getPointerLayer() {
+            return mWindowManagerService.mPolicy.windowTypeToLayerLw(
+                    WindowManager.LayoutParams.TYPE_DRAG)
+                    * WindowManagerService.TYPE_LAYER_MULTIPLIER
+                    + WindowManagerService.TYPE_LAYER_OFFSET;
+        }
     }
 }
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 95200fa..7ed9187 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -99,6 +99,7 @@
     static final int MSG_SHOW_IM_PICKER = 1;
     static final int MSG_SHOW_IM_SUBTYPE_PICKER = 2;
     static final int MSG_SHOW_IM_SUBTYPE_ENABLER = 3;
+    static final int MSG_SHOW_IM_CONFIG = 4;
 
     static final int MSG_UNBIND_INPUT = 1000;
     static final int MSG_BIND_INPUT = 1010;
@@ -117,9 +118,7 @@
 
     private static final int NOT_A_SUBTYPE_ID = -1;
     private static final String NOT_A_SUBTYPE_ID_STR = String.valueOf(NOT_A_SUBTYPE_ID);
-    // If IME doesn't support the system locale, the default subtype will be the first defined one.
-    private static final int DEFAULT_SUBTYPE_ID = 0;
-
+    private static final String EXTRA_INPUT_METHOD_ID = "input_method_id";
     private static final String SUBTYPE_MODE_KEYBOARD = "keyboard";
     private static final String SUBTYPE_MODE_VOICE = "voice";
 
@@ -564,12 +563,19 @@
         }
     }
 
-    public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi) {
+    public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi,
+            boolean allowsImplicitlySelectedSubtypes) {
         synchronized (mMethodMap) {
             if (imi == null && mCurMethodId != null) {
                 imi = mMethodMap.get(mCurMethodId);
             }
-            return mSettings.getEnabledInputMethodSubtypeListLocked(imi);
+            final List<InputMethodSubtype> enabledSubtypes =
+                    mSettings.getEnabledInputMethodSubtypeListLocked(imi);
+            if (!allowsImplicitlySelectedSubtypes || enabledSubtypes.size() > 0) {
+                return enabledSubtypes;
+            } else {
+                return getApplicableSubtypesLocked(imi.getSubtypes());
+            }
         }
     }
 
@@ -1313,14 +1319,14 @@
     }
 
     public void showInputMethodAndSubtypeEnablerFromClient(
-            IInputMethodClient client, String topId) {
-        // TODO: Handle topId for setting the top position of the list ActivityManagerNative
+            IInputMethodClient client, String inputMethodId) {
         synchronized (mMethodMap) {
             if (mCurClient == null || client == null
                 || mCurClient.client.asBinder() != client.asBinder()) {
                 Slog.w(TAG, "Ignoring showInputMethodAndSubtypeEnablerFromClient of: " + client);
             }
-            mHandler.sendEmptyMessage(MSG_SHOW_IM_SUBTYPE_ENABLER);
+            executeOrSendMessage(mCurMethod, mCaller.obtainMessageO(
+                    MSG_SHOW_IM_SUBTYPE_ENABLER, inputMethodId));
         }
     }
 
@@ -1428,7 +1434,12 @@
                 return true;
 
             case MSG_SHOW_IM_SUBTYPE_ENABLER:
-                showInputMethodAndSubtypeEnabler();
+                args = (HandlerCaller.SomeArgs)msg.obj;
+                showInputMethodAndSubtypeEnabler((String)args.arg1);
+                return true;
+
+            case MSG_SHOW_IM_CONFIG:
+                showConfigureInputMethods();
                 return true;
 
             // ---------------------------------------------------------
@@ -1624,11 +1635,22 @@
         showInputMethodMenuInternal(true);
     }
 
-    private void showInputMethodAndSubtypeEnabler() {
+    private void showInputMethodAndSubtypeEnabler(String inputMethodId) {
         Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_AND_SUBTYPE_ENABLER);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                 | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
                 | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        if (!TextUtils.isEmpty(inputMethodId)) {
+            intent.putExtra(EXTRA_INPUT_METHOD_ID, inputMethodId);
+        }
+        mContext.startActivity(intent);
+    }
+
+    private void showConfigureInputMethods() {
+        Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
+                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
         mContext.startActivity(intent);
     }
 
@@ -1647,6 +1669,22 @@
         synchronized (mMethodMap) {
             final List<Pair<InputMethodInfo, ArrayList<String>>> immis =
                     mSettings.getEnabledInputMethodAndSubtypeHashCodeListLocked();
+            int N = immis.size();
+
+            // Add applicable subtypes if no subtype for each IME is enabled.
+            for (int i = 0; i < N; ++i) {
+                InputMethodInfo imi = immis.get(i).first;
+                ArrayList<String> subtypes = immis.get(i).second;
+                if (subtypes != null && subtypes.size() == 0) {
+                    ArrayList<InputMethodSubtype> applicableSubtypes =
+                            getApplicableSubtypesLocked(imi.getSubtypes());
+                    final int numSubtypes = applicableSubtypes.size();
+                    for (int j = 0; j < numSubtypes; ++j) {
+                        subtypes.add(String.valueOf(applicableSubtypes.get(j).hashCode()));
+                    }
+                }
+            }
+
             ArrayList<Integer> subtypeIds = new ArrayList<Integer>();
 
             if (immis == null || immis.size() == 0) {
@@ -1655,7 +1693,6 @@
 
             hideInputMethodMenuLocked();
 
-            int N = immis.size();
 
             final Map<CharSequence, Pair<InputMethodInfo, Integer>> imMap =
                 new TreeMap<CharSequence, Pair<InputMethodInfo, Integer>>(Collator.getInstance());
@@ -1763,7 +1800,7 @@
                 mDialogBuilder.setPositiveButton(com.android.internal.R.string.more_item_label,
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int whichButton) {
-                                showInputMethodAndSubtypeEnabler();
+                                showConfigureInputMethods();
                             }
                         });
             }
@@ -1942,18 +1979,46 @@
         return NOT_A_SUBTYPE_ID;
     }
 
+    private ArrayList<InputMethodSubtype> getApplicableSubtypesLocked(
+            List<InputMethodSubtype> subtypes) {
+        ArrayList<InputMethodSubtype> applicableSubtypes = new ArrayList<InputMethodSubtype>();
+        final String systemLocale = mRes.getConfiguration().locale.toString();
+        if (TextUtils.isEmpty(systemLocale)) return applicableSubtypes;
+        final int N = subtypes.size();
+        boolean containsKeyboardSubtype = false;
+        for (int i = 0; i < N; ++i) {
+            InputMethodSubtype subtype = subtypes.get(i);
+            if (subtype.getLocale().equals(systemLocale)) {
+                applicableSubtypes.add(subtype);
+                if (!containsKeyboardSubtype
+                        && SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())) {
+                    containsKeyboardSubtype = true;
+                }
+            }
+        }
+        if (!containsKeyboardSubtype) {
+            InputMethodSubtype lastResortKeyboardSubtype = findLastResortApplicableSubtypeLocked(
+                    subtypes, SUBTYPE_MODE_KEYBOARD, systemLocale, true);
+            if (lastResortKeyboardSubtype != null) {
+                applicableSubtypes.add(lastResortKeyboardSubtype);
+            }
+        }
+        return applicableSubtypes;
+    }
+
     /**
      * If there are no selected subtypes, tries finding the most applicable one according to the
      * given locale.
      * @param subtypes this function will search the most applicable subtype in subtypes
      * @param mode subtypes will be filtered by mode
      * @param locale subtypes will be filtered by locale
-     * @param defaultSubtypeId if this function can't find the most applicable subtype, it will
-     * return defaultSubtypeId
+     * @param canIgnoreLocaleAsLastResort if this function can't find the most applicable subtype,
+     * it will return the first subtype matched with mode
      * @return the most applicable subtypeId
      */
     private InputMethodSubtype findLastResortApplicableSubtypeLocked(
-            List<InputMethodSubtype> subtypes, String mode, String locale, int defaultSubtypeId) {
+            List<InputMethodSubtype> subtypes, String mode, String locale,
+            boolean canIgnoreLocaleAsLastResort) {
         if (subtypes == null || subtypes.size() == 0) {
             return null;
         }
@@ -1963,11 +2028,16 @@
         final String language = locale.substring(0, 2);
         boolean partialMatchFound = false;
         InputMethodSubtype applicableSubtype = null;
-        for (int i = 0; i < subtypes.size(); ++i) {
+        InputMethodSubtype firstMatchedModeSubtype = null;
+        final int N = subtypes.size();
+        for (int i = 0; i < N; ++i) {
             InputMethodSubtype subtype = subtypes.get(i);
             final String subtypeLocale = subtype.getLocale();
             // An applicable subtype should match "mode".
             if (subtypes.get(i).getMode().equalsIgnoreCase(mode)) {
+                if (firstMatchedModeSubtype == null) {
+                    firstMatchedModeSubtype = subtype;
+                }
                 if (locale.equals(subtypeLocale)) {
                     // Exact match (e.g. system locale is "en_US" and subtype locale is "en_US")
                     applicableSubtype = subtype;
@@ -1980,11 +2050,17 @@
             }
         }
 
+        if (applicableSubtype == null && canIgnoreLocaleAsLastResort) {
+            return firstMatchedModeSubtype;
+        }
+
         // The first subtype applicable to the system locale will be defined as the most applicable
         // subtype.
         if (DEBUG) {
-            Slog.d(TAG, "Applicable InputMethodSubtype was found: " + applicableSubtype.getMode()
-                    + "," + applicableSubtype.getLocale());
+            if (applicableSubtype != null) {
+                Slog.d(TAG, "Applicable InputMethodSubtype was found: "
+                        + applicableSubtype.getMode() + "," + applicableSubtype.getLocale());
+            }
         }
         return applicableSubtype;
     }
@@ -1999,44 +2075,49 @@
 
         // Search applicable subtype for each InputMethodInfo
         for (InputMethodInfo imi: imis) {
+            final String imiId = imi.getId();
+            if (foundInSystemIME && !imiId.equals(mCurMethodId)) {
+                continue;
+            }
             InputMethodSubtype subtype = null;
+            final List<InputMethodSubtype> explicitlyEnabledSubtypes =
+                    mSettings.getEnabledInputMethodSubtypeListLocked(imi);
+            // 1. Search by the current subtype's locale from explicitlyEnabledSubtypes.
             if (mCurrentSubtype != null) {
-                // 1. Search with the current subtype's locale and the enabled subtypes
                 subtype = findLastResortApplicableSubtypeLocked(
-                        mSettings.getEnabledInputMethodSubtypeListLocked(
-                        imi), mode, mCurrentSubtype.getLocale(), NOT_A_SUBTYPE_ID);
-                if (subtype == null) {
-                    // 2. Search with the current subtype's locale and all subtypes
-                    subtype = findLastResortApplicableSubtypeLocked(imi.getSubtypes(),
-                            mode, mCurrentSubtype.getLocale(), NOT_A_SUBTYPE_ID);
-                }
+                        explicitlyEnabledSubtypes, mode, mCurrentSubtype.getLocale(), false);
             }
-            // 3. Search with the system locale and the enabled subtypes
+            // 2. Search by the system locale from explicitlyEnabledSubtypes.
+            // 3. Search the first enabled subtype matched with mode from explicitlyEnabledSubtypes.
             if (subtype == null) {
                 subtype = findLastResortApplicableSubtypeLocked(
-                        mSettings.getEnabledInputMethodSubtypeListLocked(
-                        imi), mode, null, NOT_A_SUBTYPE_ID);
+                        explicitlyEnabledSubtypes, mode, null, true);
             }
+            // 4. Search by the current subtype's locale from all subtypes.
+            if (subtype == null && mCurrentSubtype != null) {
+                subtype = findLastResortApplicableSubtypeLocked(
+                        imi.getSubtypes(), mode, mCurrentSubtype.getLocale(), false);
+            }
+            // 5. Search by the system locale from all subtypes.
+            // 6. Search the first enabled subtype matched with mode from all subtypes.
             if (subtype == null) {
-                // 4. Search with the system locale and all subtypes
-                subtype = findLastResortApplicableSubtypeLocked(imi.getSubtypes(),
-                        mode, null, NOT_A_SUBTYPE_ID);
+                subtype = findLastResortApplicableSubtypeLocked(
+                        imi.getSubtypes(), mode, null, true);
             }
             if (subtype != null) {
-                if (imi.getId().equals(mCurMethodId)) {
+                if (imiId.equals(mCurMethodId)) {
                     // The current input method is the most applicable IME.
                     mostApplicableIMI = imi;
                     mostApplicableSubtype = subtype;
                     break;
-                } else if ((imi.getServiceInfo().applicationInfo.flags
-                        & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                } else if (!foundInSystemIME) {
                     // The system input method is 2nd applicable IME.
                     mostApplicableIMI = imi;
                     mostApplicableSubtype = subtype;
-                    foundInSystemIME = true;
-                } else if (!foundInSystemIME) {
-                    mostApplicableIMI = imi;
-                    mostApplicableSubtype = subtype;
+                    if ((imi.getServiceInfo().applicationInfo.flags
+                            & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                        foundInSystemIME = true;
+                    }
                 }
             }
         }
@@ -2082,7 +2163,7 @@
                         // SUBTYPE_MODE_KEYBOARD. This is an exceptional case, so we will hardcode
                         // the mode.
                         mCurrentSubtype = findLastResortApplicableSubtypeLocked(imi.getSubtypes(),
-                                SUBTYPE_MODE_KEYBOARD, null, DEFAULT_SUBTYPE_ID);
+                                SUBTYPE_MODE_KEYBOARD, null, true);
                     }
                 } else {
                     mCurrentSubtype =
@@ -2114,7 +2195,9 @@
                 Pair<InputMethodInfo, InputMethodSubtype> info =
                     findLastResortApplicableShortcutInputMethodAndSubtypeLocked(
                             SUBTYPE_MODE_VOICE);
-                addShortcutInputMethodAndSubtypes(info.first, info.second);
+                if (info != null) {
+                    addShortcutInputMethodAndSubtypes(info.first, info.second);
+                }
             }
             ArrayList<Object> ret = new ArrayList<Object>();
             for (InputMethodInfo imi: mShortcutInputMethodsAndSubtypes.keySet()) {
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 2691e1d..7965dda 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -5774,7 +5774,10 @@
         res.removedInfo.removedPackage = packageName;
         // Remove existing system package
         removePackageLI(oldPkg, true);
-
+        synchronized (mPackages) {
+            mSettings.disableSystemPackageLP(packageName);
+        }
+        
         // Successfully disabled the old package. Now proceed with re-installation
         mLastScanError = PackageManager.INSTALL_SUCCEEDED;
         pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java
index 859c85c..997e750 100644
--- a/services/java/com/android/server/WallpaperManagerService.java
+++ b/services/java/com/android/server/WallpaperManagerService.java
@@ -587,6 +587,8 @@
                 mIWindowManager.removeWindowToken(mWallpaperConnection.mToken);
             } catch (RemoteException e) {
             }
+            mWallpaperConnection.mService = null;
+            mWallpaperConnection.mEngine = null;
             mWallpaperConnection = null;
         }
     }
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index ff703fd..a9d42e3 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -877,6 +877,7 @@
                 // because of any locks so clear that tracking immediately.
                 reportStartWorkSource();
                 mWifiStateMachine.enableRssiPolling(true);
+                mWifiStateMachine.enableAllNetworks();
                 updateWifiState();
             } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                 if (DBG) {
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 26dd692..94ed813 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -6239,7 +6239,8 @@
             mDisplay = wm.getDefaultDisplay();
             mInitialDisplayWidth = mDisplay.getWidth();
             mInitialDisplayHeight = mDisplay.getHeight();
-            mInputManager.setDisplaySize(0, mInitialDisplayWidth, mInitialDisplayHeight);
+            mInputManager.setDisplaySize(0, Display.unmapDisplaySize(mInitialDisplayWidth),
+                    Display.unmapDisplaySize(mInitialDisplayHeight));
         }
 
         try {
@@ -6813,6 +6814,11 @@
         // Input channel
         InputChannel mInputChannel;
         
+        // Used to improve performance of toString()
+        String mStringNameCache;
+        CharSequence mLastTitle;
+        boolean mWasPaused;
+
         WindowState(Session s, IWindow c, WindowToken token,
                WindowState attachedWindow, WindowManager.LayoutParams a,
                int viewVisibility) {
@@ -8130,9 +8136,14 @@
 
         @Override
         public String toString() {
-            return "Window{"
-                + Integer.toHexString(System.identityHashCode(this))
-                + " " + mAttrs.getTitle() + " paused=" + mToken.paused + "}";
+            if (mStringNameCache == null || mLastTitle != mAttrs.getTitle()
+                    || mWasPaused != mToken.paused) {
+                mLastTitle = mAttrs.getTitle();
+                mWasPaused = mToken.paused;
+                mStringNameCache = "Window{" + Integer.toHexString(System.identityHashCode(this))
+                        + " " + mLastTitle + " paused=" + mWasPaused + "}";
+            }
+            return mStringNameCache;
         }
     }
 
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index a26fe5f..e0397b1 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -129,7 +129,6 @@
 import java.io.PrintWriter;
 import java.lang.IllegalStateException;
 import java.lang.ref.WeakReference;
-import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -2314,8 +2313,12 @@
     }
 
     final void addRecentTaskLocked(TaskRecord task) {
-        // Remove any existing entries that are the same kind of task.
         int N = mRecentTasks.size();
+        // Quick case: check if the top-most recent task is the same.
+        if (N > 0 && mRecentTasks.get(0) == task) {
+            return;
+        }
+        // Remove any existing entries that are the same kind of task.
         for (int i=0; i<N; i++) {
             TaskRecord tr = mRecentTasks.get(i);
             if ((task.affinity != null && task.affinity.equals(tr.affinity))
@@ -9408,6 +9411,14 @@
             if (DEBUG_SERVICE) Slog.v(
                 TAG, "Removed service that is not running: " + r);
         }
+
+        if (r.bindings.size() > 0) {
+            r.bindings.clear();
+        }
+
+        if (r.restarter instanceof ServiceRestarter) {
+           ((ServiceRestarter)r.restarter).setService(null);
+        }
     }
 
     ComponentName startServiceLocked(IApplicationThread caller,
@@ -11746,14 +11757,9 @@
         
         if (starting != null) {
             kept = mMainStack.ensureActivityConfigurationLocked(starting, changes);
-            if (kept) {
-                // If this didn't result in the starting activity being
-                // destroyed, then we need to make sure at this point that all
-                // other activities are made visible.
-                if (DEBUG_SWITCH) Slog.i(TAG, "Config didn't destroy " + starting
-                        + ", ensuring others are correct.");
-                mMainStack.ensureActivitiesVisibleLocked(starting, changes);
-            }
+            // And we need to make sure at this point that all other activities
+            // are made visible with the correct configuration.
+            mMainStack.ensureActivitiesVisibleLocked(starting, changes);
         }
         
         if (values != null && mWindowManager != null) {
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index b4e426f..caaae1f 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -413,7 +413,7 @@
         // an application, and that application is not blocked or unresponding.
         // In any other case, we can't count on getting the screen unfrozen,
         // so it is best to leave as-is.
-        return app == null || (!app.crashing && !app.notResponding);
+        return app != null && !app.crashing && !app.notResponding;
     }
     
     public void startFreezingScreenLocked(ProcessRecord app, int configChanges) {
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 516dfa21..eee9f7e 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -572,6 +572,9 @@
             r.stopped = false;
             mResumedActivity = r;
             r.task.touchActiveTime();
+            if (mMainStack) {
+                mService.addRecentTaskLocked(r.task);
+            }
             completeResumeLocked(r);
             pauseIfSleepingLocked();                
         } else {
@@ -1249,6 +1252,9 @@
             next.state = ActivityState.RESUMED;
             mResumedActivity = next;
             next.task.touchActiveTime();
+            if (mMainStack) {
+                mService.addRecentTaskLocked(next.task);
+            }
             mService.updateLruProcessLocked(next.app, true, true);
             updateLRUListLocked(next);
 
@@ -1638,9 +1644,6 @@
                             taskTopI = -1;
                         }
                         replyChainEnd = -1;
-                        if (mMainStack) {
-                            mService.addRecentTaskLocked(target.task);
-                        }
                     } else if (forceReset || finishOnTaskLaunch
                             || clearWhenTaskReset) {
                         // If the activity should just be removed -- either
@@ -2409,9 +2412,6 @@
                 r.task = reuseTask;
             }
             newTask = true;
-            if (mMainStack) {
-                mService.addRecentTaskLocked(r.task);
-            }
             moveHomeToFrontFromLaunchLocked(launchFlags);
             
         } else if (sourceRecord != null) {
@@ -3472,17 +3472,12 @@
             ActivityRecord r = (ActivityRecord)mHistory.get(pos);
             if (localLOGV) Slog.v(
                 TAG, "At " + pos + " ckp " + r.task + ": " + r);
-            boolean first = true;
             if (r.task.taskId == task) {
                 if (localLOGV) Slog.v(TAG, "Removing and adding at " + top);
                 mHistory.remove(pos);
                 mHistory.add(top, r);
                 moved.add(0, r);
                 top--;
-                if (first && mMainStack) {
-                    mService.addRecentTaskLocked(r.task);
-                    first = false;
-                }
             }
             pos--;
         }
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index a93d596..a562e1f 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -68,7 +68,7 @@
 
     private Context mContext;
     private final static String TAG = "Tethering";
-    private final static boolean DEBUG = false;
+    private final static boolean DEBUG = true;
 
     private boolean mBooted = false;
     //used to remember if we got connected before boot finished
@@ -942,7 +942,12 @@
                         String newUpstreamIfaceName = (String)(message.obj);
                         b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
                         service = INetworkManagementService.Stub.asInterface(b);
-
+                        if ((mMyUpstreamIfaceName == null && newUpstreamIfaceName == null) ||
+                                (mMyUpstreamIfaceName != null &&
+                                mMyUpstreamIfaceName.equals(newUpstreamIfaceName))) {
+                            if (DEBUG) Log.d(TAG, "Connection changed noop - dropping");
+                            break;
+                        }
                         if (mMyUpstreamIfaceName != null) {
                             try {
                                 service.disableNat(mIfaceName, mMyUpstreamIfaceName);
@@ -1085,7 +1090,8 @@
 
         private ArrayList mNotifyList;
 
-        private boolean mConnectionRequested = false;
+        private int mCurrentConnectionSequence;
+        private boolean mMobileReserved = false;
 
         private String mUpstreamIfaceName = null;
 
@@ -1124,32 +1130,36 @@
             public boolean processMessage(Message m) {
                 return false;
             }
-            protected int turnOnMobileConnection() {
+            protected boolean turnOnMobileConnection() {
+                boolean retValue = true;
+                if (mMobileReserved) return retValue;
                 IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
                 IConnectivityManager service = IConnectivityManager.Stub.asInterface(b);
-                int retValue = Phone.APN_REQUEST_FAILED;
+                int result = Phone.APN_REQUEST_FAILED;
                 try {
-                    retValue = service.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
+                    result = service.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
                             (mDunRequired ? Phone.FEATURE_ENABLE_DUN : Phone.FEATURE_ENABLE_HIPRI),
                             new Binder());
                 } catch (Exception e) {
                 }
-                switch (retValue) {
+                switch (result) {
                 case Phone.APN_ALREADY_ACTIVE:
                 case Phone.APN_REQUEST_STARTED:
-                    sendMessageDelayed(CMD_CELL_CONNECTION_RENEW, CELL_CONNECTION_RENEW_MS);
-                    mConnectionRequested = true;
+                    mMobileReserved = true;
+                    Message m = obtainMessage(CMD_CELL_CONNECTION_RENEW);
+                    m.arg1 = ++mCurrentConnectionSequence;
+                    sendMessageDelayed(m, CELL_CONNECTION_RENEW_MS);
                     break;
                 case Phone.APN_REQUEST_FAILED:
                 default:
-                    mConnectionRequested = false;
+                    retValue = false;
                     break;
                 }
 
                 return retValue;
             }
             protected boolean turnOffMobileConnection() {
-                if (mConnectionRequested) {
+                if (mMobileReserved) {
                     IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
                     IConnectivityManager service =
                             IConnectivityManager.Stub.asInterface(b);
@@ -1160,7 +1170,7 @@
                     } catch (Exception e) {
                         return false;
                     }
-                    mConnectionRequested = false;
+                    mMobileReserved = false;
                 }
                 return true;
             }
@@ -1240,13 +1250,14 @@
                 }
                 return null;
             }
+
             protected void chooseUpstreamType(boolean tryCell) {
                 // decide if the current upstream is good or not and if not
                 // do something about it (start up DUN if required or HiPri if not)
                 String iface = findActiveUpstreamIface();
                 IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
                 IConnectivityManager cm = IConnectivityManager.Stub.asInterface(b);
-                mConnectionRequested = false;
+                mMobileReserved = false;
                 if (DEBUG) {
                     Log.d(TAG, "chooseUpstreamType(" + tryCell + "),  dunRequired ="
                             + mDunRequired + ", iface=" + iface);
@@ -1287,11 +1298,14 @@
                 }
                 // may have been set to null in the if above
                 if (iface == null ) {
+                    boolean success = false;
                     if (tryCell == TRY_TO_SETUP_MOBILE_CONNECTION) {
-                        turnOnMobileConnection();
+                        success = turnOnMobileConnection();
                     }
-                    // wait for things to settle and retry
-                    sendMessageDelayed(CMD_RETRY_UPSTREAM, UPSTREAM_SETTLE_TIME_MS);
+                    if (!success) {
+                        // wait for things to settle and retry
+                        sendMessageDelayed(CMD_RETRY_UPSTREAM, UPSTREAM_SETTLE_TIME_MS);
+                    }
                 }
                 notifyTetheredOfNewUpstreamIface(iface);
             }
@@ -1309,7 +1323,7 @@
         class InitialState extends TetherMasterUtilState {
             @Override
             public void enter() {
-                mConnectionRequested = false;
+                mMobileReserved = false;
             }
             @Override
             public boolean processMessage(Message message) {
@@ -1382,11 +1396,12 @@
                     case CMD_CELL_CONNECTION_RENEW:
                         // make sure we're still using a requested connection - may have found
                         // wifi or something since then.
-                        if (mConnectionRequested) {
+                        if (mCurrentConnectionSequence == message.arg1) {
                             if (DEBUG) {
                                 Log.d(TAG, "renewing mobile connection - requeuing for another " +
                                         CELL_CONNECTION_RENEW_MS + "ms");
                             }
+                            mMobileReserved = false; // need to renew it
                             turnOnMobileConnection();
                         }
                         break;
diff --git a/services/jni/Android.mk b/services/jni/Android.mk
index 89ead82..845869c 100644
--- a/services/jni/Android.mk
+++ b/services/jni/Android.mk
@@ -10,24 +10,23 @@
     com_android_server_SystemServer.cpp \
     com_android_server_UsbService.cpp \
     com_android_server_VibratorService.cpp \
-	com_android_server_location_GpsLocationProvider.cpp \
+    com_android_server_location_GpsLocationProvider.cpp \
     onload.cpp
 
 LOCAL_C_INCLUDES += \
-	$(JNI_H_INCLUDE)
+    $(JNI_H_INCLUDE)
 
 LOCAL_SHARED_LIBRARIES := \
     libandroid_runtime \
-	libcutils \
-	libhardware \
-	libhardware_legacy \
-	libnativehelper \
+    libcutils \
+    libhardware \
+    libhardware_legacy \
+    libnativehelper \
     libsystem_server \
-	libutils \
-	libui \
-    libsurfaceflinger_client
-
-LOCAL_STATIC_LIBRARIES := libusbhost
+    libutils \
+    libui \
+    libsurfaceflinger_client \
+    libusbhost
 
 ifeq ($(TARGET_SIMULATOR),true)
 ifeq ($(TARGET_OS),linux)
@@ -38,7 +37,7 @@
 endif
 
 ifeq ($(WITH_MALLOC_LEAK_CHECK),true)
-	LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK
+    LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK
 endif
 
 LOCAL_MODULE:= libandroid_servers
diff --git a/services/jni/com_android_server_InputManager.cpp b/services/jni/com_android_server_InputManager.cpp
index 9156249..c757ada 100644
--- a/services/jni/com_android_server_InputManager.cpp
+++ b/services/jni/com_android_server_InputManager.cpp
@@ -24,6 +24,10 @@
 // Log debug messages about InputDispatcherPolicy
 #define DEBUG_INPUT_DISPATCHER_POLICY 0
 
+// Log debug messages about PointerController
+#define DEBUG_POINTER_CONTROLLER 1
+
+
 #include "JNIHelp.h"
 #include "jni.h"
 #include <limits.h>
@@ -34,6 +38,10 @@
 #include <ui/InputTransport.h>
 #include <utils/Log.h>
 #include <utils/threads.h>
+#include <surfaceflinger/Surface.h>
+#include <surfaceflinger/SurfaceComposerClient.h>
+#include <surfaceflinger/ISurfaceComposer.h>
+
 #include "../../core/jni/android_view_KeyEvent.h"
 #include "../../core/jni/android_view_MotionEvent.h"
 #include "../../core/jni/android_view_InputChannel.h"
@@ -58,6 +66,7 @@
     jmethodID filterJumpyTouchEvents;
     jmethodID getExcludedDeviceNames;
     jmethodID getMaxEventsPerSecond;
+    jmethodID getPointerLayer;
 } gCallbacksClassInfo;
 
 static struct {
@@ -135,6 +144,52 @@
 
 // ----------------------------------------------------------------------------
 
+class PointerController : public PointerControllerInterface {
+protected:
+    virtual ~PointerController();
+
+public:
+    PointerController(int32_t pointerLayer);
+
+    virtual bool getBounds(float* outMinX, float* outMinY,
+            float* outMaxX, float* outMaxY) const;
+    virtual void move(float deltaX, float deltaY);
+    virtual void setButtonState(uint32_t buttonState);
+    virtual uint32_t getButtonState() const;
+    virtual void setPosition(float x, float y);
+    virtual void getPosition(float* outX, float* outY) const;
+
+    void setDisplaySize(int32_t width, int32_t height);
+    void setDisplayOrientation(int32_t orientation);
+
+private:
+    mutable Mutex mLock;
+
+    int32_t mPointerLayer;
+    sp<SurfaceComposerClient> mSurfaceComposerClient;
+    sp<SurfaceControl> mSurfaceControl;
+
+    struct Locked {
+        int32_t displayWidth;
+        int32_t displayHeight;
+        int32_t displayOrientation;
+
+        float pointerX;
+        float pointerY;
+        uint32_t buttonState;
+
+        bool wantVisible;
+        bool visible;
+        bool drawn;
+    } mLocked;
+
+    bool getBoundsLocked(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const;
+    void setPositionLocked(float x, float y);
+    void updateLocked();
+};
+
+// ----------------------------------------------------------------------------
+
 class NativeInputManager : public virtual RefBase,
     public virtual InputReaderPolicyInterface,
     public virtual InputDispatcherPolicyInterface {
@@ -166,6 +221,7 @@
     virtual bool filterTouchEvents();
     virtual bool filterJumpyTouchEvents();
     virtual void getExcludedDeviceNames(Vector<String8>& outExcludedDeviceNames);
+    virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId);
 
     /* --- InputDispatcherPolicyInterface implementation --- */
 
@@ -215,19 +271,23 @@
     // Cached throttling policy.
     int32_t mMaxEventsPerSecond;
 
-    // Cached display state.  (lock mDisplayLock)
-    Mutex mDisplayLock;
-    int32_t mDisplayWidth, mDisplayHeight;
-    int32_t mDisplayOrientation;
+    Mutex mLock;
+    struct Locked {
+        // Display size information.
+        int32_t displayWidth, displayHeight; // -1 when initialized
+        int32_t displayOrientation;
+
+        // Pointer controller singleton, created and destroyed as needed.
+        wp<PointerController> pointerController;
+
+        // Weak references to all currently registered input channels by connection pointer.
+        KeyedVector<InputChannel*, jweak> inputChannelObjWeakTable;
+    } mLocked;
 
     // Power manager interactions.
     bool isScreenOn();
     bool isScreenBright();
 
-    // Weak references to all currently registered input channels by connection pointer.
-    Mutex mInputChannelRegistryLock;
-    KeyedVector<InputChannel*, jweak> mInputChannelObjWeakTable;
-
     jobject getInputChannelObjLocal(JNIEnv* env, const sp<InputChannel>& inputChannel);
 
     static bool populateWindow(JNIEnv* env, jobject windowObj, InputWindow& outWindow);
@@ -243,12 +303,18 @@
 
 NativeInputManager::NativeInputManager(jobject callbacksObj) :
     mFilterTouchEvents(-1), mFilterJumpyTouchEvents(-1),
-    mMaxEventsPerSecond(-1),
-    mDisplayWidth(-1), mDisplayHeight(-1), mDisplayOrientation(ROTATION_0) {
+    mMaxEventsPerSecond(-1) {
     JNIEnv* env = jniEnv();
 
     mCallbacksObj = env->NewGlobalRef(callbacksObj);
 
+    {
+        AutoMutex _l(mLock);
+        mLocked.displayWidth = -1;
+        mLocked.displayHeight = -1;
+        mLocked.displayOrientation = ROTATION_0;
+    }
+
     sp<EventHub> eventHub = new EventHub();
     mInputManager = new InputManager(eventHub, this, this);
 }
@@ -279,18 +345,32 @@
 
 void NativeInputManager::setDisplaySize(int32_t displayId, int32_t width, int32_t height) {
     if (displayId == 0) {
-        AutoMutex _l(mDisplayLock);
+        AutoMutex _l(mLock);
 
-        mDisplayWidth = width;
-        mDisplayHeight = height;
+        if (mLocked.displayWidth != width || mLocked.displayHeight != height) {
+            mLocked.displayWidth = width;
+            mLocked.displayHeight = height;
+
+            sp<PointerController> controller = mLocked.pointerController.promote();
+            if (controller != NULL) {
+                controller->setDisplaySize(width, height);
+            }
+        }
     }
 }
 
 void NativeInputManager::setDisplayOrientation(int32_t displayId, int32_t orientation) {
     if (displayId == 0) {
-        AutoMutex _l(mDisplayLock);
+        AutoMutex _l(mLock);
 
-        mDisplayOrientation = orientation;
+        if (mLocked.displayOrientation != orientation) {
+            mLocked.displayOrientation = orientation;
+
+            sp<PointerController> controller = mLocked.pointerController.promote();
+            if (controller != NULL) {
+                controller->setDisplayOrientation(orientation);
+            }
+        }
     }
 }
 
@@ -305,9 +385,9 @@
 
     status_t status;
     {
-        AutoMutex _l(mInputChannelRegistryLock);
+        AutoMutex _l(mLock);
 
-        ssize_t index = mInputChannelObjWeakTable.indexOfKey(inputChannel.get());
+        ssize_t index = mLocked.inputChannelObjWeakTable.indexOfKey(inputChannel.get());
         if (index >= 0) {
             LOGE("Input channel object '%s' has already been registered",
                     inputChannel->getName().string());
@@ -315,7 +395,7 @@
             goto DeleteWeakRef;
         }
 
-        mInputChannelObjWeakTable.add(inputChannel.get(), inputChannelObjWeak);
+        mLocked.inputChannelObjWeakTable.add(inputChannel.get(), inputChannelObjWeak);
     }
 
     status = mInputManager->getDispatcher()->registerInputChannel(inputChannel, monitor);
@@ -326,8 +406,8 @@
 
     // Failed!
     {
-        AutoMutex _l(mInputChannelRegistryLock);
-        mInputChannelObjWeakTable.removeItem(inputChannel.get());
+        AutoMutex _l(mLock);
+        mLocked.inputChannelObjWeakTable.removeItem(inputChannel.get());
     }
 
 DeleteWeakRef:
@@ -339,17 +419,17 @@
         const sp<InputChannel>& inputChannel) {
     jweak inputChannelObjWeak;
     {
-        AutoMutex _l(mInputChannelRegistryLock);
+        AutoMutex _l(mLock);
 
-        ssize_t index = mInputChannelObjWeakTable.indexOfKey(inputChannel.get());
+        ssize_t index = mLocked.inputChannelObjWeakTable.indexOfKey(inputChannel.get());
         if (index < 0) {
             LOGE("Input channel object '%s' is not currently registered",
                     inputChannel->getName().string());
             return INVALID_OPERATION;
         }
 
-        inputChannelObjWeak = mInputChannelObjWeakTable.valueAt(index);
-        mInputChannelObjWeakTable.removeItemsAt(index);
+        inputChannelObjWeak = mLocked.inputChannelObjWeakTable.valueAt(index);
+        mLocked.inputChannelObjWeakTable.removeItemsAt(index);
     }
 
     env->DeleteWeakGlobalRef(inputChannelObjWeak);
@@ -365,14 +445,14 @@
     }
 
     {
-        AutoMutex _l(mInputChannelRegistryLock);
+        AutoMutex _l(mLock);
 
-        ssize_t index = mInputChannelObjWeakTable.indexOfKey(inputChannelPtr);
+        ssize_t index = mLocked.inputChannelObjWeakTable.indexOfKey(inputChannelPtr);
         if (index < 0) {
             return NULL;
         }
 
-        jweak inputChannelObjWeak = mInputChannelObjWeakTable.valueAt(index);
+        jweak inputChannelObjWeak = mLocked.inputChannelObjWeakTable.valueAt(index);
         return env->NewLocalRef(inputChannelObjWeak);
     }
 }
@@ -381,17 +461,17 @@
         int32_t* width, int32_t* height, int32_t* orientation) {
     bool result = false;
     if (displayId == 0) {
-        AutoMutex _l(mDisplayLock);
+        AutoMutex _l(mLock);
 
-        if (mDisplayWidth > 0) {
+        if (mLocked.displayWidth > 0 && mLocked.displayHeight > 0) {
             if (width) {
-                *width = mDisplayWidth;
+                *width = mLocked.displayWidth;
             }
             if (height) {
-                *height = mDisplayHeight;
+                *height = mLocked.displayHeight;
             }
             if (orientation) {
-                *orientation = mDisplayOrientation;
+                *orientation = mLocked.displayOrientation;
             }
             result = true;
         }
@@ -451,6 +531,24 @@
     }
 }
 
+sp<PointerControllerInterface> NativeInputManager::obtainPointerController(int32_t deviceId) {
+    AutoMutex _l(mLock);
+
+    sp<PointerController> controller = mLocked.pointerController.promote();
+    if (controller == NULL) {
+        JNIEnv* env = jniEnv();
+        jint layer = env->CallIntMethod(mCallbacksObj, gCallbacksClassInfo.getPointerLayer);
+        checkAndClearExceptionFromCallback(env, "getPointerLayer");
+
+        controller = new PointerController(layer);
+        mLocked.pointerController = controller;
+
+        controller->setDisplaySize(mLocked.displayWidth, mLocked.displayHeight);
+        controller->setDisplayOrientation(mLocked.displayOrientation);
+    }
+    return controller;
+}
+
 void NativeInputManager::notifySwitch(nsecs_t when, int32_t switchCode,
         int32_t switchValue, uint32_t policyFlags) {
 #if DEBUG_INPUT_DISPATCHER_POLICY
@@ -886,6 +984,294 @@
     return result;
 }
 
+// --- PointerController ---
+
+PointerController::PointerController(int32_t pointerLayer) :
+    mPointerLayer(pointerLayer) {
+    AutoMutex _l(mLock);
+
+    mLocked.displayWidth = -1;
+    mLocked.displayHeight = -1;
+    mLocked.displayOrientation = InputReaderPolicyInterface::ROTATION_0;
+
+    mLocked.pointerX = 0;
+    mLocked.pointerY = 0;
+    mLocked.buttonState = 0;
+
+    mLocked.wantVisible = false;
+    mLocked.visible = false;
+    mLocked.drawn = false;
+}
+
+PointerController::~PointerController() {
+    mSurfaceControl.clear();
+    mSurfaceComposerClient.clear();
+}
+
+bool PointerController::getBounds(float* outMinX, float* outMinY,
+        float* outMaxX, float* outMaxY) const {
+    AutoMutex _l(mLock);
+
+    return getBoundsLocked(outMinX, outMinY, outMaxX, outMaxY);
+}
+
+bool PointerController::getBoundsLocked(float* outMinX, float* outMinY,
+        float* outMaxX, float* outMaxY) const {
+    if (mLocked.displayWidth <= 0 || mLocked.displayHeight <= 0) {
+        return false;
+    }
+
+    *outMinX = 0;
+    *outMinY = 0;
+    switch (mLocked.displayOrientation) {
+    case InputReaderPolicyInterface::ROTATION_90:
+    case InputReaderPolicyInterface::ROTATION_270:
+        *outMaxX = mLocked.displayHeight;
+        *outMaxY = mLocked.displayWidth;
+        break;
+    default:
+        *outMaxX = mLocked.displayWidth;
+        *outMaxY = mLocked.displayHeight;
+        break;
+    }
+    return true;
+}
+
+void PointerController::move(float deltaX, float deltaY) {
+#if DEBUG_POINTER_CONTROLLER
+    LOGD("Move pointer by deltaX=%0.3f, deltaY=%0.3f", deltaX, deltaY);
+#endif
+    if (deltaX == 0.0f && deltaY == 0.0f) {
+        return;
+    }
+
+    AutoMutex _l(mLock);
+
+    setPositionLocked(mLocked.pointerX + deltaX, mLocked.pointerY + deltaY);
+}
+
+void PointerController::setButtonState(uint32_t buttonState) {
+    AutoMutex _l(mLock);
+
+    if (mLocked.buttonState != buttonState) {
+        mLocked.buttonState = buttonState;
+        mLocked.wantVisible = true;
+        updateLocked();
+    }
+}
+
+uint32_t PointerController::getButtonState() const {
+    AutoMutex _l(mLock);
+
+    return mLocked.buttonState;
+}
+
+void PointerController::setPosition(float x, float y) {
+    AutoMutex _l(mLock);
+
+    setPositionLocked(x, y);
+}
+
+void PointerController::setPositionLocked(float x, float y) {
+    float minX, minY, maxX, maxY;
+    if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) {
+        if (x <= minX) {
+            mLocked.pointerX = minX;
+        } else if (x >= maxX) {
+            mLocked.pointerX = maxX;
+        } else {
+            mLocked.pointerX = x;
+        }
+        if (y <= minY) {
+            mLocked.pointerY = minY;
+        } else if (y >= maxY) {
+            mLocked.pointerY = maxY;
+        } else {
+            mLocked.pointerY = y;
+        }
+        mLocked.wantVisible = true;
+        updateLocked();
+    }
+}
+
+void PointerController::getPosition(float* outX, float* outY) const {
+    AutoMutex _l(mLock);
+
+    *outX = mLocked.pointerX;
+    *outY = mLocked.pointerY;
+}
+
+void PointerController::updateLocked() {
+#if DEBUG_POINTER_CONTROLLER
+    LOGD("Pointer at (%f, %f).", mLocked.pointerX, mLocked.pointerY);
+#endif
+
+    if (!mLocked.wantVisible && !mLocked.visible) {
+        return;
+    }
+
+    if (mSurfaceComposerClient == NULL) {
+        mSurfaceComposerClient = new SurfaceComposerClient();
+    }
+
+    if (mSurfaceControl == NULL) {
+        mSurfaceControl = mSurfaceComposerClient->createSurface(getpid(),
+                String8("Pointer"), 0, 16, 16, PIXEL_FORMAT_RGBA_8888);
+        if (mSurfaceControl == NULL) {
+            LOGE("Error creating pointer surface.");
+            return;
+        }
+    }
+
+    status_t status = mSurfaceComposerClient->openTransaction();
+    if (status) {
+        LOGE("Error opening surface transaction to update pointer surface.");
+        return;
+    }
+
+    if (mLocked.wantVisible) {
+        if (!mLocked.drawn) {
+            mLocked.drawn = true;
+
+            sp<Surface> surface = mSurfaceControl->getSurface();
+            Surface::SurfaceInfo surfaceInfo;
+            status = surface->lock(&surfaceInfo);
+            if (status) {
+                LOGE("Error %d locking pointer surface before drawing.", status);
+                goto CloseTransaction;
+            }
+
+            // TODO: Load pointers from assets and allow them to be set.
+            char* bitmap = (char*)surfaceInfo.bits;
+            ssize_t bpr = surfaceInfo.s * 4;
+            for (int y = 0; y < surfaceInfo.h; y++) {
+                for (int x = 0; x < surfaceInfo.w; x++) {
+                    bitmap[y * bpr + x * 4] = 128;
+                    bitmap[y * bpr + x * 4 + 1] = 255;
+                    bitmap[y * bpr + x * 4 + 2] = 128;
+                    bitmap[y * bpr + x * 4 + 3] = 255;
+                }
+            }
+
+            status = surface->unlockAndPost();
+            if (status) {
+                LOGE("Error %d unlocking pointer surface after drawing.", status);
+                goto CloseTransaction;
+            }
+        }
+
+        status = mSurfaceControl->setPosition(mLocked.pointerX, mLocked.pointerY);
+        if (status) {
+            LOGE("Error %d moving pointer surface.", status);
+            goto CloseTransaction;
+        }
+
+        if (!mLocked.visible) {
+            mLocked.visible = true;
+
+            mSurfaceControl->setLayer(mPointerLayer);
+
+            LOGD("XXX Show");
+            status = mSurfaceControl->show(mPointerLayer);
+            if (status) {
+                LOGE("Error %d showing pointer surface.", status);
+                goto CloseTransaction;
+            }
+        }
+    } else {
+        if (mLocked.visible) {
+            mLocked.visible = false;
+
+            if (mSurfaceControl != NULL) {
+                status = mSurfaceControl->hide();
+                if (status) {
+                    LOGE("Error %d hiding pointer surface.", status);
+                    goto CloseTransaction;
+                }
+            }
+        }
+    }
+
+CloseTransaction:
+    status = mSurfaceComposerClient->closeTransaction();
+    if (status) {
+        LOGE("Error closing surface transaction to update pointer surface.");
+    }
+}
+
+void PointerController::setDisplaySize(int32_t width, int32_t height) {
+    AutoMutex _l(mLock);
+
+    if (mLocked.displayWidth != width || mLocked.displayHeight != height) {
+        mLocked.displayWidth = width;
+        mLocked.displayHeight = height;
+
+        float minX, minY, maxX, maxY;
+        if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) {
+            mLocked.pointerX = (minX + maxX) * 0.5f;
+            mLocked.pointerY = (minY + maxY) * 0.5f;
+        } else {
+            mLocked.pointerX = 0;
+            mLocked.pointerY = 0;
+        }
+
+        updateLocked();
+    }
+}
+
+void PointerController::setDisplayOrientation(int32_t orientation) {
+    AutoMutex _l(mLock);
+
+    if (mLocked.displayOrientation != orientation) {
+        float absoluteX, absoluteY;
+
+        // Map from oriented display coordinates to absolute display coordinates.
+        switch (mLocked.displayOrientation) {
+        case InputReaderPolicyInterface::ROTATION_90:
+            absoluteX = mLocked.displayWidth - mLocked.pointerY;
+            absoluteY = mLocked.pointerX;
+            break;
+        case InputReaderPolicyInterface::ROTATION_180:
+            absoluteX = mLocked.displayWidth - mLocked.pointerX;
+            absoluteY = mLocked.displayHeight - mLocked.pointerY;
+            break;
+        case InputReaderPolicyInterface::ROTATION_270:
+            absoluteX = mLocked.pointerY;
+            absoluteY = mLocked.displayHeight - mLocked.pointerX;
+            break;
+        default:
+            absoluteX = mLocked.pointerX;
+            absoluteY = mLocked.pointerY;
+            break;
+        }
+
+        // Map from absolute display coordinates to oriented display coordinates.
+        switch (orientation) {
+        case InputReaderPolicyInterface::ROTATION_90:
+            mLocked.pointerX = absoluteY;
+            mLocked.pointerY = mLocked.displayWidth - absoluteX;
+            break;
+        case InputReaderPolicyInterface::ROTATION_180:
+            mLocked.pointerX = mLocked.displayWidth - absoluteX;
+            mLocked.pointerY = mLocked.displayHeight - absoluteY;
+            break;
+        case InputReaderPolicyInterface::ROTATION_270:
+            mLocked.pointerX = mLocked.displayHeight - absoluteY;
+            mLocked.pointerY = absoluteX;
+            break;
+        default:
+            mLocked.pointerX = absoluteX;
+            mLocked.pointerY = absoluteY;
+            break;
+        }
+
+        mLocked.displayOrientation = orientation;
+
+        updateLocked();
+    }
+}
+
+
 // ----------------------------------------------------------------------------
 
 static sp<NativeInputManager> gNativeInputManager;
@@ -1326,6 +1712,9 @@
     GET_METHOD_ID(gCallbacksClassInfo.getMaxEventsPerSecond, gCallbacksClassInfo.clazz,
             "getMaxEventsPerSecond", "()I");
 
+    GET_METHOD_ID(gCallbacksClassInfo.getPointerLayer, gCallbacksClassInfo.clazz,
+            "getPointerLayer", "()I");
+
     // InputWindow
 
     FIND_CLASS(gInputWindowClassInfo.clazz, "com/android/server/InputWindow");
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 7c4790f..825d90b 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2123,6 +2123,7 @@
 
         // invert everything, b/c glReadPixel() below will invert the FB
         glViewport(0, 0, sw, sh);
+        glScissor(0, 0, sw, sh);
         glMatrixMode(GL_PROJECTION);
         glPushMatrix();
         glLoadIdentity();
@@ -2132,6 +2133,7 @@
         // redraw the screen entirely...
         glClearColor(0,0,0,1);
         glClear(GL_COLOR_BUFFER_BIT);
+
         const Vector< sp<LayerBase> >& layers(mVisibleLayersSortedByZ);
         const size_t count = layers.size();
         for (size_t i=0 ; i<count ; ++i) {
@@ -2169,7 +2171,6 @@
                 result = NO_MEMORY;
             }
         }
-
         glEnable(GL_SCISSOR_TEST);
         glViewport(0, 0, hw_w, hw_h);
         glMatrixMode(GL_PROJECTION);
diff --git a/test-runner/src/android/test/InstrumentationTestRunner.java b/test-runner/src/android/test/InstrumentationTestRunner.java
index 5ce3efc..c3d09ff 100644
--- a/test-runner/src/android/test/InstrumentationTestRunner.java
+++ b/test-runner/src/android/test/InstrumentationTestRunner.java
@@ -16,8 +16,6 @@
 
 package android.test;
 
-import static android.test.suitebuilder.TestPredicates.REJECT_PERFORMANCE;
-
 import com.android.internal.util.Predicate;
 import com.android.internal.util.Predicates;
 
@@ -172,8 +170,6 @@
     /** @hide */
     public static final String ARGUMENT_TEST_SIZE_PREDICATE = "size";
     /** @hide */
-    public static final String ARGUMENT_INCLUDE_PERF = "perf";
-    /** @hide */
     public static final String ARGUMENT_DELAY_MSEC = "delay_msec";
 
     private static final String SMALL_SUITE = "small";
@@ -305,7 +301,6 @@
         Predicate<TestMethod> testSizePredicate = null;
         Predicate<TestMethod> testAnnotationPredicate = null;
         Predicate<TestMethod> testNotAnnotationPredicate = null;
-        boolean includePerformance = false;
         String testClassesArg = null;
         boolean logOnly = false;
 
@@ -323,7 +318,6 @@
             testNotAnnotationPredicate = getNotAnnotationPredicate(
                     arguments.getString(ARGUMENT_NOT_ANNOTATION));
 
-            includePerformance = getBooleanArgument(arguments, ARGUMENT_INCLUDE_PERF);
             logOnly = getBooleanArgument(arguments, ARGUMENT_LOG_ONLY);
             mCoverage = getBooleanArgument(arguments, "coverage");
             mCoverageFilePath = arguments.getString("coverageFile");
@@ -348,9 +342,6 @@
         if (testNotAnnotationPredicate != null) {
             testSuiteBuilder.addRequirements(testNotAnnotationPredicate);
         }
-        if (!includePerformance) {
-            testSuiteBuilder.addRequirements(REJECT_PERFORMANCE);
-        }
 
         if (testClassesArg == null) {
             if (mPackageOfTests != null) {
diff --git a/test-runner/src/android/test/LoaderTestCase.java b/test-runner/src/android/test/LoaderTestCase.java
index 8be6590..c8564c2 100644
--- a/test-runner/src/android/test/LoaderTestCase.java
+++ b/test-runner/src/android/test/LoaderTestCase.java
@@ -64,7 +64,7 @@
                 // Shut the loader down
                 completedLoader.unregisterListener(this);
                 completedLoader.stopLoading();
-                completedLoader.destroy();
+                completedLoader.reset();
 
                 // Store the result, unblocking the test thread
                 queue.add(data);
diff --git a/test-runner/src/android/test/PerformanceTestBase.java b/test-runner/src/android/test/PerformanceTestBase.java
deleted file mode 100644
index 4a0a589..0000000
--- a/test-runner/src/android/test/PerformanceTestBase.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 android.test;
-
-import junit.framework.TestCase;
-
-/**
- * {@hide} Not needed for SDK.
- */
-public class PerformanceTestBase extends TestCase implements PerformanceTestCase {
-
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        return 0;
-    }
-
-    public boolean isPerformanceOnly() {
-        return true;
-    }
-}
diff --git a/test-runner/src/android/test/suitebuilder/TestPredicates.java b/test-runner/src/android/test/suitebuilder/TestPredicates.java
index d814e0b..47aca55 100644
--- a/test-runner/src/android/test/suitebuilder/TestPredicates.java
+++ b/test-runner/src/android/test/suitebuilder/TestPredicates.java
@@ -17,7 +17,6 @@
 package android.test.suitebuilder;
 
 import android.test.InstrumentationTestCase;
-import android.test.PerformanceTestBase;
 import android.test.suitebuilder.annotation.HasAnnotation;
 import android.test.suitebuilder.annotation.Suppress;
 import android.test.suitebuilder.annotation.LargeTest;
@@ -43,7 +42,5 @@
     public static final Predicate<TestMethod> SELECT_LARGE = new HasAnnotation(LargeTest.class);
     public static final Predicate<TestMethod> REJECT_SUPPRESSED =
             Predicates.not(new HasAnnotation(Suppress.class));
-    public static final Predicate<TestMethod> REJECT_PERFORMANCE =
-            Predicates.not(new AssignableFrom(PerformanceTestBase.class));
 
 }
diff --git a/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java b/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
index 428905e..28f7216 100644
--- a/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
+++ b/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
@@ -24,7 +24,6 @@
 import com.google.android.collect.Lists;
 import static android.test.suitebuilder.TestGrouping.SORT_BY_FULLY_QUALIFIED_NAME;
 import static android.test.suitebuilder.TestPredicates.REJECT_SUPPRESSED;
-import static android.test.suitebuilder.TestPredicates.REJECT_PERFORMANCE;
 
 import junit.framework.Test;
 import junit.framework.TestCase;
@@ -71,9 +70,9 @@
         this.testCases = Lists.newArrayList();
         addRequirements(REJECT_SUPPRESSED);
     }
-    
+
     /** @hide pending API Council approval */
-    public TestSuiteBuilder addTestClassByName(String testClassName, String testMethodName, 
+    public TestSuiteBuilder addTestClassByName(String testClassName, String testMethodName,
             Context context) {
 
         AndroidTestRunner atr = new AndroidTestRunner();
@@ -83,7 +82,7 @@
         this.testCases.addAll(atr.getTestCases());
         return this;
     }
-    
+
     /** @hide pending API Council approval */
     public TestSuiteBuilder addTestSuite(TestSuite testSuite) {
         for (TestCase testCase : (List<TestCase>) TestCaseUtil.getTests(testSuite, true)) {
@@ -242,7 +241,7 @@
 
     /**
      * @return the test package that represents the packages that were included for our test suite.
-     * 
+     *
      * {@hide} Not needed for 1.0 SDK.
      */
     protected TestGrouping getTestGrouping() {
@@ -262,7 +261,7 @@
         addSuiteIfNecessary(testMethod.getEnclosingClassname());
         suiteForCurrentClass.addTest(testMethod.createTest());
     }
-    
+
     private void addTest(Test test) {
         addSuiteIfNecessary(test.getClass().getName());
         suiteForCurrentClass.addTest(test);
diff --git a/test-runner/src/android/test/suitebuilder/UnitTestSuiteBuilder.java b/test-runner/src/android/test/suitebuilder/UnitTestSuiteBuilder.java
index 8cf4c86..a746b35 100644
--- a/test-runner/src/android/test/suitebuilder/UnitTestSuiteBuilder.java
+++ b/test-runner/src/android/test/suitebuilder/UnitTestSuiteBuilder.java
@@ -18,7 +18,7 @@
 
 /**
  * A suite builder that finds unit tests.
- * 
+ *
  * {@hide} Not needed for 1.0 SDK.
  */
 public class UnitTestSuiteBuilder extends TestSuiteBuilder {
@@ -31,6 +31,5 @@
     public UnitTestSuiteBuilder(String name, ClassLoader classLoader) {
         super(name, classLoader);
         addRequirements(TestPredicates.REJECT_INSTRUMENTATION);
-        addRequirements(TestPredicates.REJECT_PERFORMANCE);
     }
 }
diff --git a/tests/CoreTests/android/core/AndroidPerformanceTests.java b/tests/CoreTests/android/core/AndroidPerformanceTests.java
deleted file mode 100644
index e604d59..0000000
--- a/tests/CoreTests/android/core/AndroidPerformanceTests.java
+++ /dev/null
@@ -1,35 +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 android.core;
-
-import android.test.TestListActivity;
-
-public class AndroidPerformanceTests extends TestListActivity {
-    @Override
-    public String getTestSuite() {
-        return "com.android.unit_tests.AndroidPerformanceTests$Suite";
-    }
-
-    public static class Suite {
-        public static String[] children() {
-            return new String[] {
-                JavaPerformanceTests.class.getName(),
-                PerformanceTests.class.getName(),
-            };
-        }
-    }
-}
diff --git a/tests/CoreTests/android/core/ArrayListPerformanceTest.java b/tests/CoreTests/android/core/ArrayListPerformanceTest.java
deleted file mode 100644
index 6130e83..0000000
--- a/tests/CoreTests/android/core/ArrayListPerformanceTest.java
+++ /dev/null
@@ -1,327 +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 android.core;
-
-import java.util.ArrayList;
-import android.test.PerformanceTestBase;
-
-public class ArrayListPerformanceTest extends PerformanceTestBase {
-
-    private ArrayList<Integer> mList;
-
-    @Override
-    @SuppressWarnings("unchecked")
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mList = new ArrayList();
-        mList.add(0);
-        mList.add(1);
-        mList.add(2);
-        mList.add(3);
-        mList.add(4);
-        mList.add(5);
-        mList.add(6);
-        mList.add(7);
-        mList.add(8);
-        mList.add(9);
-    }
-
-    public void testArrayListAdd() {
-        int i = 0;
-        for (; i < 10; i++) {
-            mList.add(i);
-            mList.add(i);
-            mList.add(i);
-            mList.add(i);
-            mList.add(i);
-            mList.add(i);
-            mList.add(i);
-            mList.add(i);
-            mList.add(i);
-            mList.add(i);
-        }
-    }
-
-    public void testArrayListAdd1() {
-        int i = 0;
-        for (; i < 10; i++) {
-            mList.add(7, i);
-            mList.add(7, i);
-            mList.add(7, i);
-            mList.add(7, i);
-            mList.add(7, i);
-            mList.add(7, i);
-            mList.add(7, i);
-            mList.add(7, i);
-            mList.add(7, i);
-            mList.add(7, i);
-        }
-    }
-
-    public void testArrayListToArray() {
-        Object rArray;
-        int i = 0;
-        for (; i < 100; i++) {
-            rArray = mList.toArray();
-            rArray = mList.toArray();
-            rArray = mList.toArray();
-            rArray = mList.toArray();
-            rArray = mList.toArray();
-            rArray = mList.toArray();
-            rArray = mList.toArray();
-            rArray = mList.toArray();
-            rArray = mList.toArray();
-            rArray = mList.toArray();
-        }
-    }
-
-    public void testArrayListSize() {
-        int i = 0, len;
-        for (; i < 100; i++) {
-            len = mList.size();
-            len = mList.size();
-            len = mList.size();
-            len = mList.size();
-            len = mList.size();
-            len = mList.size();
-            len = mList.size();
-            len = mList.size();
-            len = mList.size();
-            len = mList.size();
-        }
-    }
-
-    public void testArrayListGet() {
-        int i = 0, value;
-        int len = mList.size();
-        for (; i < len; i++) {
-            value = mList.get(i);
-            value = mList.get(i);
-            value = mList.get(i);
-            value = mList.get(i);
-            value = mList.get(i);
-            value = mList.get(i);
-            value = mList.get(i);
-            value = mList.get(i);
-            value = mList.get(i);
-            value = mList.get(i);
-        }
-    }
-
-    public void testArrayListContains() {
-        boolean flag;
-        int i = 0;
-
-        for (; i < 100; i++) {
-            flag = mList.contains(i);
-            flag = mList.contains(i);
-            flag = mList.contains(i);
-            flag = mList.contains(i);
-            flag = mList.contains(i);
-            flag = mList.contains(i);
-            flag = mList.contains(i);
-            flag = mList.contains(i);
-            flag = mList.contains(i);
-            flag = mList.contains(i);
-
-        }
-    }
-
-    public void testArrayListToArray1() {
-        Integer[] rArray = new Integer[10];
-
-        Integer[] mArray;
-        int i = 0;
-        for (; i < 100; i++) {
-            mArray = mList.toArray(rArray);
-            mArray = mList.toArray(rArray);
-            mArray = mList.toArray(rArray);
-            mArray = mList.toArray(rArray);
-            mArray = mList.toArray(rArray);
-            mArray = mList.toArray(rArray);
-            mArray = mList.toArray(rArray);
-            mArray = mList.toArray(rArray);
-            mArray = mList.toArray(rArray);
-            mArray = mList.toArray(rArray);
-        }
-    }
-
-    public void testArrayListSet() {
-        int i = 0;
-        for (; i < 10; i++) {
-            mList.set(5, 0);
-            mList.set(5, 0);
-            mList.set(5, 0);
-            mList.set(5, 0);
-            mList.set(5, 0);
-            mList.set(5, 0);
-            mList.set(5, 0);
-            mList.set(5, 0);
-            mList.set(5, 0);
-            mList.set(5, 0);
-        }
-    }
-
-    public void testArrayListIndexOf() {
-        int i = 0, index;
-
-        for (; i < 100; i++) {
-            index = mList.indexOf(0);
-            index = mList.indexOf(0);
-            index = mList.indexOf(0);
-            index = mList.indexOf(0);
-            index = mList.indexOf(0);
-            index = mList.indexOf(0);
-            index = mList.indexOf(0);
-            index = mList.indexOf(0);
-            index = mList.indexOf(0);
-            index = mList.indexOf(0);
-        }
-    }
-
-    public void testArrayListLastIndexOf() {
-        int i = 0, index;
-
-        for (; i < 100; i++) {
-            index = mList.lastIndexOf(0);
-            index = mList.lastIndexOf(0);
-            index = mList.lastIndexOf(0);
-            index = mList.lastIndexOf(0);
-            index = mList.lastIndexOf(0);
-            index = mList.lastIndexOf(0);
-            index = mList.lastIndexOf(0);
-            index = mList.lastIndexOf(0);
-            index = mList.lastIndexOf(0);
-            index = mList.lastIndexOf(0);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testArrayListRemove() {
-        ArrayList<Integer> aList;
-        aList = new ArrayList();
-        for (int j = 0; j < 10000; j++) {
-            aList.add(0);
-        }
-
-        int i = 0, index;
-
-        for (; i < 10; i++) {
-            index = aList.remove(0);
-            index = aList.remove(0);
-            index = aList.remove(0);
-            index = aList.remove(0);
-            index = aList.remove(0);
-            index = aList.remove(0);
-            index = aList.remove(0);
-            index = aList.remove(0);
-            index = aList.remove(0);
-            index = aList.remove(0);
-
-
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testArrayListAddAll() {
-        ArrayList<Integer> aList = new ArrayList();
-
-        int i = 0;
-        boolean b;
-        for (; i < 10; i++) {
-            b = aList.addAll(mList);
-            b = aList.addAll(mList);
-            b = aList.addAll(mList);
-            b = aList.addAll(mList);
-            b = aList.addAll(mList);
-            b = aList.addAll(mList);
-            b = aList.addAll(mList);
-            b = aList.addAll(mList);
-            b = aList.addAll(mList);
-            b = aList.addAll(mList);
-
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testArrayListRemove1() {
-        ArrayList<String> aList;
-        String s;
-
-        aList = new ArrayList();
-        for (int j = 0; j < 100; j++) {
-            aList.add("a");
-            aList.add("b");
-        }
-        s = new String("a");
-
-        int i = 0;
-        boolean b;
-        for (; i < 10; i++) {
-            b = aList.remove(s);
-            b = aList.remove(s);
-            b = aList.remove(s);
-            b = aList.remove(s);
-            b = aList.remove(s);
-            b = aList.remove(s);
-            b = aList.remove(s);
-            b = aList.remove(s);
-            b = aList.remove(s);
-            b = aList.remove(s);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testArrayListAddAll1() {
-        ArrayList<Integer> aList = new ArrayList();
-
-        int i = 0;
-        boolean b;
-
-        for (; i < 10; i++) {
-            b = aList.addAll(0, mList);
-            b = aList.addAll(0, mList);
-            b = aList.addAll(0, mList);
-            b = aList.addAll(0, mList);
-            b = aList.addAll(0, mList);
-            b = aList.addAll(0, mList);
-            b = aList.addAll(0, mList);
-            b = aList.addAll(0, mList);
-            b = aList.addAll(0, mList);
-            b = aList.addAll(0, mList);
-        }
-    }
-
-    public void testArrayListClone() {
-        Object rObj;
-        int i = 0;
-
-        for (; i < 100; i++) {
-            rObj = mList.clone();
-            rObj = mList.clone();
-            rObj = mList.clone();
-            rObj = mList.clone();
-            rObj = mList.clone();
-            rObj = mList.clone();
-            rObj = mList.clone();
-            rObj = mList.clone();
-            rObj = mList.clone();
-            rObj = mList.clone();
-        }
-    }
-}
diff --git a/tests/CoreTests/android/core/HashMapPerfTest.java b/tests/CoreTests/android/core/HashMapPerfTest.java
deleted file mode 100644
index 8475222..0000000
--- a/tests/CoreTests/android/core/HashMapPerfTest.java
+++ /dev/null
@@ -1,93 +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 android.core;
-
-import android.os.SystemClock;
-import android.test.suitebuilder.annotation.LargeTest;
-import junit.framework.TestCase;
-
-import java.util.HashMap;
-import java.util.Random;
-
-/**
- * Tests basic functionality of HashMaps and prints the time needed to System.out
- */
-public class HashMapPerfTest extends TestCase {
-
-    private static final Random sRandom = new Random(1);
-
-    class StringThing {
-
-        String mId;
-
-        public StringThing() {
-            int len = sRandom.nextInt(20) + 1;
-            char[] chars = new char[len];
-            chars[0] = 't';
-            for (int i = 1; i < len; i++) {
-                chars[i] = (char) ('q' + sRandom.nextInt(4));
-            }
-            mId = new String(chars, 0, len);
-        }
-
-        public String getId() {
-            return mId;
-        }
-    }
-
-    private static final int NUM_ELTS = 1000;
-    private static final int ITERS = 100;
-
-    String[] keyCopies = new String[NUM_ELTS];
-
-    private static final boolean lookupByOriginals = false;
-
-    @LargeTest
-    public void testHashMapPerformance() throws Exception {
-        StringThing[] st = new StringThing[NUM_ELTS];
-        for (int i = 0; i < NUM_ELTS; i++) {
-            st[i] = new StringThing();
-            keyCopies[i] = st[i].getId();
-        }
-
-        // android.os.Debug.startMethodTracing();
-        long start = SystemClock.uptimeMillis();
-        for (int i = 0; i < ITERS; i++) {
-            HashMap<String, StringThing> map = new HashMap<String, StringThing>();
-            for (int j = 0; j < NUM_ELTS; j++) {
-                StringThing s = st[i];
-                map.put(s.getId(), s);
-            }
-            for (int j = 0; j < NUM_ELTS; j++) {
-                if (lookupByOriginals) {
-                    StringThing s = st[i];
-                    map.get(s.getId());
-                } else {
-                    map.get(keyCopies[j]);
-                }
-            }
-        }
-        long finish = SystemClock.uptimeMillis();
-        // android.os.Debug.stopMethodTracing();
-
-        // This should be an assertion instead
-        
-//        System.out.println("time (" + NUM_ELTS +
-//                ", elts, " + ITERS +
-//                " iters) = " + (finish - start));
-    }
-}
diff --git a/tests/CoreTests/android/core/HashMapPerformanceTest.java b/tests/CoreTests/android/core/HashMapPerformanceTest.java
deleted file mode 100644
index 82727bb..0000000
--- a/tests/CoreTests/android/core/HashMapPerformanceTest.java
+++ /dev/null
@@ -1,185 +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 android.core;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Set;
-
-import android.test.PerformanceTestBase;
-import android.test.PerformanceTestCase;
-
-public class HashMapPerformanceTest extends PerformanceTestBase {
-    public static final int ITERATIONS = 1000;
-    public HashMap mMap;
-    public String[] mKeys;
-
-    @Override
-    @SuppressWarnings("unchecked")
-    protected void setUp() throws Exception {
-        super.setUp();
-        mMap = new HashMap();
-        mKeys = new String[ITERATIONS];
-
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            mKeys[i] = Integer.toString(i, 16);
-            mMap.put(mKeys[i], i);
-        }
-    }
-
-    @Override
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        intermediates.setInternalIterations(ITERATIONS);
-        return 0;
-    }
-
-    public void testHashMapGet() {
-        int num;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            num = (Integer) mMap.get(mKeys[i]);
-            num = (Integer) mMap.get(mKeys[i]);
-            num = (Integer) mMap.get(mKeys[i]);
-            num = (Integer) mMap.get(mKeys[i]);
-            num = (Integer) mMap.get(mKeys[i]);
-            num = (Integer) mMap.get(mKeys[i]);
-            num = (Integer) mMap.get(mKeys[i]);
-            num = (Integer) mMap.get(mKeys[i]);
-            num = (Integer) mMap.get(mKeys[i]);
-            num = (Integer) mMap.get(mKeys[i]);
-        }
-    }
-
-    public void testHashMapKeySet() {
-        Set keyset;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            keyset = mMap.keySet();
-            keyset = mMap.keySet();
-            keyset = mMap.keySet();
-            keyset = mMap.keySet();
-            keyset = mMap.keySet();
-            keyset = mMap.keySet();
-            keyset = mMap.keySet();
-            keyset = mMap.keySet();
-            keyset = mMap.keySet();
-            keyset = mMap.keySet();
-        }
-    }
-
-    public void testHashMapEntrySet() {
-        Set keyset;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            keyset = mMap.entrySet();
-            keyset = mMap.entrySet();
-            keyset = mMap.entrySet();
-            keyset = mMap.entrySet();
-            keyset = mMap.entrySet();
-            keyset = mMap.entrySet();
-            keyset = mMap.entrySet();
-            keyset = mMap.entrySet();
-            keyset = mMap.entrySet();
-            keyset = mMap.entrySet();
-
-
-        }
-    }
-
-    public void testHashMapValues() {
-        Collection c;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            c = mMap.values();
-            c = mMap.values();
-            c = mMap.values();
-            c = mMap.values();
-            c = mMap.values();
-            c = mMap.values();
-            c = mMap.values();
-            c = mMap.values();
-            c = mMap.values();
-            c = mMap.values();
-
-
-        }
-    }
-
-    public void testHashMapSize() {
-        int len;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            len = mMap.size();
-            len = mMap.size();
-            len = mMap.size();
-            len = mMap.size();
-            len = mMap.size();
-            len = mMap.size();
-            len = mMap.size();
-            len = mMap.size();
-            len = mMap.size();
-            len = mMap.size();
-
-
-        }
-    }
-
-    public void testHashMapContainsValue() {
-        boolean flag;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = mMap.containsValue(i);
-            flag = mMap.containsValue(i);
-            flag = mMap.containsValue(i);
-            flag = mMap.containsValue(i);
-            flag = mMap.containsValue(i);
-            flag = mMap.containsValue(i);
-            flag = mMap.containsValue(i);
-            flag = mMap.containsValue(i);
-            flag = mMap.containsValue(i);
-            flag = mMap.containsValue(i);
-
-
-        }
-    }
-
-    public void testHashMapRemove() {
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            mMap.remove(mKeys[i]);
-            mMap.remove(mKeys[i]);
-            mMap.remove(mKeys[i]);
-            mMap.remove(mKeys[i]);
-            mMap.remove(mKeys[i]);
-            mMap.remove(mKeys[i]);
-            mMap.remove(mKeys[i]);
-            mMap.remove(mKeys[i]);
-            mMap.remove(mKeys[i]);
-            mMap.remove(mKeys[i]);
-        }
-    }
-
-
-    public void testHashMapClone() {
-        HashMap cMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            cMap = (HashMap) mMap.clone();
-            cMap = (HashMap) mMap.clone();
-            cMap = (HashMap) mMap.clone();
-            cMap = (HashMap) mMap.clone();
-            cMap = (HashMap) mMap.clone();
-            cMap = (HashMap) mMap.clone();
-            cMap = (HashMap) mMap.clone();
-            cMap = (HashMap) mMap.clone();
-            cMap = (HashMap) mMap.clone();
-            cMap = (HashMap) mMap.clone();
-        }
-    }
-}
diff --git a/tests/CoreTests/android/core/HashSetTest.java b/tests/CoreTests/android/core/HashSetTest.java
deleted file mode 100644
index 09a711f..0000000
--- a/tests/CoreTests/android/core/HashSetTest.java
+++ /dev/null
@@ -1,207 +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 android.core;
-
-import android.test.PerformanceTestBase;
-import android.test.PerformanceTestCase;
-
-import java.util.HashSet;
-import java.util.Iterator;
-
-/**
- * Implements basic performance test functionality for HashSets
- */
-
-public class HashSetTest extends PerformanceTestBase {
-    public static final int ITERATIONS = 1000;
-    public static HashSet<Integer> sSet;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        sSet = new HashSet<Integer>();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            sSet.add(i);
-        }
-    }
-
-    @Override
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        intermediates.setInternalIterations(ITERATIONS);
-        return 0;
-    }
-
-    /**
-     * 
-     * Tests performance for the HashSet method Add(Object arg 0)
-     * 
-     */
-
-    @SuppressWarnings("unchecked")
-    public void testHashSetAdd() {
-        HashSet set = new HashSet();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-        }
-
-    }
-
-    /**
-     * 
-     * Tests performance of HashSet method contains(Object arg 0)
-     * 
-     */
-
-    public void testHashSetContains() {
-        Integer index = new Integer(500);
-        boolean flag;
-        HashSet set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-        }
-    }
-
-    /**
-     * 
-     * Tests performance of HashSet method size()
-     * 
-     */
-
-    public void testHashSetSize() {
-        int num;
-        HashSet set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            num = set.size();
-            num = set.size();
-            num = set.size();
-            num = set.size();
-            num = set.size();
-            num = set.size();
-            num = set.size();
-            num = set.size();
-            num = set.size();
-        }
-    }
-
-    /**
-     * 
-     * Tests performance of the HashSet method -iterator()
-     * 
-     */
-
-    public void testHashSetIterator() {
-        Iterator iterator;
-        HashSet set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the HashSet method Remove(Object arg 0)
-     * 
-     */
-
-    @SuppressWarnings("unchecked")
-    public void testHashSetRemove() {
-        HashSet set = new HashSet(sSet);
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the HashSet method isEmpty(Object arg 0)
-     * 
-     */
-
-    public void testHashSetIsEmpty() {
-        HashSet set = sSet;
-        boolean flag;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = set.isEmpty();
-            flag = set.isEmpty();
-            flag = set.isEmpty();
-            flag = set.isEmpty();
-            flag = set.isEmpty();
-            flag = set.isEmpty();
-            flag = set.isEmpty();
-            flag = set.isEmpty();
-            flag = set.isEmpty();
-            flag = set.isEmpty();
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the HashSet method clone()
-     * 
-     */
-
-    public void testHashSetClone() {
-        HashSet hSet = sSet;
-        Object set;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            set = hSet.clone();
-            set = hSet.clone();
-            set = hSet.clone();
-            set = hSet.clone();
-            set = hSet.clone();
-            set = hSet.clone();
-            set = hSet.clone();
-            set = hSet.clone();
-            set = hSet.clone();
-            set = hSet.clone();
-        }
-    }
-}
diff --git a/tests/CoreTests/android/core/HashtableTest.java b/tests/CoreTests/android/core/HashtableTest.java
deleted file mode 100644
index 6160f57..0000000
--- a/tests/CoreTests/android/core/HashtableTest.java
+++ /dev/null
@@ -1,357 +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 android.core;
-
-import android.test.PerformanceTestBase;
-import android.test.PerformanceTestCase;
-
-import java.util.Hashtable;
-import java.util.Set;
-import java.util.Enumeration;
-
-/**
- * Implements basic performance test functionality for java.util.Hashtable
- */
-
-public class HashtableTest extends PerformanceTestBase {
-    public static final int ITERATIONS = 1000;
-    public Hashtable<String, Integer> sTable;
-    public String[] sKeys;
-
-    @Override
-    @SuppressWarnings("unchecked")
-    protected void setUp() throws Exception {
-        super.setUp();
-        sTable = new Hashtable();
-        sKeys = new String[ITERATIONS];
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            sKeys[i] = Integer.toString(i, 16);
-            sTable.put(sKeys[i], i);
-        }
-    }
-
-    @Override
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        intermediates.setInternalIterations(ITERATIONS);
-        return 0;
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testHashtablePut() {
-        Hashtable hTable = new Hashtable();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            hTable.put(i, i);
-            hTable.put(i, i);
-            hTable.put(i, i);
-            hTable.put(i, i);
-            hTable.put(i, i);
-            hTable.put(i, i);
-            hTable.put(i, i);
-            hTable.put(i, i);
-            hTable.put(i, i);
-            hTable.put(i, i);
-        }
-    }
-
-    public void testHashtableGet() {
-        int value;
-        String[] keys = sKeys;
-        Hashtable<String, Integer> hTable = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            value = hTable.get(keys[i]);
-            value = hTable.get(keys[i]);
-            value = hTable.get(keys[i]);
-            value = hTable.get(keys[i]);
-            value = hTable.get(keys[i]);
-            value = hTable.get(keys[i]);
-            value = hTable.get(keys[i]);
-            value = hTable.get(keys[i]);
-            value = hTable.get(keys[i]);
-            value = hTable.get(keys[i]);
-        }
-    }
-
-    public void testHashtablekeyset() {
-        Set keyset;
-        Hashtable<String, Integer> hTable = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            keyset = hTable.keySet();
-            keyset = hTable.keySet();
-            keyset = hTable.keySet();
-            keyset = hTable.keySet();
-            keyset = hTable.keySet();
-            keyset = hTable.keySet();
-            keyset = hTable.keySet();
-            keyset = hTable.keySet();
-            keyset = hTable.keySet();
-            keyset = hTable.keySet();
-        }
-    }
-
-    /**
-     * 
-     */
-
-    public void testHashtableEntrySet() {
-        Set keyset;
-        Hashtable<String, Integer> hTable = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            keyset = hTable.entrySet();
-            keyset = hTable.entrySet();
-            keyset = hTable.entrySet();
-            keyset = hTable.entrySet();
-            keyset = hTable.entrySet();
-            keyset = hTable.entrySet();
-            keyset = hTable.entrySet();
-            keyset = hTable.entrySet();
-            keyset = hTable.entrySet();
-            keyset = hTable.entrySet();
-        }
-    }
-
-    public void testHashtableSize() {
-        int len;
-        Hashtable<String, Integer> hTable = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            len = hTable.size();
-            len = hTable.size();
-            len = hTable.size();
-            len = hTable.size();
-            len = hTable.size();
-            len = hTable.size();
-            len = hTable.size();
-            len = hTable.size();
-            len = hTable.size();
-            len = hTable.size();
-        }
-    }
-
-    public void testHashtableContainsValue() {
-        boolean flag;
-        Hashtable<String, Integer> hTable = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = hTable.containsValue(i);
-            flag = hTable.containsValue(i);
-            flag = hTable.containsValue(i);
-            flag = hTable.containsValue(i);
-            flag = hTable.containsValue(i);
-            flag = hTable.containsValue(i);
-            flag = hTable.containsValue(i);
-            flag = hTable.containsValue(i);
-            flag = hTable.containsValue(i);
-            flag = hTable.containsValue(i);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testHashtableRemove() {
-        Hashtable<String, Integer> hTable = new Hashtable(sTable);
-        String[] keys = sKeys;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            hTable.remove(keys[i]);
-            hTable.remove(keys[i]);
-            hTable.remove(keys[i]);
-            hTable.remove(keys[i]);
-            hTable.remove(keys[i]);
-            hTable.remove(keys[i]);
-            hTable.remove(keys[i]);
-            hTable.remove(keys[i]);
-            hTable.remove(keys[i]);
-            hTable.remove(keys[i]);
-        }
-    }
-
-    public void testHashtableContains() {
-        Hashtable<String, Integer> hTable = sTable;
-        boolean flag;
-
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = hTable.contains(i);
-            flag = hTable.contains(i);
-            flag = hTable.contains(i);
-            flag = hTable.contains(i);
-            flag = hTable.contains(i);
-            flag = hTable.contains(i);
-            flag = hTable.contains(i);
-            flag = hTable.contains(i);
-            flag = hTable.contains(i);
-            flag = hTable.contains(i);
-        }
-    }
-
-    public void testHashtableContainsKey() {
-        Hashtable<String, Integer> hTable = sTable;
-        boolean flag;
-
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = hTable.containsKey(i);
-            flag = hTable.containsKey(i);
-            flag = hTable.containsKey(i);
-            flag = hTable.containsKey(i);
-            flag = hTable.containsKey(i);
-            flag = hTable.containsKey(i);
-            flag = hTable.containsKey(i);
-            flag = hTable.containsKey(i);
-            flag = hTable.containsKey(i);
-            flag = hTable.containsKey(i);
-        }
-    }
-
-    public void testHashtableIsEmpty() {
-        Hashtable<String, Integer> hTable = sTable;
-        boolean flag;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = hTable.isEmpty();
-            flag = hTable.isEmpty();
-            flag = hTable.isEmpty();
-            flag = hTable.isEmpty();
-            flag = hTable.isEmpty();
-            flag = hTable.isEmpty();
-            flag = hTable.isEmpty();
-            flag = hTable.isEmpty();
-            flag = hTable.isEmpty();
-            flag = hTable.isEmpty();
-        }
-    }
-
-    public void testHashtableKeys() {
-        Hashtable<String, Integer> hTable = sTable;
-        Enumeration<String> keys;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            keys = hTable.keys();
-            keys = hTable.keys();
-            keys = hTable.keys();
-            keys = hTable.keys();
-            keys = hTable.keys();
-            keys = hTable.keys();
-            keys = hTable.keys();
-            keys = hTable.keys();
-            keys = hTable.keys();
-            keys = hTable.keys();
-        }
-    }
-
-    public void testHashtableElements() {
-        Hashtable<String, Integer> hTable = sTable;
-        Enumeration<Integer> elements;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            elements = hTable.elements();
-            elements = hTable.elements();
-            elements = hTable.elements();
-            elements = hTable.elements();
-            elements = hTable.elements();
-            elements = hTable.elements();
-            elements = hTable.elements();
-            elements = hTable.elements();
-            elements = hTable.elements();
-            elements = hTable.elements();
-        }
-    }
-
-    public void testHashtableHashCode() {
-        int index;
-        Hashtable<String, Integer> hTable = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            index = hTable.hashCode();
-            index = hTable.hashCode();
-            index = hTable.hashCode();
-            index = hTable.hashCode();
-            index = hTable.hashCode();
-            index = hTable.hashCode();
-            index = hTable.hashCode();
-            index = hTable.hashCode();
-            index = hTable.hashCode();
-            index = hTable.hashCode();
-        }
-    }
-
-    public void testHashtableEquals() {
-        boolean flag;
-        Hashtable<String, Integer> hTable = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = hTable.equals(hTable);
-            flag = hTable.equals(hTable);
-            flag = hTable.equals(hTable);
-            flag = hTable.equals(hTable);
-            flag = hTable.equals(hTable);
-            flag = hTable.equals(hTable);
-            flag = hTable.equals(hTable);
-            flag = hTable.equals(hTable);
-            flag = hTable.equals(hTable);
-            flag = hTable.equals(hTable);
-        }
-    }
-
-    public void testHashtableToString() {
-        String str;
-        Hashtable<String, Integer> hTable = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            str = hTable.toString();
-            str = hTable.toString();
-            str = hTable.toString();
-            str = hTable.toString();
-            str = hTable.toString();
-            str = hTable.toString();
-            str = hTable.toString();
-            str = hTable.toString();
-            str = hTable.toString();
-            str = hTable.toString();
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testHashtablePutAll() {
-        Hashtable<String, Integer> hTable = new Hashtable();
-        Hashtable<String, Integer> hTable1 = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            hTable.putAll(hTable1);
-            hTable.putAll(hTable1);
-            hTable.putAll(hTable1);
-            hTable.putAll(hTable1);
-            hTable.putAll(hTable1);
-            hTable.putAll(hTable1);
-            hTable.putAll(hTable1);
-            hTable.putAll(hTable1);
-            hTable.putAll(hTable1);
-            hTable.putAll(hTable1);
-        }
-    }
-
-    /**
-     * 
-     * clone() returns a Hashtable .. It should return Object as per the
-     * specification.
-     * 
-     */
-
-    public void testHashtableClone() {
-        Hashtable hashTable;
-        Hashtable<String, Integer> hTable = sTable;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            hashTable = (Hashtable) hTable.clone();
-            hashTable = (Hashtable) hTable.clone();
-            hashTable = (Hashtable) hTable.clone();
-            hashTable = (Hashtable) hTable.clone();
-            hashTable = (Hashtable) hTable.clone();
-            hashTable = (Hashtable) hTable.clone();
-            hashTable = (Hashtable) hTable.clone();
-            hashTable = (Hashtable) hTable.clone();
-            hashTable = (Hashtable) hTable.clone();
-            hashTable = (Hashtable) hTable.clone();
-        }
-    }
-}
diff --git a/tests/CoreTests/android/core/JavaPerformanceTests.java b/tests/CoreTests/android/core/JavaPerformanceTests.java
deleted file mode 100644
index 95075ea..0000000
--- a/tests/CoreTests/android/core/JavaPerformanceTests.java
+++ /dev/null
@@ -1,37 +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 android.core;
-
-/**
- * 
- */
-public class JavaPerformanceTests {
-
-    public static String[] children() {
-        return new String[] {
-                HashMapPerformanceTest.class.getName(),
-                ArrayListPerformanceTest.class.getName(),
-                TreeMapPerformanceTest.class.getName(),
-                TreeSetTest.class.getName(),
-                HashSetTest.class.getName(),
-                HashtableTest.class.getName(),
-                VectorTest.class.getName(),
-                LinkedListTest.class.getName(),
-                MathPerformanceTest.class.getName(),
-        };
-    }
-}
diff --git a/tests/CoreTests/android/core/LinkedListTest.java b/tests/CoreTests/android/core/LinkedListTest.java
deleted file mode 100644
index 8b237fd..0000000
--- a/tests/CoreTests/android/core/LinkedListTest.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 android.core;
-
-import android.test.PerformanceTestBase;
-import android.test.PerformanceTestCase;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-/**
- * This class contains performance tests for methods in java.util.LinkedList
- * 
- */
-@SuppressWarnings("unchecked")
-public class LinkedListTest extends PerformanceTestBase {
-    public static final int ITERATIONS = 1000;
-    LinkedList<Integer> mLinkedList;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mLinkedList = new LinkedList();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            mLinkedList.add(i);
-        }
-    }
-
-    @Override
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        intermediates.setInternalIterations(ITERATIONS);
-        return 0;
-    }
-
-    public void testLinkedListAdd() {
-        LinkedList<Integer> list = new LinkedList();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            list.add(i);
-            list.add(i);
-            list.add(i);
-            list.add(i);
-            list.add(i);
-            list.add(i);
-            list.add(i);
-            list.add(i);
-            list.add(i);
-            list.add(i);
-        }
-    }
-
-    public void testLinkedListAdd1() {
-        LinkedList<Integer> list = new LinkedList();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            list.add(0, i);
-            list.add(0, i);
-            list.add(0, i);
-            list.add(0, i);
-            list.add(0, i);
-            list.add(0, i);
-            list.add(0, i);
-            list.add(0, i);
-            list.add(0, i);
-            list.add(0, i);
-        }
-    }
-
-    public void testLinkedListToArray() {
-        Object array;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            array = list.toArray();
-            array = list.toArray();
-            array = list.toArray();
-            array = list.toArray();
-            array = list.toArray();
-            array = list.toArray();
-            array = list.toArray();
-            array = list.toArray();
-            array = list.toArray();
-            array = list.toArray();
-        }
-    }
-
-    public void testLinkedListSize() {
-        LinkedList<Integer> list = mLinkedList;
-        int len;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            len = list.size();
-            len = list.size();
-            len = list.size();
-            len = list.size();
-            len = list.size();
-            len = list.size();
-            len = list.size();
-            len = list.size();
-            len = list.size();
-            len = list.size();
-        }
-    }
-
-    public void testLinkedListGet() {
-        int element;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            element = list.get(i);
-            element = list.get(i);
-            element = list.get(i);
-            element = list.get(i);
-            element = list.get(i);
-            element = list.get(i);
-            element = list.get(i);
-            element = list.get(i);
-            element = list.get(i);
-            element = list.get(i);
-        }
-    }
-
-    public void testLinkedListContains() {
-        boolean flag;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = list.contains(i);
-            flag = list.contains(i);
-            flag = list.contains(i);
-            flag = list.contains(i);
-            flag = list.contains(i);
-            flag = list.contains(i);
-            flag = list.contains(i);
-            flag = list.contains(i);
-            flag = list.contains(i);
-            flag = list.contains(i);
-        }
-    }
-
-    public void testLinkedListToArray1() {
-        Integer[] rArray = new Integer[100];
-        Integer[] array;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            array = list.toArray(rArray);
-            array = list.toArray(rArray);
-            array = list.toArray(rArray);
-            array = list.toArray(rArray);
-            array = list.toArray(rArray);
-            array = list.toArray(rArray);
-            array = list.toArray(rArray);
-            array = list.toArray(rArray);
-            array = list.toArray(rArray);
-            array = list.toArray(rArray);
-        }
-    }
-
-    public void testLinkedListSet() {
-        LinkedList<Integer> list = mLinkedList;
-        int value1 = 500, value2 = 0;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            list.set(value1, value2);
-            list.set(value1, value2);
-            list.set(value1, value2);
-            list.set(value1, value2);
-            list.set(value1, value2);
-            list.set(value1, value2);
-            list.set(value1, value2);
-            list.set(value1, value2);
-            list.set(value1, value2);
-            list.set(value1, value2);
-        }
-    }
-
-    public void testLinkedListIndexOf() {
-        int index;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            index = list.indexOf(0);
-            index = list.indexOf(0);
-            index = list.indexOf(0);
-            index = list.indexOf(0);
-            index = list.indexOf(0);
-            index = list.indexOf(0);
-            index = list.indexOf(0);
-            index = list.indexOf(0);
-            index = list.indexOf(0);
-            index = list.indexOf(0);
-
-        }
-    }
-
-    public void testLinkedListLastIndexOf() {
-        int index;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            index = list.lastIndexOf(0);
-            index = list.lastIndexOf(0);
-            index = list.lastIndexOf(0);
-            index = list.lastIndexOf(0);
-            index = list.lastIndexOf(0);
-            index = list.lastIndexOf(0);
-            index = list.lastIndexOf(0);
-            index = list.lastIndexOf(0);
-            index = list.lastIndexOf(0);
-            index = list.lastIndexOf(0);
-        }
-    }
-
-    public void testLinkedListRemove() {
-        int index;
-        LinkedList<Integer> list = new LinkedList(mLinkedList);
-        for (int i = 10; i > 0; i--) {
-            index = list.remove();
-            index = list.remove();
-            index = list.remove();
-            index = list.remove();
-            index = list.remove();
-            index = list.remove();
-            index = list.remove();
-            index = list.remove();
-            index = list.remove();
-            index = list.remove();
-        }
-    }
-
-    public void testLinkedListRemove1() {
-        int index;
-        LinkedList<Integer> list = new LinkedList(mLinkedList);
-        for (int i = 10; i > 0; i--) {
-            index = list.remove(0);
-            index = list.remove(0);
-            index = list.remove(0);
-            index = list.remove(0);
-            index = list.remove(0);
-            index = list.remove(0);
-            index = list.remove(0);
-            index = list.remove(0);
-            index = list.remove(0);
-            index = list.remove(0);
-        }
-    }
-
-    public void testLinkedListRemoveFirst() {
-        int index;
-        LinkedList<Integer> list = new LinkedList(mLinkedList);
-        for (int i = 10; i > 0; i--) {
-            index = list.removeFirst();
-            index = list.removeFirst();
-            index = list.removeFirst();
-            index = list.removeFirst();
-            index = list.removeFirst();
-            index = list.removeFirst();
-            index = list.removeFirst();
-            index = list.removeFirst();
-            index = list.removeFirst();
-            index = list.removeFirst();
-        }
-    }
-
-    public void testLinkedListRemoveLast() {
-        int index;
-        LinkedList<Integer> list = new LinkedList(mLinkedList);
-        for (int i = 10; i > 0; i--) {
-            index = list.removeLast();
-            index = list.removeLast();
-            index = list.removeLast();
-            index = list.removeLast();
-            index = list.removeLast();
-            index = list.removeLast();
-            index = list.removeLast();
-            index = list.removeLast();
-            index = list.removeLast();
-            index = list.removeLast();
-        }
-    }
-
-    public void testLinkedListAddAll() {
-        LinkedList<Integer> mList = mLinkedList;
-        boolean flag;
-        LinkedList<Integer> list = new LinkedList();
-        for (int i = 10; i > 0; i--) {
-            flag = list.addAll(mList);
-            flag = list.addAll(mList);
-            flag = list.addAll(mList);
-            flag = list.addAll(mList);
-            flag = list.addAll(mList);
-            flag = list.addAll(mList);
-            flag = list.addAll(mList);
-            flag = list.addAll(mList);
-            flag = list.addAll(mList);
-            flag = list.addAll(mList);
-        }
-    }
-
-    public void testLinkedListRemove2() {
-        LinkedList<String> list;
-        String s = new String("a");
-        list = new LinkedList();
-        for (int j = 1000; j > 0; j--) {
-            list.add("a");
-            list.add("b");
-        }
-        boolean flag;
-        for (int i = 10; i > 0; i--) {
-            flag = list.remove(s);
-            flag = list.remove(s);
-            flag = list.remove(s);
-            flag = list.remove(s);
-            flag = list.remove(s);
-            flag = list.remove(s);
-            flag = list.remove(s);
-            flag = list.remove(s);
-            flag = list.remove(s);
-            flag = list.remove(s);
-        }
-    }
-
-    public void testLinkedListAddAll1() {
-        LinkedList<Integer> mList = new LinkedList();
-        int pos = 0;
-        boolean flag;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = 0; i < 10; i++) {
-            flag = mList.addAll(pos, list);
-            flag = mList.addAll(pos, list);
-            flag = mList.addAll(pos, list);
-            flag = mList.addAll(pos, list);
-            flag = mList.addAll(pos, list);
-            flag = mList.addAll(pos, list);
-            flag = mList.addAll(pos, list);
-            flag = mList.addAll(pos, list);
-            flag = mList.addAll(pos, list);
-            flag = mList.addAll(pos, list);
-        }
-    }
-
-    public void testLinkedListClone() {
-        Object rObj;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = 100; i > 0; i--) {
-            rObj = list.clone();
-            rObj = list.clone();
-            rObj = list.clone();
-            rObj = list.clone();
-            rObj = list.clone();
-            rObj = list.clone();
-            rObj = list.clone();
-            rObj = list.clone();
-            rObj = list.clone();
-            rObj = list.clone();
-        }
-    }
-
-    public void testLinkedListHashcode() {
-        int element;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            element = list.hashCode();
-            element = list.hashCode();
-            element = list.hashCode();
-            element = list.hashCode();
-            element = list.hashCode();
-            element = list.hashCode();
-            element = list.hashCode();
-            element = list.hashCode();
-            element = list.hashCode();
-            element = list.hashCode();
-        }
-    }
-
-    public void testLinkedListElement() {
-        int element;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            element = list.element();
-            element = list.element();
-            element = list.element();
-            element = list.element();
-            element = list.element();
-            element = list.element();
-            element = list.element();
-            element = list.element();
-            element = list.element();
-            element = list.element();
-        }
-    }
-
-    public void testLinkedListToString() {
-        String str;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            str = list.toString();
-            str = list.toString();
-            str = list.toString();
-            str = list.toString();
-            str = list.toString();
-            str = list.toString();
-            str = list.toString();
-            str = list.toString();
-            str = list.toString();
-            str = list.toString();
-        }
-    }
-
-    public void testLinkedListIsEmpty() {
-        boolean flag;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = list.isEmpty();
-            flag = list.isEmpty();
-            flag = list.isEmpty();
-            flag = list.isEmpty();
-            flag = list.isEmpty();
-            flag = list.isEmpty();
-            flag = list.isEmpty();
-            flag = list.isEmpty();
-            flag = list.isEmpty();
-            flag = list.isEmpty();
-        }
-    }
-
-    public void testLinkedListOffer() {
-        LinkedList<Integer> list = new LinkedList();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            list.offer(i);
-            list.offer(i);
-            list.offer(i);
-            list.offer(i);
-            list.offer(i);
-            list.offer(i);
-            list.offer(i);
-            list.offer(i);
-            list.offer(i);
-            list.offer(i);
-        }
-    }
-
-    public void testLinkedListPeek() {
-        int element;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            element = list.peek();
-            element = list.peek();
-            element = list.peek();
-            element = list.peek();
-            element = list.peek();
-            element = list.peek();
-            element = list.peek();
-            element = list.peek();
-            element = list.peek();
-            element = list.peek();
-        }
-    }
-
-    public void testLinkedListPoll() {
-        int element;
-        LinkedList<Integer> list = new LinkedList(mLinkedList);
-        for (int i = 10; i > 0; i--) {
-            element = list.poll();
-            element = list.poll();
-            element = list.poll();
-            element = list.poll();
-            element = list.poll();
-            element = list.poll();
-            element = list.poll();
-            element = list.poll();
-            element = list.poll();
-            element = list.poll();
-        }
-    }
-
-    public void testLinkedListAddLast() {
-        LinkedList<Integer> list = new LinkedList();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            list.addLast(i);
-            list.addLast(i);
-            list.addLast(i);
-            list.addLast(i);
-            list.addLast(i);
-            list.addLast(i);
-            list.addLast(i);
-            list.addLast(i);
-            list.addLast(i);
-            list.addLast(i);
-        }
-    }
-
-    public void testLinkedListAddFirst() {
-        LinkedList<Integer> list = new LinkedList();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            list.addFirst(i);
-            list.addFirst(i);
-            list.addFirst(i);
-            list.addFirst(i);
-            list.addFirst(i);
-            list.addFirst(i);
-            list.addFirst(i);
-            list.addFirst(i);
-            list.addFirst(i);
-            list.addFirst(i);
-        }
-    }
-
-    public void testLinkedListIterator() {
-        ListIterator iterator;
-        LinkedList<Integer> list = mLinkedList;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            iterator = list.listIterator();
-            iterator = list.listIterator();
-            iterator = list.listIterator();
-            iterator = list.listIterator();
-            iterator = list.listIterator();
-            iterator = list.listIterator();
-            iterator = list.listIterator();
-            iterator = list.listIterator();
-            iterator = list.listIterator();
-            iterator = list.listIterator();
-        }
-    }
-}
diff --git a/tests/CoreTests/android/core/MathPerformanceTest.java b/tests/CoreTests/android/core/MathPerformanceTest.java
deleted file mode 100644
index b1eb500..0000000
--- a/tests/CoreTests/android/core/MathPerformanceTest.java
+++ /dev/null
@@ -1,380 +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 android.core;
-
-import android.test.PerformanceTestBase;
-import android.test.PerformanceTestCase;
-
-/**
- * 
- * Implements basic performance test functionality for java.lang.Math
- * 
- */
-
-public class MathPerformanceTest extends PerformanceTestBase {
-    public static final int ITERATIONS = 1000;
-    public static final double sDouble1 = -2450.50;
-    public static final double sDouble2 = -500;
-    public static final float sFloat = 300.50f;
-    public static final int sInt = 90;
-
-    @Override
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        intermediates.setInternalIterations(ITERATIONS);
-        return 0;
-    }
-
-    public void testDoubleAbs() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.abs(sDouble1);
-            result = Math.abs(sDouble1);
-            result = Math.abs(sDouble1);
-            result = Math.abs(sDouble1);
-            result = Math.abs(sDouble1);
-            result = Math.abs(sDouble1);
-            result = Math.abs(sDouble1);
-            result = Math.abs(sDouble1);
-            result = Math.abs(sDouble1);
-            result = Math.abs(sDouble1);
-        }
-    }
-
-    public void testFloatAbs() {
-        float result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.abs(sFloat);
-            result = Math.abs(sFloat);
-            result = Math.abs(sFloat);
-            result = Math.abs(sFloat);
-            result = Math.abs(sFloat);
-            result = Math.abs(sFloat);
-            result = Math.abs(sFloat);
-            result = Math.abs(sFloat);
-            result = Math.abs(sFloat);
-            result = Math.abs(sFloat);
-        }
-    }
-
-    public void testMathSin() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.sin(sDouble1);
-            result = Math.sin(sDouble1);
-            result = Math.sin(sDouble1);
-            result = Math.sin(sDouble1);
-            result = Math.sin(sDouble1);
-            result = Math.sin(sDouble1);
-            result = Math.sin(sDouble1);
-            result = Math.sin(sDouble1);
-            result = Math.sin(sDouble1);
-            result = Math.sin(sDouble1);
-        }
-    }
-
-    public void testMathCos() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.cos(sDouble1);
-            result = Math.cos(sDouble1);
-            result = Math.cos(sDouble1);
-            result = Math.cos(sDouble1);
-            result = Math.cos(sDouble1);
-            result = Math.cos(sDouble1);
-            result = Math.cos(sDouble1);
-            result = Math.cos(sDouble1);
-            result = Math.cos(sDouble1);
-            result = Math.cos(sDouble1);
-        }
-    }
-
-    public void testMathTan() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.tan(sDouble1);
-            result = Math.tan(sDouble1);
-            result = Math.tan(sDouble1);
-            result = Math.tan(sDouble1);
-            result = Math.tan(sDouble1);
-            result = Math.tan(sDouble1);
-            result = Math.tan(sDouble1);
-            result = Math.tan(sDouble1);
-            result = Math.tan(sDouble1);
-            result = Math.tan(sDouble1);
-        }
-    }
-
-    public void testMathASin() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.asin(sDouble1);
-            result = Math.asin(sDouble1);
-            result = Math.asin(sDouble1);
-            result = Math.asin(sDouble1);
-            result = Math.asin(sDouble1);
-            result = Math.asin(sDouble1);
-            result = Math.asin(sDouble1);
-            result = Math.asin(sDouble1);
-            result = Math.asin(sDouble1);
-            result = Math.asin(sDouble1);
-        }
-    }
-
-    public void testMathACos() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.acos(sDouble1);
-            result = Math.acos(sDouble1);
-            result = Math.acos(sDouble1);
-            result = Math.acos(sDouble1);
-            result = Math.acos(sDouble1);
-            result = Math.acos(sDouble1);
-            result = Math.acos(sDouble1);
-            result = Math.acos(sDouble1);
-            result = Math.acos(sDouble1);
-            result = Math.acos(sDouble1);
-        }
-    }
-
-    public void testMathATan() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.atan(sDouble1);
-            result = Math.atan(sDouble1);
-            result = Math.atan(sDouble1);
-            result = Math.atan(sDouble1);
-            result = Math.atan(sDouble1);
-            result = Math.atan(sDouble1);
-            result = Math.atan(sDouble1);
-            result = Math.atan(sDouble1);
-            result = Math.atan(sDouble1);
-            result = Math.atan(sDouble1);
-        }
-    }
-
-    public void testMathLog() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.log(sDouble1);
-            result = Math.log(sDouble1);
-            result = Math.log(sDouble1);
-            result = Math.log(sDouble1);
-            result = Math.log(sDouble1);
-            result = Math.log(sDouble1);
-            result = Math.log(sDouble1);
-            result = Math.log(sDouble1);
-            result = Math.log(sDouble1);
-            result = Math.log(sDouble1);
-        }
-    }
-
-    public void testMathSqrt() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.sqrt(sDouble1);
-            result = Math.sqrt(sDouble1);
-            result = Math.sqrt(sDouble1);
-            result = Math.sqrt(sDouble1);
-            result = Math.sqrt(sDouble1);
-            result = Math.sqrt(sDouble1);
-            result = Math.sqrt(sDouble1);
-            result = Math.sqrt(sDouble1);
-            result = Math.sqrt(sDouble1);
-            result = Math.sqrt(sDouble1);
-        }
-    }
-
-    public void testMathCeil() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.ceil(sDouble1);
-            result = Math.ceil(sDouble1);
-            result = Math.ceil(sDouble1);
-            result = Math.ceil(sDouble1);
-            result = Math.ceil(sDouble1);
-            result = Math.ceil(sDouble1);
-            result = Math.ceil(sDouble1);
-            result = Math.ceil(sDouble1);
-            result = Math.ceil(sDouble1);
-            result = Math.ceil(sDouble1);
-        }
-    }
-
-    public void testMathRound() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.round(sDouble1);
-            result = Math.round(sDouble1);
-            result = Math.round(sDouble1);
-            result = Math.round(sDouble1);
-            result = Math.round(sDouble1);
-            result = Math.round(sDouble1);
-            result = Math.round(sDouble1);
-            result = Math.round(sDouble1);
-            result = Math.round(sDouble1);
-            result = Math.round(sDouble1);
-        }
-    }
-
-    public void testMathFloor() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.floor(sDouble1);
-            result = Math.floor(sDouble1);
-            result = Math.floor(sDouble1);
-            result = Math.floor(sDouble1);
-            result = Math.floor(sDouble1);
-            result = Math.floor(sDouble1);
-            result = Math.floor(sDouble1);
-            result = Math.floor(sDouble1);
-            result = Math.floor(sDouble1);
-            result = Math.floor(sDouble1);
-        }
-    }
-
-    public void testMathExp() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.exp(sDouble1);
-            result = Math.exp(sDouble1);
-            result = Math.exp(sDouble1);
-            result = Math.exp(sDouble1);
-            result = Math.exp(sDouble1);
-            result = Math.exp(sDouble1);
-            result = Math.exp(sDouble1);
-            result = Math.exp(sDouble1);
-            result = Math.exp(sDouble1);
-            result = Math.exp(sDouble1);
-        }
-    }
-
-    /**
-     * 
-     */
-
-    public void testMathPow() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.pow(sDouble1, sDouble2);
-            result = Math.pow(sDouble1, sDouble2);
-            result = Math.pow(sDouble1, sDouble2);
-            result = Math.pow(sDouble1, sDouble2);
-            result = Math.pow(sDouble1, sDouble2);
-            result = Math.pow(sDouble1, sDouble2);
-            result = Math.pow(sDouble1, sDouble2);
-            result = Math.pow(sDouble1, sDouble2);
-            result = Math.pow(sDouble1, sDouble2);
-            result = Math.pow(sDouble1, sDouble2);
-        }
-    }
-
-    public void testMathMax() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.max(sDouble1, sDouble2);
-            result = Math.max(sDouble1, sDouble2);
-            result = Math.max(sDouble1, sDouble2);
-            result = Math.max(sDouble1, sDouble2);
-            result = Math.max(sDouble1, sDouble2);
-            result = Math.max(sDouble1, sDouble2);
-            result = Math.max(sDouble1, sDouble2);
-            result = Math.max(sDouble1, sDouble2);
-            result = Math.max(sDouble1, sDouble2);
-            result = Math.max(sDouble1, sDouble2);
-        }
-    }
-
-    public void testMathMin() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.min(sDouble1, sDouble2);
-            result = Math.min(sDouble1, sDouble2);
-            result = Math.min(sDouble1, sDouble2);
-            result = Math.min(sDouble1, sDouble2);
-            result = Math.min(sDouble1, sDouble2);
-            result = Math.min(sDouble1, sDouble2);
-            result = Math.min(sDouble1, sDouble2);
-            result = Math.min(sDouble1, sDouble2);
-            result = Math.min(sDouble1, sDouble2);
-            result = Math.min(sDouble1, sDouble2);
-        }
-    }
-
-    public void testMathRandom() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.random();
-            result = Math.random();
-            result = Math.random();
-            result = Math.random();
-            result = Math.random();
-            result = Math.random();
-            result = Math.random();
-            result = Math.random();
-            result = Math.random();
-            result = Math.random();
-        }
-    }
-
-    public void testMathIEEERemainder() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-            result = Math.IEEEremainder(sDouble1, sDouble2);
-        }
-    }
-
-    public void testMathToDegrees() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.toDegrees(sDouble1);
-            result = Math.toDegrees(sDouble1);
-            result = Math.toDegrees(sDouble1);
-            result = Math.toDegrees(sDouble1);
-            result = Math.toDegrees(sDouble1);
-            result = Math.toDegrees(sDouble1);
-            result = Math.toDegrees(sDouble1);
-            result = Math.toDegrees(sDouble1);
-            result = Math.toDegrees(sDouble1);
-            result = Math.toDegrees(sDouble1);
-        }
-    }
-
-    public void testMathToRadians() {
-        double result;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            result = Math.toRadians(sDouble1);
-            result = Math.toRadians(sDouble1);
-            result = Math.toRadians(sDouble1);
-            result = Math.toRadians(sDouble1);
-            result = Math.toRadians(sDouble1);
-            result = Math.toRadians(sDouble1);
-            result = Math.toRadians(sDouble1);
-            result = Math.toRadians(sDouble1);
-            result = Math.toRadians(sDouble1);
-            result = Math.toRadians(sDouble1);
-        }
-    }
-}
diff --git a/tests/CoreTests/android/core/PerformanceTests.java b/tests/CoreTests/android/core/PerformanceTests.java
deleted file mode 100644
index faf46e6..0000000
--- a/tests/CoreTests/android/core/PerformanceTests.java
+++ /dev/null
@@ -1,1224 +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 android.core;
-
-import org.apache.harmony.dalvik.NativeTestTarget;
-
-import android.test.PerformanceTestBase;
-import android.test.PerformanceTestCase;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import junit.framework.Assert;
-
-public class PerformanceTests {
-    public static String[] children() {
-        return new String[] {
-                //StringEquals2.class.getName(),
-                //StringEquals10.class.getName(),
-                //StringEquals20.class.getName(),
-                //StringEquals200.class.getName(),
-                //StringEquals200U.class.getName(),
-                //StringCompareTo10.class.getName(),
-                //StringCompareTo200.class.getName(),
-                StringLength.class.getName(),
-                StringCrawl.class.getName(),
-                Ackermann.class.getName(),
-                AddTest.class.getName(),
-//                AddMemberVariableTest.class.getName(),
-                ArrayListIterator.class.getName(),
-                BoundsCheckTest.class.getName(),
-//                EmptyClassBaseTest.class.getName(),
-                EmptyJniStaticMethod0.class.getName(),
-                EmptyJniStaticMethod6.class.getName(),
-                EmptyJniStaticMethod6L.class.getName(),
-                FibonacciFast.class.getName(),
-                FibonacciSlow.class.getName(),
-//                LoopTests.class.getName(),
-//                HashMapTest.class.getName(),
-//                InterfaceTests.class.getName(),
-                LocalVariableAccess.class.getName(),
-                MemeberVariableAccess.class.getName(),
-                NestedLoop.class.getName(),
-//                StringConcatenationTests.class.getName(),
-//                ArrayListBase.class.getName(),
-                SynchronizedGetAndSetInt.class.getName(),
-
-                /* this will not work on JamVM -- lacks atomic ops */
-                AtomicGetAndSetInt.class.getName(),
-        };
-    }
-
-    public static class SizeTest {
-        private int mSize;
-
-        public SizeTest(int size) {
-            mSize = size;
-        }
-
-        public int size() {
-            return mSize;
-        }
-    }
-
-    public static class LocalVariableAccess extends PerformanceTestBase {
-        private static final int ITERATIONS = 100000;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 20);
-            return 0;
-        }
-
-        public void testRun() {
-            boolean variable = false;
-            boolean local = true;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                local = variable;
-                local = variable;
-                local = variable;
-                local = variable;
-                local = variable; // 5
-                local = variable;
-                local = variable;
-                local = variable;
-                local = variable;
-                local = variable; // 10
-                local = variable;
-                local = variable;
-                local = variable;
-                local = variable;
-                local = variable; // 15
-                local = variable;
-                local = variable;
-                local = variable;
-                local = variable;
-                local = variable; // 20
-            }
-        }
-    }
-
-    /* This test is intentionally misspelled. Please do not rename it. Thanks! */
-    public static class MemeberVariableAccess extends PerformanceTestBase {
-        private static final int ITERATIONS = 100000;
-
-        public volatile boolean mMember = false;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 20);
-            return 0;
-        }
-
-        public void testRun() {
-            boolean local = true;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                local = mMember;
-                local = mMember;
-                local = mMember;
-                local = mMember;
-                local = mMember; // 5
-                local = mMember;
-                local = mMember;
-                local = mMember;
-                local = mMember;
-                local = mMember; // 10
-                local = mMember;
-                local = mMember;
-                local = mMember;
-                local = mMember;
-                local = mMember; // 15
-                local = mMember;
-                local = mMember;
-                local = mMember;
-                local = mMember;
-                local = mMember; // 20
-            }
-        }
-    }
-
-    public static class ArrayListIterator extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-        private ArrayList mList;
-        private String[] mKeys;
-        private Iterator mIterator;
-
-        public void setUp() throws Exception {
-            super.setUp();
-            mList = new ArrayList();
-            mKeys = new String[ITERATIONS];
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                mKeys[i] = Integer.toString(i, 16);
-                mList.add(mKeys[i]);
-            }
-        }
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS);
-            return 0;
-        }
-
-        public void testRun() {
-            mIterator = mList.iterator();
-            while (mIterator.hasNext()) {
-                mIterator.next();
-            }
-        }
-    }
-
-    public static class Ackermann extends PerformanceTestBase {
-        public static final int ITERATIONS = 100;
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS);
-            return 0;
-        }
-
-        public void testRun() {
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                ackermann(3, 13);
-            }
-        }
-
-        private int ackermann(int m, int n) {
-            if (m == 0)
-                return n + 1;
-            if (n == 0)
-                return ackermann(m - 1, 1);
-            return ackermann(m, n - 1);
-        }
-    }
-
-    public static class FibonacciSlow extends PerformanceTestBase {
-        public void setUp() throws Exception {
-            super.setUp();
-            Assert.assertEquals(0, fibonacci(0));
-            Assert.assertEquals(1, fibonacci(1));
-            Assert.assertEquals(1, fibonacci(2));
-            Assert.assertEquals(2, fibonacci(3));
-            Assert.assertEquals(6765, fibonacci(20));
-        }
-
-        public void tearDown() {
-        }
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            return 0;
-        }
-
-        public void testRun() {
-            fibonacci(20);
-        }
-
-        private long fibonacci(long n) {
-            if (n == 0)
-                return 0;
-            if (n == 1)
-                return 1;
-            return fibonacci(n - 2) + fibonacci(n - 1);
-        }
-    }
-
-    public static class FibonacciFast extends PerformanceTestBase {
-        public void setUp() throws Exception {
-            super.setUp();
-            Assert.assertEquals(0, fibonacci(0));
-            Assert.assertEquals(1, fibonacci(1));
-            Assert.assertEquals(1, fibonacci(2));
-            Assert.assertEquals(2, fibonacci(3));
-            Assert.assertEquals(6765, fibonacci(20));
-        }
-
-        public void tearDown() {
-        }
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            return 0;
-        }
-
-        public void testRun() {
-            fibonacci(5000);
-        }
-
-        private long fibonacci(long n) {
-            if (n == 0)
-                return 0;
-            if (n == 1)
-                return 1;
-
-            int x = 0;
-            int y = 1;
-            for (int i = 0; i < n - 1; i++) {
-                y = y + x;
-                x = y - x;
-            }
-
-            return y;
-        }
-    }
-
-    public static class HashMapTest extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-        private HashMap mMap;
-        private String[] mKeys;
-
-        public void setUp() throws Exception {
-            super.setUp();
-            mMap = new HashMap();
-            mKeys = new String[ITERATIONS];
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                mKeys[i] = Integer.toString(i, 16);
-                mMap.put(mKeys[i], i);
-            }
-        }
-
-        public void tearDown() {
-        }
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS);
-            return 0;
-        }
-
-        public void testHashMapContainsKey() {
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                mMap.containsKey(mKeys[i]);
-            }
-        }
-
-        public void testHashMapIterator() {
-            Iterator iterator;
-
-            iterator = mMap.entrySet().iterator();
-            while (iterator.hasNext()) {
-                iterator.next();
-            }
-        }
-
-        public void testHashMapPut() {
-            HashMap map = new HashMap();
-            String[] keys = mKeys;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                map.put(keys[i], i);
-            }
-        }
-    }
-
-    interface IA {
-        void funcA0();
-        void funcA1();
-        void funcA2();
-        void funcA3();
-    }
-    interface IAB extends IA {
-        void funcAB0();
-        void funcAB1();
-        void funcAB2();
-        void funcAB3();
-    }
-    interface IABC extends IAB {
-        void funcABC0();
-        void funcABC1();
-        void funcABC2();
-        void funcABC3();
-    }
-    interface IB {
-        void funcB0();
-        void funcB1();
-        void funcB2();
-        void funcB3();
-    }
-    interface IC {
-        void funcC0();
-        void funcC1();
-        void funcC2();
-        void funcC3();
-    }
-
-    static class Alphabet implements Cloneable, IB, IABC, IC, Runnable {
-        public void funcA0() {
-        }
-        public void funcA1() {
-        }
-        public void funcA2() {
-        }
-        public void funcA3() {
-        }
-        public void funcAB0() {
-        }
-        public void funcAB1() {
-        }
-        public void funcAB2() {
-        }
-        public void funcAB3() {
-        }
-        public void funcABC0() {
-        }
-        public void funcABC1() {
-        }
-        public void funcABC2() {
-        }
-        public void funcABC3() {
-        }
-        public void funcB0() {
-        }
-        public void funcB1() {
-        }
-        public void funcB2() {
-        }
-        public void funcB3() {
-        }
-        public void funcC0() {
-        }
-        public void funcC1() {
-        }
-        public void funcC2() {
-        }
-        public void funcC3() {
-        }
-        public void run() {
-        }
-    };
-
-    public static class InterfaceTests extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        /* call method directly */
-        public void testInterfaceCalls0() {
-            Alphabet alpha = new Alphabet();
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                alpha.funcABC1();
-                alpha.funcABC1();
-                alpha.funcABC1();
-                alpha.funcABC1();
-                alpha.funcABC1();
-                alpha.funcABC1();
-                alpha.funcABC1();
-                alpha.funcABC1();
-                alpha.funcABC1();
-                alpha.funcABC1();
-            }
-        }
-
-       /* call method through interface reference */
-        public void testInterfaceCalls1() {
-            Alphabet alpha = new Alphabet();
-            IABC iabc = alpha;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                iabc.funcABC1();
-                iabc.funcABC1();
-                iabc.funcABC1();
-                iabc.funcABC1();
-                iabc.funcABC1();
-                iabc.funcABC1();
-                iabc.funcABC1();
-                iabc.funcABC1();
-                iabc.funcABC1();
-                iabc.funcABC1();
-            }
-        }
-
-        public void testInstanceOfTrivial() {
-            Alphabet alpha = new Alphabet();
-            IABC iabc = alpha;
-            boolean val;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                val = iabc instanceof Alphabet;
-                val = iabc instanceof Alphabet;
-                val = iabc instanceof Alphabet;
-                val = iabc instanceof Alphabet;
-                val = iabc instanceof Alphabet;
-                val = iabc instanceof Alphabet;
-                val = iabc instanceof Alphabet;
-                val = iabc instanceof Alphabet;
-                val = iabc instanceof Alphabet;
-                val = iabc instanceof Alphabet;
-            }
-        }
-
-        public void testInstanceOfInterface() {
-            Alphabet alpha = new Alphabet();
-            IABC iabc = alpha;
-            boolean val;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                val = iabc instanceof IA;
-                val = iabc instanceof IA;
-                val = iabc instanceof IA;
-                val = iabc instanceof IA;
-                val = iabc instanceof IA;
-                val = iabc instanceof IA;
-                val = iabc instanceof IA;
-                val = iabc instanceof IA;
-                val = iabc instanceof IA;
-                val = iabc instanceof IA;
-            }
-        }
-
-        public void testInstanceOfNot() {
-            Alphabet alpha = new Alphabet();
-            IABC iabc = alpha;
-            boolean val;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                val = iabc instanceof EmptyInterface;
-                val = iabc instanceof EmptyInterface;
-                val = iabc instanceof EmptyInterface;
-                val = iabc instanceof EmptyInterface;
-                val = iabc instanceof EmptyInterface;
-                val = iabc instanceof EmptyInterface;
-                val = iabc instanceof EmptyInterface;
-                val = iabc instanceof EmptyInterface;
-                val = iabc instanceof EmptyInterface;
-                val = iabc instanceof EmptyInterface;
-            }
-        }
-    }
-
-    public static class NestedLoop extends PerformanceTestBase {
-        private static final int ITERATIONS = 10;
-        private static final int LOOPS = 5;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * LOOPS);
-            return 0;
-        }
-
-        public void testRun() {
-            int x = 0;
-            for (int a = 0; a < ITERATIONS; a++) {
-                for (int b = 0; b < ITERATIONS; b++) {
-                    for (int c = 0; c < ITERATIONS; c++) {
-                        for (int d = 0; d < ITERATIONS; d++) {
-                            for (int e = 0; e < ITERATIONS; e++) {
-                                x++;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    public static class StringConcatenationTests extends PerformanceTestBase {
-        private static final int ITERATIONS = 1000;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS);
-            return 0;
-        }
-
-        public void testStringConcatenation1() {
-            StringBuffer buffer = new StringBuffer();
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                buffer.append("Hello World!\n");
-            }
-            buffer = null;
-        }
-
-        public void testStringConcatenation2() {
-            String string = "";
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                string += "Hello World!\n";
-            }
-            string = null;
-        }
-    }
-
-    public static class StringLength extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-        private static final String TEST_STRING = "This is the string we use for testing..."; // 40 chars
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        public void testRun() {
-            String testStr = TEST_STRING;
-            int length;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                length = testStr.length();
-                length = testStr.length();
-                length = testStr.length();
-                length = testStr.length();
-                length = testStr.length();
-                length = testStr.length();
-                length = testStr.length();
-                length = testStr.length();
-                length = testStr.length();
-                length = testStr.length();
-            }
-        }
-    }
-
-    public static class EmptyJniStaticMethod0 extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        public void testRun() {
-            int a, b, c, d, e, f;
-
-            a = b = c = d = e = f = 0;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-            }
-        }
-    }
-    public static class EmptyJniStaticMethod6 extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        public void testRun() {
-            int a, b, c, d, e, f;
-
-            a = b = c = d = e = f = 0;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-            }
-        }
-    }
-    public static class EmptyJniStaticMethod6L extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        public void testRun() {
-            String a = null;
-            String[] b = null;
-            int[][] c = null;
-            Object d = null;
-            Object[] e = null;
-            Object[][][][] f = null;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6L(a, b, c, d, e, f);
-            }
-        }
-    }
-
-    public static class StringCrawl extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-        private static final String TEST_STRING = "This is the string we use for testing..."; // 40 chars
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * TEST_STRING.length());
-            return 0;
-        }
-
-        public void testRun() {
-            String testStr = TEST_STRING;
-            char ch;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                /* this is the wrong way to walk through a string */
-                for (int j = 0; j < testStr.length(); j++) {
-                    ch = testStr.charAt(j);
-                }
-            }
-        }
-    }
-
-    public static class AddTest extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 20);
-            return 0;
-        }
-
-        public void testRun() {
-            int j = 0;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-            }
-        }
-    }
-
-    public static class AddMemberVariableTest extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-        private int j;
-
-        public void setUp() throws Exception {
-           super.setUp();
-           j = 0;
-        }
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        public void testAddMemberVariableTest() {
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-                j++;
-            }
-        }
-
-        public void testAddMemberVariableInMethodTest() {
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                add();
-                add();
-                add();
-                add();
-                add();
-                add();
-                add();
-                add();
-                add();
-                add();
-            }
-        }
-
-        public void add() {
-            j++;
-        }
-    }
-
-    private interface EmptyInterface {
-        public void emptyVirtual();
-
-    }
-
-    private static class EmptyClass implements EmptyInterface {
-        public void emptyVirtual() {
-        }
-
-        public static void emptyStatic() {
-        }
-    }
-
-    public static class EmptyClassBaseTest extends PerformanceTestBase {
-        protected EmptyInterface mEmptyInterface;
-        protected EmptyClass mEmptyClass;
-
-        public void setUp() throws Exception {
-            super.setUp();
-            mEmptyClass = new EmptyClass();
-            mEmptyInterface = mEmptyClass;
-        }
-        private static final int ITERATIONS = 10000;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        public void testEmptyVirtualMethod() {
-            //EmptyClass emtpyClass = mEmptyClass;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                mEmptyClass.emptyVirtual();
-                mEmptyClass.emptyVirtual();
-                mEmptyClass.emptyVirtual();
-                mEmptyClass.emptyVirtual();
-                mEmptyClass.emptyVirtual();
-                mEmptyClass.emptyVirtual();
-                mEmptyClass.emptyVirtual();
-                mEmptyClass.emptyVirtual();
-                mEmptyClass.emptyVirtual();
-                mEmptyClass.emptyVirtual();
-            }
-        }
-
-        public void testEmptyVirtualMethodTestInLocal() {
-            EmptyClass empty = mEmptyClass;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                empty.emptyVirtual();
-                empty.emptyVirtual();
-                empty.emptyVirtual();
-                empty.emptyVirtual();
-                empty.emptyVirtual();
-                empty.emptyVirtual();
-                empty.emptyVirtual();
-                empty.emptyVirtual();
-                empty.emptyVirtual();
-                empty.emptyVirtual();
-            }
-        }
-
-    public void testEmptyStaticMethod () {
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                EmptyClass.emptyStatic();
-                EmptyClass.emptyStatic();
-                EmptyClass.emptyStatic();
-                EmptyClass.emptyStatic();
-                EmptyClass.emptyStatic();
-                EmptyClass.emptyStatic();
-                EmptyClass.emptyStatic();
-                EmptyClass.emptyStatic();
-                EmptyClass.emptyStatic();
-                EmptyClass.emptyStatic();
-            }
-        }
-
-    public void testEmptyJniStaticMethod0() {
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-                NativeTestTarget.emptyJniStaticMethod0();
-            }
-        }
-
-    public void testEmptyJniStaticMethod6() {
-            int a, b, c, d, e, f;
-
-            a = b = c = d = e = f = 0;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-                NativeTestTarget.emptyJniStaticMethod6(a, b, c, d, e, f);
-            }
-        }
-
-    public void testEmptyInternalStaticMethod() {
-            /*
-             * The method called is a VM-internal method with no extra
-             * wrapping.
-             */
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                NativeTestTarget.emptyInternalStaticMethod();
-                NativeTestTarget.emptyInternalStaticMethod();
-                NativeTestTarget.emptyInternalStaticMethod();
-                NativeTestTarget.emptyInternalStaticMethod();
-                NativeTestTarget.emptyInternalStaticMethod();
-                NativeTestTarget.emptyInternalStaticMethod();
-                NativeTestTarget.emptyInternalStaticMethod();
-                NativeTestTarget.emptyInternalStaticMethod();
-                NativeTestTarget.emptyInternalStaticMethod();
-                NativeTestTarget.emptyInternalStaticMethod();
-            }
-        }
-
-    public void testEmptyInlineStaticMethod() {
-            /*
-             * The method called is a VM-internal method that gets
-             * specially "inlined" in a bytecode transformation.
-             */
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                NativeTestTarget.emptyInlineMethod();
-                NativeTestTarget.emptyInlineMethod();
-                NativeTestTarget.emptyInlineMethod();
-                NativeTestTarget.emptyInlineMethod();
-                NativeTestTarget.emptyInlineMethod();
-                NativeTestTarget.emptyInlineMethod();
-                NativeTestTarget.emptyInlineMethod();
-                NativeTestTarget.emptyInlineMethod();
-                NativeTestTarget.emptyInlineMethod();
-                NativeTestTarget.emptyInlineMethod();
-            }
-        }
-
-    public void testEmptyInterfaceMethodTest() {
-            EmptyInterface emptyInterface = mEmptyInterface;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                emptyInterface.emptyVirtual();
-                emptyInterface.emptyVirtual();
-                emptyInterface.emptyVirtual();
-                emptyInterface.emptyVirtual();
-                emptyInterface.emptyVirtual();
-                emptyInterface.emptyVirtual();
-                emptyInterface.emptyVirtual();
-                emptyInterface.emptyVirtual();
-                emptyInterface.emptyVirtual();
-                emptyInterface.emptyVirtual();
-            }
-        }
-    }
-
-    public static class LoopTests extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-        private SizeTest mSizeTest = new SizeTest(ITERATIONS);
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS);
-            return 0;
-        }
-
-        public void testForLoopTest() {
-            int i = 0;
-            for (; i < 10000; i++) {
-            }
-        }
-
-        public void testWhileLoopTest() {
-            int i = 0;
-
-            while (i < 10000) {
-                i++;
-            }
-        }
-
-        public void testForLoopSizeCalledInside() {
-            for (int i = 0; i < mSizeTest.size(); i++) {
-            }
-        }
-
-        public void testForLoopSizeCalledOutside() {
-            final int size = mSizeTest.size();
-            for (int i = 0; i < size; i++) {
-            }
-        }
-    }
-
-    public static class BoundsCheckTest extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        public void testRun() {
-            int[] data = new int[1];
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                data[0] = i;
-                data[0] = i;
-                data[0] = i;
-                data[0] = i;
-                data[0] = i;
-                data[0] = i;
-                data[0] = i;
-                data[0] = i;
-                data[0] = i;
-                data[0] = i;
-            }
-        }
-    }
-
-    public static class ArrayListBase extends PerformanceTestBase {
-        public void setUp() throws Exception {
-            super.setUp();
-            mList = new ArrayList();
-            mList.add(0);
-            mList.add(1);
-            mList.add(2);
-            mList.add(3);
-            mList.add(4);
-            mList.add(5);
-            mList.add(6);
-            mList.add(7);
-            mList.add(8);
-            mList.add(9);
-        }
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(100);
-            return 0;
-        }
-
-        ArrayList<Integer> mList;
-
-        public void testForArrayList() {
-            int i = 0;
-            int res = 0;
-            for (; i < 100; i++) {
-                for (int j = 0; j < mList.size(); j++) {
-                    res += mList.get(j);
-                }
-            }
-        }
-
-        public void testForLocalArrayList() {
-            int i = 0;
-            int res = 0;
-            for (; i < 100; i++) {
-                final List<Integer> list = mList;
-                final int N = list.size();
-                for (int j = 0; j < N; j++) {
-                    res += list.get(j);
-                }
-            }
-        }
-
-        public void testForEachArrayList() {
-            int i = 0;
-            int res = 0;
-            for (; i < 100; i++) {
-                for (Integer v : mList) {
-                    res += v;
-                }
-            }
-        }
-    }
-
-    public static class SynchronizedGetAndSetInt extends PerformanceTestBase {
-        private static final int ITERATIONS = 100000;
-
-        public int mMember = 0;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS);
-            return 0;
-        }
-
-        public void testRun() {
-            int result = 0;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                synchronized (this) {
-                    result = mMember;
-                    mMember = i;
-                }
-            }
-        }
-    }
-
-    public static class AtomicGetAndSetInt extends PerformanceTestBase {
-        private static final int ITERATIONS = 100000;
-
-        public AtomicInteger mMember = new AtomicInteger(0);
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS);
-            return 0;
-        }
-
-        public void testRun() {
-            int result = 0;
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                result = mMember.getAndSet(i);
-            }
-        }
-    }
-
-    public static abstract class StringEquals extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-
-        protected String mString1, mString2;
-        public void setUp() throws Exception {
-          super.setUp();
-        }
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        public void testRun() {
-            String string1 = mString1;
-            String string2 = mString2;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                string1.equals(string2);
-                string1.equals(string2);
-                string1.equals(string2);
-                string1.equals(string2);
-                string1.equals(string2);
-                string1.equals(string2);
-                string1.equals(string2);
-                string1.equals(string2);
-                string1.equals(string2);
-                string1.equals(string2);
-            }
-        }
-    }
-
-    public static class StringEquals2 extends StringEquals {
-        public void setUp() throws Exception {
-            mString1 = "01";
-            mString2 = "0x";
-        }
-    }
-    public static class StringEquals10 extends StringEquals {
-        public void setUp() throws Exception {
-            mString1 = "0123456789";
-            mString2 = "012345678x";
-        }
-    }
-    public static class StringEquals20 extends StringEquals {
-        public void setUp() throws Exception {
-            mString1 = "01234567890123456789";
-            mString2 = "0123456789012345678x";
-        }
-    }
-
-    public static class StringEquals200 extends StringEquals {
-        public void setUp() throws Exception {
-            mString1 = "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789";
-            mString2 = "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "012345678901234567890123456789012345678x";
-        }
-    }
-    public static class StringEquals200U extends StringEquals {
-        /* make one of the strings non-word aligned (bad memcmp case) */
-        public void setUp() throws Exception {
-            String tmpStr;
-            mString1 = "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789";
-            tmpStr = "z0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "012345678901234567890123456789012345678x";
-            mString2 = tmpStr.substring(1);
-        }
-    }
-
-    public static abstract class StringCompareTo extends PerformanceTestBase {
-        private static final int ITERATIONS = 10000;
-
-        protected String mString1, mString2;
-
-        public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-            intermediates.setInternalIterations(ITERATIONS * 10);
-            return 0;
-        }
-
-        public void testRun() {
-            String string1 = mString1;
-            String string2 = mString2;
-
-            for (int i = ITERATIONS - 1; i >= 0; i--) {
-                string1.compareTo(string2);
-                string1.compareTo(string2);
-                string1.compareTo(string2);
-                string1.compareTo(string2);
-                string1.compareTo(string2);
-                string1.compareTo(string2);
-                string1.compareTo(string2);
-                string1.compareTo(string2);
-                string1.compareTo(string2);
-                string1.compareTo(string2);
-            }
-        }
-    }
-    public static class StringCompareTo10 extends StringCompareTo {
-        public void setUp() throws Exception {
-            mString1 = "0123456789";
-            mString2 = "012345678x";
-        }
-    }
-    public static class StringCompareTo200 extends StringCompareTo {
-        public void setUp() throws Exception {
-            mString1 = "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789";
-            mString2 = "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "0123456789012345678901234567890123456789"
-                    + "012345678901234567890123456789012345678x";
-        }
-    }
-}
-
diff --git a/tests/CoreTests/android/core/TreeMapPerformanceTest.java b/tests/CoreTests/android/core/TreeMapPerformanceTest.java
deleted file mode 100644
index 3a210f4..0000000
--- a/tests/CoreTests/android/core/TreeMapPerformanceTest.java
+++ /dev/null
@@ -1,281 +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 android.core;
-
-import android.test.PerformanceTestBase;
-import android.test.PerformanceTestCase;
-
-import java.util.Collection;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-/**
- * Implements basic performance test functionality for java.util.TreeMap
- */
-
-public class TreeMapPerformanceTest extends PerformanceTestBase {
-    public static final int ITERATIONS = 1000;
-    public static TreeMap<String, Integer> sMap;
-    public static String[] sKeys;
-
-    @Override
-    @SuppressWarnings("unchecked")
-    protected void setUp() throws Exception {
-        super.setUp();
-        sMap = new TreeMap();
-        sKeys = new String[ITERATIONS];
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            sKeys[i] = Integer.toString(i, 16);
-            sMap.put(sKeys[i], i);
-        }
-    }
-
-    @Override
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        intermediates.setInternalIterations(ITERATIONS);
-        return 0;
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testTreeMapPut() {
-        TreeMap map = new TreeMap();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            map.put(i, i);
-            map.put(i, i);
-            map.put(i, i);
-            map.put(i, i);
-            map.put(i, i);
-            map.put(i, i);
-            map.put(i, i);
-            map.put(i, i);
-            map.put(i, i);
-            map.put(i, i);
-        }
-    }
-
-    public void testTreeMapGet() {
-        int value;
-        TreeMap<String, Integer> map = sMap;
-        String[] keys = sKeys;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            value = map.get(keys[i]);
-            value = map.get(keys[i]);
-            value = map.get(keys[i]);
-            value = map.get(keys[i]);
-            value = map.get(keys[i]);
-            value = map.get(keys[i]);
-            value = map.get(keys[i]);
-            value = map.get(keys[i]);
-            value = map.get(keys[i]);
-            value = map.get(keys[i]);
-        }
-    }
-
-    public void testTreeMapFirstKey() {
-        String key;
-        TreeMap<String, Integer> map = sMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            key = map.firstKey();
-            key = map.firstKey();
-            key = map.firstKey();
-            key = map.firstKey();
-            key = map.firstKey();
-            key = map.firstKey();
-            key = map.firstKey();
-            key = map.firstKey();
-            key = map.firstKey();
-            key = map.firstKey();
-        }
-    }
-
-    public void testTreeMapKeySet() {
-        Set keyset;
-        TreeMap<String, Integer> map = sMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            keyset = map.keySet();
-            keyset = map.keySet();
-            keyset = map.keySet();
-            keyset = map.keySet();
-            keyset = map.keySet();
-            keyset = map.keySet();
-            keyset = map.keySet();
-            keyset = map.keySet();
-            keyset = map.keySet();
-            keyset = map.keySet();
-        }
-    }
-
-    public void testTreeMapEntrySet() {
-        Set keyset;
-        TreeMap<String, Integer> map = sMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            keyset = map.entrySet();
-            keyset = map.entrySet();
-            keyset = map.entrySet();
-            keyset = map.entrySet();
-            keyset = map.entrySet();
-            keyset = map.entrySet();
-            keyset = map.entrySet();
-            keyset = map.entrySet();
-            keyset = map.entrySet();
-            keyset = map.entrySet();
-        }
-    }
-
-    public void testTreeMapValues() {
-        Collection collection;
-        TreeMap<String, Integer> map = sMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            collection = map.values();
-            collection = map.values();
-            collection = map.values();
-            collection = map.values();
-            collection = map.values();
-            collection = map.values();
-            collection = map.values();
-            collection = map.values();
-            collection = map.values();
-            collection = map.values();
-        }
-    }
-
-    public void testTreeMapSize() {
-        int len;
-        TreeMap<String, Integer> map = sMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            len = map.size();
-            len = map.size();
-            len = map.size();
-            len = map.size();
-            len = map.size();
-            len = map.size();
-            len = map.size();
-            len = map.size();
-            len = map.size();
-            len = map.size();
-        }
-    }
-
-    public void testTreeMapContainsKey() {
-        boolean flag;
-        String key = sKeys[525];
-        TreeMap<String, Integer> map = sMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = map.containsKey(key);
-            flag = map.containsKey(key);
-            flag = map.containsKey(key);
-            flag = map.containsKey(key);
-            flag = map.containsKey(key);
-            flag = map.containsKey(key);
-            flag = map.containsKey(key);
-            flag = map.containsKey(key);
-            flag = map.containsKey(key);
-            flag = map.containsKey(key);
-        }
-    }
-
-    public void testTreeMapContainsValue() {
-        boolean flag;
-        TreeMap<String, Integer> map = sMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = map.containsValue(i);
-            flag = map.containsValue(i);
-            flag = map.containsValue(i);
-            flag = map.containsValue(i);
-            flag = map.containsValue(i);
-            flag = map.containsValue(i);
-            flag = map.containsValue(i);
-            flag = map.containsValue(i);
-            flag = map.containsValue(i);
-            flag = map.containsValue(i);
-        }
-    }
-
-    public void testTreeMapHeadMap() {
-        SortedMap map;
-        String str = sKeys[100];
-        TreeMap<String, Integer> tMap = sMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            map = tMap.headMap(str);
-            map = tMap.headMap(str);
-            map = tMap.headMap(str);
-            map = tMap.headMap(str);
-            map = tMap.headMap(str);
-            map = tMap.headMap(str);
-            map = tMap.headMap(str);
-            map = tMap.headMap(str);
-            map = tMap.headMap(str);
-            map = tMap.headMap(str);
-        }
-    }
-
-    public void testTreeMapSubMap() {
-        String str1 = sKeys[400];
-        String str2 = sKeys[500];
-        SortedMap map;
-        TreeMap<String, Integer> tMap = sMap;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            map = tMap.subMap(str1, str2);
-            map = tMap.subMap(str1, str2);
-            map = tMap.subMap(str1, str2);
-            map = tMap.subMap(str1, str2);
-            map = tMap.subMap(str1, str2);
-            map = tMap.subMap(str1, str2);
-            map = tMap.subMap(str1, str2);
-            map = tMap.subMap(str1, str2);
-            map = tMap.subMap(str1, str2);
-            map = tMap.subMap(str1, str2);
-        }
-    }
-
-    public void testTreeMapTailMap() {
-        String str = sKeys[900];
-        TreeMap<String, Integer> tMap = sMap;
-        SortedMap map;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            map = tMap.tailMap(str);
-            map = tMap.tailMap(str);
-            map = tMap.tailMap(str);
-            map = tMap.tailMap(str);
-            map = tMap.tailMap(str);
-            map = tMap.tailMap(str);
-            map = tMap.tailMap(str);
-            map = tMap.tailMap(str);
-            map = tMap.tailMap(str);
-            map = tMap.tailMap(str);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testTreeMapRemove() {
-        TreeMap<String, Integer> tMap = new TreeMap(sMap);
-        String[] keys = sKeys;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            tMap.remove(keys[i]);
-            tMap.remove(keys[i]);
-            tMap.remove(keys[i]);
-            tMap.remove(keys[i]);
-            tMap.remove(keys[i]);
-            tMap.remove(keys[i]);
-            tMap.remove(keys[i]);
-            tMap.remove(keys[i]);
-            tMap.remove(keys[i]);
-            tMap.remove(keys[i]);
-        }
-    }
-}
diff --git a/tests/CoreTests/android/core/TreeSetTest.java b/tests/CoreTests/android/core/TreeSetTest.java
deleted file mode 100644
index a6a3309..0000000
--- a/tests/CoreTests/android/core/TreeSetTest.java
+++ /dev/null
@@ -1,349 +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 android.core;
-
-import android.test.PerformanceTestBase;
-import android.test.PerformanceTestCase;
-
-import java.util.TreeSet;
-import java.util.SortedSet;
-import java.util.Iterator;
-import java.util.Comparator;
-
-/**
- * Implements basic performance test functionality for java.util.TreeSet
- */
-
-public class TreeSetTest extends PerformanceTestBase {
-    public static final int ITERATIONS = 1000;
-    public static TreeSet<Integer> sSet;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        sSet = new TreeSet<Integer>();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            sSet.add(i);
-        }
-    }
-
-    @Override
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        intermediates.setInternalIterations(ITERATIONS);
-        return 0;
-    }
-
-    /**
-     * 
-     * Tests performance for the java.util.TreeSet method Add(Object arg 0)
-     * 
-     */
-
-    @SuppressWarnings("unchecked")
-    public void testTreeSetAdd() {
-        TreeSet<Integer> set = new TreeSet();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-            set.add(i);
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the java.util.TreeSet method - first()
-     * 
-     */
-
-    public void testTreeSetFirst() {
-        int value;
-        TreeSet<Integer> set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            value = set.first();
-            value = set.first();
-            value = set.first();
-            value = set.first();
-            value = set.first();
-            value = set.first();
-            value = set.first();
-            value = set.first();
-            value = set.first();
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the java.util.TreeSet method - last()
-     * 
-     */
-
-    public void testTreeSetLast() {
-        int value;
-        TreeSet<Integer> set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            value = set.last();
-            value = set.last();
-            value = set.last();
-            value = set.last();
-            value = set.last();
-            value = set.last();
-            value = set.last();
-            value = set.last();
-            value = set.last();
-        }
-    }
-
-    /**
-     * 
-     * Tests performance of the java.util.TreeSet method- contains(Object arg0)
-     * 
-     */
-
-    public void testTreeSetContains() {
-        Integer index = new Integer(500);
-        boolean flag;
-        TreeSet<Integer> set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-            flag = set.contains(index);
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the java.util.TreeSet method - size()
-     * 
-     */
-
-    public void testTreeSetSize() {
-        int value;
-        TreeSet<Integer> set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            value = set.size();
-            value = set.size();
-            value = set.size();
-            value = set.size();
-            value = set.size();
-            value = set.size();
-            value = set.size();
-            value = set.size();
-            value = set.size();
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the java.util.TreeSet method - iterator()
-     * 
-     */
-
-    public void testTreeSetIterator() {
-        Iterator iterator;
-        TreeSet<Integer> set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-            iterator = set.iterator();
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the java.util.TreeSet method - comparator()
-     * 
-     */
-
-    public void testTreeSetComparator() {
-        Comparator comparator;
-        TreeSet<Integer> set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            comparator = set.comparator();
-            comparator = set.comparator();
-            comparator = set.comparator();
-            comparator = set.comparator();
-            comparator = set.comparator();
-            comparator = set.comparator();
-            comparator = set.comparator();
-            comparator = set.comparator();
-            comparator = set.comparator();
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the java.util.TreeSet method - clone()
-     * 
-     */
-
-    public void testTreeSetClone() {
-        Object obj;
-        TreeSet<Integer> set = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            obj = set.clone();
-            obj = set.clone();
-            obj = set.clone();
-            obj = set.clone();
-            obj = set.clone();
-            obj = set.clone();
-            obj = set.clone();
-            obj = set.clone();
-            obj = set.clone();
-            obj = set.clone();
-        }
-    }
-
-    /**
-     * 
-     * Tests performance of the java.util.TreeSet method - remove(Object arg0)
-     * 
-     */
-
-    @SuppressWarnings("unchecked")
-    public void testTreeSetRemove() {
-        TreeSet<Integer> set = new TreeSet(sSet);
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-            set.remove(i);
-        }
-    }
-
-    /**
-     * 
-     * Tests performance of the java.util.TreeSet method- headSet(Integer arg0)
-     * 
-     */
-
-    public void testTreeSetHeadSet() {
-        Integer value = new Integer(100);
-        SortedSet set;
-        TreeSet<Integer> tSet = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            set = tSet.headSet(value);
-            set = tSet.headSet(value);
-            set = tSet.headSet(value);
-            set = tSet.headSet(value);
-            set = tSet.headSet(value);
-            set = tSet.headSet(value);
-            set = tSet.headSet(value);
-            set = tSet.headSet(value);
-            set = tSet.headSet(value);
-            set = tSet.headSet(value);
-        }
-    }
-
-    /**
-     * 
-     * Tests performance of subSet(Integer arg0, Integer arg1) - TreeSet
-     * 
-     */
-
-    public void testTreeSetSubSet() {
-        Integer value = new Integer(400);
-        Integer nInt = new Integer(500);
-        SortedSet set;
-        TreeSet<Integer> tSet = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            set = tSet.subSet(value, nInt);
-            set = tSet.subSet(value, nInt);
-            set = tSet.subSet(value, nInt);
-            set = tSet.subSet(value, nInt);
-            set = tSet.subSet(value, nInt);
-            set = tSet.subSet(value, nInt);
-            set = tSet.subSet(value, nInt);
-            set = tSet.subSet(value, nInt);
-            set = tSet.subSet(value, nInt);
-            set = tSet.subSet(value, nInt);
-
-        }
-
-    }
-
-    /**
-     * 
-     * Tests performance of tailSet(Integer arg0) - TreeSet
-     * 
-     */
-
-    public void testTreeSetTailSet() {
-        Integer value = new Integer(900);
-        SortedSet set;
-        TreeSet<Integer> tSet = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            set = tSet.tailSet(value);
-            set = tSet.tailSet(value);
-            set = tSet.tailSet(value);
-            set = tSet.tailSet(value);
-            set = tSet.tailSet(value);
-            set = tSet.tailSet(value);
-            set = tSet.tailSet(value);
-            set = tSet.tailSet(value);
-            set = tSet.tailSet(value);
-            set = tSet.tailSet(value);
-        }
-    }
-
-    /**
-     * 
-     * Tests performance for the java.util.TreeSet method - isEmpty()
-     * 
-     */
-
-    public void testTreeSetIsEmpty() {
-        boolean flag;
-        TreeSet<Integer> tSet = sSet;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = tSet.isEmpty();
-            flag = tSet.isEmpty();
-            flag = tSet.isEmpty();
-            flag = tSet.isEmpty();
-            flag = tSet.isEmpty();
-            flag = tSet.isEmpty();
-            flag = tSet.isEmpty();
-            flag = tSet.isEmpty();
-            flag = tSet.isEmpty();
-            flag = tSet.isEmpty();
-        }
-    }
-}
diff --git a/tests/CoreTests/android/core/VectorTest.java b/tests/CoreTests/android/core/VectorTest.java
deleted file mode 100644
index b4c84fd..0000000
--- a/tests/CoreTests/android/core/VectorTest.java
+++ /dev/null
@@ -1,555 +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 android.core;
-
-import android.test.PerformanceTestBase;
-import android.test.PerformanceTestCase;
-
-import java.util.Vector;
-import java.util.Enumeration;
-
-/**
- * Basic Performance Tests for java.util.Vector
- */
-
-@SuppressWarnings("unchecked")
-public class VectorTest extends PerformanceTestBase {
-    public static final int ITERATIONS = 1000;
-    private Vector<Integer> mVector;
-    private Vector<String> mStrVector;
-    private String mTestString = "Hello Android";
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mVector = new Vector();
-        mStrVector = new Vector();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            assertTrue(mVector.add(i));
-            assertTrue(mStrVector.add(Integer.toString(i)));
-        }
-    }
-
-    @Override
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        intermediates.setInternalIterations(ITERATIONS);
-        return 0;
-    }
-
-    public void testVectorAdd() {
-        Vector<Integer> vector = new Vector();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            vector.add(i);
-            vector.add(i);
-            vector.add(i);
-            vector.add(i);
-            vector.add(i);
-            vector.add(i);
-            vector.add(i);
-            vector.add(i);
-            vector.add(i);
-            vector.add(i);
-        }
-    }
-
-    public void testVectorAdd1() {
-        Vector<Integer> vector = new Vector();
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            vector.add(0, i);
-            vector.add(0, i);
-            vector.add(0, i);
-            vector.add(0, i);
-            vector.add(0, i);
-            vector.add(0, i);
-            vector.add(0, i);
-            vector.add(0, i);
-            vector.add(0, i);
-            vector.add(0, i);
-        }
-    }
-
-    public void testVectorToArray() {
-        Object array;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            array = vector.toArray();
-            array = vector.toArray();
-            array = vector.toArray();
-            array = vector.toArray();
-            array = vector.toArray();
-            array = vector.toArray();
-            array = vector.toArray();
-            array = vector.toArray();
-            array = vector.toArray();
-            array = vector.toArray();
-        }
-    }
-
-    /**
-     * 
-     */
-    public void testVectorSize() {
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            int mLen;
-            mLen = vector.size();
-            mLen = vector.size();
-            mLen = vector.size();
-            mLen = vector.size();
-            mLen = vector.size();
-            mLen = vector.size();
-            mLen = vector.size();
-            mLen = vector.size();
-            mLen = vector.size();
-            mLen = vector.size();
-        }
-    }
-
-    public void testVectorGet() {
-        int element;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            element = vector.get(i);
-            element = vector.get(i);
-            element = vector.get(i);
-            element = vector.get(i);
-            element = vector.get(i);
-            element = vector.get(i);
-            element = vector.get(i);
-            element = vector.get(i);
-            element = vector.get(i);
-            element = vector.get(i);
-        }
-
-    }
-
-    public void testVectorContains() {
-        boolean flag;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            flag = vector.contains(i);
-            flag = vector.contains(i);
-            flag = vector.contains(i);
-            flag = vector.contains(i);
-            flag = vector.contains(i);
-            flag = vector.contains(i);
-            flag = vector.contains(i);
-            flag = vector.contains(i);
-            flag = vector.contains(i);
-            flag = vector.contains(i);
-        }
-    }
-
-    public void testVectorToArray1() {
-        Integer[] rArray = new Integer[100];
-        Integer[] array;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            array = vector.toArray(rArray);
-            array = vector.toArray(rArray);
-            array = vector.toArray(rArray);
-            array = vector.toArray(rArray);
-            array = vector.toArray(rArray);
-            array = vector.toArray(rArray);
-            array = vector.toArray(rArray);
-            array = vector.toArray(rArray);
-            array = vector.toArray(rArray);
-            array = vector.toArray(rArray);
-        }
-    }
-
-    public void testVectorSet() {
-        Vector<Integer> vector = mVector;
-        int pos = 5, value = 0;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            vector.set(pos, value);
-            vector.set(pos, value);
-            vector.set(pos, value);
-            vector.set(pos, value);
-            vector.set(pos, value);
-            vector.set(pos, value);
-            vector.set(pos, value);
-            vector.set(pos, value);
-            vector.set(pos, value);
-            vector.set(pos, value);
-        }
-    }
-
-    public void testVectorIndexOf() {
-        int index, value = 0;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            index = vector.indexOf(value);
-            index = vector.indexOf(value);
-            index = vector.indexOf(value);
-            index = vector.indexOf(value);
-            index = vector.indexOf(value);
-            index = vector.indexOf(value);
-            index = vector.indexOf(value);
-            index = vector.indexOf(value);
-            index = vector.indexOf(value);
-            index = vector.indexOf(value);
-        }
-    }
-
-    public void testVectorLastIndexOf() {
-        int index, value = 0;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i >= 0; i--) {
-            index = vector.lastIndexOf(value);
-            index = vector.lastIndexOf(value);
-            index = vector.lastIndexOf(value);
-            index = vector.lastIndexOf(value);
-            index = vector.lastIndexOf(value);
-            index = vector.lastIndexOf(value);
-            index = vector.lastIndexOf(value);
-            index = vector.lastIndexOf(value);
-            index = vector.lastIndexOf(value);
-            index = vector.lastIndexOf(value);
-        }
-    }
-
-    public void testVectorRemove() {
-        int index, value = 0;
-        Vector<Integer> vector = new Vector(mVector);
-        for (int i = 10; i > 0; i--) {
-            index = vector.remove(value);
-            index = vector.remove(value);
-            index = vector.remove(value);
-            index = vector.remove(value);
-            index = vector.remove(value);
-            index = vector.remove(value);
-            index = vector.remove(value);
-            index = vector.remove(value);
-            index = vector.remove(value);
-            index = vector.remove(value);
-        }
-    }
-
-    public void testVectorRemoveElement() {
-        Vector<Integer> vector = new Vector(mVector);
-        for (int i = 10; i > 0; i--) {
-            vector.removeElement(i);
-            vector.removeElement(i);
-            vector.removeElement(i);
-            vector.removeElement(i);
-            vector.removeElement(i);
-            vector.removeElement(i);
-            vector.removeElement(i);
-            vector.removeElement(i);
-            vector.removeElement(i);
-            vector.removeElement(i);
-        }
-    }
-
-    public void VectorRemoveElementAt() {
-        Vector<Integer> vector = new Vector(mVector);
-        for (int i = 10; i > 0; i--) {
-            vector.removeElementAt(i);
-            vector.removeElementAt(i);
-            vector.removeElementAt(i);
-            vector.removeElementAt(i);
-            vector.removeElementAt(i);
-            vector.removeElementAt(i);
-            vector.removeElementAt(i);
-            vector.removeElementAt(i);
-            vector.removeElementAt(i);
-            vector.removeElementAt(i);
-        }
-    }
-
-    public void VectorAddAll() {
-        Vector<Integer> vector = new Vector(), vector1 = mVector;
-
-        boolean flag;
-        for (int i = 10; i > 0; i--) {
-            flag = vector.addAll(vector1);
-            flag = vector.addAll(vector1);
-            flag = vector.addAll(vector1);
-            flag = vector.addAll(vector1);
-            flag = vector.addAll(vector1);
-            flag = vector.addAll(vector1);
-            flag = vector.addAll(vector1);
-            flag = vector.addAll(vector1);
-            flag = vector.addAll(vector1);
-            flag = vector.addAll(vector1);
-        }
-    }
-
-    public void VectorRemove1() {
-        Vector<String> vector = mStrVector;
-        for (int j = 1000; j > 0; j--) {
-            vector.add("a");
-            vector.add("b");
-        }
-        String s = new String("a");
-        boolean flag;
-        for (int i = 10; i > 0; i--) {
-            flag = vector.remove(s);
-            flag = vector.remove(s);
-            flag = vector.remove(s);
-            flag = vector.remove(s);
-            flag = vector.remove(s);
-            flag = vector.remove(s);
-            flag = vector.remove(s);
-            flag = vector.remove(s);
-            flag = vector.remove(s);
-            flag = vector.remove(s);
-        }
-    }
-
-    public void testVectorAddAll1() {
-        Vector<Integer> mEmptyVector = new Vector();
-        boolean flag;
-        int pos = 0;
-        Vector<Integer> vector1 = mVector;
-        Vector<Integer> vector = mEmptyVector;
-        for (int i = 10; i > 0; i--) {
-            flag = vector.addAll(pos, vector1);
-            flag = vector.addAll(pos, vector1);
-            flag = vector.addAll(pos, vector1);
-            flag = vector.addAll(pos, vector1);
-            flag = vector.addAll(pos, vector1);
-            flag = vector.addAll(pos, vector1);
-            flag = vector.addAll(pos, vector1);
-            flag = vector.addAll(pos, vector1);
-            flag = vector.addAll(pos, vector1);
-            flag = vector.addAll(pos, vector1);
-        }
-    }
-
-    public void testVectorClone() {
-        Object obj;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            obj = vector.clone();
-            obj = vector.clone();
-            obj = vector.clone();
-            obj = vector.clone();
-            obj = vector.clone();
-            obj = vector.clone();
-            obj = vector.clone();
-            obj = vector.clone();
-            obj = vector.clone();
-            obj = vector.clone();
-        }
-    }
-
-    public void testVectorCapacity() {
-        int capacity;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            capacity = vector.capacity();
-            capacity = vector.capacity();
-            capacity = vector.capacity();
-            capacity = vector.capacity();
-            capacity = vector.capacity();
-            capacity = vector.capacity();
-            capacity = vector.capacity();
-            capacity = vector.capacity();
-            capacity = vector.capacity();
-            capacity = vector.capacity();
-        }
-    }
-
-    public void testVectorHashcode() {
-        int element;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            element = vector.hashCode();
-            element = vector.hashCode();
-            element = vector.hashCode();
-            element = vector.hashCode();
-            element = vector.hashCode();
-            element = vector.hashCode();
-            element = vector.hashCode();
-            element = vector.hashCode();
-            element = vector.hashCode();
-            element = vector.hashCode();
-        }
-    }
-
-    public void testVectorElements() {
-        Enumeration<Integer> elements;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            elements = vector.elements();
-            elements = vector.elements();
-            elements = vector.elements();
-            elements = vector.elements();
-            elements = vector.elements();
-            elements = vector.elements();
-            elements = vector.elements();
-            elements = vector.elements();
-            elements = vector.elements();
-            elements = vector.elements();
-        }
-    }
-
-    public void testVectorToString() {
-        String str;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            str = vector.toString();
-            str = vector.toString();
-            str = vector.toString();
-            str = vector.toString();
-            str = vector.toString();
-            str = vector.toString();
-            str = vector.toString();
-            str = vector.toString();
-            str = vector.toString();
-            str = vector.toString();
-        }
-    }
-
-    public void testVectorElementAt() {
-        int element;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            element = vector.elementAt(50);
-            element = vector.elementAt(50);
-            element = vector.elementAt(50);
-            element = vector.elementAt(50);
-            element = vector.elementAt(50);
-            element = vector.elementAt(50);
-            element = vector.elementAt(50);
-            element = vector.elementAt(50);
-            element = vector.elementAt(50);
-            element = vector.elementAt(50);
-        }
-    }
-
-    public void testVectorAddElement() {
-        int element;
-        Vector<String> vector = mStrVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            vector.addElement(mTestString);
-            vector.addElement(mTestString);
-            vector.addElement(mTestString);
-            vector.addElement(mTestString);
-            vector.addElement(mTestString);
-            vector.addElement(mTestString);
-            vector.addElement(mTestString);
-            vector.addElement(mTestString);
-            vector.addElement(mTestString);
-            vector.addElement(mTestString);
-        }
-    }
-
-    public void testVectorFirstElement() {
-        int element;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            element = vector.firstElement();
-            element = vector.firstElement();
-            element = vector.firstElement();
-            element = vector.firstElement();
-            element = vector.firstElement();
-            element = vector.firstElement();
-            element = vector.firstElement();
-            element = vector.firstElement();
-            element = vector.firstElement();
-            element = vector.firstElement();
-        }
-    }
-
-    public void testVectorLastElement() {
-        int element;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            element = vector.lastElement();
-            element = vector.lastElement();
-            element = vector.lastElement();
-            element = vector.lastElement();
-            element = vector.lastElement();
-            element = vector.lastElement();
-            element = vector.lastElement();
-            element = vector.lastElement();
-            element = vector.lastElement();
-            element = vector.lastElement();
-        }
-    }
-
-    public void testVectorSetElementAt() {
-        Vector<Integer> vector = mVector;
-        int value1 = 500, value2 = 50;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            vector.setElementAt(value1, value2);
-            vector.setElementAt(value1, value2);
-            vector.setElementAt(value1, value2);
-            vector.setElementAt(value1, value2);
-            vector.setElementAt(value1, value2);
-            vector.setElementAt(value1, value2);
-            vector.setElementAt(value1, value2);
-            vector.setElementAt(value1, value2);
-            vector.setElementAt(value1, value2);
-            vector.setElementAt(value1, value2);
-        }
-    }
-
-    public void testVectorIsEmpty() {
-        boolean flag;
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            flag = vector.isEmpty();
-            flag = vector.isEmpty();
-            flag = vector.isEmpty();
-            flag = vector.isEmpty();
-            flag = vector.isEmpty();
-            flag = vector.isEmpty();
-            flag = vector.isEmpty();
-            flag = vector.isEmpty();
-            flag = vector.isEmpty();
-            flag = vector.isEmpty();
-        }
-    }
-
-    public void testVectorCopyInto() {
-        Integer[] rArray = new Integer[ITERATIONS];
-        Vector<Integer> vector = mVector;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            vector.copyInto(rArray);
-            vector.copyInto(rArray);
-            vector.copyInto(rArray);
-            vector.copyInto(rArray);
-            vector.copyInto(rArray);
-            vector.copyInto(rArray);
-            vector.copyInto(rArray);
-            vector.copyInto(rArray);
-            vector.copyInto(rArray);
-            vector.copyInto(rArray);
-        }
-    }
-
-    public void testVectorInsertElementAt() {
-        Vector<String> vector = mStrVector;
-        String string = mTestString;
-        for (int i = ITERATIONS - 1; i > 0; i--) {
-            vector.insertElementAt(string, i);
-            vector.insertElementAt(string, i);
-            vector.insertElementAt(string, i);
-            vector.insertElementAt(string, i);
-            vector.insertElementAt(string, i);
-            vector.insertElementAt(string, i);
-            vector.insertElementAt(string, i);
-            vector.insertElementAt(string, i);
-            vector.insertElementAt(string, i);
-            vector.insertElementAt(string, i);
-        }
-    }
-}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
index 643dbf5..9ccb3ee 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
@@ -86,10 +86,12 @@
                 }
                 return;
             } else if (msg.what == MSG_WEBKIT_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);
         }
     }
@@ -106,10 +108,12 @@
             case DUMP_AS_TEXT:
                 callback.arg1 = mDumpTopFrameAsText ? 1 : 0;
                 callback.arg2 = mDumpChildFramesAsText ? 1 : 0;
+                setDumpTimeout(DUMP_TIMEOUT_MS);
                 mWebView.documentAsText(callback);
                 break;
             case EXT_REPR:
                 mWebView.externalRepresentation(callback);
+                setDumpTimeout(DUMP_TIMEOUT_MS);
                 break;
             default:
                 finished();
@@ -117,6 +121,11 @@
         }
     }
 
+    private void setDumpTimeout(long timeout) {
+        Message msg = mHandler.obtainMessage(MSG_DUMP_TIMEOUT);
+        mHandler.sendMessageDelayed(msg, timeout);
+    }
+
     public void clearCache() {
       mWebView.freeMemory();
     }
@@ -933,9 +942,11 @@
     private boolean mDumpWebKitData = false;
 
     static final String TIMEOUT_STR = "**Test timeout";
+    static final long DUMP_TIMEOUT_MS = 20000; //20s 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";
 
diff --git a/tests/HwAccelerationTest/res/layout/advanced_blend.xml b/tests/HwAccelerationTest/res/layout/_advanced_blend.xml
similarity index 100%
rename from tests/HwAccelerationTest/res/layout/advanced_blend.xml
rename to tests/HwAccelerationTest/res/layout/_advanced_blend.xml
diff --git a/tests/HwAccelerationTest/res/layout/advanced_gradient.xml b/tests/HwAccelerationTest/res/layout/_advanced_gradient.xml
similarity index 100%
rename from tests/HwAccelerationTest/res/layout/advanced_gradient.xml
rename to tests/HwAccelerationTest/res/layout/_advanced_gradient.xml
diff --git a/tests/HwAccelerationTest/res/layout/_layers.xml b/tests/HwAccelerationTest/res/layout/_layers.xml
new file mode 100644
index 0000000..c2b186d
--- /dev/null
+++ b/tests/HwAccelerationTest/res/layout/_layers.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.android.test.hwui.LayersActivity.LayersView
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="fill_parent"
+  android:layout_height="fill_parent">
+</com.android.test.hwui.LayersActivity.LayersView>
diff --git a/tests/HwAccelerationTest/res/layout/_lines.xml b/tests/HwAccelerationTest/res/layout/_lines.xml
new file mode 100644
index 0000000..00f2556
--- /dev/null
+++ b/tests/HwAccelerationTest/res/layout/_lines.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.android.test.hwui.LinesActivity.LinesView
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="fill_parent"
+  android:layout_height="fill_parent">
+</com.android.test.hwui.LinesActivity.LinesView>
diff --git a/tests/HwAccelerationTest/res/layout/_newlayers.xml b/tests/HwAccelerationTest/res/layout/_newlayers.xml
new file mode 100644
index 0000000..062a2e1
--- /dev/null
+++ b/tests/HwAccelerationTest/res/layout/_newlayers.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.android.test.hwui.NewLayersActivity.LayersView
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="fill_parent"
+  android:layout_height="fill_parent">
+</com.android.test.hwui.NewLayersActivity.LayersView>
diff --git a/tests/HwAccelerationTest/res/layout/_paths.xml b/tests/HwAccelerationTest/res/layout/_paths.xml
new file mode 100644
index 0000000..b053482
--- /dev/null
+++ b/tests/HwAccelerationTest/res/layout/_paths.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.android.test.hwui.PathsActivity.PathsView
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="fill_parent"
+  android:layout_height="fill_parent">
+</com.android.test.hwui.PathsActivity.PathsView>
diff --git a/tests/HwAccelerationTest/res/layout/_shaders.xml b/tests/HwAccelerationTest/res/layout/_shaders.xml
new file mode 100644
index 0000000..dcb42fb
--- /dev/null
+++ b/tests/HwAccelerationTest/res/layout/_shaders.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.android.test.hwui.ShadersActivity.ShadersView
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="fill_parent"
+  android:layout_height="fill_parent">
+</com.android.test.hwui.ShadersActivity.ShadersView>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/LayersActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/LayersActivity.java
index b705117..9d5cd28 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/LayersActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/LayersActivity.java
@@ -33,11 +33,11 @@
         setContentView(new LayersView(this));
     }
 
-    static class LayersView extends View {
+    public static class LayersView extends View {
         private Paint mLayerPaint;
         private final Paint mRectPaint;
 
-        LayersView(Context c) {
+        public LayersView(Context c) {
             super(c);
 
             mLayerPaint = new Paint();
@@ -47,11 +47,11 @@
         @Override
         protected void onDraw(Canvas canvas) {
             super.onDraw(canvas);
-            
+
             canvas.translate(140.0f, 100.0f);
 
             //canvas.drawRGB(255, 255, 255);
-            
+
             int count = canvas.saveLayer(0.0f, 0.0f, 200.0f, 100.0f, mLayerPaint,
                     Canvas.ALL_SAVE_FLAG);
 
@@ -59,9 +59,9 @@
             canvas.drawRect(0.0f, 0.0f, 200.0f, 100.0f, mRectPaint);
 
             canvas.restoreToCount(count);
-            
+
             canvas.translate(0.0f, 125.0f);
-            
+
             count = canvas.saveLayer(0.0f, 0.0f, 200.0f, 100.0f, mLayerPaint,
                     Canvas.ALL_SAVE_FLAG);
 
@@ -75,8 +75,8 @@
 
             mRectPaint.setColor(0xff0000ff);
             mRectPaint.setAlpha(255);
-            canvas.drawRect(0.0f, 0.0f, 100.0f, 50.0f, mRectPaint);            
-            
+            canvas.drawRect(0.0f, 0.0f, 100.0f, 50.0f, mRectPaint);
+
             mLayerPaint.setAlpha(127);
             mLayerPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
             count = canvas.saveLayer(50.0f, 25.0f, 150.0f, 75.0f, mLayerPaint,
@@ -86,13 +86,13 @@
             canvas.drawRect(50.0f, 25.0f, 150.0f, 75.0f, mRectPaint);
 
             canvas.restoreToCount(count);
-            
+
             canvas.translate(0.0f, 125.0f);
 
             mRectPaint.setColor(0xff0000ff);
             mRectPaint.setAlpha(255);
-            canvas.drawRect(0.0f, 0.0f, 100.0f, 50.0f, mRectPaint);            
-            
+            canvas.drawRect(0.0f, 0.0f, 100.0f, 50.0f, mRectPaint);
+
             mLayerPaint.setColor(0xffff0000);
             mLayerPaint.setAlpha(127);
             mLayerPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP));
@@ -103,7 +103,7 @@
             canvas.drawRect(50.0f, 25.0f, 150.0f, 75.0f, mRectPaint);
 
             canvas.restoreToCount(count);
-            
+
             mLayerPaint = new Paint();
         }
     }
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/LinesActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/LinesActivity.java
index 6afbb01..91e3b84 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/LinesActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/LinesActivity.java
@@ -35,7 +35,7 @@
         setContentView(view);
     }
 
-    static class LinesView extends View {
+    public static class LinesView extends View {
         private static final boolean LINE_AA = false;
 
         private final Bitmap mBitmap1;
@@ -47,7 +47,7 @@
         private final Paint mAlphaPaint;
         private final Paint mHairLinePaint;
 
-        LinesView(Context c) {
+        public LinesView(Context c) {
             super(c);
 
             mBitmap1 = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
@@ -71,7 +71,7 @@
             mAlphaPaint.setAntiAlias(LINE_AA);
             mAlphaPaint.setColor(0x7fff0050);
             mAlphaPaint.setStrokeWidth(10.0f);
-            
+
             mHairLinePaint = new Paint();
             mHairLinePaint.setAntiAlias(LINE_AA);
             mHairLinePaint.setColor(0xff0000ff);
@@ -99,11 +99,11 @@
             canvas.drawLine(0.0f, 0.0f, 40.0f, 400.0f, mSmallPaint);
             canvas.drawLine(5.0f, 0.0f, 95.0f, 400.0f, mMediumPaint);
             canvas.drawLine(22.0f, 0.0f, 162.0f, 400.0f, mLargePaint);
-            
+
             mLargePaint.setShader(mShader);
             canvas.drawLine(42.0f, 0.0f, 222.0f, 400.0f, mLargePaint);
             mLargePaint.setShader(null);
-            
+
             canvas.drawLines(mPoints, mAlphaPaint);
 
             mSmallPaint.setAntiAlias(false);
@@ -111,14 +111,14 @@
             mSmallPaint.setAntiAlias(LINE_AA);
             canvas.drawLine(0.0f, 0.0f, 0.0f, 400.0f, mSmallPaint);
             canvas.drawLine(0.0f, 400.0f, 400.0f, 400.0f, mSmallPaint);
-            
+
             canvas.translate(120.0f, 0.0f);
-            mAlphaPaint.setShader(mShader);            
+            mAlphaPaint.setShader(mShader);
             canvas.drawLines(mPoints, mAlphaPaint);
             mAlphaPaint.setShader(null);
 
             canvas.restore();
-            
+
             canvas.scale(10.0f, 10.0f);
             canvas.drawLine(50.0f, 40.0f, 10.0f, 40.0f, mSmallPaint);
             canvas.drawLine(10.0f, 50.0f, 50.0f, 50.0f, mSmallPaint);
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/NewLayersActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/NewLayersActivity.java
index d9a2893..2509d367 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/NewLayersActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/NewLayersActivity.java
@@ -31,11 +31,11 @@
         setContentView(new LayersView(this));
     }
 
-    static class LayersView extends View {
+    public static class LayersView extends View {
         private Paint mLayerPaint;
         private final Paint mRectPaint;
 
-        LayersView(Context c) {
+        public LayersView(Context c) {
             super(c);
 
             mLayerPaint = new Paint();
@@ -57,7 +57,7 @@
 
             canvas.translate(0.0f, 200.0f);
             drawStuff(canvas, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
-            
+
             canvas.restore();
         }
 
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/PathsActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/PathsActivity.java
index 8d9bf37..aa1eb59 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/PathsActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/PathsActivity.java
@@ -37,7 +37,7 @@
         setContentView(view);
     }
 
-    static class PathsView extends View {
+    public static class PathsView extends View {
         private final Bitmap mBitmap1;
         private final Paint mSmallPaint;
         private final Paint mMediumPaint;
@@ -50,7 +50,7 @@
         private final float mOffset;
         private final Paint mLinePaint;
 
-        PathsView(Context c) {
+        public PathsView(Context c) {
             super(c);
 
             mBitmap1 = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
@@ -60,7 +60,7 @@
             mSmallPaint.setColor(0xffff0000);
             mSmallPaint.setStrokeWidth(1.0f);
             mSmallPaint.setStyle(Paint.Style.STROKE);
-            
+
             mLinePaint = new Paint();
             mLinePaint.setAntiAlias(true);
             mLinePaint.setColor(0xffff00ff);
@@ -112,7 +112,7 @@
             canvas.save();
             canvas.translate(200.0f, 60.0f);
             canvas.drawPath(mPath, mSmallPaint);
-            
+
             canvas.translate(350.0f, 0.0f);
             canvas.drawPath(mPath, mMediumPaint);
 
@@ -121,12 +121,12 @@
             canvas.drawPath(mPath, mLargePaint);
             mLargePaint.setShader(null);
             canvas.restore();
-            
+
             canvas.save();
             canvas.translate(200.0f, 360.0f);
             canvas.drawPath(mPath, mSmallPaint);
             canvas.drawRect(mPathBounds, mBoundsPaint);
-            
+
             canvas.translate(350.0f, 0.0f);
             canvas.drawBitmap(mBitmap, mPathBounds.left - mOffset * 1.5f,
                     mPathBounds.top - mOffset * 1.5f, null);
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ShadersActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ShadersActivity.java
index 02eaa7c..1d18f61 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/ShadersActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ShadersActivity.java
@@ -39,7 +39,7 @@
         setContentView(new ShadersView(this));
     }
 
-    static class ShadersView extends View {
+    public static class ShadersView extends View {
         private BitmapShader mRepeatShader;
         private BitmapShader mTranslatedShader;
         private BitmapShader mScaledShader;
@@ -52,8 +52,11 @@
         private LinearGradient mDiagGradient;
         private LinearGradient mVertGradient;
         private Bitmap mTexture;
+        private Matrix mMtx1;
+        private Matrix mMtx2;
+        private Matrix mMtx3;
 
-        ShadersView(Context c) {
+        public ShadersView(Context c) {
             super(c);
 
             mTexture = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
@@ -67,28 +70,28 @@
 
             mTranslatedShader = new BitmapShader(mTexture, Shader.TileMode.REPEAT,
                     Shader.TileMode.REPEAT);
-            Matrix m1 = new Matrix();
-            m1.setTranslate(mTexWidth / 2.0f, mTexHeight / 2.0f);
-            m1.postRotate(45, 0, 0);
-            mTranslatedShader.setLocalMatrix(m1);
-            
+            mMtx1 = new Matrix();
+            mMtx1.setTranslate(mTexWidth / 2.0f, mTexHeight / 2.0f);
+            mMtx1.postRotate(45, 0, 0);
+            mTranslatedShader.setLocalMatrix(mMtx1);
+
             mScaledShader = new BitmapShader(mTexture, Shader.TileMode.MIRROR,
                     Shader.TileMode.MIRROR);
-            Matrix m2 = new Matrix();
-            m2.setScale(0.5f, 0.5f);
-            mScaledShader.setLocalMatrix(m2);
+            mMtx2 = new Matrix();
+            mMtx2.setScale(0.5f, 0.5f);
+            mScaledShader.setLocalMatrix(mMtx2);
 
             mHorGradient = new LinearGradient(0.0f, 0.0f, 1.0f, 0.0f,
                     Color.RED, Color.GREEN, Shader.TileMode.CLAMP);
-            Matrix m3 = new Matrix();
-            m3.setScale(mDrawHeight, 1.0f);
-            m3.postRotate(-90.0f);
-            m3.postTranslate(0.0f, mDrawHeight);
-            mHorGradient.setLocalMatrix(m3);
-            
+            mMtx3 = new Matrix();
+            mMtx3.setScale(mDrawHeight, 1.0f);
+            mMtx3.postRotate(-90.0f);
+            mMtx3.postTranslate(0.0f, mDrawHeight);
+            mHorGradient.setLocalMatrix(mMtx3);
+
             mDiagGradient = new LinearGradient(0.0f, 0.0f, mDrawWidth / 1.5f, mDrawHeight,
                     Color.BLUE, Color.MAGENTA, Shader.TileMode.CLAMP);
-            
+
             mVertGradient = new LinearGradient(0.0f, 0.0f, 0.0f, mDrawHeight / 2.0f,
                     Color.YELLOW, Color.MAGENTA, Shader.TileMode.MIRROR);
 
@@ -107,7 +110,7 @@
 
             mPaint.setShader(mRepeatShader);
             canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
-            
+
             canvas.translate(0.0f, 40.0f + mDrawHeight);
             mPaint.setShader(mTranslatedShader);
             canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
@@ -124,7 +127,7 @@
 
             mPaint.setShader(mHorGradient);
             canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
-            
+
             canvas.translate(0.0f, 40.0f + mDrawHeight);
             mPaint.setShader(mDiagGradient);
             canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
@@ -132,7 +135,7 @@
             canvas.translate(0.0f, 40.0f + mDrawHeight);
             mPaint.setShader(mVertGradient);
             canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
-            
+
             canvas.restore();
         }
     }
diff --git a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java b/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java
index b46d95c..60ad645 100644
--- a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java
@@ -16,7 +16,7 @@
 
 package android.app;
 
-import com.android.layoutlib.api.IProjectCallback;
+import com.android.ide.common.rendering.api.IProjectCallback;
 
 import android.content.Context;
 import android.os.Bundle;
diff --git a/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java
new file mode 100644
index 0000000..190eb37
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java
@@ -0,0 +1,68 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import java.awt.Composite;
+
+/**
+ * Delegate implementing the native methods of android.graphics.AvoidXfermode
+ *
+ * Through the layoutlib_create tool, the original native methods of AvoidXfermode have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original AvoidXfermode class.
+ *
+ * Because this extends {@link Xfermode_Delegate}, there's no need to use a
+ * {@link DelegateManager}, as all the PathEffect classes will be added to the manager owned by
+ * {@link Xfermode_Delegate}.
+ *
+ */
+public class AvoidXfermode_Delegate extends Xfermode_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public Composite getComposite(int alpha) {
+        // FIXME
+        return null;
+    }
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Avoid Xfermodes are not supported in Layout Preview mode.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeCreate(int opColor, int tolerance, int nativeMode) {
+        AvoidXfermode_Delegate newDelegate = new AvoidXfermode_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java
index 626f878..c57aef6 100644
--- a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java
+++ b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java
@@ -16,7 +16,7 @@
 
 package android.graphics;
 
-import com.android.layoutlib.api.ResourceDensity;
+import com.android.ide.common.rendering.api.ResourceDensity;
 import com.android.layoutlib.bridge.Bridge;
 
 import android.content.res.AssetManager;
diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java
new file mode 100644
index 0000000..75b8f99
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java
@@ -0,0 +1,241 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.Bridge;
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import android.graphics.Shader.TileMode;
+
+/**
+ * Delegate implementing the native methods of android.graphics.BitmapShader
+ *
+ * Through the layoutlib_create tool, the original native methods of BitmapShader have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original BitmapShader class.
+ *
+ * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
+ * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
+ *
+ * @see Shader_Delegate
+ *
+ */
+public class BitmapShader_Delegate extends Shader_Delegate {
+
+    // ---- delegate data ----
+    private java.awt.Paint mJavaPaint;
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public java.awt.Paint getJavaPaint() {
+        return mJavaPaint;
+    }
+
+    @Override
+    public boolean isSupported() {
+        return true;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        // no message since isSupported returns true;
+        return null;
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeCreate(int native_bitmap, int shaderTileModeX,
+            int shaderTileModeY) {
+        Bitmap_Delegate bitmap = Bitmap_Delegate.getDelegate(native_bitmap);
+        if (bitmap == null) {
+            return 0;
+        }
+
+        BitmapShader_Delegate newDelegate = new BitmapShader_Delegate(
+                bitmap.getImage(),
+                Shader_Delegate.getTileMode(shaderTileModeX),
+                Shader_Delegate.getTileMode(shaderTileModeY));
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static int nativePostCreate(int native_shader, int native_bitmap,
+            int shaderTileModeX, int shaderTileModeY) {
+        // pass, not needed.
+        return 0;
+    }
+
+    // ---- Private delegate/helper methods ----
+
+    private BitmapShader_Delegate(java.awt.image.BufferedImage image,
+            TileMode tileModeX, TileMode tileModeY) {
+        mJavaPaint = new BitmapShaderPaint(image, tileModeX, tileModeY);
+    }
+
+    private class BitmapShaderPaint implements java.awt.Paint {
+        private final java.awt.image.BufferedImage mImage;
+        private final TileMode mTileModeX;
+        private final TileMode mTileModeY;
+
+        BitmapShaderPaint(java.awt.image.BufferedImage image,
+                TileMode tileModeX, TileMode tileModeY) {
+            mImage = image;
+            mTileModeX = tileModeX;
+            mTileModeY = tileModeY;
+        }
+
+        public java.awt.PaintContext createContext(
+                java.awt.image.ColorModel      colorModel,
+                java.awt.Rectangle             deviceBounds,
+                java.awt.geom.Rectangle2D      userBounds,
+                java.awt.geom.AffineTransform  xform,
+                java.awt.RenderingHints        hints) {
+
+            java.awt.geom.AffineTransform canvasMatrix;
+            try {
+                canvasMatrix = xform.createInverse();
+            } catch (java.awt.geom.NoninvertibleTransformException e) {
+                Bridge.getLog().error(null, "Unable to inverse matrix in BitmapShader", e);
+                canvasMatrix = new java.awt.geom.AffineTransform();
+            }
+
+            java.awt.geom.AffineTransform localMatrix = getLocalMatrix();
+            try {
+                localMatrix = localMatrix.createInverse();
+            } catch (java.awt.geom.NoninvertibleTransformException e) {
+                Bridge.getLog().error(null, "Unable to inverse matrix in BitmapShader", e);
+                localMatrix = new java.awt.geom.AffineTransform();
+            }
+
+            return new BitmapShaderContext(canvasMatrix, localMatrix, colorModel);
+        }
+
+        private class BitmapShaderContext implements java.awt.PaintContext {
+
+            private final java.awt.geom.AffineTransform mCanvasMatrix;
+            private final java.awt.geom.AffineTransform mLocalMatrix;
+            private final java.awt.image.ColorModel mColorModel;
+
+            public BitmapShaderContext(
+                    java.awt.geom.AffineTransform canvasMatrix,
+                    java.awt.geom.AffineTransform localMatrix,
+                    java.awt.image.ColorModel colorModel) {
+                mCanvasMatrix = canvasMatrix;
+                mLocalMatrix = localMatrix;
+                mColorModel = colorModel;
+            }
+
+            public void dispose() {
+            }
+
+            public java.awt.image.ColorModel getColorModel() {
+                return mColorModel;
+            }
+
+            public java.awt.image.Raster getRaster(int x, int y, int w, int h) {
+                java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h,
+                        java.awt.image.BufferedImage.TYPE_INT_ARGB);
+
+                int[] data = new int[w*h];
+
+                int index = 0;
+                float[] pt1 = new float[2];
+                float[] pt2 = new float[2];
+                for (int iy = 0 ; iy < h ; iy++) {
+                    for (int ix = 0 ; ix < w ; ix++) {
+                        // handle the canvas transform
+                        pt1[0] = x + ix;
+                        pt1[1] = y + iy;
+                        mCanvasMatrix.transform(pt1, 0, pt2, 0, 1);
+
+                        // handle the local matrix.
+                        pt1[0] = pt2[0];
+                        pt1[1] = pt2[1];
+                        mLocalMatrix.transform(pt1, 0, pt2, 0, 1);
+
+                        data[index++] = getColor(pt2[0], pt2[1]);
+                    }
+                }
+
+                image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/);
+
+                return image.getRaster();
+            }
+        }
+
+        /**
+         * Returns a color for an arbitrary point.
+         */
+        private int getColor(float fx, float fy) {
+            int x = getCoordinate(Math.round(fx), mImage.getWidth(), mTileModeX);
+            int y = getCoordinate(Math.round(fy), mImage.getHeight(), mTileModeY);
+
+            return mImage.getRGB(x, y);
+        }
+
+        private int getCoordinate(int i, int size, TileMode mode) {
+            if (i < 0) {
+                switch (mode) {
+                    case CLAMP:
+                        i = 0;
+                        break;
+                    case REPEAT:
+                        i = size - 1 - (-i % size);
+                        break;
+                    case MIRROR:
+                        // this is the same as the positive side, just make the value positive
+                        // first.
+                        i = -i;
+                        int count = i / size;
+                        i = i % size;
+
+                        if ((count % 2) == 1) {
+                            i = size - 1 - i;
+                        }
+                        break;
+                }
+            } else if (i >= size) {
+                switch (mode) {
+                    case CLAMP:
+                        i = size - 1;
+                        break;
+                    case REPEAT:
+                        i = i % size;
+                        break;
+                    case MIRROR:
+                        int count = i / size;
+                        i = i % size;
+
+                        if ((count % 2) == 1) {
+                            i = size - 1 - i;
+                        }
+                        break;
+                }
+            }
+
+            return i;
+        }
+
+
+        public int getTransparency() {
+            return java.awt.Paint.TRANSLUCENT;
+        }
+    }
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
index fe201c1..dd57bd1 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
@@ -16,7 +16,8 @@
 
 package android.graphics;
 
-import com.android.layoutlib.api.ResourceDensity;
+import com.android.ide.common.rendering.api.ResourceDensity;
+import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.impl.DelegateManager;
 
 import android.graphics.Bitmap.Config;
@@ -29,6 +30,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.Buffer;
+import java.util.Arrays;
 
 import javax.imageio.ImageIO;
 
@@ -45,7 +47,7 @@
  * @see DelegateManager
  *
  */
-public class Bitmap_Delegate {
+public final class Bitmap_Delegate {
 
     // ---- delegate manager ----
     private static final DelegateManager<Bitmap_Delegate> sManager =
@@ -54,8 +56,11 @@
     // ---- delegate helper data ----
 
     // ---- delegate data ----
+    private final Config mConfig;
     private BufferedImage mImage;
     private boolean mHasAlpha = true;
+    private int mGenerationId = 0;
+
 
     // ---- Public Helper methods ----
 
@@ -86,7 +91,7 @@
     public static Bitmap createBitmap(File input, boolean isMutable, ResourceDensity density)
             throws IOException {
         // create a delegate with the content of the file.
-        Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input));
+        Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888);
 
         return createBitmap(delegate, isMutable, density.getDpi());
     }
@@ -104,7 +109,7 @@
     public static Bitmap createBitmap(InputStream input, boolean isMutable, ResourceDensity density)
             throws IOException {
         // create a delegate with the content of the stream.
-        Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input));
+        Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888);
 
         return createBitmap(delegate, isMutable, density.getDpi());
     }
@@ -122,7 +127,7 @@
     public static Bitmap createBitmap(BufferedImage image, boolean isMutable,
             ResourceDensity density) throws IOException {
         // create a delegate with the given image.
-        Bitmap_Delegate delegate = new Bitmap_Delegate(image);
+        Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888);
 
         return createBitmap(delegate, isMutable, density.getDpi());
     }
@@ -134,7 +139,6 @@
         // get the delegate from the native int.
         Bitmap_Delegate delegate = sManager.getDelegate(bitmap.mNativeBitmap);
         if (delegate == null) {
-            assert false;
             return null;
         }
 
@@ -163,6 +167,31 @@
         return mImage;
     }
 
+    /**
+     * Returns the Android bitmap config. Note that this not the config of the underlying
+     * Java2D bitmap.
+     */
+    public Config getConfig() {
+        return mConfig;
+    }
+
+    /**
+     * Returns the hasAlpha rendering hint
+     * @return true if the bitmap alpha should be used at render time
+     */
+    public boolean hasAlpha() {
+        return mHasAlpha && mConfig != Config.RGB_565;
+    }
+
+    /**
+     * Update the generationId.
+     *
+     * @see Bitmap#getGenerationId()
+     */
+    public void change() {
+        mGenerationId++;
+    }
+
     // ---- native methods ----
 
     /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width,
@@ -172,17 +201,41 @@
         // create the image
         BufferedImage image = new BufferedImage(width, height, imageType);
 
-        // FIXME fill the bitmap!
+        if (colors != null) {
+            image.setRGB(0, 0, width, height, colors, offset, stride);
+        }
 
         // create a delegate with the content of the stream.
-        Bitmap_Delegate delegate = new Bitmap_Delegate(image);
+        Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.sConfigs[nativeConfig]);
 
         return createBitmap(delegate, mutable, Bitmap.getDefaultDensity());
     }
 
     /*package*/ static Bitmap nativeCopy(int srcBitmap, int nativeConfig, boolean isMutable) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap");
+        Bitmap_Delegate srcBmpDelegate = sManager.getDelegate(srcBitmap);
+        if (srcBmpDelegate == null) {
+            return null;
+        }
+
+        BufferedImage srcImage = srcBmpDelegate.getImage();
+
+        int width = srcImage.getWidth();
+        int height = srcImage.getHeight();
+
+        int imageType = getBufferedImageType(nativeConfig);
+
+        // create the image
+        BufferedImage image = new BufferedImage(width, height, imageType);
+
+        // copy the source image into the image.
+        int[] argb = new int[width * height];
+        srcImage.getRGB(0, 0, width, height, argb, 0, width);
+        image.setRGB(0, 0, width, height, argb, 0, width);
+
+        // create a delegate with the content of the stream.
+        Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.sConfigs[nativeConfig]);
+
+        return createBitmap(delegate, isMutable, Bitmap.getDefaultDensity());
     }
 
     /*package*/ static void nativeDestructor(int nativeBitmap) {
@@ -195,15 +248,14 @@
 
     /*package*/ static boolean nativeCompress(int nativeBitmap, int format, int quality,
             OutputStream stream, byte[] tempStorage) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap");
+        Bridge.getLog().error(null, "Bitmap.compress() is not supported");
+        return true;
     }
 
     /*package*/ static void nativeErase(int nativeBitmap, int color) {
         // get the delegate from the native int.
         Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -211,10 +263,7 @@
 
         Graphics2D g = image.createGraphics();
         try {
-            if (delegate.mHasAlpha == false) {
-                color |= color & 0xFF000000;
-            }
-            g.setColor(new java.awt.Color(color));
+            g.setColor(new java.awt.Color(color, true));
 
             g.fillRect(0, 0, image.getWidth(), image.getHeight());
         } finally {
@@ -226,7 +275,6 @@
         // get the delegate from the native int.
         Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -237,7 +285,6 @@
         // get the delegate from the native int.
         Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -248,7 +295,6 @@
         // get the delegate from the native int.
         Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -256,14 +302,19 @@
     }
 
     /*package*/ static int nativeConfig(int nativeBitmap) {
-        return Config.ARGB_8888.nativeInt;
+        // get the delegate from the native int.
+        Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
+        if (delegate == null) {
+            return 0;
+        }
+
+        return delegate.mConfig.nativeInt;
     }
 
     /*package*/ static boolean nativeHasAlpha(int nativeBitmap) {
         // get the delegate from the native int.
         Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
         if (delegate == null) {
-            assert false;
             return true;
         }
 
@@ -274,7 +325,6 @@
         // get the delegate from the native int.
         Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -283,20 +333,32 @@
 
     /*package*/ static void nativeGetPixels(int nativeBitmap, int[] pixels, int offset,
             int stride, int x, int y, int width, int height) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeGetPixels");
+        Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
+        if (delegate == null) {
+            return;
+        }
+
+        delegate.getImage().getRGB(x, y, width, height, pixels, offset, stride);
     }
 
 
     /*package*/ static void nativeSetPixel(int nativeBitmap, int x, int y, int color) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeSetPixel");
+        Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
+        if (delegate == null) {
+            return;
+        }
+
+        delegate.getImage().setRGB(x, y, color);
     }
 
     /*package*/ static void nativeSetPixels(int nativeBitmap, int[] colors, int offset,
             int stride, int x, int y, int width, int height) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeSetPixels");
+        Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
+        if (delegate == null) {
+            return;
+        }
+
+        delegate.getImage().setRGB(x, y, width, height, colors, offset, stride);
     }
 
     /*package*/ static void nativeCopyPixelsToBuffer(int nativeBitmap, Buffer dst) {
@@ -310,38 +372,66 @@
     }
 
     /*package*/ static int nativeGenerationId(int nativeBitmap) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeGenerationId");
+        Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
+        if (delegate == null) {
+            return 0;
+        }
+
+        return delegate.mGenerationId;
     }
 
     /*package*/ static Bitmap nativeCreateFromParcel(Parcel p) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeCreateFromParcel");
+        // This is only called by Bitmap.CREATOR (Parcelable.Creator<Bitmap>), which is only
+        // used during aidl call so really this should not be called.
+        Bridge.getLog().error(null,
+                "AIDL is not suppored, and therefore Bitmaps cannot be created from parcels.");
+        return null;
     }
 
     /*package*/ static boolean nativeWriteToParcel(int nativeBitmap, boolean isMutable,
             int density, Parcel p) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeWriteToParcel");
+        // This is only called when sending a bitmap through aidl, so really this should not
+        // be called.
+        Bridge.getLog().error(null,
+                "AIDL is not suppored, and therefore Bitmaps cannot be written to parcels.");
+        return false;
     }
 
     /*package*/ static Bitmap nativeExtractAlpha(int nativeBitmap, int nativePaint,
             int[] offsetXY) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeExtractAlpha");
+        Bitmap_Delegate bitmap = sManager.getDelegate(nativeBitmap);
+        if (bitmap == null) {
+            return null;
+        }
+
+        // get the paint which can be null if nativePaint is 0.
+        Paint_Delegate paint = Paint_Delegate.getDelegate(nativePaint);
+
+        if (paint != null && paint.getMaskFilter() != null) {
+            Bridge.getLog().fidelityWarning(null,
+                    "MaskFilter not supported in Bitmap.extractAlpha",
+                    null);
+        }
+
+        int alpha = paint != null ? paint.getAlpha() : 0xFF;
+        BufferedImage image = createCopy(bitmap.getImage(), BufferedImage.TYPE_INT_ARGB, alpha);
+
+        // create the delegate. The actual Bitmap config is only an alpha channel
+        Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ALPHA_8);
+
+        // the density doesn't matter, it's set by the Java method.
+        return createBitmap(delegate, false /*isMutable*/,
+                ResourceDensity.DEFAULT_DENSITY /*density*/);
     }
 
-
     /*package*/ static void nativePrepareToDraw(int nativeBitmap) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativePrepareToDraw");
+        // nothing to be done here.
     }
 
     /*package*/ static void nativeSetHasAlpha(int nativeBitmap, boolean hasAlpha) {
         // get the delegate from the native int.
         Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -349,14 +439,53 @@
     }
 
     /*package*/ static boolean nativeSameAs(int nb0, int nb1) {
-        // FIXME implement native delegate
-        throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeSameAs");
+        Bitmap_Delegate delegate1 = sManager.getDelegate(nb0);
+        if (delegate1 == null) {
+            return false;
+        }
+
+        Bitmap_Delegate delegate2 = sManager.getDelegate(nb1);
+        if (delegate2 == null) {
+            return false;
+        }
+
+        BufferedImage image1 = delegate1.getImage();
+        BufferedImage image2 = delegate2.getImage();
+        if (delegate1.mConfig != delegate2.mConfig ||
+                image1.getWidth() != image2.getWidth() ||
+                image1.getHeight() != image2.getHeight()) {
+            return false;
+        }
+
+        // get the internal data
+        int w = image1.getWidth();
+        int h = image2.getHeight();
+        int[] argb1 = new int[w*h];
+        int[] argb2 = new int[w*h];
+
+        image1.getRGB(0, 0, w, h, argb1, 0, w);
+        image2.getRGB(0, 0, w, h, argb2, 0, w);
+
+        // compares
+        if (delegate1.mConfig == Config.ALPHA_8) {
+            // in this case we have to manually compare the alpha channel as the rest is garbage.
+            final int length = w*h;
+            for (int i = 0 ; i < length ; i++) {
+                if ((argb1[i] & 0xFF000000) != (argb2[i] & 0xFF000000)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        return Arrays.equals(argb1, argb2);
     }
 
     // ---- Private delegate/helper methods ----
 
-    private Bitmap_Delegate(BufferedImage image) {
+    private Bitmap_Delegate(BufferedImage image, Config config) {
         mImage = image;
+        mConfig = config;
     }
 
     private static Bitmap createBitmap(Bitmap_Delegate delegate, boolean isMutable, int density) {
@@ -366,4 +495,37 @@
         // and create/return a new Bitmap with it
         return new Bitmap(nativeInt, null /* buffer */, isMutable, null /*ninePatchChunk*/, density);
     }
+
+    /**
+     * Creates and returns a copy of a given BufferedImage.
+     * <p/>
+     * if alpha is different than 255, then it is applied to the alpha channel of each pixel.
+     *
+     * @param image the image to copy
+     * @param imageType the type of the new image
+     * @param alpha an optional alpha modifier
+     * @return a new BufferedImage
+     */
+    /*package*/ static BufferedImage createCopy(BufferedImage image, int imageType, int alpha) {
+        int w = image.getWidth();
+        int h = image.getHeight();
+
+        BufferedImage result = new BufferedImage(w, h, imageType);
+
+        int[] argb = new int[w * h];
+        image.getRGB(0, 0, image.getWidth(), image.getHeight(), argb, 0, image.getWidth());
+
+        if (alpha != 255) {
+            final int length = argb.length;
+            for (int i = 0 ; i < length; i++) {
+                int a = (argb[i] >>> 24 * alpha) / 255;
+                argb[i] = (a << 24) | (argb[i] & 0x00FFFFFF);
+            }
+        }
+
+        result.setRGB(0, 0, w, h, argb, 0, w);
+
+        return result;
+    }
+
 }
diff --git a/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java
new file mode 100644
index 0000000..34824b4
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java
@@ -0,0 +1,62 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.BlurMaskFilter
+ *
+ * Through the layoutlib_create tool, the original native methods of BlurMaskFilter have
+ * been replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original BlurMaskFilter class.
+ *
+ * Because this extends {@link MaskFilter_Delegate}, there's no need to use a
+ * {@link DelegateManager}, as all the Shader classes will be added to the manager
+ * owned by {@link MaskFilter_Delegate}.
+ *
+ * @see MaskFilter_Delegate
+ *
+ */
+public class BlurMaskFilter_Delegate extends MaskFilter_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Blur Mask Filters are not supported.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeConstructor(float radius, int style) {
+        BlurMaskFilter_Delegate newDelegate = new BlurMaskFilter_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
index c75e1b6..def0f02 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
@@ -23,12 +23,12 @@
 import android.graphics.Paint_Delegate.FontInfo;
 import android.text.TextUtils;
 
-import java.awt.AlphaComposite;
-import java.awt.BasicStroke;
 import java.awt.Color;
+import java.awt.Composite;
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
 import java.awt.RenderingHints;
+import java.awt.Shape;
 import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
 import java.util.List;
@@ -47,7 +47,7 @@
  * @see DelegateManager
  *
  */
-public class Canvas_Delegate {
+public final class Canvas_Delegate {
 
     // ---- delegate manager ----
     private static final DelegateManager<Canvas_Delegate> sManager =
@@ -55,9 +55,13 @@
 
     // ---- delegate helper data ----
 
+    private final static boolean[] sBoolOut = new boolean[1];
+
     // ---- delegate data ----
-    private BufferedImage mBufferedImage;
-    private GcSnapshot mSnapshot = new GcSnapshot();
+    private Bitmap_Delegate mBitmap;
+    private GcSnapshot mSnapshot;
+
+    private int mDrawFilter = 0;
 
     // ---- Public Helper methods ----
 
@@ -78,10 +82,19 @@
     /**
      * Returns the current {@link Graphics2D} used to draw.
      */
-    public GcSnapshot getGcSnapshot() {
+    public GcSnapshot getSnapshot() {
         return mSnapshot;
     }
 
+    /**
+     * Returns the {@link DrawFilter} delegate or null if none have been set.
+     *
+     * @return the delegate or null.
+     */
+    public DrawFilter_Delegate getDrawFilter() {
+        return DrawFilter_Delegate.getDelegate(mDrawFilter);
+    }
+
     // ---- native methods ----
 
     /*package*/ static boolean isOpaque(Canvas thisCanvas) {
@@ -93,67 +106,61 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return 0;
         }
 
-        return canvasDelegate.mBufferedImage.getWidth();
+        return canvasDelegate.mBitmap.getImage().getWidth();
     }
 
     /*package*/ static int getHeight(Canvas thisCanvas) {
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return 0;
         }
 
-        return canvasDelegate.mBufferedImage.getHeight();
+        return canvasDelegate.mBitmap.getImage().getHeight();
     }
 
     /*package*/ static void translate(Canvas thisCanvas, float dx, float dy) {
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
-        canvasDelegate.getGcSnapshot().translate(dx, dy);
+        canvasDelegate.getSnapshot().translate(dx, dy);
     }
 
     /*package*/ static void rotate(Canvas thisCanvas, float degrees) {
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
-        canvasDelegate.getGcSnapshot().rotate(Math.toRadians(degrees));
+        canvasDelegate.getSnapshot().rotate(Math.toRadians(degrees));
     }
 
     /*package*/ static void scale(Canvas thisCanvas, float sx, float sy) {
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
-        canvasDelegate.getGcSnapshot().scale(sx, sy);
+        canvasDelegate.getSnapshot().scale(sx, sy);
     }
 
     /*package*/ static void skew(Canvas thisCanvas, float kx, float ky) {
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
         // get the current top graphics2D object.
-        GcSnapshot g = canvasDelegate.getGcSnapshot();
+        GcSnapshot g = canvasDelegate.getSnapshot();
 
         // get its current matrix
         AffineTransform currentTx = g.getTransform();
@@ -182,7 +189,6 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return false;
         }
 
@@ -203,7 +209,6 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return 0;
         }
 
@@ -214,7 +219,6 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
@@ -225,18 +229,16 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return 0;
         }
 
-        return canvasDelegate.getGcSnapshot().size();
+        return canvasDelegate.getSnapshot().size();
     }
 
     /*package*/ static void restoreToCount(Canvas thisCanvas, int saveCount) {
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
@@ -254,38 +256,22 @@
         throw new UnsupportedOperationException();
     }
 
-    /*package*/ static void drawLines(Canvas thisCanvas, float[] pts, int offset, int count,
+    /*package*/ static void drawLines(Canvas thisCanvas,
+            final float[] pts, final int offset, final int count,
             Paint paint) {
-        // get the delegate from the native int.
-        Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
-        if (canvasDelegate == null) {
-            assert false;
-            return;
-        }
-
-        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint.mNativePaint);
-        if (paintDelegate == null) {
-            assert false;
-            return;
-        }
-
-        // get a Graphics2D object configured with the drawing parameters.
-        Graphics2D g = canvasDelegate.createCustomGraphics(paintDelegate);
-
-        try {
-            for (int i = 0 ; i < count ; i += 4) {
-                g.drawLine((int)pts[i + offset], (int)pts[i + offset + 1],
-                        (int)pts[i + offset + 2], (int)pts[i + offset + 3]);
-            }
-        } finally {
-            // dispose Graphics2D object
-            g.dispose();
-        }
+        draw(thisCanvas.mNativeCanvas, paint.mNativePaint, false /*compositeOnly*/,
+                false /*forceSrcMode*/, new GcSnapshot.Drawable() {
+                    public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                        for (int i = 0 ; i < count ; i += 4) {
+                            graphics.drawLine((int)pts[i + offset], (int)pts[i + offset + 1],
+                                    (int)pts[i + offset + 2], (int)pts[i + offset + 3]);
+                        }
+                    }
+                });
     }
 
     /*package*/ static void freeCaches() {
-        // FIXME
-        throw new UnsupportedOperationException();
+        // nothing to be done here.
     }
 
     /*package*/ static int initRaster(int nativeBitmapOrZero) {
@@ -294,7 +280,7 @@
             Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(nativeBitmapOrZero);
 
             // create a new Canvas_Delegate with the given bitmap and return its new native int.
-            Canvas_Delegate newDelegate = new Canvas_Delegate(bitmapDelegate.getImage());
+            Canvas_Delegate newDelegate = new Canvas_Delegate(bitmapDelegate);
 
             return sManager.addDelegate(newDelegate);
         } else {
@@ -309,45 +295,74 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
         // get the delegate from the native int.
         Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap);
         if (bitmapDelegate == null) {
-            assert false;
             return;
         }
 
-        canvasDelegate.setBitmap(bitmapDelegate.getImage());
+        canvasDelegate.setBitmap(bitmapDelegate);
     }
 
     /*package*/ static int native_saveLayer(int nativeCanvas, RectF bounds,
                                                int paint, int layerFlags) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        // get the delegate from the native int.
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
+        if (canvasDelegate == null) {
+            return 0;
+        }
+
+        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
+        if (paintDelegate == null) {
+            return 0;
+        }
+
+        return canvasDelegate.saveLayer(bounds, paintDelegate, layerFlags);
     }
 
     /*package*/ static int native_saveLayer(int nativeCanvas, float l,
                                                float t, float r, float b,
                                                int paint, int layerFlags) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        // get the delegate from the native int.
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
+        if (canvasDelegate == null) {
+            return 0;
+        }
+
+        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
+        if (paintDelegate == null) {
+            return 0;
+        }
+
+        return canvasDelegate.saveLayer(new RectF(l, t, r, b),
+                paintDelegate, layerFlags);
     }
 
     /*package*/ static int native_saveLayerAlpha(int nativeCanvas,
                                                     RectF bounds, int alpha,
                                                     int layerFlags) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        // get the delegate from the native int.
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
+        if (canvasDelegate == null) {
+            return 0;
+        }
+
+        return canvasDelegate.saveLayerAlpha(bounds, alpha, layerFlags);
     }
 
     /*package*/ static int native_saveLayerAlpha(int nativeCanvas, float l,
                                                     float t, float r, float b,
                                                     int alpha, int layerFlags) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        // get the delegate from the native int.
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
+        if (canvasDelegate == null) {
+            return 0;
+        }
+
+        return canvasDelegate.saveLayerAlpha(new RectF(l, t, r, b), alpha, layerFlags);
     }
 
 
@@ -355,18 +370,16 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
         Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(nMatrix);
         if (matrixDelegate == null) {
-            assert false;
             return;
         }
 
         // get the current top graphics2D object.
-        GcSnapshot snapshot = canvasDelegate.getGcSnapshot();
+        GcSnapshot snapshot = canvasDelegate.getSnapshot();
 
         // get its current matrix
         AffineTransform currentTx = snapshot.getTransform();
@@ -384,16 +397,16 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
         if (canvasDelegate == null) {
-            assert false;
+            return;
         }
 
         Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(nMatrix);
         if (matrixDelegate == null) {
-            assert false;
+            return;
         }
 
         // get the current top graphics2D object.
-        GcSnapshot snapshot = canvasDelegate.getGcSnapshot();
+        GcSnapshot snapshot = canvasDelegate.getSnapshot();
 
         // get the AffineTransform of the given matrix
         AffineTransform matrixTx = matrixDelegate.getAffineTransform();
@@ -403,9 +416,9 @@
 
         if (matrixDelegate.hasPerspective()) {
             assert false;
-            Bridge.getLog().warning(null,
+            Bridge.getLog().fidelityWarning(null,
                     "android.graphics.Canvas#setMatrix(android.graphics.Matrix) only " +
-                    "supports affine transformations in the Layout Preview.");
+                    "supports affine transformations in the Layout Preview.", null);
         }
     }
 
@@ -417,7 +430,7 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
         if (canvasDelegate == null) {
-            assert false;
+            return false;
         }
 
         return canvasDelegate.clipRect(left, top, right, bottom, regionOp);
@@ -426,21 +439,55 @@
     /*package*/ static boolean native_clipPath(int nativeCanvas,
                                                   int nativePath,
                                                   int regionOp) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
+        if (canvasDelegate == null) {
+            return true;
+        }
+
+        Path_Delegate pathDelegate = Path_Delegate.getDelegate(nativePath);
+        if (pathDelegate == null) {
+            return true;
+        }
+
+        return canvasDelegate.mSnapshot.clip(pathDelegate.getJavaShape(), regionOp);
     }
 
     /*package*/ static boolean native_clipRegion(int nativeCanvas,
                                                     int nativeRegion,
                                                     int regionOp) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
+        if (canvasDelegate == null) {
+            return true;
+        }
+
+        Region_Delegate region = Region_Delegate.getDelegate(nativeRegion);
+        if (region == null) {
+            return true;
+        }
+
+        return canvasDelegate.mSnapshot.clip(region.getJavaArea(), regionOp);
     }
 
     /*package*/ static void nativeSetDrawFilter(int nativeCanvas,
                                                    int nativeFilter) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
+        if (canvasDelegate == null) {
+            return;
+        }
+
+        canvasDelegate.mDrawFilter = nativeFilter;
+
+        // get the delegate only because we don't support them at all for the moment, so
+        // we can display the message now.
+
+        DrawFilter_Delegate filterDelegate = DrawFilter_Delegate.getDelegate(nativeFilter);
+        if (canvasDelegate == null) {
+            return;
+        }
+
+        if (filterDelegate.isSupported() == false) {
+            Bridge.getLog().fidelityWarning(null, filterDelegate.getSupportMessage(), null);
+        }
     }
 
     /*package*/ static boolean native_getClipBounds(int nativeCanvas,
@@ -448,11 +495,10 @@
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return false;
         }
 
-        Rectangle rect = canvasDelegate.getGcSnapshot().getClip().getBounds();
+        Rectangle rect = canvasDelegate.getSnapshot().getClip().getBounds();
         if (rect != null) {
             bounds.left = rect.x;
             bounds.top = rect.y;
@@ -505,31 +551,33 @@
         native_drawColor(nativeCanvas, color, PorterDuff.Mode.SRC_OVER.nativeInt);
     }
 
-    /*package*/ static void native_drawColor(int nativeCanvas, int color, int mode) {
+    /*package*/ static void native_drawColor(int nativeCanvas, final int color, final int mode) {
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
-        // get a new graphics context.
-        Graphics2D graphics = (Graphics2D)canvasDelegate.getGcSnapshot().create();
-        try {
-            // reset its transform just in case
-            graphics.setTransform(new AffineTransform());
+        final int w = canvasDelegate.mBitmap.getImage().getWidth();
+        final int h = canvasDelegate.mBitmap.getImage().getHeight();
+        draw(nativeCanvas, new GcSnapshot.Drawable() {
 
-            // set the color
-            graphics.setColor(new Color(color, true /*alpha*/));
+            public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                // reset its transform just in case
+                graphics.setTransform(new AffineTransform());
 
-            setModeInGraphics(graphics, mode);
+                // set the color
+                graphics.setColor(new Color(color, true /*alpha*/));
 
-            graphics.fillRect(0, 0, canvasDelegate.mBufferedImage.getWidth(),
-                    canvasDelegate.mBufferedImage.getHeight());
-        } finally {
-            // dispose Graphics2D object
-            graphics.dispose();
-        }
+                Composite composite = PorterDuffXfermode_Delegate.getComposite(
+                        PorterDuffXfermode_Delegate.getPorterDuffMode(mode), 0xFF);
+                if (composite != null) {
+                    graphics.setComposite(composite);
+                }
+
+                graphics.fillRect(0, 0, w, h);
+            }
+        });
     }
 
     /*package*/ static void native_drawPaint(int nativeCanvas, int paint) {
@@ -537,32 +585,16 @@
         throw new UnsupportedOperationException();
     }
 
-    /*package*/ static void native_drawLine(int nativeCanvas, float startX,
-                                               float startY, float stopX,
-                                               float stopY, int paint) {
-        // get the delegate from the native int.
-        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
-        if (canvasDelegate == null) {
-            assert false;
-            return;
-        }
+    /*package*/ static void native_drawLine(int nativeCanvas,
+            final float startX, final float startY, final float stopX, final float stopY,
+            int paint) {
 
-        // get the delegate from the native int.
-        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
-        if (paintDelegate == null) {
-            assert false;
-            return;
-        }
-
-        // get a Graphics2D object configured with the drawing parameters.
-        Graphics2D g = canvasDelegate.createCustomGraphics(paintDelegate);
-
-        try {
-            g.drawLine((int)startX, (int)startY, (int)stopX, (int)stopY);
-        } finally {
-            // dispose Graphics2D object
-            g.dispose();
-        }
+        draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
+                new GcSnapshot.Drawable() {
+                    public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                        graphics.drawLine((int)startX, (int)startY, (int)stopX, (int)stopY);
+                    }
+        });
     }
 
     /*package*/ static void native_drawRect(int nativeCanvas, RectF rect,
@@ -570,82 +602,51 @@
         native_drawRect(nativeCanvas, rect.left, rect.top, rect.right, rect.bottom, paint);
     }
 
-    /*package*/ static void native_drawRect(int nativeCanvas, float left,
-                                               float top, float right,
-                                               float bottom, int paint) {
-        // get the delegate from the native int.
-        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
-        if (canvasDelegate == null) {
-            assert false;
-            return;
-        }
+    /*package*/ static void native_drawRect(int nativeCanvas,
+            final float left, final float top, final float right, final float bottom, int paint) {
 
-        // get the delegate from the native int.
-        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
-        if (paintDelegate == null) {
-            assert false;
-            return;
-        }
+        draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
+                new GcSnapshot.Drawable() {
+                    public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                        int style = paint.getStyle();
 
-        if (right > left && bottom > top) {
-            // get a Graphics2D object configured with the drawing parameters.
-            Graphics2D g = canvasDelegate.createCustomGraphics(paintDelegate);
+                        // draw
+                        if (style == Paint.Style.FILL.nativeInt ||
+                                style == Paint.Style.FILL_AND_STROKE.nativeInt) {
+                            graphics.fillRect((int)left, (int)top,
+                                    (int)(right-left), (int)(bottom-top));
+                        }
 
-            try {
-                int style = paintDelegate.getStyle();
-
-                // draw
-                if (style == Paint.Style.FILL.nativeInt ||
-                        style == Paint.Style.FILL_AND_STROKE.nativeInt) {
-                    g.fillRect((int)left, (int)top, (int)(right-left), (int)(bottom-top));
-                }
-
-                if (style == Paint.Style.STROKE.nativeInt ||
-                        style == Paint.Style.FILL_AND_STROKE.nativeInt) {
-                    g.drawRect((int)left, (int)top, (int)(right-left), (int)(bottom-top));
-                }
-            } finally {
-                // dispose Graphics2D object
-                g.dispose();
-            }
-        }
+                        if (style == Paint.Style.STROKE.nativeInt ||
+                                style == Paint.Style.FILL_AND_STROKE.nativeInt) {
+                            graphics.drawRect((int)left, (int)top,
+                                    (int)(right-left), (int)(bottom-top));
+                        }
+                    }
+        });
     }
 
-    /*package*/ static void native_drawOval(int nativeCanvas, RectF oval,
-                                               int paint) {
-        // get the delegate from the native int.
-        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
-        if (canvasDelegate == null) {
-            assert false;
-            return;
-        }
-
-        // get the delegate from the native int.
-        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
-        if (paintDelegate == null) {
-            assert false;
-            return;
-        }
-
+    /*package*/ static void native_drawOval(int nativeCanvas, final RectF oval, int paint) {
         if (oval.right > oval.left && oval.bottom > oval.top) {
-            // get a Graphics2D object configured with the drawing parameters.
-            Graphics2D g = canvasDelegate.createCustomGraphics(paintDelegate);
+            draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
+                    new GcSnapshot.Drawable() {
+                        public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                            int style = paint.getStyle();
 
-            int style = paintDelegate.getStyle();
+                            // draw
+                            if (style == Paint.Style.FILL.nativeInt ||
+                                    style == Paint.Style.FILL_AND_STROKE.nativeInt) {
+                                graphics.fillOval((int)oval.left, (int)oval.top,
+                                        (int)oval.width(), (int)oval.height());
+                            }
 
-            // draw
-            if (style == Paint.Style.FILL.nativeInt ||
-                    style == Paint.Style.FILL_AND_STROKE.nativeInt) {
-                g.fillOval((int)oval.left, (int)oval.top, (int)oval.width(), (int)oval.height());
-            }
-
-            if (style == Paint.Style.STROKE.nativeInt ||
-                    style == Paint.Style.FILL_AND_STROKE.nativeInt) {
-                g.drawOval((int)oval.left, (int)oval.top, (int)oval.width(), (int)oval.height());
-            }
-
-            // dispose Graphics2D object
-            g.dispose();
+                            if (style == Paint.Style.STROKE.nativeInt ||
+                                    style == Paint.Style.FILL_AND_STROKE.nativeInt) {
+                                graphics.drawOval((int)oval.left, (int)oval.top,
+                                        (int)oval.width(), (int)oval.height());
+                            }
+                        }
+            });
         }
     }
 
@@ -665,52 +666,57 @@
     }
 
     /*package*/ static void native_drawRoundRect(int nativeCanvas,
-                                                    RectF rect, float rx,
-                                                    float ry, int paint) {
-        // get the delegate from the native int.
-        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
-        if (canvasDelegate == null) {
-            assert false;
-            return;
-        }
+            final RectF rect, final float rx, final float ry, int paint) {
 
-        // get the delegate from the native int.
-        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
-        if (paintDelegate == null) {
-            assert false;
-            return;
-        }
+        draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
+                new GcSnapshot.Drawable() {
+                    public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                        int style = paint.getStyle();
 
-        if (rect.right > rect.left && rect.bottom > rect.top) {
-            // get a Graphics2D object configured with the drawing parameters.
-            Graphics2D g = canvasDelegate.createCustomGraphics(paintDelegate);
+                        // draw
+                        if (style == Paint.Style.FILL.nativeInt ||
+                                style == Paint.Style.FILL_AND_STROKE.nativeInt) {
+                            graphics.fillRoundRect(
+                                    (int)rect.left, (int)rect.top,
+                                    (int)rect.width(), (int)rect.height(),
+                                    (int)rx, (int)ry);
+                        }
 
-            int style = paintDelegate.getStyle();
-
-            // draw
-            if (style == Paint.Style.FILL.nativeInt ||
-                    style == Paint.Style.FILL_AND_STROKE.nativeInt) {
-                g.fillRoundRect(
-                        (int)rect.left, (int)rect.top, (int)rect.width(), (int)rect.height(),
-                        (int)rx, (int)ry);
-            }
-
-            if (style == Paint.Style.STROKE.nativeInt ||
-                    style == Paint.Style.FILL_AND_STROKE.nativeInt) {
-                g.drawRoundRect(
-                        (int)rect.left, (int)rect.top, (int)rect.width(), (int)rect.height(),
-                        (int)rx, (int)ry);
-            }
-
-            // dispose Graphics2D object
-            g.dispose();
-        }
+                        if (style == Paint.Style.STROKE.nativeInt ||
+                                style == Paint.Style.FILL_AND_STROKE.nativeInt) {
+                            graphics.drawRoundRect(
+                                    (int)rect.left, (int)rect.top,
+                                    (int)rect.width(), (int)rect.height(),
+                                    (int)rx, (int)ry);
+                        }
+                    }
+        });
     }
 
     /*package*/ static void native_drawPath(int nativeCanvas, int path,
                                                int paint) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        final Path_Delegate pathDelegate = Path_Delegate.getDelegate(path);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
+                new GcSnapshot.Drawable() {
+                    public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                        Shape shape = pathDelegate.getJavaShape();
+                        int style = paint.getStyle();
+
+                        if (style == Paint.Style.FILL.nativeInt ||
+                                style == Paint.Style.FILL_AND_STROKE.nativeInt) {
+                            graphics.fill(shape);
+                        }
+
+                        if (style == Paint.Style.STROKE.nativeInt ||
+                                style == Paint.Style.FILL_AND_STROKE.nativeInt) {
+                            graphics.draw(shape);
+                        }
+                    }
+        });
     }
 
     /*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap,
@@ -719,8 +725,19 @@
                                                  int canvasDensity,
                                                  int screenDensity,
                                                  int bitmapDensity) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        // get the delegate from the native int.
+        Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap);
+        if (bitmapDelegate == null) {
+            return;
+        }
+
+        BufferedImage image = bitmapDelegate.getImage();
+        float right = left + image.getWidth();
+        float bottom = top + image.getHeight();
+
+        drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
+                0, 0, image.getWidth(), image.getHeight(),
+                (int)left, (int)top, (int)right, (int)bottom);
     }
 
     /*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap,
@@ -731,18 +748,17 @@
         // get the delegate from the native int.
         Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap);
         if (bitmapDelegate == null) {
-            assert false;
             return;
         }
 
         BufferedImage image = bitmapDelegate.getImage();
 
         if (src == null) {
-            drawBitmap(nativeCanvas, image, nativePaintOrZero,
+            drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
                     0, 0, image.getWidth(), image.getHeight(),
                     (int)dst.left, (int)dst.top, (int)dst.right, (int)dst.bottom);
         } else {
-            drawBitmap(nativeCanvas, image, nativePaintOrZero,
+            drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
                     src.left, src.top, src.width(), src.height(),
                     (int)dst.left, (int)dst.top, (int)dst.right, (int)dst.bottom);
         }
@@ -756,36 +772,83 @@
         // get the delegate from the native int.
         Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap);
         if (bitmapDelegate == null) {
-            assert false;
             return;
         }
 
         BufferedImage image = bitmapDelegate.getImage();
 
         if (src == null) {
-            drawBitmap(nativeCanvas, image, nativePaintOrZero,
+            drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
                     0, 0, image.getWidth(), image.getHeight(),
                     dst.left, dst.top, dst.right, dst.bottom);
         } else {
-            drawBitmap(nativeCanvas, image, nativePaintOrZero,
+            drawBitmap(nativeCanvas, bitmapDelegate, nativePaintOrZero,
                     src.left, src.top, src.width(), src.height(),
                     dst.left, dst.top, dst.right, dst.bottom);
         }
     }
 
     /*package*/ static void native_drawBitmap(int nativeCanvas, int[] colors,
-                                                int offset, int stride, float x,
-                                                 float y, int width, int height,
+                                                int offset, int stride, final float x,
+                                                 final float y, int width, int height,
                                                  boolean hasAlpha,
                                                  int nativePaintOrZero) {
-        // FIXME
-        throw new UnsupportedOperationException();
+
+        // create a temp BufferedImage containing the content.
+        final BufferedImage image = new BufferedImage(width, height,
+                hasAlpha ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB);
+        image.setRGB(0, 0, width, height, colors, offset, stride);
+
+        draw(nativeCanvas, nativePaintOrZero, true /*compositeOnly*/, false /*forceSrcMode*/,
+                new GcSnapshot.Drawable() {
+                    public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                        if (paint != null && paint.isFilterBitmap()) {
+                            graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+                                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+                        }
+
+                        graphics.drawImage(image, (int) x, (int) y, null);
+                    }
+        });
     }
 
     /*package*/ static void nativeDrawBitmapMatrix(int nCanvas, int nBitmap,
                                                       int nMatrix, int nPaint) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        // get the delegate from the native int.
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
+        if (canvasDelegate == null) {
+            return;
+        }
+
+        // get the delegate from the native int, which can be null
+        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(nPaint);
+
+        // get the delegate from the native int.
+        Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(nBitmap);
+        if (bitmapDelegate == null) {
+            return;
+        }
+
+        final BufferedImage image = getImageToDraw(bitmapDelegate, paintDelegate, sBoolOut);
+
+        Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(nMatrix);
+        if (matrixDelegate == null) {
+            return;
+        }
+
+        final AffineTransform mtx = matrixDelegate.getAffineTransform();
+
+        canvasDelegate.getSnapshot().draw(new GcSnapshot.Drawable() {
+                public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                    if (paint != null && paint.isFilterBitmap()) {
+                        graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+                                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+                    }
+
+                    //FIXME add support for canvas, screen and bitmap densities.
+                    graphics.drawImage(image, mtx, null);
+                }
+        }, paintDelegate, true /*compositeOnly*/, false /*forceSrcMode*/);
     }
 
     /*package*/ static void nativeDrawBitmapMesh(int nCanvas, int nBitmap,
@@ -804,116 +867,103 @@
         throw new UnsupportedOperationException();
     }
 
-    /*package*/ static void native_drawText(int nativeCanvas, char[] text,
-                                               int index, int count, float x,
-                                               float y, int flags, int paint) {
-        // WARNING: the logic in this method is similar to Paint.measureText.
-        // Any change to this method should be reflected in Paint.measureText
-
-        // get the delegate from the native int.
-        Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
-        if (canvasDelegate == null) {
-            assert false;
-            return;
-        }
-
-        // get the delegate from the native int.
-        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
-        if (paintDelegate == null) {
-            assert false;
-            return;
-        }
-
-        Graphics2D g = (Graphics2D) canvasDelegate.createCustomGraphics(paintDelegate);
-        try {
-            // Paint.TextAlign indicates how the text is positioned relative to X.
-            // LEFT is the default and there's nothing to do.
-            if (paintDelegate.getTextAlign() != Paint.Align.LEFT.nativeInt) {
-                float m = paintDelegate.measureText(text, index, count);
-                if (paintDelegate.getTextAlign() == Paint.Align.CENTER.nativeInt) {
-                    x -= m / 2;
-                } else if (paintDelegate.getTextAlign() == Paint.Align.RIGHT.nativeInt) {
-                    x -= m;
-                }
-            }
-
-            List<FontInfo> fonts = paintDelegate.getFonts();
-
-            if (fonts.size() > 0) {
-                FontInfo mainFont = fonts.get(0);
-                int i = index;
-                int lastIndex = index + count;
-                while (i < lastIndex) {
-                    // always start with the main font.
-                    int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex);
-                    if (upTo == -1) {
-                        // draw all the rest and exit.
-                        g.setFont(mainFont.mFont);
-                        g.drawChars(text, i, lastIndex - i, (int)x, (int)y);
-                        return;
-                    } else if (upTo > 0) {
-                        // draw what's possible
-                        g.setFont(mainFont.mFont);
-                        g.drawChars(text, i, upTo - i, (int)x, (int)y);
-
-                        // compute the width that was drawn to increase x
-                        x += mainFont.mMetrics.charsWidth(text, i, upTo - i);
-
-                        // move index to the first non displayed char.
-                        i = upTo;
-
-                        // don't call continue at this point. Since it is certain the main font
-                        // cannot display the font a index upTo (now ==i), we move on to the
-                        // fallback fonts directly.
+    /*package*/ static void native_drawText(int nativeCanvas,
+            final char[] text, final int index, final int count,
+            final float startX, final float startY, int flags, int paint) {
+        draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
+                new GcSnapshot.Drawable() {
+            public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                // WARNING: the logic in this method is similar to Paint.measureText.
+                // Any change to this method should be reflected in Paint.measureText
+                // Paint.TextAlign indicates how the text is positioned relative to X.
+                // LEFT is the default and there's nothing to do.
+                float x = startX;
+                float y = startY;
+                if (paint.getTextAlign() != Paint.Align.LEFT.nativeInt) {
+                    float m = paint.measureText(text, index, count);
+                    if (paint.getTextAlign() == Paint.Align.CENTER.nativeInt) {
+                        x -= m / 2;
+                    } else if (paint.getTextAlign() == Paint.Align.RIGHT.nativeInt) {
+                        x -= m;
                     }
+                }
 
-                    // no char supported, attempt to read the next char(s) with the
-                    // fallback font. In this case we only test the first character
-                    // and then go back to test with the main font.
-                    // Special test for 2-char characters.
-                    boolean foundFont = false;
-                    for (int f = 1 ; f < fonts.size() ; f++) {
-                        FontInfo fontInfo = fonts.get(f);
+                List<FontInfo> fonts = paint.getFonts();
 
-                        // need to check that the font can display the character. We test
-                        // differently if the char is a high surrogate.
-                        int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1;
-                        upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount);
+                if (fonts.size() > 0) {
+                    FontInfo mainFont = fonts.get(0);
+                    int i = index;
+                    int lastIndex = index + count;
+                    while (i < lastIndex) {
+                        // always start with the main font.
+                        int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex);
                         if (upTo == -1) {
-                            // draw that char
-                            g.setFont(fontInfo.mFont);
-                            g.drawChars(text, i, charCount, (int)x, (int)y);
+                            // draw all the rest and exit.
+                            graphics.setFont(mainFont.mFont);
+                            graphics.drawChars(text, i, lastIndex - i, (int)x, (int)y);
+                            return;
+                        } else if (upTo > 0) {
+                            // draw what's possible
+                            graphics.setFont(mainFont.mFont);
+                            graphics.drawChars(text, i, upTo - i, (int)x, (int)y);
 
-                            // update x
-                            x += fontInfo.mMetrics.charsWidth(text, i, charCount);
+                            // compute the width that was drawn to increase x
+                            x += mainFont.mMetrics.charsWidth(text, i, upTo - i);
 
-                            // update the index in the text, and move on
+                            // move index to the first non displayed char.
+                            i = upTo;
+
+                            // don't call continue at this point. Since it is certain the main font
+                            // cannot display the font a index upTo (now ==i), we move on to the
+                            // fallback fonts directly.
+                        }
+
+                        // no char supported, attempt to read the next char(s) with the
+                        // fallback font. In this case we only test the first character
+                        // and then go back to test with the main font.
+                        // Special test for 2-char characters.
+                        boolean foundFont = false;
+                        for (int f = 1 ; f < fonts.size() ; f++) {
+                            FontInfo fontInfo = fonts.get(f);
+
+                            // need to check that the font can display the character. We test
+                            // differently if the char is a high surrogate.
+                            int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1;
+                            upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount);
+                            if (upTo == -1) {
+                                // draw that char
+                                graphics.setFont(fontInfo.mFont);
+                                graphics.drawChars(text, i, charCount, (int)x, (int)y);
+
+                                // update x
+                                x += fontInfo.mMetrics.charsWidth(text, i, charCount);
+
+                                // update the index in the text, and move on
+                                i += charCount;
+                                foundFont = true;
+                                break;
+
+                            }
+                        }
+
+                        // in case no font can display the char, display it with the main font.
+                        // (it'll put a square probably)
+                        if (foundFont == false) {
+                            int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1;
+
+                            graphics.setFont(mainFont.mFont);
+                            graphics.drawChars(text, i, charCount, (int)x, (int)y);
+
+                            // measure it to advance x
+                            x += mainFont.mMetrics.charsWidth(text, i, charCount);
+
+                            // and move to the next chars.
                             i += charCount;
-                            foundFont = true;
-                            break;
-
                         }
                     }
-
-                    // in case no font can display the char, display it with the main font.
-                    // (it'll put a square probably)
-                    if (foundFont == false) {
-                        int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1;
-
-                        g.setFont(mainFont.mFont);
-                        g.drawChars(text, i, charCount, (int)x, (int)y);
-
-                        // measure it to advance x
-                        x += mainFont.mMetrics.charsWidth(text, i, charCount);
-
-                        // and move to the next chars.
-                        i += charCount;
-                    }
                 }
             }
-        } finally {
-            g.dispose();
-        }
+        });
     }
 
     /*package*/ static void native_drawText(int nativeCanvas, String text,
@@ -986,7 +1036,6 @@
         // get the delegate from the native int so that it can be disposed.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
@@ -998,11 +1047,47 @@
 
     // ---- Private delegate/helper methods ----
 
-    private Canvas_Delegate(BufferedImage image) {
-        setBitmap(image);
+    /**
+     * Executes a {@link GcSnapshot.Drawable} with a given canvas and paint.
+     * <p>Note that the drawable may actually be executed several times if there are
+     * layers involved (see {@link #saveLayer(RectF, int, int)}.
+     */
+    private static void draw(int nCanvas, int nPaint, boolean compositeOnly, boolean forceSrcMode,
+            GcSnapshot.Drawable drawable) {
+        // get the delegate from the native int.
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
+        if (canvasDelegate == null) {
+            return;
+        }
+
+        // get the paint which can be null if nPaint is 0;
+        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(nPaint);
+
+        canvasDelegate.getSnapshot().draw(drawable, paintDelegate, compositeOnly, forceSrcMode);
+    }
+
+    /**
+     * Executes a {@link GcSnapshot.Drawable} with a given canvas. No paint object will be provided
+     * to {@link GcSnapshot.Drawable#draw(Graphics2D, Paint_Delegate)}.
+     * <p>Note that the drawable may actually be executed several times if there are
+     * layers involved (see {@link #saveLayer(RectF, int, int)}.
+     */
+    private static void draw(int nCanvas, GcSnapshot.Drawable drawable) {
+        // get the delegate from the native int.
+        Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
+        if (canvasDelegate == null) {
+            return;
+        }
+
+        canvasDelegate.mSnapshot.draw(drawable);
+    }
+
+    private Canvas_Delegate(Bitmap_Delegate bitmap) {
+        mSnapshot = GcSnapshot.createDefaultSnapshot(mBitmap = bitmap);
     }
 
     private Canvas_Delegate() {
+        mSnapshot = GcSnapshot.createDefaultSnapshot(null /*image*/);
     }
 
     /**
@@ -1016,8 +1101,23 @@
         // get the current save count
         int count = mSnapshot.size();
 
-        // create a new snapshot and add it to the stack
-        mSnapshot = new GcSnapshot(mSnapshot, saveFlags);
+        mSnapshot = mSnapshot.save(saveFlags);
+
+        // return the old save count
+        return count;
+    }
+
+    private int saveLayerAlpha(RectF rect, int alpha, int saveFlags) {
+        Paint_Delegate paint = new Paint_Delegate();
+        paint.setAlpha(alpha);
+        return saveLayer(rect, paint, saveFlags);
+    }
+
+    private int saveLayer(RectF rect, Paint_Delegate paint, int saveFlags) {
+        // get the current save count
+        int count = mSnapshot.size();
+
+        mSnapshot = mSnapshot.saveLayer(rect, paint, saveFlags);
 
         // return the old save count
         return count;
@@ -1043,204 +1143,103 @@
         return mSnapshot.clipRect(left, top, right, bottom, regionOp);
     }
 
-    private void setBitmap(BufferedImage image) {
-        mBufferedImage = image;
+    private void setBitmap(Bitmap_Delegate bitmap) {
+        mBitmap = bitmap;
         assert mSnapshot.size() == 1;
-        mSnapshot.setGraphics2D(mBufferedImage.createGraphics());
+        mSnapshot.setBitmap(mBitmap);
     }
 
-    /**
-     * Creates a new {@link Graphics2D} based on the {@link Paint} parameters.
-     * <p/>The object must be disposed ({@link Graphics2D#dispose()}) after being used.
-     */
-    /*package*/ Graphics2D createCustomGraphics(Paint_Delegate paint) {
-        // make new one
-        Graphics2D g = getGcSnapshot().create();
-
-        // configure it
-
-        if (paint.isAntiAliased()) {
-            g.setRenderingHint(
-                    RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-            g.setRenderingHint(
-                    RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
-        }
-
-        boolean useColorPaint = true;
-
-        // get the shader first, as it'll replace the color if it can be used it.
-        Shader_Delegate shaderDelegate = Shader_Delegate.getDelegate(paint.getShader());
-        if (shaderDelegate != null) {
-            java.awt.Paint shaderPaint = shaderDelegate.getJavaPaint();
-            assert shaderPaint != null;
-            if (shaderPaint != null) {
-                g.setPaint(shaderPaint);
-                useColorPaint = false;
-            } else {
-                Bridge.getLog().warning(null,
-                        String.format(
-                            "Shader '%1$s' is not supported in the Layout Preview.",
-                            shaderDelegate.getClass().getCanonicalName()));
-            }
-        }
-
-        if (useColorPaint) {
-            g.setColor(new Color(paint.getColor(), true /*hasAlpha*/));
-        }
-
-        int style = paint.getStyle();
-        if (style == Paint.Style.STROKE.nativeInt ||
-                style == Paint.Style.FILL_AND_STROKE.nativeInt) {
-
-            PathEffect_Delegate effectDelegate = PathEffect_Delegate.getDelegate(
-                    paint.getPathEffect());
-
-            if (effectDelegate instanceof DashPathEffect_Delegate) {
-                DashPathEffect_Delegate dpe = (DashPathEffect_Delegate)effectDelegate;
-                g.setStroke(new BasicStroke(
-                        paint.getStrokeWidth(),
-                        paint.getJavaCap(),
-                        paint.getJavaJoin(),
-                        paint.getStrokeMiter(),
-                        dpe.getIntervals(),
-                        dpe.getPhase()));
-            } else {
-                g.setStroke(new BasicStroke(
-                        paint.getStrokeWidth(),
-                        paint.getJavaCap(),
-                        paint.getJavaJoin(),
-                        paint.getStrokeMiter()));
-            }
-        }
-
-        Xfermode_Delegate xfermodeDelegate = Xfermode_Delegate.getDelegate(paint.getXfermode());
-        if (xfermodeDelegate instanceof PorterDuffXfermode_Delegate) {
-            int mode = ((PorterDuffXfermode_Delegate)xfermodeDelegate).getMode();
-
-            setModeInGraphics(g, mode);
-        } else {
-            // default mode is src_over
-            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
-
-            // if xfermode wasn't null, then it's something we don't support. log it.
-            if (xfermodeDelegate != null) {
-                assert false;
-                Bridge.getLog().warning(null,
-                        String.format(
-                            "Xfermode '%1$s' is not supported in the Layout Preview.",
-                            xfermodeDelegate.getClass().getCanonicalName()));
-            }
-        }
-
-        return g;
-    }
-
-    private static void setModeInGraphics(Graphics2D g, int mode) {
-        for (PorterDuff.Mode m : PorterDuff.Mode.values()) {
-            if (m.nativeInt == mode) {
-                setModeInGraphics(g, m);
-                return;
-            }
-        }
-    }
-
-    private static void setModeInGraphics(Graphics2D g, PorterDuff.Mode mode) {
-        switch (mode) {
-            case CLEAR:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 1.0f /*alpha*/));
-                break;
-            case DARKEN:
-                break;
-            case DST:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST, 1.0f /*alpha*/));
-                break;
-            case DST_ATOP:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_ATOP, 1.0f /*alpha*/));
-                break;
-            case DST_IN:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 1.0f /*alpha*/));
-                break;
-            case DST_OUT:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_OUT, 1.0f /*alpha*/));
-                break;
-            case DST_OVER:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_OVER, 1.0f /*alpha*/));
-                break;
-            case LIGHTEN:
-                break;
-            case MULTIPLY:
-                break;
-            case SCREEN:
-                break;
-            case SRC:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f /*alpha*/));
-                break;
-            case SRC_ATOP:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1.0f /*alpha*/));
-                break;
-            case SRC_IN:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 1.0f /*alpha*/));
-                break;
-            case SRC_OUT:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OUT, 1.0f /*alpha*/));
-                break;
-            case SRC_OVER:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f /*alpha*/));
-                break;
-            case XOR:
-                g.setComposite(AlphaComposite.getInstance(AlphaComposite.XOR, 1.0f /*alpha*/));
-                break;
-        }
-    }
-
-
     private static void drawBitmap(
             int nativeCanvas,
-            BufferedImage image,
+            Bitmap_Delegate bitmap,
             int nativePaintOrZero,
-            int sleft, int stop, int sright, int sbottom,
-            int dleft, int dtop, int dright, int dbottom) {
+            final int sleft, final int stop, final int sright, final int sbottom,
+            final int dleft, final int dtop, final int dright, final int dbottom) {
         // get the delegate from the native int.
         Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
         if (canvasDelegate == null) {
-            assert false;
             return;
         }
 
-        // get the delegate from the native int.
-        Paint_Delegate paintDelegate = null;
-        if (nativePaintOrZero > 0) {
-            paintDelegate = Paint_Delegate.getDelegate(nativePaintOrZero);
-            if (paintDelegate == null) {
-                assert false;
-                return;
-            }
-        }
+        // get the paint, which could be null if the int is 0
+        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(nativePaintOrZero);
 
-        drawBitmap(canvasDelegate, image, paintDelegate,
-                sleft, stop, sright, sbottom,
-                dleft, dtop, dright, dbottom);
+        final BufferedImage image = getImageToDraw(bitmap, paintDelegate, sBoolOut);
+
+        draw(nativeCanvas, nativePaintOrZero, true /*compositeOnly*/, sBoolOut[0],
+                new GcSnapshot.Drawable() {
+                    public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                        if (paint != null && paint.isFilterBitmap()) {
+                            graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+                                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+                        }
+
+                        //FIXME add support for canvas, screen and bitmap densities.
+                        graphics.drawImage(image, dleft, dtop, dright, dbottom,
+                                sleft, stop, sright, sbottom, null);
+                    }
+        });
     }
 
-    private static void drawBitmap(
-            Canvas_Delegate canvasDelegate,
-            BufferedImage image,
-            Paint_Delegate paintDelegate,
-            int sleft, int stop, int sright, int sbottom,
-            int dleft, int dtop, int dright, int dbottom) {
 
-        Graphics2D g = canvasDelegate.getGcSnapshot().create();
-        try {
-            if (paintDelegate != null && paintDelegate.isFilterBitmap()) {
-                g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
-                        RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+    /**
+     * Returns a BufferedImage ready for drawing, based on the bitmap and paint delegate.
+     * The image returns, through a 1-size boolean array, whether the drawing code should
+     * use a SRC composite no matter what the paint says.
+     *
+     * @param bitmap the bitmap
+     * @param paint the paint that will be used to draw
+     * @param forceSrcMode whether the composite will have to be SRC
+     * @return the image to draw
+     */
+    private static BufferedImage getImageToDraw(Bitmap_Delegate bitmap, Paint_Delegate paint,
+            boolean[] forceSrcMode) {
+        BufferedImage image = bitmap.getImage();
+        forceSrcMode[0] = false;
+
+        // if the bitmap config is alpha_8, then we erase all color value from it
+        // before drawing it.
+        if (bitmap.getConfig() == Bitmap.Config.ALPHA_8) {
+            fixAlpha8Bitmap(image);
+        } else if (bitmap.hasAlpha() == false) {
+            // hasAlpha is merely a rendering hint. There can in fact be alpha values
+            // in the bitmap but it should be ignored at drawing time.
+            // There is two ways to do this:
+            // - override the composite to be SRC. This can only be used if the composite
+            //   was going to be SRC or SRC_OVER in the first place
+            // - Create a different bitmap to draw in which all the alpha channel values is set
+            //   to 0xFF.
+            if (paint != null) {
+                Xfermode_Delegate xfermodeDelegate = paint.getXfermode();
+                if (xfermodeDelegate instanceof PorterDuffXfermode_Delegate) {
+                    PorterDuff.Mode mode =
+                        ((PorterDuffXfermode_Delegate)xfermodeDelegate).getMode();
+
+                    forceSrcMode[0] = mode == PorterDuff.Mode.SRC_OVER ||
+                            mode == PorterDuff.Mode.SRC;
+                }
             }
 
-            g.drawImage(image, dleft, dtop, dright, dbottom,
-                    sleft, stop, sright, sbottom, null);
-        } finally {
-            g.dispose();
+            // if we can't force SRC mode, then create a temp bitmap of TYPE_RGB
+            if (forceSrcMode[0] == false) {
+                image = Bitmap_Delegate.createCopy(image, BufferedImage.TYPE_INT_RGB, 0xFF);
+            }
         }
+
+        return image;
+    }
+
+    private static void fixAlpha8Bitmap(final BufferedImage image) {
+        int w = image.getWidth();
+        int h = image.getHeight();
+        int[] argb = new int[w * h];
+        image.getRGB(0, 0, image.getWidth(), image.getHeight(), argb, 0, image.getWidth());
+
+        final int length = argb.length;
+        for (int i = 0 ; i < length; i++) {
+            argb[i] &= 0xFF000000;
+        }
+        image.setRGB(0, 0, w, h, argb, 0, w);
     }
 }
 
diff --git a/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java
new file mode 100644
index 0000000..3df170f
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java
@@ -0,0 +1,62 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.ColorFilter
+ *
+ * Through the layoutlib_create tool, the original native methods of ColorFilter have been replaced
+ * by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original ColorFilter class.
+ *
+ * This also serve as a base class for all ColorFilter delegate classes.
+ *
+ * @see DelegateManager
+ *
+ */
+public abstract class ColorFilter_Delegate {
+
+    // ---- delegate manager ----
+    protected static final DelegateManager<ColorFilter_Delegate> sManager =
+            new DelegateManager<ColorFilter_Delegate>();
+
+    // ---- delegate helper data ----
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    public static ColorFilter_Delegate getDelegate(int nativeShader) {
+        return sManager.getDelegate(nativeShader);
+    }
+
+    public abstract boolean isSupported();
+    public abstract String getSupportMessage();
+
+    // ---- native methods ----
+
+    /*package*/ static void finalizer(int native_instance, int nativeColorFilter) {
+        sManager.removeDelegate(native_instance);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java
new file mode 100644
index 0000000..42843279
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java
@@ -0,0 +1,67 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.ColorMatrixColorFilter
+ *
+ * Through the layoutlib_create tool, the original native methods of ColorMatrixColorFilter have
+ * been replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original ColorMatrixColorFilter class.
+ *
+ * Because this extends {@link ColorFilter_Delegate}, there's no need to use a
+ * {@link DelegateManager}, as all the Shader classes will be added to the manager
+ * owned by {@link ColorFilter_Delegate}.
+ *
+ * @see ColorFilter_Delegate
+ *
+ */
+public class ColorMatrixColorFilter_Delegate extends ColorFilter_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "ColorMatrix Color Filters are not supported.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeColorMatrixFilter(float[] array) {
+        ColorMatrixColorFilter_Delegate newDelegate = new ColorMatrixColorFilter_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static int nColorMatrixFilter(int nativeFilter, float[] array) {
+        // pass
+        return 0;
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java
new file mode 100644
index 0000000..a6844d4
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java
@@ -0,0 +1,69 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import java.awt.Stroke;
+
+/**
+ * Delegate implementing the native methods of android.graphics.ComposePathEffect
+ *
+ * Through the layoutlib_create tool, the original native methods of ComposePathEffect have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original ComposePathEffect class.
+ *
+ * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
+ * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
+ *
+ * @see Shader_Delegate
+ *
+ */
+public class ComposePathEffect_Delegate extends PathEffect_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public Stroke getStroke(Paint_Delegate paint) {
+        // FIXME
+        return null;
+    }
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Compose Path Effects are not supported in Layout Preview mode.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeCreate(int outerpe, int innerpe) {
+        ComposePathEffect_Delegate newDelegate = new ComposePathEffect_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java
new file mode 100644
index 0000000..b4baa6f
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java
@@ -0,0 +1,93 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import java.awt.Paint;
+
+/**
+ * Delegate implementing the native methods of android.graphics.ComposeShader
+ *
+ * Through the layoutlib_create tool, the original native methods of ComposeShader have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original ComposeShader class.
+ *
+ * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
+ * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
+ *
+ * @see Shader_Delegate
+ *
+ */
+public class ComposeShader_Delegate extends Shader_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public Paint getJavaPaint() {
+        // FIXME
+        return null;
+    }
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Compose Shaders are not supported in Layout Preview mode.";
+    }
+
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeCreate1(int native_shaderA, int native_shaderB,
+            int native_mode) {
+        // FIXME not supported yet.
+        ComposeShader_Delegate newDelegate = new ComposeShader_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static int nativeCreate2(int native_shaderA, int native_shaderB,
+            int porterDuffMode) {
+        // FIXME not supported yet.
+        ComposeShader_Delegate newDelegate = new ComposeShader_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static int nativePostCreate1(int native_shader, int native_skiaShaderA,
+            int native_skiaShaderB, int native_mode) {
+        // pass, not needed.
+        return 0;
+    }
+
+    /*package*/ static int nativePostCreate2(int native_shader, int native_skiaShaderA,
+            int native_skiaShaderB, int porterDuffMode) {
+        // pass, not needed.
+        return 0;
+    }
+
+
+    // ---- Private delegate/helper methods ----
+
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java
new file mode 100644
index 0000000..cd08549
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java
@@ -0,0 +1,69 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import java.awt.Stroke;
+
+/**
+ * Delegate implementing the native methods of android.graphics.CornerPathEffect
+ *
+ * Through the layoutlib_create tool, the original native methods of CornerPathEffect have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original CornerPathEffect class.
+ *
+ * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
+ * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
+ *
+ * @see Shader_Delegate
+ *
+ */
+public class CornerPathEffect_Delegate extends PathEffect_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public Stroke getStroke(Paint_Delegate paint) {
+        // FIXME
+        return null;
+    }
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Corner Path Effects are not supported in Layout Preview mode.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeCreate(float radius) {
+        CornerPathEffect_Delegate newDelegate = new CornerPathEffect_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java
index 7ee72d8..5a704a7 100644
--- a/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java
@@ -18,6 +18,9 @@
 
 import com.android.layoutlib.bridge.impl.DelegateManager;
 
+import java.awt.BasicStroke;
+import java.awt.Stroke;
+
 /**
  * Delegate implementing the native methods of android.graphics.DashPathEffect
  *
@@ -32,8 +35,10 @@
  * {@link DelegateManager}, as all the PathEffect classes will be added to the manager owned by
  * {@link PathEffect_Delegate}.
  *
+ * @see PathEffect_Delegate
+ *
  */
-public class DashPathEffect_Delegate extends PathEffect_Delegate {
+public final class DashPathEffect_Delegate extends PathEffect_Delegate {
 
     // ---- delegate data ----
 
@@ -42,12 +47,26 @@
 
     // ---- Public Helper methods ----
 
-    public float[] getIntervals() {
-        return mIntervals;
+    @Override
+    public Stroke getStroke(Paint_Delegate paint) {
+        return new BasicStroke(
+                paint.getStrokeWidth(),
+                paint.getJavaCap(),
+                paint.getJavaJoin(),
+                paint.getJavaStrokeMiter(),
+                mIntervals,
+                mPhase);
     }
 
-    public float getPhase() {
-        return mPhase;
+    @Override
+    public boolean isSupported() {
+        return true;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        // no message since isSupported returns true;
+        return null;
     }
 
     // ---- native methods ----
diff --git a/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java
new file mode 100644
index 0000000..f99ab2b
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java
@@ -0,0 +1,69 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import java.awt.Stroke;
+
+/**
+ * Delegate implementing the native methods of android.graphics.DiscretePathEffect
+ *
+ * Through the layoutlib_create tool, the original native methods of DiscretePathEffect have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original DiscretePathEffect class.
+ *
+ * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
+ * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
+ *
+ * @see Shader_Delegate
+ *
+ */
+public class DiscretePathEffect_Delegate extends PathEffect_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public Stroke getStroke(Paint_Delegate paint) {
+        // FIXME
+        return null;
+    }
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Discrete Path Effects are not supported in Layout Preview mode.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeCreate(float length, float deviation) {
+        DiscretePathEffect_Delegate newDelegate = new DiscretePathEffect_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java
new file mode 100644
index 0000000..ddf20b6
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java
@@ -0,0 +1,62 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.DrawFilter
+ *
+ * Through the layoutlib_create tool, the original native methods of DrawFilter have been replaced
+ * by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original DrawFilter class.
+ *
+ * This also serve as a base class for all DrawFilter delegate classes.
+ *
+ * @see DelegateManager
+ *
+ */
+public abstract class DrawFilter_Delegate {
+
+    // ---- delegate manager ----
+    protected static final DelegateManager<DrawFilter_Delegate> sManager =
+            new DelegateManager<DrawFilter_Delegate>();
+
+    // ---- delegate helper data ----
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    public static DrawFilter_Delegate getDelegate(int nativeDrawFilter) {
+        return sManager.getDelegate(nativeDrawFilter);
+    }
+
+    public abstract boolean isSupported();
+    public abstract String getSupportMessage();
+
+    // ---- native methods ----
+
+    /*package*/ static void nativeDestructor(int nativeDrawFilter) {
+        sManager.removeDelegate(nativeDrawFilter);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java
new file mode 100644
index 0000000..82f1da3
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java
@@ -0,0 +1,63 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.EmbossMaskFilter
+ *
+ * Through the layoutlib_create tool, the original native methods of EmbossMaskFilter have
+ * been replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original EmbossMaskFilter class.
+ *
+ * Because this extends {@link MaskFilter_Delegate}, there's no need to use a
+ * {@link DelegateManager}, as all the Shader classes will be added to the manager
+ * owned by {@link MaskFilter_Delegate}.
+ *
+ * @see MaskFilter_Delegate
+ *
+ */
+public class EmbossMaskFilter_Delegate extends MaskFilter_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Emboss Mask Filters are not supported.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeConstructor(float[] direction, float ambient,
+            float specular, float blurRadius) {
+        EmbossMaskFilter_Delegate newDelegate = new EmbossMaskFilter_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java
index bc4ccd2..7a0c2f7 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java
@@ -26,6 +26,18 @@
     protected final int[] mColors;
     protected final float[] mPositions;
 
+    @Override
+    public boolean isSupported() {
+        // all gradient shaders are supported.
+        return true;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        // all gradient shaders are supported, no need for a gradient support
+        return null;
+    }
+
     /**
      * Creates the base shader and do some basic test on the parameters.
      *
diff --git a/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java
new file mode 100644
index 0000000..132004f9
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java
@@ -0,0 +1,66 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.LayerRasterizer
+ *
+ * Through the layoutlib_create tool, the original native methods of LayerRasterizer have
+ * been replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original LayerRasterizer class.
+ *
+ * Because this extends {@link Rasterizer_Delegate}, there's no need to use a
+ * {@link DelegateManager}, as all the Shader classes will be added to the manager
+ * owned by {@link Rasterizer_Delegate}.
+ *
+ * @see Rasterizer_Delegate
+ *
+ */
+public class LayerRasterizer_Delegate extends Rasterizer_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Layer Rasterizers are not supported.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeConstructor() {
+        LayerRasterizer_Delegate newDelegate = new LayerRasterizer_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static void nativeAddLayer(int native_layer, int native_paint, float dx, float dy) {
+
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java
new file mode 100644
index 0000000..ba2cfad
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java
@@ -0,0 +1,67 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.LightingColorFilter
+ *
+ * Through the layoutlib_create tool, the original native methods of LightingColorFilter have
+ * been replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original LightingColorFilter class.
+ *
+ * Because this extends {@link ColorFilter_Delegate}, there's no need to use a
+ * {@link DelegateManager}, as all the Shader classes will be added to the manager
+ * owned by {@link ColorFilter_Delegate}.
+ *
+ * @see ColorFilter_Delegate
+ *
+ */
+public class LightingColorFilter_Delegate extends ColorFilter_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Lighting Color Filters are not supported.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int native_CreateLightingFilter(int mul, int add) {
+        LightingColorFilter_Delegate newDelegate = new LightingColorFilter_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static int nCreateLightingFilter(int nativeFilter, int mul, int add) {
+        // pass
+        return 0;
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java
index 862b4544..9fb48c80 100644
--- a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java
@@ -21,10 +21,6 @@
 
 import android.graphics.Shader.TileMode;
 
-import java.awt.Paint;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.NoninvertibleTransformException;
-
 /**
  * Delegate implementing the native methods of android.graphics.LinearGradient
  *
@@ -41,7 +37,7 @@
  * @see Shader_Delegate
  *
  */
-public class LinearGradient_Delegate extends Gradient_Delegate {
+public final class LinearGradient_Delegate extends Gradient_Delegate {
 
     // ---- delegate data ----
     private java.awt.Paint mJavaPaint;
@@ -49,7 +45,7 @@
     // ---- Public Helper methods ----
 
     @Override
-    public Paint getJavaPaint() {
+    public java.awt.Paint getJavaPaint() {
         return mJavaPaint;
     }
 
@@ -58,17 +54,8 @@
     /*package*/ static int nativeCreate1(LinearGradient thisGradient,
             float x0, float y0, float x1, float y1,
             int colors[], float positions[], int tileMode) {
-        // figure out the tile
-        TileMode tile = null;
-        for (TileMode tm : TileMode.values()) {
-            if (tm.nativeInt == tileMode) {
-                tile = tm;
-                break;
-            }
-        }
-
         LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(x0, y0, x1, y1,
-                colors, positions, tile);
+                colors, positions, Shader_Delegate.getTileMode(tileMode));
         return sManager.addDelegate(newDelegate);
     }
     /*package*/ static int nativeCreate2(LinearGradient thisGradient,
@@ -144,20 +131,20 @@
                 java.awt.RenderingHints        hints) {
             precomputeGradientColors();
 
-            AffineTransform canvasMatrix;
+            java.awt.geom.AffineTransform canvasMatrix;
             try {
                 canvasMatrix = xform.createInverse();
-            } catch (NoninvertibleTransformException e) {
+            } catch (java.awt.geom.NoninvertibleTransformException e) {
                 Bridge.getLog().error(null, "Unable to inverse matrix in LinearGradient", e);
-                canvasMatrix = new AffineTransform();
+                canvasMatrix = new java.awt.geom.AffineTransform();
             }
 
-            AffineTransform localMatrix = getLocalMatrix();
+            java.awt.geom.AffineTransform localMatrix = getLocalMatrix();
             try {
                 localMatrix = localMatrix.createInverse();
-            } catch (NoninvertibleTransformException e) {
+            } catch (java.awt.geom.NoninvertibleTransformException e) {
                 Bridge.getLog().error(null, "Unable to inverse matrix in LinearGradient", e);
-                localMatrix = new AffineTransform();
+                localMatrix = new java.awt.geom.AffineTransform();
             }
 
             return new LinearGradientPaintContext(canvasMatrix, localMatrix, colorModel);
@@ -165,12 +152,14 @@
 
         private class LinearGradientPaintContext implements java.awt.PaintContext {
 
-            private final AffineTransform mCanvasMatrix;
-            private final AffineTransform mLocalMatrix;
+            private final java.awt.geom.AffineTransform mCanvasMatrix;
+            private final java.awt.geom.AffineTransform mLocalMatrix;
             private final java.awt.image.ColorModel mColorModel;
 
-            public LinearGradientPaintContext(AffineTransform canvasMatrix,
-                    AffineTransform localMatrix, java.awt.image.ColorModel colorModel) {
+            private LinearGradientPaintContext(
+                    java.awt.geom.AffineTransform canvasMatrix,
+                    java.awt.geom.AffineTransform localMatrix,
+                    java.awt.image.ColorModel colorModel) {
                 mCanvasMatrix = canvasMatrix;
                 mLocalMatrix = localMatrix;
                 mColorModel = colorModel;
@@ -218,10 +207,17 @@
          * Returns a color for an arbitrary point.
          */
         private int getColor(float x, float y) {
-            // find the x position on the gradient vector.
-            float _x = (mDx*mDy*(y-mY0) + mDy*mDy*mX0 + mDx*mDx*x) / mDSize2;
-            // from it get the position relative to the vector
-            float pos = (float) ((_x - mX0) / mDx);
+            float pos;
+            if (mDx == 0) {
+                pos = (y - mY0) / mDy;
+            } else if (mDy == 0) {
+                pos = (x - mX0) / mDx;
+            } else {
+                // find the x position on the gradient vector.
+                float _x = (mDx*mDy*(y-mY0) + mDy*mDy*mX0 + mDx*mDx*x) / mDSize2;
+                // from it get the position relative to the vector
+                pos = (_x - mX0) / mDx;
+            }
 
             return getGradientColor(pos);
         }
diff --git a/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java
new file mode 100644
index 0000000..c582a91
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java
@@ -0,0 +1,62 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.MaskFilter
+ *
+ * Through the layoutlib_create tool, the original native methods of MaskFilter have been replaced
+ * by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original MaskFilter class.
+ *
+ * This also serve as a base class for all MaskFilter delegate classes.
+ *
+ * @see DelegateManager
+ *
+ */
+public abstract class MaskFilter_Delegate {
+
+    // ---- delegate manager ----
+    protected static final DelegateManager<MaskFilter_Delegate> sManager =
+            new DelegateManager<MaskFilter_Delegate>();
+
+    // ---- delegate helper data ----
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    public static MaskFilter_Delegate getDelegate(int nativeShader) {
+        return sManager.getDelegate(nativeShader);
+    }
+
+    public abstract boolean isSupported();
+    public abstract String getSupportMessage();
+
+    // ---- native methods ----
+
+    /*package*/ static void nativeDestructor(int native_filter) {
+        sManager.removeDelegate(native_filter);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java
index b464f66..94beef3 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java
@@ -60,7 +60,6 @@
     public static AffineTransform getAffineTransform(Matrix m) {
         Matrix_Delegate delegate = sManager.getDelegate(m.native_instance);
         if (delegate == null) {
-            assert false;
             return null;
         }
 
@@ -70,7 +69,6 @@
     public static boolean hasPerspective(Matrix m) {
         Matrix_Delegate delegate = sManager.getDelegate(m.native_instance);
         if (delegate == null) {
-            assert false;
             return false;
         }
 
@@ -106,6 +104,45 @@
         return true;
     }
 
+    public static Matrix_Delegate make(AffineTransform matrix) {
+        float[] values = new float[MATRIX_SIZE];
+        values[0] = (float) matrix.getScaleX();
+        values[1] = (float) matrix.getShearX();
+        values[2] = (float) matrix.getTranslateX();
+        values[3] = (float) matrix.getShearY();
+        values[4] = (float) matrix.getScaleY();
+        values[5] = (float) matrix.getTranslateY();
+        values[6] = 0.f;
+        values[7] = 0.f;
+        values[8] = 1.f;
+
+        return new Matrix_Delegate(values);
+    }
+
+    public boolean mapRect(RectF dst, RectF src) {
+        // array with 4 corners
+        float[] corners = new float[] {
+                src.left, src.top,
+                src.right, src.top,
+                src.right, src.bottom,
+                src.left, src.bottom,
+        };
+
+        // apply the transform to them.
+        mapPoints(corners);
+
+        // now put the result in the rect. We take the min/max of Xs and min/max of Ys
+        dst.left = Math.min(Math.min(corners[0], corners[2]), Math.min(corners[4], corners[6]));
+        dst.right = Math.max(Math.max(corners[0], corners[2]), Math.max(corners[4], corners[6]));
+
+        dst.top = Math.min(Math.min(corners[1], corners[3]), Math.min(corners[5], corners[7]));
+        dst.bottom = Math.max(Math.max(corners[1], corners[3]), Math.max(corners[5], corners[7]));
+
+
+        return (computeTypeMask() & kRectStaysRect_Mask) != 0;
+    }
+
+
     /**
      * Returns an {@link AffineTransform} matching the matrix.
      */
@@ -142,7 +179,6 @@
     /*package*/ static boolean native_isIdentity(int native_object) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -152,7 +188,6 @@
     /*package*/ static boolean native_rectStaysRect(int native_object) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return true;
         }
 
@@ -162,7 +197,6 @@
     /*package*/ static void native_reset(int native_object) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -172,13 +206,11 @@
     /*package*/ static void native_set(int native_object, int other) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
         Matrix_Delegate src = sManager.getDelegate(other);
         if (src == null) {
-            assert false;
             return;
         }
 
@@ -188,7 +220,6 @@
     /*package*/ static void native_setTranslate(int native_object, float dx, float dy) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -199,7 +230,6 @@
             float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -209,7 +239,6 @@
     /*package*/ static void native_setScale(int native_object, float sx, float sy) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -227,7 +256,6 @@
     /*package*/ static void native_setRotate(int native_object, float degrees, float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -237,7 +265,6 @@
     /*package*/ static void native_setRotate(int native_object, float degrees) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -248,7 +275,6 @@
             float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -266,7 +292,6 @@
     /*package*/ static void native_setSinCos(int native_object, float sinValue, float cosValue) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -277,7 +302,6 @@
             float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -287,7 +311,6 @@
     /*package*/ static void native_setSkew(int native_object, float kx, float ky) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -311,19 +334,16 @@
 
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
         Matrix_Delegate a_mtx = sManager.getDelegate(a);
         if (a_mtx == null) {
-            assert false;
             return false;
         }
 
         Matrix_Delegate b_mtx = sManager.getDelegate(b);
         if (b_mtx == null) {
-            assert false;
             return false;
         }
 
@@ -335,7 +355,6 @@
     /*package*/ static boolean native_preTranslate(int native_object, float dx, float dy) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -347,7 +366,6 @@
             float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -358,7 +376,6 @@
     /*package*/ static boolean native_preScale(int native_object, float sx, float sy) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -370,7 +387,6 @@
             float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -381,7 +397,6 @@
     /*package*/ static boolean native_preRotate(int native_object, float degrees) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -397,7 +412,6 @@
             float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -408,7 +422,6 @@
     /*package*/ static boolean native_preSkew(int native_object, float kx, float ky) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -419,13 +432,11 @@
     /*package*/ static boolean native_preConcat(int native_object, int other_matrix) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
         Matrix_Delegate other = sManager.getDelegate(other_matrix);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -436,7 +447,6 @@
     /*package*/ static boolean native_postTranslate(int native_object, float dx, float dy) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -448,7 +458,6 @@
             float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -459,7 +468,6 @@
     /*package*/ static boolean native_postScale(int native_object, float sx, float sy) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -471,7 +479,6 @@
             float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -482,7 +489,6 @@
     /*package*/ static boolean native_postRotate(int native_object, float degrees) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -494,7 +500,6 @@
             float px, float py) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -505,7 +510,6 @@
     /*package*/ static boolean native_postSkew(int native_object, float kx, float ky) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -516,13 +520,11 @@
     /*package*/ static boolean native_postConcat(int native_object, int other_matrix) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
         Matrix_Delegate other = sManager.getDelegate(other_matrix);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -534,7 +536,6 @@
             RectF dst, int stf) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
@@ -604,17 +605,14 @@
     /*package*/ static boolean native_invert(int native_object, int inverse) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
         Matrix_Delegate inv_mtx = sManager.getDelegate(inverse);
         if (inv_mtx == null) {
-            assert false;
             return false;
         }
 
-
         try {
             AffineTransform affineTransform = d.getAffineTransform();
             AffineTransform inverseTransform = affineTransform.createInverse();
@@ -635,7 +633,6 @@
             float[] src, int srcIndex, int ptCount, boolean isPts) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -651,30 +648,10 @@
     /*package*/ static boolean native_mapRect(int native_object, RectF dst, RectF src) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return false;
         }
 
-        // array with 4 corners
-        float[] corners = new float[] {
-                src.left, src.top,
-                src.right, src.top,
-                src.right, src.bottom,
-                src.left, src.bottom,
-        };
-
-        // apply the transform to them.
-        d.mapPoints(corners);
-
-        // now put the result in the rect. We take the min/max of Xs and min/max of Ys
-        dst.left = Math.min(Math.min(corners[0], corners[2]), Math.min(corners[4], corners[6]));
-        dst.right = Math.max(Math.max(corners[0], corners[2]), Math.max(corners[4], corners[6]));
-
-        dst.top = Math.min(Math.min(corners[1], corners[3]), Math.min(corners[5], corners[7]));
-        dst.bottom = Math.max(Math.max(corners[1], corners[3]), Math.max(corners[5], corners[7]));
-
-
-        return (d.computeTypeMask() & kRectStaysRect_Mask) != 0;
+        return d.mapRect(dst, src);
     }
 
     /*package*/ static float native_mapRadius(int native_object, float radius) {
@@ -685,7 +662,6 @@
     /*package*/ static void native_getValues(int native_object, float[] values) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -695,7 +671,6 @@
     /*package*/ static void native_setValues(int native_object, float[] values) {
         Matrix_Delegate d = sManager.getDelegate(native_object);
         if (d == null) {
-            assert false;
             return;
         }
 
@@ -705,13 +680,11 @@
     /*package*/ static boolean native_equals(int native_a, int native_b) {
         Matrix_Delegate a = sManager.getDelegate(native_a);
         if (a == null) {
-            assert false;
             return false;
         }
 
         Matrix_Delegate b = sManager.getDelegate(native_b);
         if (b == null) {
-            assert false;
             return false;
         }
 
@@ -740,7 +713,6 @@
                 matrix[4], matrix[2], matrix[5]);
     }
 
-
     /**
      * Reset a matrix to the identity
      */
@@ -830,6 +802,10 @@
         reset();
     }
 
+    private Matrix_Delegate(float[] values) {
+        System.arraycopy(values, 0, mValues, 0, MATRIX_SIZE);
+    }
+
     /**
      * Adds the given transformation to the current Matrix
      * <p/>This in effect does this = this*matrix
@@ -1052,6 +1028,4 @@
 
         return tmp;
     }
-
-
 }
diff --git a/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java
index fe9bef9..e9fb30a 100644
--- a/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java
@@ -18,6 +18,7 @@
 
 import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.impl.DelegateManager;
+import com.android.layoutlib.bridge.impl.GcSnapshot;
 import com.android.ninepatch.NinePatchChunk;
 
 import android.graphics.drawable.NinePatchDrawable;
@@ -43,7 +44,7 @@
  * around to map int to instance of the delegate.
  *
  */
-public class NinePatch_Delegate {
+public final class NinePatch_Delegate {
 
     /**
      * Cache map for {@link NinePatchChunk}.
@@ -123,13 +124,12 @@
     }
 
    private static void draw(int canvas_instance,
-           int left, int top, int right, int bottom,
+           final int left, final int top, final int right, final int bottom,
            int bitmap_instance, byte[] c, int paint_instance_or_null,
-           int destDensity, int srcDensity) {
+           final int destDensity, final int srcDensity) {
        // get the delegate from the native int.
-       Bitmap_Delegate bitmap_delegate = Bitmap_Delegate.getDelegate(bitmap_instance);
+       final Bitmap_Delegate bitmap_delegate = Bitmap_Delegate.getDelegate(bitmap_instance);
        if (bitmap_delegate == null) {
-           assert false;
            return;
        }
 
@@ -143,7 +143,7 @@
            return;
        }
 
-       NinePatchChunk chunkObject = getChunk(c);
+       final NinePatchChunk chunkObject = getChunk(c);
        assert chunkObject != null;
        if (chunkObject == null) {
            return;
@@ -151,26 +151,19 @@
 
        Canvas_Delegate canvas_delegate = Canvas_Delegate.getDelegate(canvas_instance);
        if (canvas_delegate == null) {
-           assert false;
            return;
        }
 
        // this one can be null
        Paint_Delegate paint_delegate = Paint_Delegate.getDelegate(paint_instance_or_null);
 
-       Graphics2D graphics;
-       if (paint_delegate != null) {
-           graphics = canvas_delegate.createCustomGraphics(paint_delegate);
-       } else {
-           graphics = canvas_delegate.getGcSnapshot().create();
-       }
+       canvas_delegate.getSnapshot().draw(new GcSnapshot.Drawable() {
+               public void draw(Graphics2D graphics, Paint_Delegate paint) {
+                   chunkObject.draw(bitmap_delegate.getImage(), graphics,
+                           left, top, right - left, bottom - top, destDensity, srcDensity);
+               }
+           }, paint_delegate, true /*compositeOnly*/, false /*forceSrcMode*/);
 
-       try {
-           chunkObject.draw(bitmap_delegate.getImage(), graphics,
-                   left, top, right - left, bottom - top, destDensity, srcDensity);
-       } finally {
-           graphics.dispose();
-       }
     }
 
     /*package*/ static int nativeGetTransparentRegion(int bitmap, byte[] chunk, Rect location) {
diff --git a/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java
new file mode 100644
index 0000000..ec92507
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java
@@ -0,0 +1,62 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.PaintFlagsDrawFilter
+ *
+ * Through the layoutlib_create tool, the original native methods of PaintFlagsDrawFilter have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original PaintFlagsDrawFilter class.
+ *
+ * Because this extends {@link DrawFilter_Delegate}, there's no need to use a
+ * {@link DelegateManager}, as all the DrawFilter classes will be added to the manager owned by
+ * {@link DrawFilter_Delegate}.
+ *
+ * @see DrawFilter_Delegate
+ *
+ */
+public class PaintFlagsDrawFilter_Delegate extends DrawFilter_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Paint Flags Draw Filters are not supported.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeConstructor(int clearBits, int setBits) {
+        PaintFlagsDrawFilter_Delegate newDelegate = new PaintFlagsDrawFilter_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
index fa26bcf..9d4970f 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
@@ -16,6 +16,7 @@
 
 package android.graphics;
 
+import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.impl.DelegateManager;
 
 import android.graphics.Paint.FontMetrics;
@@ -24,6 +25,8 @@
 
 import java.awt.BasicStroke;
 import java.awt.Font;
+import java.awt.Shape;
+import java.awt.Stroke;
 import java.awt.Toolkit;
 import java.awt.font.FontRenderContext;
 import java.awt.geom.AffineTransform;
@@ -82,6 +85,7 @@
     private int mShader;
     private int mPathEffect;
     private int mMaskFilter;
+    private int mRasterizer;
 
 
     // ---- Public Helper methods ----
@@ -114,6 +118,14 @@
         return mColor;
     }
 
+    public int getAlpha() {
+        return mColor >>> 24;
+    }
+
+    public void setAlpha(int alpha) {
+        mColor = (alpha << 24) | (mColor & 0x00FFFFFF);
+    }
+
     public int getTextAlign() {
         return mTextAlign;
     }
@@ -122,8 +134,15 @@
         return mStrokeWidth;
     }
 
-    public float getStrokeMiter() {
-        return mStrokeMiter;
+    /**
+     * returns the value of stroke miter needed by the java api.
+     */
+    public float getJavaStrokeMiter() {
+        float miter = mStrokeMiter * mStrokeWidth;
+        if (miter < 1.f) {
+            miter = 1.f;
+        }
+        return miter;
     }
 
     public int getJavaCap() {
@@ -150,24 +169,73 @@
         }
     }
 
-    public int getXfermode() {
-        return mXfermode;
+    public Stroke getJavaStroke() {
+        PathEffect_Delegate effectDelegate = PathEffect_Delegate.getDelegate(mPathEffect);
+        if (effectDelegate != null) {
+            if (effectDelegate.isSupported()) {
+                Stroke stroke = effectDelegate.getStroke(this);
+                assert stroke != null;
+                if (stroke != null) {
+                    return stroke;
+                }
+            } else {
+                Bridge.getLog().fidelityWarning(null,
+                        effectDelegate.getSupportMessage(),
+                        null);
+            }
+        }
+
+        // if no custom stroke as been set, set the default one.
+        return new BasicStroke(
+                    getStrokeWidth(),
+                    getJavaCap(),
+                    getJavaJoin(),
+                    getJavaStrokeMiter());
     }
 
-    public int getColorFilter() {
-        return mColorFilter;
+    /**
+     * Returns the {@link Xfermode} delegate or null if none have been set
+     *
+     * @return the delegate or null.
+     */
+    public Xfermode_Delegate getXfermode() {
+        return  Xfermode_Delegate.getDelegate(mXfermode);
     }
 
-    public int getShader() {
-        return mShader;
+    /**
+     * Returns the {@link ColorFilter} delegate or null if none have been set
+     *
+     * @return the delegate or null.
+     */
+    public ColorFilter_Delegate getColorFilter() {
+        return ColorFilter_Delegate.getDelegate(mColorFilter);
     }
 
-    public int getPathEffect() {
-        return mPathEffect;
+    /**
+     * Returns the {@link Shader} delegate or null if none have been set
+     *
+     * @return the delegate or null.
+     */
+    public Shader_Delegate getShader() {
+        return Shader_Delegate.getDelegate(mShader);
     }
 
-    public int getMaskFilter() {
-        return mMaskFilter;
+    /**
+     * Returns the {@link MaskFilter} delegate or null if none have been set
+     *
+     * @return the delegate or null.
+     */
+    public MaskFilter_Delegate getMaskFilter() {
+        return MaskFilter_Delegate.getDelegate(mMaskFilter);
+    }
+
+    /**
+     * Returns the {@link Rasterizer} delegate or null if none have been set
+     *
+     * @return the delegate or null.
+     */
+    public Rasterizer_Delegate getRasterizer() {
+        return Rasterizer_Delegate.getDelegate(mRasterizer);
     }
 
     // ---- native methods ----
@@ -176,7 +244,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -187,7 +254,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -230,7 +296,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -241,7 +306,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -252,29 +316,26 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
-        return delegate.mColor >>> 24;
+        return delegate.getAlpha();
     }
 
     /*package*/ static void setAlpha(Paint thisPaint, int a) {
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return;
         }
 
-        delegate.mColor = (a << 24) | (delegate.mColor & 0x00FFFFFF);
+        delegate.setAlpha(a);
     }
 
     /*package*/ static float getStrokeWidth(Paint thisPaint) {
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 1.f;
         }
 
@@ -285,7 +346,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -296,7 +356,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 1.f;
         }
 
@@ -307,7 +366,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -324,7 +382,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 1.f;
         }
 
@@ -335,7 +392,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -347,7 +403,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 1.f;
         }
 
@@ -358,7 +413,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -370,7 +424,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 1.f;
         }
 
@@ -381,7 +434,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -393,7 +445,6 @@
         // get the delegate
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -410,7 +461,6 @@
         // get the delegate
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -427,7 +477,6 @@
         // get the delegate
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -438,7 +487,6 @@
         // get the delegate
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -467,7 +515,6 @@
         // get the delegate
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -504,7 +551,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(paint);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -516,7 +562,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -527,14 +572,12 @@
         // get the delegate from the native int.
         Paint_Delegate delegate_dst = sManager.getDelegate(native_dst);
         if (delegate_dst == null) {
-            assert false;
             return;
         }
 
         // get the delegate from the native int.
         Paint_Delegate delegate_src = sManager.getDelegate(native_src);
         if (delegate_src == null) {
-            assert false;
             return;
         }
 
@@ -545,7 +588,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -556,7 +598,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -567,7 +608,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -578,7 +618,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -589,7 +628,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -600,7 +638,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -608,15 +645,34 @@
     }
 
     /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        Paint_Delegate paint = sManager.getDelegate(native_object);
+        if (paint == null) {
+            return false;
+        }
+
+        Path_Delegate srcPath = Path_Delegate.getDelegate(src);
+        if (srcPath == null) {
+            return true;
+        }
+
+        Path_Delegate dstPath = Path_Delegate.getDelegate(dst);
+        if (dstPath == null) {
+            return true;
+        }
+
+        Stroke stroke = paint.getJavaStroke();
+        Shape strokeShape = stroke.createStrokedShape(srcPath.getJavaShape());
+
+        dstPath.setJavaShape(strokeShape);
+
+        // FIXME figure out the return value?
+        return true;
     }
 
     /*package*/ static int native_setShader(int native_object, int shader) {
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return shader;
         }
 
@@ -627,18 +683,24 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return filter;
         }
 
-        return delegate.mColorFilter = filter;
+        delegate.mColorFilter = filter;
+
+        // since none of those are supported, display a fidelity warning right away
+        ColorFilter_Delegate filterDelegate = delegate.getColorFilter();
+        if (filterDelegate != null && filterDelegate.isSupported() == false) {
+            Bridge.getLog().fidelityWarning(null, filterDelegate.getSupportMessage(), null);
+        }
+
+        return filter;
     }
 
     /*package*/ static int native_setXfermode(int native_object, int xfermode) {
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return xfermode;
         }
 
@@ -649,7 +711,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return effect;
         }
 
@@ -660,18 +721,24 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return maskfilter;
         }
 
-        return delegate.mMaskFilter = maskfilter;
+        delegate.mMaskFilter = maskfilter;
+
+        // since none of those are supported, display a fidelity warning right away
+        MaskFilter_Delegate filterDelegate = delegate.getMaskFilter();
+        if (filterDelegate != null && filterDelegate.isSupported() == false) {
+            Bridge.getLog().fidelityWarning(null, filterDelegate.getSupportMessage(), null);
+        }
+
+        return maskfilter;
     }
 
     /*package*/ static int native_setTypeface(int native_object, int typeface) {
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -681,15 +748,27 @@
     }
 
     /*package*/ static int native_setRasterizer(int native_object, int rasterizer) {
-        // FIXME
-        throw new UnsupportedOperationException();
+        // get the delegate from the native int.
+        Paint_Delegate delegate = sManager.getDelegate(native_object);
+        if (delegate == null) {
+            return rasterizer;
+        }
+
+        delegate.mRasterizer = rasterizer;
+
+        // since none of those are supported, display a fidelity warning right away
+        Rasterizer_Delegate rasterizerDelegate = delegate.getRasterizer();
+        if (rasterizerDelegate != null && rasterizerDelegate.isSupported() == false) {
+            Bridge.getLog().fidelityWarning(null, rasterizerDelegate.getSupportMessage(), null);
+        }
+
+        return rasterizer;
     }
 
     /*package*/ static int native_getTextAlign(int native_object) {
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -700,7 +779,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return;
         }
 
@@ -711,7 +789,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_paint);
         if (delegate == null) {
-            assert false;
             return 0.f;
         }
 
@@ -736,7 +813,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(native_object);
         if (delegate == null) {
-            assert false;
             return 0.f;
         }
 
@@ -828,7 +904,7 @@
 
     // ---- Private delegate/helper methods ----
 
-    private Paint_Delegate() {
+    /*package*/ Paint_Delegate() {
         reset();
     }
 
@@ -854,19 +930,20 @@
         mShader = paint.mShader;
         mPathEffect = paint.mPathEffect;
         mMaskFilter = paint.mMaskFilter;
+        mRasterizer = paint.mRasterizer;
         updateFontObject();
     }
 
     private void reset() {
         mFlags = Paint.DEFAULT_PAINT_FLAGS;
-        mColor = 0;
-        mStyle = 0;
-        mCap = 0;
-        mJoin = 0;
+        mColor = 0xFF000000;
+        mStyle = Paint.Style.FILL.nativeInt;
+        mCap = Paint.Cap.BUTT.nativeInt;
+        mJoin = Paint.Join.MITER.nativeInt;
         mTextAlign = 0;
         mTypeface = Typeface.sDefaults[0].native_instance;
         mStrokeWidth = 1.f;
-        mStrokeMiter = 2.f;
+        mStrokeMiter = 4.f;
         mTextSize = 20.f;
         mTextScaleX = 1.f;
         mTextSkewX = 0.f;
@@ -875,12 +952,14 @@
         mShader = 0;
         mPathEffect = 0;
         mMaskFilter = 0;
+        mRasterizer = 0;
         updateFontObject();
     }
 
     /**
      * Update the {@link Font} object from the typeface, text size and scaling
      */
+    @SuppressWarnings("deprecation")
     private void updateFontObject() {
         if (mTypeface != 0) {
             // Get the fonts from the TypeFace object.
@@ -983,7 +1062,6 @@
         // get the delegate from the native int.
         Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
         if (delegate == null) {
-            assert false;
             return;
         }
 
diff --git a/tools/layoutlib/bridge/src/android/graphics/Path.java b/tools/layoutlib/bridge/src/android/graphics/Path.java
deleted file mode 100644
index c0bc005..0000000
--- a/tools/layoutlib/bridge/src/android/graphics/Path.java
+++ /dev/null
@@ -1,611 +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.graphics;
-
-import java.awt.Shape;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.PathIterator;
-import java.awt.geom.Rectangle2D;
-
-/**
- * The Path class encapsulates compound (multiple contour) geometric paths
- * consisting of straight line segments, quadratic curves, and cubic curves.
- * It can be drawn with canvas.drawPath(path, paint), either filled or stroked
- * (based on the paint's Style), or it can be used for clipping or to draw
- * text on a path.
- */
-public class Path {
-
-    private FillType mFillType = FillType.WINDING;
-    private GeneralPath mPath = new GeneralPath();
-
-    private float mLastX = 0;
-    private float mLastY = 0;
-
-    //---------- Custom methods ----------
-
-    public Shape getAwtShape() {
-        return mPath;
-    }
-
-    //----------
-
-    /**
-     * Create an empty path
-     */
-    public Path() {
-    }
-
-    /**
-     * Create a new path, copying the contents from the src path.
-     *
-     * @param src The path to copy from when initializing the new path
-     */
-    public Path(Path src) {
-        mPath.append(src.mPath, false /* connect */);
-    }
-
-    /**
-     * Clear any lines and curves from the path, making it empty.
-     * This does NOT change the fill-type setting.
-     */
-    public void reset() {
-        mPath = new GeneralPath();
-    }
-
-    /**
-     * Rewinds the path: clears any lines and curves from the path but
-     * keeps the internal data structure for faster reuse.
-     */
-    public void rewind() {
-        // FIXME
-        throw new UnsupportedOperationException();
-    }
-
-    /** Replace the contents of this with the contents of src.
-    */
-    public void set(Path src) {
-        mPath.append(src.mPath, false /* connect */);
-    }
-
-    /** Enum for the ways a path may be filled
-    */
-    public enum FillType {
-        // these must match the values in SkPath.h
-        WINDING         (GeneralPath.WIND_NON_ZERO, false),
-        EVEN_ODD        (GeneralPath.WIND_EVEN_ODD, false),
-        INVERSE_WINDING (GeneralPath.WIND_NON_ZERO, true),
-        INVERSE_EVEN_ODD(GeneralPath.WIND_EVEN_ODD, true);
-
-        FillType(int rule, boolean inverse) {
-            this.rule = rule;
-            this.inverse = inverse;
-        }
-
-        final int rule;
-        final boolean inverse;
-    }
-
-    /**
-     * Return the path's fill type. This defines how "inside" is
-     * computed. The default value is WINDING.
-     *
-     * @return the path's fill type
-     */
-    public FillType getFillType() {
-        return mFillType;
-    }
-
-    /**
-     * Set the path's fill type. This defines how "inside" is computed.
-     *
-     * @param ft The new fill type for this path
-     */
-    public void setFillType(FillType ft) {
-        mFillType = ft;
-        mPath.setWindingRule(ft.rule);
-    }
-
-    /**
-     * Returns true if the filltype is one of the INVERSE variants
-     *
-     * @return true if the filltype is one of the INVERSE variants
-     */
-    public boolean isInverseFillType() {
-        return mFillType.inverse;
-    }
-
-    /**
-     * Toggles the INVERSE state of the filltype
-     */
-    public void toggleInverseFillType() {
-        switch (mFillType) {
-            case WINDING:
-                mFillType = FillType.INVERSE_WINDING;
-                break;
-            case EVEN_ODD:
-                mFillType = FillType.INVERSE_EVEN_ODD;
-                break;
-            case INVERSE_WINDING:
-                mFillType = FillType.WINDING;
-                break;
-            case INVERSE_EVEN_ODD:
-                mFillType = FillType.EVEN_ODD;
-                break;
-        }
-    }
-
-    /**
-     * Returns true if the path is empty (contains no lines or curves)
-     *
-     * @return true if the path is empty (contains no lines or curves)
-     */
-    public boolean isEmpty() {
-        return mPath.getCurrentPoint() == null;
-    }
-
-    /**
-     * Returns true if the path specifies a rectangle. If so, and if rect is
-     * not null, set rect to the bounds of the path. If the path does not
-     * specify a rectangle, return false and ignore rect.
-     *
-     * @param rect If not null, returns the bounds of the path if it specifies
-     *             a rectangle
-     * @return     true if the path specifies a rectangle
-     */
-    public boolean isRect(RectF rect) {
-        // FIXME
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Compute the bounds of the path, and write the answer into bounds. If the
-     * path contains 0 or 1 points, the bounds is set to (0,0,0,0)
-     *
-     * @param bounds Returns the computed bounds of the path
-     * @param exact If true, return the exact (but slower) bounds, else return
-     *              just the bounds of all control points
-     */
-    public void computeBounds(RectF bounds, boolean exact) {
-        Rectangle2D rect = mPath.getBounds2D();
-        bounds.left = (float)rect.getMinX();
-        bounds.right = (float)rect.getMaxX();
-        bounds.top = (float)rect.getMinY();
-        bounds.bottom = (float)rect.getMaxY();
-    }
-
-    /**
-     * Hint to the path to prepare for adding more points. This can allow the
-     * path to more efficiently allocate its storage.
-     *
-     * @param extraPtCount The number of extra points that may be added to this
-     *                     path
-     */
-    public void incReserve(int extraPtCount) {
-        // pass
-    }
-
-    /**
-     * Set the beginning of the next contour to the point (x,y).
-     *
-     * @param x The x-coordinate of the start of a new contour
-     * @param y The y-coordinate of the start of a new contour
-     */
-    public void moveTo(float x, float y) {
-        mPath.moveTo(mLastX = x, mLastY = y);
-    }
-
-    /**
-     * Set the beginning of the next contour relative to the last point on the
-     * previous contour. If there is no previous contour, this is treated the
-     * same as moveTo().
-     *
-     * @param dx The amount to add to the x-coordinate of the end of the
-     *           previous contour, to specify the start of a new contour
-     * @param dy The amount to add to the y-coordinate of the end of the
-     *           previous contour, to specify the start of a new contour
-     */
-    public void rMoveTo(float dx, float dy) {
-        dx += mLastX;
-        dy += mLastY;
-        mPath.moveTo(mLastX = dx, mLastY = dy);
-    }
-
-    /**
-     * Add a line from the last point to the specified point (x,y).
-     * If no moveTo() call has been made for this contour, the first point is
-     * automatically set to (0,0).
-     *
-     * @param x The x-coordinate of the end of a line
-     * @param y The y-coordinate of the end of a line
-     */
-    public void lineTo(float x, float y) {
-        mPath.lineTo(mLastX = x, mLastY = y);
-    }
-
-    /**
-     * Same as lineTo, but the coordinates are considered relative to the last
-     * point on this contour. If there is no previous point, then a moveTo(0,0)
-     * is inserted automatically.
-     *
-     * @param dx The amount to add to the x-coordinate of the previous point on
-     *           this contour, to specify a line
-     * @param dy The amount to add to the y-coordinate of the previous point on
-     *           this contour, to specify a line
-     */
-    public void rLineTo(float dx, float dy) {
-        if (isEmpty()) {
-            mPath.moveTo(mLastX = 0, mLastY = 0);
-        }
-        dx += mLastX;
-        dy += mLastY;
-        mPath.lineTo(mLastX = dx, mLastY = dy);
-    }
-
-    /**
-     * Add a quadratic bezier from the last point, approaching control point
-     * (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for
-     * this contour, the first point is automatically set to (0,0).
-     *
-     * @param x1 The x-coordinate of the control point on a quadratic curve
-     * @param y1 The y-coordinate of the control point on a quadratic curve
-     * @param x2 The x-coordinate of the end point on a quadratic curve
-     * @param y2 The y-coordinate of the end point on a quadratic curve
-     */
-    public void quadTo(float x1, float y1, float x2, float y2) {
-        mPath.quadTo(x1, y1, mLastX = x2, mLastY = y2);
-    }
-
-    /**
-     * Same as quadTo, but the coordinates are considered relative to the last
-     * point on this contour. If there is no previous point, then a moveTo(0,0)
-     * is inserted automatically.
-     *
-     * @param dx1 The amount to add to the x-coordinate of the last point on
-     *            this contour, for the control point of a quadratic curve
-     * @param dy1 The amount to add to the y-coordinate of the last point on
-     *            this contour, for the control point of a quadratic curve
-     * @param dx2 The amount to add to the x-coordinate of the last point on
-     *            this contour, for the end point of a quadratic curve
-     * @param dy2 The amount to add to the y-coordinate of the last point on
-     *            this contour, for the end point of a quadratic curve
-     */
-    public void rQuadTo(float dx1, float dy1, float dx2, float dy2) {
-        if (isEmpty()) {
-            mPath.moveTo(mLastX = 0, mLastY = 0);
-        }
-        dx1 += mLastX;
-        dy1 += mLastY;
-        dx2 += mLastX;
-        dy2 += mLastY;
-        mPath.quadTo(dx1, dy1, mLastX = dx2, mLastY = dy2);
-    }
-
-    /**
-     * Add a cubic bezier from the last point, approaching control points
-     * (x1,y1) and (x2,y2), and ending at (x3,y3). If no moveTo() call has been
-     * made for this contour, the first point is automatically set to (0,0).
-     *
-     * @param x1 The x-coordinate of the 1st control point on a cubic curve
-     * @param y1 The y-coordinate of the 1st control point on a cubic curve
-     * @param x2 The x-coordinate of the 2nd control point on a cubic curve
-     * @param y2 The y-coordinate of the 2nd control point on a cubic curve
-     * @param x3 The x-coordinate of the end point on a cubic curve
-     * @param y3 The y-coordinate of the end point on a cubic curve
-     */
-    public void cubicTo(float x1, float y1, float x2, float y2,
-                        float x3, float y3) {
-        mPath.curveTo(x1, y1, x2, y2, mLastX = x3, mLastY = y3);
-    }
-
-    /**
-     * Same as cubicTo, but the coordinates are considered relative to the
-     * current point on this contour. If there is no previous point, then a
-     * moveTo(0,0) is inserted automatically.
-     */
-    public void rCubicTo(float dx1, float dy1, float dx2, float dy2,
-                         float dx3, float dy3) {
-        if (isEmpty()) {
-            mPath.moveTo(mLastX = 0, mLastY = 0);
-        }
-        dx1 += mLastX;
-        dy1 += mLastY;
-        dx2 += mLastX;
-        dy2 += mLastY;
-        dx3 += mLastX;
-        dy3 += mLastY;
-        mPath.curveTo(dx1, dy1, dx2, dy2, mLastX = dx3, mLastY = dy3);
-    }
-
-    /**
-     * Append the specified arc to the path as a new contour. If the start of
-     * the path is different from the path's current last point, then an
-     * automatic lineTo() is added to connect the current contour to the
-     * start of the arc. However, if the path is empty, then we call moveTo()
-     * with the first point of the arc. The sweep angle is tread mod 360.
-     *
-     * @param oval        The bounds of oval defining shape and size of the arc
-     * @param startAngle  Starting angle (in degrees) where the arc begins
-     * @param sweepAngle  Sweep angle (in degrees) measured clockwise, treated
-     *                    mod 360.
-     * @param forceMoveTo If true, always begin a new contour with the arc
-     */
-    public void arcTo(RectF oval, float startAngle, float sweepAngle,
-                      boolean forceMoveTo) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Append the specified arc to the path as a new contour. If the start of
-     * the path is different from the path's current last point, then an
-     * automatic lineTo() is added to connect the current contour to the
-     * start of the arc. However, if the path is empty, then we call moveTo()
-     * with the first point of the arc.
-     *
-     * @param oval        The bounds of oval defining shape and size of the arc
-     * @param startAngle  Starting angle (in degrees) where the arc begins
-     * @param sweepAngle  Sweep angle (in degrees) measured clockwise
-     */
-    public void arcTo(RectF oval, float startAngle, float sweepAngle) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Close the current contour. If the current point is not equal to the
-     * first point of the contour, a line segment is automatically added.
-     */
-    public void close() {
-        mPath.closePath();
-    }
-
-    /**
-     * Specifies how closed shapes (e.g. rects, ovals) are oriented when they
-     * are added to a path.
-     */
-    public enum Direction {
-        /** clockwise */
-        CW  (0),    // must match enum in SkPath.h
-        /** counter-clockwise */
-        CCW (1);    // must match enum in SkPath.h
-
-        Direction(int ni) {
-            nativeInt = ni;
-        }
-        final int nativeInt;
-    }
-
-    /**
-     * Add a closed rectangle contour to the path
-     *
-     * @param rect The rectangle to add as a closed contour to the path
-     * @param dir  The direction to wind the rectangle's contour
-     */
-    public void addRect(RectF rect, Direction dir) {
-        if (rect == null) {
-            throw new NullPointerException("need rect parameter");
-        }
-
-        addRect(rect.left, rect.top, rect.right, rect.bottom, dir);
-    }
-
-    /**
-     * Add a closed rectangle contour to the path
-     *
-     * @param left   The left side of a rectangle to add to the path
-     * @param top    The top of a rectangle to add to the path
-     * @param right  The right side of a rectangle to add to the path
-     * @param bottom The bottom of a rectangle to add to the path
-     * @param dir    The direction to wind the rectangle's contour
-     */
-    public void addRect(float left, float top, float right, float bottom,
-                        Direction dir) {
-        moveTo(left, top);
-
-        switch (dir) {
-            case CW:
-                lineTo(right, top);
-                lineTo(right, bottom);
-                lineTo(left, bottom);
-                break;
-            case CCW:
-                lineTo(left, bottom);
-                lineTo(right, bottom);
-                lineTo(right, top);
-                break;
-        }
-
-        close();
-    }
-
-    /**
-     * Add a closed oval contour to the path
-     *
-     * @param oval The bounds of the oval to add as a closed contour to the path
-     * @param dir  The direction to wind the oval's contour
-     */
-    public void addOval(RectF oval, Direction dir) {
-        if (oval == null) {
-            throw new NullPointerException("need oval parameter");
-        }
-
-        // FIXME Need to support direction
-        Ellipse2D ovalShape = new Ellipse2D.Float(oval.left, oval.top, oval.width(), oval.height());
-
-        mPath.append(ovalShape, false /* connect */);
-    }
-
-    /**
-     * Add a closed circle contour to the path
-     *
-     * @param x   The x-coordinate of the center of a circle to add to the path
-     * @param y   The y-coordinate of the center of a circle to add to the path
-     * @param radius The radius of a circle to add to the path
-     * @param dir    The direction to wind the circle's contour
-     */
-    public void addCircle(float x, float y, float radius, Direction dir) {
-        // FIXME
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Add the specified arc to the path as a new contour.
-     *
-     * @param oval The bounds of oval defining the shape and size of the arc
-     * @param startAngle Starting angle (in degrees) where the arc begins
-     * @param sweepAngle Sweep angle (in degrees) measured clockwise
-     */
-    public void addArc(RectF oval, float startAngle, float sweepAngle) {
-        if (oval == null) {
-            throw new NullPointerException("need oval parameter");
-        }
-        // FIXME
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-        * Add a closed round-rectangle contour to the path
-     *
-     * @param rect The bounds of a round-rectangle to add to the path
-     * @param rx   The x-radius of the rounded corners on the round-rectangle
-     * @param ry   The y-radius of the rounded corners on the round-rectangle
-     * @param dir  The direction to wind the round-rectangle's contour
-     */
-    public void addRoundRect(RectF rect, float rx, float ry, Direction dir) {
-        if (rect == null) {
-            throw new NullPointerException("need rect parameter");
-        }
-        // FIXME
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Add a closed round-rectangle contour to the path. Each corner receives
-     * two radius values [X, Y]. The corners are ordered top-left, top-right,
-     * bottom-right, bottom-left
-     *
-     * @param rect The bounds of a round-rectangle to add to the path
-     * @param radii Array of 8 values, 4 pairs of [X,Y] radii
-     * @param dir  The direction to wind the round-rectangle's contour
-     */
-    public void addRoundRect(RectF rect, float[] radii, Direction dir) {
-        if (rect == null) {
-            throw new NullPointerException("need rect parameter");
-        }
-        if (radii.length < 8) {
-            throw new ArrayIndexOutOfBoundsException("radii[] needs 8 values");
-        }
-        // FIXME
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Add a copy of src to the path, offset by (dx,dy)
-     *
-     * @param src The path to add as a new contour
-     * @param dx  The amount to translate the path in X as it is added
-     */
-    public void addPath(Path src, float dx, float dy) {
-        PathIterator iterator = src.mPath.getPathIterator(new AffineTransform(0, 0, dx, 0, 0, dy));
-        mPath.append(iterator, false /* connect */);
-    }
-
-    /**
-     * Add a copy of src to the path
-     *
-     * @param src The path that is appended to the current path
-     */
-    public void addPath(Path src) {
-        addPath(src, 0, 0);
-    }
-
-    /**
-     * Add a copy of src to the path, transformed by matrix
-     *
-     * @param src The path to add as a new contour
-     */
-    public void addPath(Path src, Matrix matrix) {
-        // FIXME
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Offset the path by (dx,dy), returning true on success
-     *
-     * @param dx  The amount in the X direction to offset the entire path
-     * @param dy  The amount in the Y direction to offset the entire path
-     * @param dst The translated path is written here. If this is null, then
-     *            the original path is modified.
-     */
-    public void offset(float dx, float dy, Path dst) {
-        GeneralPath newPath = new GeneralPath();
-
-        PathIterator iterator = mPath.getPathIterator(new AffineTransform(0, 0, dx, 0, 0, dy));
-
-        newPath.append(iterator, false /* connect */);
-
-        if (dst != null) {
-            dst.mPath = newPath;
-        } else {
-            mPath = newPath;
-        }
-    }
-
-    /**
-     * Offset the path by (dx,dy), returning true on success
-     *
-     * @param dx The amount in the X direction to offset the entire path
-     * @param dy The amount in the Y direction to offset the entire path
-     */
-    public void offset(float dx, float dy) {
-        offset(dx, dy, null /* dst */);
-    }
-
-    /**
-     * Sets the last point of the path.
-     *
-     * @param dx The new X coordinate for the last point
-     * @param dy The new Y coordinate for the last point
-     */
-    public void setLastPoint(float dx, float dy) {
-        mLastX = dx;
-        mLastY = dy;
-    }
-
-    /**
-     * Transform the points in this path by matrix, and write the answer
-     * into dst. If dst is null, then the the original path is modified.
-     *
-     * @param matrix The matrix to apply to the path
-     * @param dst    The transformed path is written here. If dst is null,
-     *               then the the original path is modified
-     */
-    public void transform(Matrix matrix, Path dst) {
-        // FIXME
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Transform the points in this path by matrix.
-     *
-     * @param matrix The matrix to apply to the path
-     */
-    public void transform(Matrix matrix) {
-        transform(matrix, null /* dst */);
-    }
-}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java
new file mode 100644
index 0000000..3777ac9
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java
@@ -0,0 +1,70 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import java.awt.Stroke;
+
+/**
+ * Delegate implementing the native methods of android.graphics.PathDashPathEffect
+ *
+ * Through the layoutlib_create tool, the original native methods of PathDashPathEffect have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original PathDashPathEffect class.
+ *
+ * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
+ * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
+ *
+ * @see Shader_Delegate
+ *
+ */
+public class PathDashPathEffect_Delegate extends PathEffect_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public Stroke getStroke(Paint_Delegate paint) {
+        // FIXME
+        return null;
+    }
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Path Dash Path Effects are not supported in Layout Preview mode.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeCreate(int native_path, float advance, float phase,
+            int native_style) {
+        PathDashPathEffect_Delegate newDelegate = new PathDashPathEffect_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java
index ce7eef07..c588423 100644
--- a/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java
@@ -18,6 +18,8 @@
 
 import com.android.layoutlib.bridge.impl.DelegateManager;
 
+import java.awt.Stroke;
+
 /**
  * Delegate implementing the native methods of android.graphics.PathEffect
  *
@@ -33,7 +35,7 @@
  * @see DelegateManager
  *
  */
-public class PathEffect_Delegate {
+public abstract class PathEffect_Delegate {
 
     // ---- delegate manager ----
     protected static final DelegateManager<PathEffect_Delegate> sManager =
@@ -49,6 +51,11 @@
         return sManager.getDelegate(nativeShader);
     }
 
+    public abstract Stroke getStroke(Paint_Delegate paint);
+    public abstract boolean isSupported();
+    public abstract String getSupportMessage();
+
+
     // ---- native methods ----
 
     /*package*/ static void nativeDestructor(int native_patheffect) {
diff --git a/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java
new file mode 100644
index 0000000..66ab29c
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java
@@ -0,0 +1,721 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.Bridge;
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import android.graphics.Path.Direction;
+import android.graphics.Path.FillType;
+
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Arc2D;
+import java.awt.geom.Area;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.PathIterator;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * Delegate implementing the native methods of android.graphics.Path
+ *
+ * Through the layoutlib_create tool, the original native methods of Path have been replaced
+ * by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original Path class.
+ *
+ * @see DelegateManager
+ *
+ */
+public final class Path_Delegate {
+
+    // ---- delegate manager ----
+    private static final DelegateManager<Path_Delegate> sManager =
+            new DelegateManager<Path_Delegate>();
+
+    // ---- delegate data ----
+    private FillType mFillType = FillType.WINDING;
+    private GeneralPath mPath = new GeneralPath();
+
+    private float mLastX = 0;
+    private float mLastY = 0;
+
+    // ---- Public Helper methods ----
+
+    public static Path_Delegate getDelegate(int nPath) {
+        return sManager.getDelegate(nPath);
+    }
+
+    public Shape getJavaShape() {
+        return mPath;
+    }
+
+    public void setJavaShape(Shape shape) {
+        mPath.reset();
+        mPath.append(shape, false /*connect*/);
+    }
+
+    public void reset() {
+        mPath.reset();
+    }
+
+    public void setPathIterator(PathIterator iterator) {
+        mPath.reset();
+        mPath.append(iterator, false /*connect*/);
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int init1() {
+        // create the delegate
+        Path_Delegate newDelegate = new Path_Delegate();
+
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static int init2(int nPath) {
+        // create the delegate
+        Path_Delegate newDelegate = new Path_Delegate();
+
+        // get the delegate to copy, which could be null if nPath is 0
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate != null) {
+            newDelegate.set(pathDelegate);
+        }
+
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static void native_reset(int nPath) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.mPath.reset();
+    }
+
+    /*package*/ static void native_rewind(int nPath) {
+        // call out to reset since there's nothing to optimize in
+        // terms of data structs.
+        native_reset(nPath);
+    }
+
+    /*package*/ static void native_set(int native_dst, int native_src) {
+        Path_Delegate pathDstDelegate = sManager.getDelegate(native_dst);
+        if (pathDstDelegate == null) {
+            return;
+        }
+
+        Path_Delegate pathSrcDelegate = sManager.getDelegate(native_src);
+        if (pathSrcDelegate == null) {
+            return;
+        }
+
+        pathDstDelegate.set(pathSrcDelegate);
+    }
+
+    /*package*/ static int native_getFillType(int nPath) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return 0;
+        }
+
+        return pathDelegate.mFillType.nativeInt;
+    }
+
+    /*package*/ static void native_setFillType(int nPath, int ft) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.mFillType = Path.sFillTypeArray[ft];
+    }
+
+    /*package*/ static boolean native_isEmpty(int nPath) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return true;
+        }
+
+        return pathDelegate.isEmpty();
+    }
+
+    /*package*/ static boolean native_isRect(int nPath, RectF rect) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return false;
+        }
+
+        // create an Area that can test if the path is a rect
+        Area area = new Area(pathDelegate.mPath);
+        if (area.isRectangular()) {
+            if (rect != null) {
+                pathDelegate.fillBounds(rect);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /*package*/ static void native_computeBounds(int nPath, RectF bounds) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.fillBounds(bounds);
+    }
+
+    /*package*/ static void native_incReserve(int nPath, int extraPtCount) {
+        // since we use a java2D path, there's no way to pre-allocate new points,
+        // so we do nothing.
+    }
+
+    /*package*/ static void native_moveTo(int nPath, float x, float y) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.moveTo(x, y);
+    }
+
+    /*package*/ static void native_rMoveTo(int nPath, float dx, float dy) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.rMoveTo(dx, dy);
+    }
+
+    /*package*/ static void native_lineTo(int nPath, float x, float y) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.lineTo(x, y);
+    }
+
+    /*package*/ static void native_rLineTo(int nPath, float dx, float dy) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.rLineTo(dx, dy);
+    }
+
+    /*package*/ static void native_quadTo(int nPath, float x1, float y1, float x2, float y2) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.quadTo(x1, y1, x2, y2);
+    }
+
+    /*package*/ static void native_rQuadTo(int nPath, float dx1, float dy1,
+                                              float dx2, float dy2) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.rQuadTo(dx1, dy1, dx2, dy2);
+    }
+
+    /*package*/ static void native_cubicTo(int nPath, float x1, float y1,
+                float x2, float y2, float x3, float y3) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.cubicTo(x1, y1, x2, y2, x3, y3);
+    }
+
+    /*package*/ static void native_rCubicTo(int nPath, float x1, float y1,
+                float x2, float y2, float x3, float y3) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.rCubicTo(x1, y1, x2, y2, x3, y3);
+    }
+
+    /*package*/ static void native_arcTo(int nPath, RectF oval,
+                    float startAngle, float sweepAngle, boolean forceMoveTo) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.arcTo(oval, startAngle, sweepAngle, forceMoveTo);
+    }
+
+    /*package*/ static void native_close(int nPath) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.close();
+    }
+
+    /*package*/ static void native_addRect(int nPath, RectF rect, int dir) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.addRect(rect.left, rect.top, rect.right, rect.bottom, dir);
+    }
+
+    /*package*/ static void native_addRect(int nPath, float left, float top,
+                                            float right, float bottom, int dir) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.addRect(left, top, right, bottom, dir);
+    }
+
+    /*package*/ static void native_addOval(int nPath, RectF oval, int dir) {
+        // FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    /*package*/ static void native_addCircle(int nPath, float x, float y,
+                                                float radius, int dir) {
+        // FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    /*package*/ static void native_addArc(int nPath, RectF oval,
+                                            float startAngle, float sweepAngle) {
+        // FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    /*package*/ static void native_addRoundRect(int nPath, RectF rect,
+                                                   float rx, float ry, int dir) {
+        // FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    /*package*/ static void native_addRoundRect(int nPath, RectF r,
+                                                   float[] radii, int dir) {
+        // FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    /*package*/ static void native_addPath(int nPath, int src, float dx,
+                                              float dy) {
+        // FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    /*package*/ static void native_addPath(int nPath, int src) {
+        // FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    /*package*/ static void native_addPath(int nPath, int src, int matrix) {
+        // FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    /*package*/ static void native_offset(int nPath, float dx, float dy,
+                                             int dst_path) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        // could be null if the int is 0;
+        Path_Delegate dstDelegate = sManager.getDelegate(dst_path);
+
+        pathDelegate.offset(dx, dy, dstDelegate);
+    }
+
+    /*package*/ static void native_offset(int nPath, float dx, float dy) {
+        native_offset(nPath, dx, dy, 0);
+    }
+
+    /*package*/ static void native_setLastPoint(int nPath, float dx, float dy) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        pathDelegate.mLastX = dx;
+        pathDelegate.mLastY = dy;
+    }
+
+    /*package*/ static void native_transform(int nPath, int matrix,
+                                                int dst_path) {
+        Path_Delegate pathDelegate = sManager.getDelegate(nPath);
+        if (pathDelegate == null) {
+            return;
+        }
+
+        Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(matrix);
+        if (matrixDelegate == null) {
+            return;
+        }
+
+        // this can be null if dst_path is 0
+        Path_Delegate dstDelegate = sManager.getDelegate(dst_path);
+
+        pathDelegate.transform(matrixDelegate, dstDelegate);
+    }
+
+    /*package*/ static void native_transform(int nPath, int matrix) {
+        native_transform(nPath, matrix, 0);
+    }
+
+    /*package*/ static void finalizer(int nPath) {
+        sManager.removeDelegate(nPath);
+    }
+
+
+    // ---- Private helper methods ----
+
+    private void set(Path_Delegate delegate) {
+        mPath.reset();
+        setFillType(delegate.mFillType);
+        mPath.append(delegate.mPath, false /*connect*/);
+    }
+
+    private void setFillType(FillType fillType) {
+        mFillType = fillType;
+        mPath.setWindingRule(getWindingRule(fillType));
+    }
+
+    /**
+     * Returns the Java2D winding rules matching a given Android {@link FillType}.
+     * @param type the android fill type
+     * @return the matching java2d winding rule.
+     */
+    private static int getWindingRule(FillType type) {
+        switch (type) {
+            case WINDING:
+            case INVERSE_WINDING:
+                return GeneralPath.WIND_NON_ZERO;
+            case EVEN_ODD:
+            case INVERSE_EVEN_ODD:
+                return GeneralPath.WIND_EVEN_ODD;
+        }
+
+        assert false;
+        throw new IllegalArgumentException();
+    }
+
+    private static Direction getDirection(int direction) {
+        for (Direction d : Direction.values()) {
+            if (direction == d.nativeInt) {
+                return d;
+            }
+        }
+
+        assert false;
+        return null;
+    }
+
+    /**
+     * Returns whether the path is empty.
+     * @return true if the path is empty.
+     */
+    private boolean isEmpty() {
+        return mPath.getCurrentPoint() == null;
+    }
+
+    /**
+     * Fills the given {@link RectF} with the path bounds.
+     * @param bounds the RectF to be filled.
+     */
+    private void fillBounds(RectF bounds) {
+        Rectangle2D rect = mPath.getBounds2D();
+        bounds.left = (float)rect.getMinX();
+        bounds.right = (float)rect.getMaxX();
+        bounds.top = (float)rect.getMinY();
+        bounds.bottom = (float)rect.getMaxY();
+    }
+
+    /**
+     * Set the beginning of the next contour to the point (x,y).
+     *
+     * @param x The x-coordinate of the start of a new contour
+     * @param y The y-coordinate of the start of a new contour
+     */
+    private void moveTo(float x, float y) {
+        mPath.moveTo(mLastX = x, mLastY = y);
+    }
+
+    /**
+     * Set the beginning of the next contour relative to the last point on the
+     * previous contour. If there is no previous contour, this is treated the
+     * same as moveTo().
+     *
+     * @param dx The amount to add to the x-coordinate of the end of the
+     *           previous contour, to specify the start of a new contour
+     * @param dy The amount to add to the y-coordinate of the end of the
+     *           previous contour, to specify the start of a new contour
+     */
+    private void rMoveTo(float dx, float dy) {
+        dx += mLastX;
+        dy += mLastY;
+        mPath.moveTo(mLastX = dx, mLastY = dy);
+    }
+
+    /**
+     * Add a line from the last point to the specified point (x,y).
+     * If no moveTo() call has been made for this contour, the first point is
+     * automatically set to (0,0).
+     *
+     * @param x The x-coordinate of the end of a line
+     * @param y The y-coordinate of the end of a line
+     */
+    private void lineTo(float x, float y) {
+        mPath.lineTo(mLastX = x, mLastY = y);
+    }
+
+    /**
+     * Same as lineTo, but the coordinates are considered relative to the last
+     * point on this contour. If there is no previous point, then a moveTo(0,0)
+     * is inserted automatically.
+     *
+     * @param dx The amount to add to the x-coordinate of the previous point on
+     *           this contour, to specify a line
+     * @param dy The amount to add to the y-coordinate of the previous point on
+     *           this contour, to specify a line
+     */
+    private void rLineTo(float dx, float dy) {
+        if (isEmpty()) {
+            mPath.moveTo(mLastX = 0, mLastY = 0);
+        }
+        dx += mLastX;
+        dy += mLastY;
+        mPath.lineTo(mLastX = dx, mLastY = dy);
+    }
+
+    /**
+     * Add a quadratic bezier from the last point, approaching control point
+     * (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for
+     * this contour, the first point is automatically set to (0,0).
+     *
+     * @param x1 The x-coordinate of the control point on a quadratic curve
+     * @param y1 The y-coordinate of the control point on a quadratic curve
+     * @param x2 The x-coordinate of the end point on a quadratic curve
+     * @param y2 The y-coordinate of the end point on a quadratic curve
+     */
+    private void quadTo(float x1, float y1, float x2, float y2) {
+        mPath.quadTo(x1, y1, mLastX = x2, mLastY = y2);
+    }
+
+    /**
+     * Same as quadTo, but the coordinates are considered relative to the last
+     * point on this contour. If there is no previous point, then a moveTo(0,0)
+     * is inserted automatically.
+     *
+     * @param dx1 The amount to add to the x-coordinate of the last point on
+     *            this contour, for the control point of a quadratic curve
+     * @param dy1 The amount to add to the y-coordinate of the last point on
+     *            this contour, for the control point of a quadratic curve
+     * @param dx2 The amount to add to the x-coordinate of the last point on
+     *            this contour, for the end point of a quadratic curve
+     * @param dy2 The amount to add to the y-coordinate of the last point on
+     *            this contour, for the end point of a quadratic curve
+     */
+    private void rQuadTo(float dx1, float dy1, float dx2, float dy2) {
+        if (isEmpty()) {
+            mPath.moveTo(mLastX = 0, mLastY = 0);
+        }
+        dx1 += mLastX;
+        dy1 += mLastY;
+        dx2 += mLastX;
+        dy2 += mLastY;
+        mPath.quadTo(dx1, dy1, mLastX = dx2, mLastY = dy2);
+    }
+
+    /**
+     * Add a cubic bezier from the last point, approaching control points
+     * (x1,y1) and (x2,y2), and ending at (x3,y3). If no moveTo() call has been
+     * made for this contour, the first point is automatically set to (0,0).
+     *
+     * @param x1 The x-coordinate of the 1st control point on a cubic curve
+     * @param y1 The y-coordinate of the 1st control point on a cubic curve
+     * @param x2 The x-coordinate of the 2nd control point on a cubic curve
+     * @param y2 The y-coordinate of the 2nd control point on a cubic curve
+     * @param x3 The x-coordinate of the end point on a cubic curve
+     * @param y3 The y-coordinate of the end point on a cubic curve
+     */
+    private void cubicTo(float x1, float y1, float x2, float y2,
+                        float x3, float y3) {
+        mPath.curveTo(x1, y1, x2, y2, mLastX = x3, mLastY = y3);
+    }
+
+    /**
+     * Same as cubicTo, but the coordinates are considered relative to the
+     * current point on this contour. If there is no previous point, then a
+     * moveTo(0,0) is inserted automatically.
+     */
+    private void rCubicTo(float dx1, float dy1, float dx2, float dy2,
+                         float dx3, float dy3) {
+        if (isEmpty()) {
+            mPath.moveTo(mLastX = 0, mLastY = 0);
+        }
+        dx1 += mLastX;
+        dy1 += mLastY;
+        dx2 += mLastX;
+        dy2 += mLastY;
+        dx3 += mLastX;
+        dy3 += mLastY;
+        mPath.curveTo(dx1, dy1, dx2, dy2, mLastX = dx3, mLastY = dy3);
+    }
+
+    /**
+     * Append the specified arc to the path as a new contour. If the start of
+     * the path is different from the path's current last point, then an
+     * automatic lineTo() is added to connect the current contour to the
+     * start of the arc. However, if the path is empty, then we call moveTo()
+     * with the first point of the arc. The sweep angle is tread mod 360.
+     *
+     * @param oval        The bounds of oval defining shape and size of the arc
+     * @param startAngle  Starting angle (in degrees) where the arc begins
+     * @param sweepAngle  Sweep angle (in degrees) measured clockwise, treated
+     *                    mod 360.
+     * @param forceMoveTo If true, always begin a new contour with the arc
+     */
+    private void arcTo(RectF oval, float startAngle, float sweepAngle,
+                      boolean forceMoveTo) {
+        Arc2D arc = new Arc2D.Float(oval.left, oval.top, oval.width(), oval.height(), startAngle,
+                sweepAngle, Arc2D.OPEN);
+        mPath.append(arc, true /*connect*/);
+
+        resetLastPointFromPath();
+    }
+
+    /**
+     * Close the current contour. If the current point is not equal to the
+     * first point of the contour, a line segment is automatically added.
+     */
+    private void close() {
+        mPath.closePath();
+    }
+
+    private void resetLastPointFromPath() {
+        Point2D last = mPath.getCurrentPoint();
+        mLastX = (float) last.getX();
+        mLastY = (float) last.getY();
+    }
+
+    /**
+     * Add a closed rectangle contour to the path
+     *
+     * @param left   The left side of a rectangle to add to the path
+     * @param top    The top of a rectangle to add to the path
+     * @param right  The right side of a rectangle to add to the path
+     * @param bottom The bottom of a rectangle to add to the path
+     * @param dir    The direction to wind the rectangle's contour
+     */
+    private void addRect(float left, float top, float right, float bottom,
+                        int dir) {
+        moveTo(left, top);
+
+        Direction direction = getDirection(dir);
+
+        switch (direction) {
+            case CW:
+                lineTo(right, top);
+                lineTo(right, bottom);
+                lineTo(left, bottom);
+                break;
+            case CCW:
+                lineTo(left, bottom);
+                lineTo(right, bottom);
+                lineTo(right, top);
+                break;
+        }
+
+        close();
+
+        resetLastPointFromPath();
+    }
+
+    /**
+     * Offset the path by (dx,dy), returning true on success
+     *
+     * @param dx  The amount in the X direction to offset the entire path
+     * @param dy  The amount in the Y direction to offset the entire path
+     * @param dst The translated path is written here. If this is null, then
+     *            the original path is modified.
+     */
+    public void offset(float dx, float dy, Path_Delegate dst) {
+        GeneralPath newPath = new GeneralPath();
+
+        PathIterator iterator = mPath.getPathIterator(new AffineTransform(0, 0, dx, 0, 0, dy));
+
+        newPath.append(iterator, false /*connect*/);
+
+        if (dst != null) {
+            dst.mPath = newPath;
+        } else {
+            mPath = newPath;
+        }
+    }
+
+    /**
+     * Transform the points in this path by matrix, and write the answer
+     * into dst. If dst is null, then the the original path is modified.
+     *
+     * @param matrix The matrix to apply to the path
+     * @param dst    The transformed path is written here. If dst is null,
+     *               then the the original path is modified
+     */
+    public void transform(Matrix_Delegate matrix, Path_Delegate dst) {
+        if (matrix.hasPerspective()) {
+            assert false;
+            Bridge.getLog().fidelityWarning(null,
+                    "android.graphics.Path#transform() only " +
+                    "supports affine transformations in the Layout Preview.", null);
+        }
+
+        GeneralPath newPath = new GeneralPath();
+
+        PathIterator iterator = mPath.getPathIterator(matrix.getAffineTransform());
+
+        newPath.append(iterator, false /*connect*/);
+
+        if (dst != null) {
+            dst.mPath = newPath;
+        } else {
+            mPath = newPath;
+        }
+    }
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java
new file mode 100644
index 0000000..516a2b9
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java
@@ -0,0 +1,68 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import java.awt.Composite;
+
+/**
+ * Delegate implementing the native methods of android.graphics.PixelXorXfermode
+ *
+ * Through the layoutlib_create tool, the original native methods of PixelXorXfermode have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original PixelXorXfermode class.
+ *
+ * Because this extends {@link Xfermode_Delegate}, there's no need to use a
+ * {@link DelegateManager}, as all the PathEffect classes will be added to the manager owned by
+ * {@link Xfermode_Delegate}.
+ *
+ * @see Xfermode_Delegate
+ */
+public class PixelXorXfermode_Delegate extends Xfermode_Delegate {
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public Composite getComposite(int alpha) {
+        // FIXME
+        return null;
+    }
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Pixel XOR Xfermodes are not supported in Layout Preview mode.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeCreate(int opColor) {
+        PixelXorXfermode_Delegate newDelegate = new PixelXorXfermode_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java
new file mode 100644
index 0000000..9038636
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java
@@ -0,0 +1,68 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.PorterDuffColorFilter
+ *
+ * Through the layoutlib_create tool, the original native methods of PorterDuffColorFilter have
+ * been replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original PorterDuffColorFilter class.
+ *
+ * Because this extends {@link ColorFilter_Delegate}, there's no need to use a
+ * {@link DelegateManager}, as all the Shader classes will be added to the manager
+ * owned by {@link ColorFilter_Delegate}.
+ *
+ * @see ColorFilter_Delegate
+ *
+ */
+public class PorterDuffColorFilter_Delegate extends ColorFilter_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "PorterDuff Color Filters are not supported.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int native_CreatePorterDuffFilter(int srcColor, int porterDuffMode) {
+        PorterDuffColorFilter_Delegate newDelegate = new PorterDuffColorFilter_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static int nCreatePorterDuffFilter(int nativeFilter, int srcColor,
+            int porterDuffMode) {
+        // pass
+        return 0;
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java
index a5885ea..b7d5dc9 100644
--- a/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java
@@ -16,8 +16,12 @@
 
 package android.graphics;
 
+import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.impl.DelegateManager;
 
+import java.awt.AlphaComposite;
+import java.awt.Composite;
+
 /**
  * Delegate implementing the native methods of android.graphics.PorterDuffXfermode
  *
@@ -41,8 +45,80 @@
 
     // ---- Public Helper methods ----
 
-    public int getMode() {
-        return mMode;
+    public PorterDuff.Mode getMode() {
+        return getPorterDuffMode(mMode);
+    }
+
+    @Override
+    public Composite getComposite(int alpha) {
+        return getComposite(getPorterDuffMode(mMode), alpha);
+    }
+
+    @Override
+    public boolean isSupported() {
+        return true;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        // no message since isSupported returns true;
+        return null;
+    }
+
+    public static PorterDuff.Mode getPorterDuffMode(int mode) {
+        for (PorterDuff.Mode m : PorterDuff.Mode.values()) {
+            if (m.nativeInt == mode) {
+                return m;
+            }
+        }
+
+        Bridge.getLog().error(null, String.format("Unknown PorterDuff.Mode: %d", mode));
+        assert false;
+        return PorterDuff.Mode.SRC_OVER;
+    }
+
+    public static Composite getComposite(PorterDuff.Mode mode, int alpha) {
+        float falpha = alpha != 0xFF ? (float)alpha / 255.f : 1.f;
+        switch (mode) {
+            case CLEAR:
+                return AlphaComposite.getInstance(AlphaComposite.CLEAR, falpha);
+            case DARKEN:
+                break;
+            case DST:
+                return AlphaComposite.getInstance(AlphaComposite.DST, falpha);
+            case DST_ATOP:
+                return AlphaComposite.getInstance(AlphaComposite.DST_ATOP, falpha);
+            case DST_IN:
+                return AlphaComposite.getInstance(AlphaComposite.DST_IN, falpha);
+            case DST_OUT:
+                return AlphaComposite.getInstance(AlphaComposite.DST_OUT, falpha);
+            case DST_OVER:
+                return AlphaComposite.getInstance(AlphaComposite.DST_OVER, falpha);
+            case LIGHTEN:
+                break;
+            case MULTIPLY:
+                break;
+            case SCREEN:
+                break;
+            case SRC:
+                return AlphaComposite.getInstance(AlphaComposite.SRC, falpha);
+            case SRC_ATOP:
+                return AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, falpha);
+            case SRC_IN:
+                return AlphaComposite.getInstance(AlphaComposite.SRC_IN, falpha);
+            case SRC_OUT:
+                return AlphaComposite.getInstance(AlphaComposite.SRC_OUT, falpha);
+            case SRC_OVER:
+                return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, falpha);
+            case XOR:
+                return AlphaComposite.getInstance(AlphaComposite.XOR, falpha);
+        }
+
+        Bridge.getLog().fidelityWarning(null,
+                String.format("Unsupported PorterDuff Mode: %s", mode.name()),
+                null);
+
+        return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, falpha);
     }
 
     // ---- native methods ----
@@ -57,5 +133,4 @@
     private PorterDuffXfermode_Delegate(int mode) {
         mMode = mode;
     }
-
 }
diff --git a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java
index eebf378..1f6f4b4 100644
--- a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java
@@ -21,10 +21,6 @@
 
 import android.graphics.Shader.TileMode;
 
-import java.awt.Paint;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.NoninvertibleTransformException;
-
 /**
  * Delegate implementing the native methods of android.graphics.RadialGradient
  *
@@ -49,7 +45,7 @@
     // ---- Public Helper methods ----
 
     @Override
-    public Paint getJavaPaint() {
+    public java.awt.Paint getJavaPaint() {
         return mJavaPaint;
     }
 
@@ -57,17 +53,8 @@
 
     /*package*/ static int nativeCreate1(float x, float y, float radius,
             int colors[], float positions[], int tileMode) {
-        // figure out the tile
-        TileMode tile = null;
-        for (TileMode tm : TileMode.values()) {
-            if (tm.nativeInt == tileMode) {
-                tile = tm;
-                break;
-            }
-        }
-
         RadialGradient_Delegate newDelegate = new RadialGradient_Delegate(x, y, radius,
-                colors, positions, tile);
+                colors, positions, Shader_Delegate.getTileMode(tileMode));
         return sManager.addDelegate(newDelegate);
     }
 
@@ -133,20 +120,20 @@
                 java.awt.RenderingHints       hints) {
             precomputeGradientColors();
 
-            AffineTransform canvasMatrix;
+            java.awt.geom.AffineTransform canvasMatrix;
             try {
                 canvasMatrix = xform.createInverse();
-            } catch (NoninvertibleTransformException e) {
+            } catch (java.awt.geom.NoninvertibleTransformException e) {
                 Bridge.getLog().error(null, "Unable to inverse matrix in RadialGradient", e);
-                canvasMatrix = new AffineTransform();
+                canvasMatrix = new java.awt.geom.AffineTransform();
             }
 
-            AffineTransform localMatrix = getLocalMatrix();
+            java.awt.geom.AffineTransform localMatrix = getLocalMatrix();
             try {
                 localMatrix = localMatrix.createInverse();
-            } catch (NoninvertibleTransformException e) {
+            } catch (java.awt.geom.NoninvertibleTransformException e) {
                 Bridge.getLog().error(null, "Unable to inverse matrix in RadialGradient", e);
-                localMatrix = new AffineTransform();
+                localMatrix = new java.awt.geom.AffineTransform();
             }
 
             return new RadialGradientPaintContext(canvasMatrix, localMatrix, colorModel);
@@ -154,12 +141,14 @@
 
         private class RadialGradientPaintContext implements java.awt.PaintContext {
 
-            private final AffineTransform mCanvasMatrix;
-            private final AffineTransform mLocalMatrix;
+            private final java.awt.geom.AffineTransform mCanvasMatrix;
+            private final java.awt.geom.AffineTransform mLocalMatrix;
             private final java.awt.image.ColorModel mColorModel;
 
-            public RadialGradientPaintContext(AffineTransform canvasMatrix,
-                    AffineTransform localMatrix, java.awt.image.ColorModel colorModel) {
+            public RadialGradientPaintContext(
+                    java.awt.geom.AffineTransform canvasMatrix,
+                    java.awt.geom.AffineTransform localMatrix,
+                    java.awt.image.ColorModel colorModel) {
                 mCanvasMatrix = canvasMatrix;
                 mLocalMatrix = localMatrix;
                 mColorModel = colorModel;
diff --git a/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java
new file mode 100644
index 0000000..9fd67be
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java
@@ -0,0 +1,62 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+/**
+ * Delegate implementing the native methods of android.graphics.Rasterizer
+ *
+ * Through the layoutlib_create tool, the original native methods of Rasterizer have been replaced
+ * by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original Rasterizer class.
+ *
+ * This also serve as a base class for all Rasterizer delegate classes.
+ *
+ * @see DelegateManager
+ *
+ */
+public abstract class Rasterizer_Delegate {
+
+    // ---- delegate manager ----
+    protected static final DelegateManager<Rasterizer_Delegate> sManager =
+            new DelegateManager<Rasterizer_Delegate>();
+
+    // ---- delegate helper data ----
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    public static Rasterizer_Delegate getDelegate(int nativeShader) {
+        return sManager.getDelegate(nativeShader);
+    }
+
+    public abstract boolean isSupported();
+    public abstract String getSupportMessage();
+
+    // ---- native methods ----
+
+    /*package*/ static void finalizer(int native_instance) {
+        sManager.removeDelegate(native_instance);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java
new file mode 100644
index 0000000..684bb90
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java
@@ -0,0 +1,306 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.Bridge;
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import android.os.Parcel;
+
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Area;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * Delegate implementing the native methods of android.graphics.Region
+ *
+ * Through the layoutlib_create tool, the original native methods of Region have been replaced
+ * by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original Region class.
+ *
+ * This also serve as a base class for all Region delegate classes.
+ *
+ * @see DelegateManager
+ *
+ */
+public class Region_Delegate {
+
+    // ---- delegate manager ----
+    protected static final DelegateManager<Region_Delegate> sManager =
+            new DelegateManager<Region_Delegate>();
+
+    // ---- delegate helper data ----
+
+    // ---- delegate data ----
+    private Area mArea = new Area();
+
+    // ---- Public Helper methods ----
+
+    public static Region_Delegate getDelegate(int nativeShader) {
+        return sManager.getDelegate(nativeShader);
+    }
+
+    public Area getJavaArea() {
+        return mArea;
+    }
+
+    /**
+     * Combines two {@link Shape} into another one (actually an {@link Area}), according
+     * to the given {@link Region.Op}.
+     *
+     * If the Op is not one that combines two shapes, then this return null
+     *
+     * @param shape1 the firt shape to combine
+     * @param shape2 the 2nd shape to combine
+     * @param regionOp the operande for the combine
+     * @return a new area or null.
+     */
+    public static Area combineShapes(Shape shape1, Shape shape2, int regionOp) {
+        if (regionOp == Region.Op.DIFFERENCE.nativeInt) {
+            // result is always a new area.
+            Area result = new Area(shape1);
+            result.subtract(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
+            return result;
+
+        } else if (regionOp == Region.Op.INTERSECT.nativeInt) {
+            // result is always a new area.
+            Area result = new Area(shape1);
+            result.intersect(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
+            return result;
+
+        } else if (regionOp == Region.Op.UNION.nativeInt) {
+            // result is always a new area.
+            Area result = new Area(shape1);
+            result.add(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
+            return result;
+
+        } else if (regionOp == Region.Op.XOR.nativeInt) {
+            // result is always a new area.
+            Area result = new Area(shape1);
+            result.exclusiveOr(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
+
+        } else if (regionOp == Region.Op.REVERSE_DIFFERENCE.nativeInt) {
+            // result is always a new area.
+            Area result = new Area(shape2);
+            result.subtract(shape1 instanceof Area ? (Area) shape1 : new Area(shape1));
+            return result;
+        }
+
+        return null;
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeConstructor() {
+        Region_Delegate newDelegate = new Region_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    /*package*/ static void nativeDestructor(int native_region) {
+        sManager.removeDelegate(native_region);
+    }
+
+    /*package*/ static boolean nativeSetRegion(int native_dst, int native_src) {
+        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
+        if (dstRegion == null) {
+            return true;
+        }
+
+        Region_Delegate srcRegion = sManager.getDelegate(native_src);
+        if (srcRegion == null) {
+            return true;
+        }
+
+        dstRegion.mArea.reset();
+        dstRegion.mArea.add(srcRegion.mArea);
+
+        return true;
+    }
+
+    /*package*/ static boolean nativeSetRect(int native_dst,
+            int left, int top, int right, int bottom) {
+        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
+        if (dstRegion == null) {
+            return true;
+        }
+
+        dstRegion.mArea = new Area(new Rectangle2D.Float(left, top, right - left, bottom - top));
+        return dstRegion.mArea.getBounds().isEmpty() == false;
+    }
+
+    /*package*/ static boolean nativeSetPath(int native_dst, int native_path, int native_clip) {
+        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
+        if (dstRegion == null) {
+            return true;
+        }
+
+        Path_Delegate path = Path_Delegate.getDelegate(native_path);
+        if (path == null) {
+            return true;
+        }
+
+        dstRegion.mArea = new Area(path.getJavaShape());
+
+        Region_Delegate clip = sManager.getDelegate(native_clip);
+        if (clip != null) {
+            dstRegion.mArea.subtract(clip.getJavaArea());
+        }
+
+        return dstRegion.mArea.getBounds().isEmpty() == false;
+    }
+
+    /*package*/ static boolean nativeGetBounds(int native_region, Rect rect) {
+        Region_Delegate region = sManager.getDelegate(native_region);
+        if (region == null) {
+            return true;
+        }
+
+        Rectangle bounds = region.mArea.getBounds();
+        if (bounds.isEmpty()) {
+            rect.left = rect.top = rect.right = rect.bottom = 0;
+            return false;
+        }
+
+        rect.left = bounds.x;
+        rect.top = bounds.y;
+        rect.right = bounds.x + bounds.width;
+        rect.bottom = bounds.y + bounds.height;
+        return true;
+    }
+
+    /*package*/ static boolean nativeGetBoundaryPath(int native_region, int native_path) {
+        Region_Delegate region = sManager.getDelegate(native_region);
+        if (region == null) {
+            return false;
+        }
+
+        Path_Delegate path = Path_Delegate.getDelegate(native_path);
+        if (path == null) {
+            return false;
+        }
+
+        if (region.mArea.isEmpty()) {
+            path.reset();
+            return false;
+        }
+
+        path.setPathIterator(region.mArea.getPathIterator(new AffineTransform()));
+        return true;
+    }
+
+    /*package*/ static boolean nativeOp(int native_dst,
+            int left, int top, int right, int bottom, int op) {
+        Region_Delegate region = sManager.getDelegate(native_dst);
+        if (region == null) {
+            return false;
+        }
+
+        region.mArea = combineShapes(region.mArea,
+                new Rectangle2D.Float(left, top, right - left, bottom - top), op);
+
+        assert region.mArea != null;
+        if (region.mArea != null) {
+            region.mArea = new Area();
+        }
+
+        return region.mArea.getBounds().isEmpty() == false;
+    }
+
+    /*package*/ static boolean nativeOp(int native_dst, Rect rect, int native_region, int op) {
+        Region_Delegate region = sManager.getDelegate(native_dst);
+        if (region == null) {
+            return false;
+        }
+
+        region.mArea = combineShapes(region.mArea,
+                new Rectangle2D.Float(rect.left, rect.top, rect.width(), rect.height()), op);
+
+        assert region.mArea != null;
+        if (region.mArea != null) {
+            region.mArea = new Area();
+        }
+
+        return region.mArea.getBounds().isEmpty() == false;
+    }
+
+    /*package*/ static boolean nativeOp(int native_dst,
+            int native_region1, int native_region2, int op) {
+        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
+        if (dstRegion == null) {
+            return true;
+        }
+
+        Region_Delegate region1 = sManager.getDelegate(native_region1);
+        if (region1 == null) {
+            return false;
+        }
+
+        Region_Delegate region2 = sManager.getDelegate(native_region2);
+        if (region2 == null) {
+            return false;
+        }
+
+        dstRegion.mArea = combineShapes(region1.mArea, region2.mArea, op);
+
+        assert dstRegion.mArea != null;
+        if (dstRegion.mArea != null) {
+            dstRegion.mArea = new Area();
+        }
+
+        return dstRegion.mArea.getBounds().isEmpty() == false;
+
+    }
+
+    /*package*/ static int nativeCreateFromParcel(Parcel p) {
+        // This is only called by Region.CREATOR (Parcelable.Creator<Region>), which is only
+        // used during aidl call so really this should not be called.
+        Bridge.getLog().error(null,
+                "AIDL is not suppored, and therefore Regions cannot be created from parcels.");
+        return 0;
+    }
+
+    /*package*/ static boolean nativeWriteToParcel(int native_region,
+                                                      Parcel p) {
+        // This is only called when sending a region through aidl, so really this should not
+        // be called.
+        Bridge.getLog().error(null,
+                "AIDL is not suppored, and therefore Regions cannot be written to parcels.");
+        return false;
+    }
+
+    /*package*/ static boolean nativeEquals(int native_r1, int native_r2) {
+        Region_Delegate region1 = sManager.getDelegate(native_r1);
+        if (region1 == null) {
+            return false;
+        }
+
+        Region_Delegate region2 = sManager.getDelegate(native_r2);
+        if (region2 == null) {
+            return false;
+        }
+
+        return region1.mArea.equals(region2.mArea);
+    }
+
+    // ---- Private delegate/helper methods ----
+
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
index 7bf1443..7903ac9 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
@@ -18,7 +18,7 @@
 
 import com.android.layoutlib.bridge.impl.DelegateManager;
 
-import java.awt.geom.AffineTransform;
+import android.graphics.Shader.TileMode;
 
 /**
  * Delegate implementing the native methods of android.graphics.Shader
@@ -52,7 +52,25 @@
         return sManager.getDelegate(nativeShader);
     }
 
+    /**
+     * Returns the {@link TileMode} matching the given int.
+     * @param tileMode the tile mode int value
+     * @return the TileMode enum.
+     */
+    public static TileMode getTileMode(int tileMode) {
+        for (TileMode tm : TileMode.values()) {
+            if (tm.nativeInt == tileMode) {
+                return tm;
+            }
+        }
+
+        assert false;
+        return TileMode.CLAMP;
+    }
+
     public abstract java.awt.Paint getJavaPaint();
+    public abstract boolean isSupported();
+    public abstract String getSupportMessage();
 
     // ---- native methods ----
 
@@ -64,27 +82,16 @@
         // get the delegate from the native int.
         Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader);
         if (shaderDelegate == null) {
-            assert false;
             return false;
         }
 
-        Matrix_Delegate localMatrixDelegate = null;
-        if (shaderDelegate.mLocalMatrix > 0) {
-            localMatrixDelegate = Matrix_Delegate.getDelegate(shaderDelegate.mLocalMatrix);
-            if (localMatrixDelegate == null) {
-                assert false;
-                return false;
-            }
-        }
+        // can be null if shader has no matrix (int is 0)
+        Matrix_Delegate localMatrixDelegate = Matrix_Delegate.getDelegate(
+                shaderDelegate.mLocalMatrix);
 
-        Matrix_Delegate destMatrixDelegate = null;
-        if (matrix_instance > 0) {
-            destMatrixDelegate = Matrix_Delegate.getDelegate(shaderDelegate.mLocalMatrix);
-            if (destMatrixDelegate == null) {
-                assert false;
-                return false;
-            }
-
+        // can be null if the int is 0.
+        Matrix_Delegate destMatrixDelegate = Matrix_Delegate.getDelegate(matrix_instance);
+        if (destMatrixDelegate != null) {
             if (localMatrixDelegate != null) {
                 destMatrixDelegate.set(localMatrixDelegate);
             } else {
@@ -102,7 +109,6 @@
         // get the delegate from the native int.
         Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader);
         if (shaderDelegate == null) {
-            assert false;
             return;
         }
 
@@ -111,19 +117,13 @@
 
     // ---- Private delegate/helper methods ----
 
-    protected AffineTransform getLocalMatrix() {
-        Matrix_Delegate localMatrixDelegate = null;
-        if (mLocalMatrix > 0) {
-            localMatrixDelegate = Matrix_Delegate.getDelegate(mLocalMatrix);
-            if (localMatrixDelegate == null) {
-                assert false;
-                return new AffineTransform();
-            }
-
+    protected java.awt.geom.AffineTransform getLocalMatrix() {
+        Matrix_Delegate localMatrixDelegate = Matrix_Delegate.getDelegate(mLocalMatrix);
+        if (localMatrixDelegate != null) {
             return localMatrixDelegate.getAffineTransform();
         }
 
-        return new AffineTransform();
+        return new java.awt.geom.AffineTransform();
     }
 
 }
diff --git a/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java
new file mode 100644
index 0000000..b02f9c5
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java
@@ -0,0 +1,69 @@
+/*
+ * 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.graphics;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+
+import java.awt.Stroke;
+
+/**
+ * Delegate implementing the native methods of android.graphics.SumPathEffect
+ *
+ * Through the layoutlib_create tool, the original native methods of SumPathEffect have been
+ * replaced by calls to methods of the same name in this delegate class.
+ *
+ * This class behaves like the original native implementation, but in Java, keeping previously
+ * native data into its own objects and mapping them to int that are sent back and forth between
+ * it and the original SumPathEffect class.
+ *
+ * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager},
+ * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}.
+ *
+ * @see Shader_Delegate
+ *
+ */
+public class SumPathEffect_Delegate extends PathEffect_Delegate {
+
+    // ---- delegate data ----
+
+    // ---- Public Helper methods ----
+
+    @Override
+    public Stroke getStroke(Paint_Delegate paint) {
+        // FIXME
+        return null;
+    }
+
+    @Override
+    public boolean isSupported() {
+        return false;
+    }
+
+    @Override
+    public String getSupportMessage() {
+        return "Sum Path Effects are not supported in Layout Preview mode.";
+    }
+
+    // ---- native methods ----
+
+    /*package*/ static int nativeCreate(int first, int second) {
+        SumPathEffect_Delegate newDelegate = new SumPathEffect_Delegate();
+        return sManager.addDelegate(newDelegate);
+    }
+
+    // ---- Private delegate/helper methods ----
+}
diff --git a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java
index 97c3cfd..970e781 100644
--- a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java
@@ -19,10 +19,6 @@
 import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.impl.DelegateManager;
 
-import java.awt.Paint;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.NoninvertibleTransformException;
-
 /**
  * Delegate implementing the native methods of android.graphics.SweepGradient
  *
@@ -47,7 +43,7 @@
     // ---- Public Helper methods ----
 
     @Override
-    public Paint getJavaPaint() {
+    public java.awt.Paint getJavaPaint() {
         return mJavaPaint;
     }
 
@@ -116,20 +112,20 @@
                 java.awt.RenderingHints       hints) {
             precomputeGradientColors();
 
-            AffineTransform canvasMatrix;
+            java.awt.geom.AffineTransform canvasMatrix;
             try {
                 canvasMatrix = xform.createInverse();
-            } catch (NoninvertibleTransformException e) {
+            } catch (java.awt.geom.NoninvertibleTransformException e) {
                 Bridge.getLog().error(null, "Unable to inverse matrix in SweepGradient", e);
-                canvasMatrix = new AffineTransform();
+                canvasMatrix = new java.awt.geom.AffineTransform();
             }
 
-            AffineTransform localMatrix = getLocalMatrix();
+            java.awt.geom.AffineTransform localMatrix = getLocalMatrix();
             try {
                 localMatrix = localMatrix.createInverse();
-            } catch (NoninvertibleTransformException e) {
+            } catch (java.awt.geom.NoninvertibleTransformException e) {
                 Bridge.getLog().error(null, "Unable to inverse matrix in SweepGradient", e);
-                localMatrix = new AffineTransform();
+                localMatrix = new java.awt.geom.AffineTransform();
             }
 
             return new SweepGradientPaintContext(canvasMatrix, localMatrix, colorModel);
@@ -137,12 +133,14 @@
 
         private class SweepGradientPaintContext implements java.awt.PaintContext {
 
-            private final AffineTransform mCanvasMatrix;
-            private final AffineTransform mLocalMatrix;
+            private final java.awt.geom.AffineTransform mCanvasMatrix;
+            private final java.awt.geom.AffineTransform mLocalMatrix;
             private final java.awt.image.ColorModel mColorModel;
 
-            public SweepGradientPaintContext(AffineTransform canvasMatrix,
-                    AffineTransform localMatrix, java.awt.image.ColorModel colorModel) {
+            public SweepGradientPaintContext(
+                    java.awt.geom.AffineTransform canvasMatrix,
+                    java.awt.geom.AffineTransform localMatrix,
+                    java.awt.image.ColorModel colorModel) {
                 mCanvasMatrix = canvasMatrix;
                 mLocalMatrix = localMatrix;
                 mColorModel = colorModel;
diff --git a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
index 0b54a0e..c7362c0 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
@@ -78,7 +78,6 @@
     public static List<Font> getFonts(int native_int) {
         Typeface_Delegate delegate = sManager.getDelegate(native_int);
         if (delegate == null) {
-            assert false;
             return null;
         }
 
@@ -109,7 +108,6 @@
     /*package*/ static synchronized int nativeCreateFromTypeface(int native_instance, int style) {
         Typeface_Delegate delegate = sManager.getDelegate(native_instance);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
@@ -143,7 +141,6 @@
     /*package*/ static int nativeGetStyle(int native_instance) {
         Typeface_Delegate delegate = sManager.getDelegate(native_instance);
         if (delegate == null) {
-            assert false;
             return 0;
         }
 
diff --git a/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java
index 0c1170d..312318a 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java
@@ -18,6 +18,8 @@
 
 import com.android.layoutlib.bridge.impl.DelegateManager;
 
+import java.awt.Composite;
+
 /**
  * Delegate implementing the native methods of android.graphics.Xfermode
  *
@@ -33,7 +35,7 @@
  * @see DelegateManager
  *
  */
-public class Xfermode_Delegate {
+public abstract class Xfermode_Delegate {
 
     // ---- delegate manager ----
     protected static final DelegateManager<Xfermode_Delegate> sManager =
@@ -49,6 +51,11 @@
         return sManager.getDelegate(native_instance);
     }
 
+    public abstract Composite getComposite(int alpha);
+    public abstract boolean isSupported();
+    public abstract String getSupportMessage();
+
+
     // ---- native methods ----
 
     /*package*/ static void finalizer(int native_instance) {
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index 9de6e8f..5f40854 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -16,15 +16,17 @@
 
 package com.android.layoutlib.bridge;
 
-import com.android.layoutlib.api.Capability;
-import com.android.layoutlib.api.LayoutBridge;
-import com.android.layoutlib.api.LayoutLog;
-import com.android.layoutlib.api.SceneParams;
-import com.android.layoutlib.api.SceneResult;
-import com.android.layoutlib.api.SceneResult.SceneStatus;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN;
+import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
+
+import com.android.ide.common.rendering.api.Capability;
+import com.android.ide.common.rendering.api.LayoutLog;
+import com.android.ide.common.rendering.api.Params;
+import com.android.ide.common.rendering.api.RenderSession;
+import com.android.ide.common.rendering.api.Result;
 import com.android.layoutlib.bridge.android.BridgeAssetManager;
 import com.android.layoutlib.bridge.impl.FontLoader;
-import com.android.layoutlib.bridge.impl.LayoutSceneImpl;
+import com.android.layoutlib.bridge.impl.RenderSessionImpl;
 import com.android.ninepatch.NinePatchChunk;
 import com.android.tools.layoutlib.create.MethodAdapter;
 import com.android.tools.layoutlib.create.OverrideMethod;
@@ -32,8 +34,8 @@
 import android.graphics.Bitmap;
 import android.graphics.Typeface_Delegate;
 import android.os.Looper;
-import android.util.Finalizers;
 
+import java.io.File;
 import java.lang.ref.SoftReference;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
@@ -48,7 +50,7 @@
  * <p/>To use this bridge, simply instantiate an object of type {@link Bridge} and call
  * {@link #createScene(SceneParams)}
  */
-public final class Bridge extends LayoutBridge {
+public final class Bridge extends com.android.ide.common.rendering.api.Bridge {
 
     public static class StaticMethodNotImplementedException extends RuntimeException {
         private static final long serialVersionUID = 1L;
@@ -170,7 +172,7 @@
 
     @Override
     public int getApiLevel() {
-        return LayoutBridge.API_CURRENT;
+        return com.android.ide.common.rendering.api.Bridge.API_CURRENT;
     }
 
     @Override
@@ -180,10 +182,10 @@
 
     /*
      * (non-Javadoc)
-     * @see com.android.layoutlib.api.ILayoutLibBridge#init(java.lang.String, java.util.Map)
+     * @see com.android.layoutlib.api.ILayoutLibBridge#init(java.io.File, java.util.Map)
      */
     @Override
-    public boolean init(String fontOsLocation, Map<String, Map<String, Integer>> enumValueMap) {
+    public boolean init(File fontLocation, Map<String, Map<String, Integer>> enumValueMap) {
         sEnumValueMap = enumValueMap;
 
         // don't use EnumSet.allOf(), because the bridge doesn't come with its specific version
@@ -198,8 +200,6 @@
                 Capability.ANIMATE);
 
 
-        Finalizers.init();
-
         BridgeAssetManager.initSystem();
 
         // When DEBUG_LAYOUT is set and is not 0 or false, setup a default listener
@@ -232,7 +232,7 @@
         }
 
         // load the fonts.
-        FontLoader fontLoader = FontLoader.create(fontOsLocation);
+        FontLoader fontLoader = FontLoader.create(fontLocation.getAbsolutePath());
         if (fontLoader != null) {
             Typeface_Delegate.init(fontLoader);
         } else {
@@ -302,10 +302,10 @@
      * @since 5
      */
     @Override
-    public BridgeLayoutScene createScene(SceneParams params) {
+    public RenderSession createSession(Params params) {
         try {
-            SceneResult lastResult = SceneStatus.SUCCESS.createResult();
-            LayoutSceneImpl scene = new LayoutSceneImpl(params);
+            Result lastResult = SUCCESS.createResult();
+            RenderSessionImpl scene = new RenderSessionImpl(params);
             try {
                 prepareThread();
                 lastResult = scene.init(params.getTimeout());
@@ -320,15 +320,15 @@
                 cleanupThread();
             }
 
-            return new BridgeLayoutScene(scene, lastResult);
+            return new BridgeRenderSession(scene, lastResult);
         } catch (Throwable t) {
             // get the real cause of the exception.
             Throwable t2 = t;
             while (t2.getCause() != null) {
                 t2 = t.getCause();
             }
-            return new BridgeLayoutScene(null,
-                    SceneStatus.ERROR_UNKNOWN.createResult(t2.getMessage(), t2));
+            return new BridgeRenderSession(null,
+                    ERROR_UNKNOWN.createResult(t2.getMessage(), t2));
         }
     }
 
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeLayoutScene.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeLayoutScene.java
deleted file mode 100644
index f43559f..0000000
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeLayoutScene.java
+++ /dev/null
@@ -1,174 +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.layoutlib.bridge;
-
-import com.android.layoutlib.api.IXmlPullParser;
-import com.android.layoutlib.api.LayoutScene;
-import com.android.layoutlib.api.SceneParams;
-import com.android.layoutlib.api.SceneResult;
-import com.android.layoutlib.api.ViewInfo;
-import com.android.layoutlib.bridge.impl.LayoutSceneImpl;
-
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.awt.image.BufferedImage;
-import java.util.Map;
-
-/**
- * An implementation of {@link LayoutScene}.
- *
- * This is a pretty basic class that does almost nothing. All of the work is done in
- * {@link LayoutSceneImpl}.
- *
- */
-public class BridgeLayoutScene extends LayoutScene {
-
-    private final LayoutSceneImpl mScene;
-    private SceneResult mLastResult;
-
-    @Override
-    public SceneResult getResult() {
-        return mLastResult;
-    }
-
-    @Override
-    public BufferedImage getImage() {
-        return mScene.getImage();
-    }
-
-    @Override
-    public ViewInfo getRootView() {
-        return mScene.getViewInfo();
-    }
-
-    @Override
-    public Map<String, String> getDefaultViewPropertyValues(Object viewObject) {
-        return mScene.getDefaultViewPropertyValues(viewObject);
-    }
-
-    @Override
-    public SceneResult render(long timeout) {
-        try {
-            Bridge.prepareThread();
-            mLastResult = mScene.acquire(timeout);
-            if (mLastResult.isSuccess()) {
-                mLastResult = mScene.render();
-            }
-        } finally {
-            mScene.release();
-            Bridge.cleanupThread();
-        }
-
-        return mLastResult;
-    }
-
-    @Override
-    public SceneResult animate(Object targetObject, String animationName,
-            boolean isFrameworkAnimation, IAnimationListener listener) {
-        try {
-            Bridge.prepareThread();
-            mLastResult = mScene.acquire(SceneParams.DEFAULT_TIMEOUT);
-            if (mLastResult.isSuccess()) {
-                mLastResult = mScene.animate(targetObject, animationName, isFrameworkAnimation,
-                        listener);
-            }
-        } finally {
-            mScene.release();
-            Bridge.cleanupThread();
-        }
-
-        return mLastResult;
-    }
-
-    @Override
-    public SceneResult insertChild(Object parentView, IXmlPullParser childXml, int index,
-            IAnimationListener listener) {
-        if (parentView instanceof ViewGroup == false) {
-            throw new IllegalArgumentException("parentView is not a ViewGroup");
-        }
-
-        try {
-            Bridge.prepareThread();
-            mLastResult = mScene.acquire(SceneParams.DEFAULT_TIMEOUT);
-            if (mLastResult.isSuccess()) {
-                mLastResult = mScene.insertChild((ViewGroup) parentView, childXml, index, listener);
-            }
-        } finally {
-            mScene.release();
-            Bridge.cleanupThread();
-        }
-
-        return mLastResult;
-    }
-
-
-    @Override
-    public SceneResult moveChild(Object parentView, Object childView, int index,
-            Map<String, String> layoutParams, IAnimationListener listener) {
-        if (parentView instanceof ViewGroup == false) {
-            throw new IllegalArgumentException("parentView is not a ViewGroup");
-        }
-        if (childView instanceof View == false) {
-            throw new IllegalArgumentException("childView is not a View");
-        }
-
-        try {
-            Bridge.prepareThread();
-            mLastResult = mScene.acquire(SceneParams.DEFAULT_TIMEOUT);
-            if (mLastResult.isSuccess()) {
-                mLastResult = mScene.moveChild((ViewGroup) parentView, (View) childView, index,
-                        layoutParams, listener);
-            }
-        } finally {
-            mScene.release();
-            Bridge.cleanupThread();
-        }
-
-        return mLastResult;
-    }
-
-    @Override
-    public SceneResult removeChild(Object childView, IAnimationListener listener) {
-        if (childView instanceof View == false) {
-            throw new IllegalArgumentException("childView is not a View");
-        }
-
-        try {
-            Bridge.prepareThread();
-            mLastResult = mScene.acquire(SceneParams.DEFAULT_TIMEOUT);
-            if (mLastResult.isSuccess()) {
-                mLastResult = mScene.removeChild((View) childView, listener);
-            }
-        } finally {
-            mScene.release();
-            Bridge.cleanupThread();
-        }
-
-        return mLastResult;
-    }
-
-    @Override
-    public void dispose() {
-    }
-
-    /*package*/ BridgeLayoutScene(LayoutSceneImpl scene, SceneResult lastResult) {
-        mScene = scene;
-        mScene.setScene(this);
-        mLastResult = lastResult;
-    }
-}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java
new file mode 100644
index 0000000..6ebc56c
--- /dev/null
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java
@@ -0,0 +1,176 @@
+/*
+ * 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.layoutlib.bridge;
+
+import com.android.ide.common.rendering.api.IAnimationListener;
+import com.android.ide.common.rendering.api.ILayoutPullParser;
+import com.android.ide.common.rendering.api.Params;
+import com.android.ide.common.rendering.api.RenderSession;
+import com.android.ide.common.rendering.api.Result;
+import com.android.ide.common.rendering.api.ViewInfo;
+import com.android.layoutlib.bridge.impl.RenderSessionImpl;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.awt.image.BufferedImage;
+import java.util.Map;
+
+/**
+ * An implementation of {@link RenderSession}.
+ *
+ * This is a pretty basic class that does almost nothing. All of the work is done in
+ * {@link RenderSessionImpl}.
+ *
+ */
+public class BridgeRenderSession extends RenderSession {
+
+    private final RenderSessionImpl mSession;
+    private Result mLastResult;
+
+    @Override
+    public Result getResult() {
+        return mLastResult;
+    }
+
+    @Override
+    public BufferedImage getImage() {
+        return mSession.getImage();
+    }
+
+    @Override
+    public ViewInfo getRootView() {
+        return mSession.getViewInfo();
+    }
+
+    @Override
+    public Map<String, String> getDefaultProperties(Object viewObject) {
+        return mSession.getDefaultProperties(viewObject);
+    }
+
+    @Override
+    public Result render(long timeout) {
+        try {
+            Bridge.prepareThread();
+            mLastResult = mSession.acquire(timeout);
+            if (mLastResult.isSuccess()) {
+                mLastResult = mSession.render();
+            }
+        } finally {
+            mSession.release();
+            Bridge.cleanupThread();
+        }
+
+        return mLastResult;
+    }
+
+    @Override
+    public Result animate(Object targetObject, String animationName,
+            boolean isFrameworkAnimation, IAnimationListener listener) {
+        try {
+            Bridge.prepareThread();
+            mLastResult = mSession.acquire(Params.DEFAULT_TIMEOUT);
+            if (mLastResult.isSuccess()) {
+                mLastResult = mSession.animate(targetObject, animationName, isFrameworkAnimation,
+                        listener);
+            }
+        } finally {
+            mSession.release();
+            Bridge.cleanupThread();
+        }
+
+        return mLastResult;
+    }
+
+    @Override
+    public Result insertChild(Object parentView, ILayoutPullParser childXml, int index,
+            IAnimationListener listener) {
+        if (parentView instanceof ViewGroup == false) {
+            throw new IllegalArgumentException("parentView is not a ViewGroup");
+        }
+
+        try {
+            Bridge.prepareThread();
+            mLastResult = mSession.acquire(Params.DEFAULT_TIMEOUT);
+            if (mLastResult.isSuccess()) {
+                mLastResult = mSession.insertChild((ViewGroup) parentView, childXml, index,
+                        listener);
+            }
+        } finally {
+            mSession.release();
+            Bridge.cleanupThread();
+        }
+
+        return mLastResult;
+    }
+
+
+    @Override
+    public Result moveChild(Object parentView, Object childView, int index,
+            Map<String, String> layoutParams, IAnimationListener listener) {
+        if (parentView instanceof ViewGroup == false) {
+            throw new IllegalArgumentException("parentView is not a ViewGroup");
+        }
+        if (childView instanceof View == false) {
+            throw new IllegalArgumentException("childView is not a View");
+        }
+
+        try {
+            Bridge.prepareThread();
+            mLastResult = mSession.acquire(Params.DEFAULT_TIMEOUT);
+            if (mLastResult.isSuccess()) {
+                mLastResult = mSession.moveChild((ViewGroup) parentView, (View) childView, index,
+                        layoutParams, listener);
+            }
+        } finally {
+            mSession.release();
+            Bridge.cleanupThread();
+        }
+
+        return mLastResult;
+    }
+
+    @Override
+    public Result removeChild(Object childView, IAnimationListener listener) {
+        if (childView instanceof View == false) {
+            throw new IllegalArgumentException("childView is not a View");
+        }
+
+        try {
+            Bridge.prepareThread();
+            mLastResult = mSession.acquire(Params.DEFAULT_TIMEOUT);
+            if (mLastResult.isSuccess()) {
+                mLastResult = mSession.removeChild((View) childView, listener);
+            }
+        } finally {
+            mSession.release();
+            Bridge.cleanupThread();
+        }
+
+        return mLastResult;
+    }
+
+    @Override
+    public void dispose() {
+    }
+
+    /*package*/ BridgeRenderSession(RenderSessionImpl scene, Result lastResult) {
+        mSession = scene;
+        mSession.setScene(this);
+        mLastResult = lastResult;
+    }
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index f484e7a..7269227 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -16,9 +16,9 @@
 
 package com.android.layoutlib.bridge.android;
 
-import com.android.layoutlib.api.IProjectCallback;
-import com.android.layoutlib.api.ResourceValue;
-import com.android.layoutlib.api.StyleResourceValue;
+import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.ResourceValue;
+import com.android.ide.common.rendering.api.StyleResourceValue;
 import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.BridgeConstants;
 import com.android.layoutlib.bridge.impl.Stack;
@@ -105,11 +105,11 @@
      * @param themeName The name of the theme to use.
      * @param projectResources the resources of the project. The map contains (String, map) pairs
      * where the string is the type of the resource reference used in the layout file, and the
-     * map contains (String, {@link IResourceValue}) pairs where the key is the resource name,
+     * map contains (String, {@link }) pairs where the key is the resource name,
      * and the value is the resource value.
      * @param frameworkResources the framework resources. The map contains (String, map) pairs
      * where the string is the type of the resource reference used in the layout file, and the map
-     * contains (String, {@link IResourceValue}) pairs where the key is the resource name, and the
+     * contains (String, {@link ResourceValue}) pairs where the key is the resource name, and the
      * value is the resource value.
      * @param styleInheritanceMap
      * @param projectCallback
@@ -321,7 +321,7 @@
 
             isPlatformFile = parser.isPlatformFile();
 
-            Object key = parser.getViewKey();
+            Object key = parser.getViewCookie();
             if (key != null) {
                 defaultPropMap = mDefaultPropMaps.get(key);
                 if (defaultPropMap == null) {
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java
index dbf83e7..1b59621 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java
@@ -16,8 +16,8 @@
 
 package com.android.layoutlib.bridge.android;
 
-import com.android.layoutlib.api.IProjectCallback;
-import com.android.layoutlib.api.ResourceValue;
+import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.ResourceValue;
 import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.BridgeConstants;
 
@@ -217,14 +217,14 @@
                 BridgeXmlBlockParser parser = (BridgeXmlBlockParser) attrs;
 
                 // get the view key
-                Object viewKey = parser.getViewKey();
+                Object viewKey = parser.getViewCookie();
 
                 // if there's no view key and the depth is 1 (ie this is the first tag),
                 // look for a previous parser in the context, and check if this one has a viewkey.
                 if (viewKey == null && parser.getDepth() == 1) {
                     BridgeXmlBlockParser previousParser = bc.getPreviousParser();
                     if (previousParser != null) {
-                        viewKey = previousParser.getViewKey();
+                        viewKey = previousParser.getViewCookie();
                     }
                 }
 
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java
index c1e2046..2ea5281 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java
@@ -16,8 +16,8 @@
 
 package com.android.layoutlib.bridge.android;
 
-import com.android.layoutlib.api.IProjectCallback;
-import com.android.layoutlib.api.ResourceValue;
+import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.ResourceValue;
 import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.BridgeConstants;
 import com.android.layoutlib.bridge.impl.ResourceHelper;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java
index fcbf5fa..6ae7e03 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java
@@ -16,9 +16,9 @@
 
 package com.android.layoutlib.bridge.android;
 
+import com.android.ide.common.rendering.api.ResourceValue;
+import com.android.ide.common.rendering.api.StyleResourceValue;
 import com.android.internal.util.XmlUtils;
-import com.android.layoutlib.api.ResourceValue;
-import com.android.layoutlib.api.StyleResourceValue;
 import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.BridgeConstants;
 import com.android.layoutlib.bridge.impl.ResourceHelper;
@@ -66,7 +66,7 @@
     }
 
     /**
-     * Seals the array after all calls to {@link #bridgeSetValue(int, String, IResourceValue)} have
+     * Seals the array after all calls to {@link #bridgeSetValue(int, String, ResourceValue)} have
      * been done.
      * <p/>This allows to compute the list of non default values, permitting
      * {@link #getIndexCount()} to return the proper value.
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java
index 73bee96..38800da 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlBlockParser.java
@@ -16,7 +16,8 @@
 
 package com.android.layoutlib.bridge.android;
 
-import com.android.layoutlib.api.IXmlPullParser;
+
+import com.android.ide.common.rendering.api.ILayoutPullParser;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -65,17 +66,17 @@
         return mPlatformFile;
     }
 
-    public IXmlPullParser getParser(String layoutName) {
-        if (mParser instanceof IXmlPullParser) {
-            return ((IXmlPullParser)mParser).getParser(layoutName);
+    public ILayoutPullParser getParser(String layoutName) {
+        if (mParser instanceof ILayoutPullParser) {
+            return ((ILayoutPullParser)mParser).getParser(layoutName);
         }
 
         return null;
     }
 
-    public Object getViewKey() {
-        if (mParser instanceof IXmlPullParser) {
-            return ((IXmlPullParser)mParser).getViewKey();
+    public Object getViewCookie() {
+        if (mParser instanceof ILayoutPullParser) {
+            return ((ILayoutPullParser)mParser).getViewCookie();
         }
 
         return null;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlPullAttributes.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlPullAttributes.java
index 92b98e5..ba45217 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlPullAttributes.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlPullAttributes.java
@@ -16,7 +16,7 @@
 
 package com.android.layoutlib.bridge.android;
 
-import com.android.layoutlib.api.ResourceValue;
+import com.android.ide.common.rendering.api.ResourceValue;
 import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.BridgeConstants;
 
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java
index 4ee813c..1651d6a 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java
@@ -16,10 +16,10 @@
 
 package com.android.layoutlib.bridge.impl;
 
-import com.android.layoutlib.api.LayoutScene;
-import com.android.layoutlib.api.SceneResult;
-import com.android.layoutlib.api.LayoutScene.IAnimationListener;
-import com.android.layoutlib.api.SceneResult.SceneStatus;
+import com.android.ide.common.rendering.api.IAnimationListener;
+import com.android.ide.common.rendering.api.RenderSession;
+import com.android.ide.common.rendering.api.Result;
+import com.android.ide.common.rendering.api.Result.Status;
 import com.android.layoutlib.bridge.Bridge;
 
 import android.animation.ValueAnimator;
@@ -57,18 +57,19 @@
         }
     }
 
-    private final LayoutSceneImpl mScene;
+    private final RenderSessionImpl mSession;
 
     Queue<MessageBundle> mQueue = new LinkedList<MessageBundle>();
     private final IAnimationListener mListener;
 
-    public AnimationThread(LayoutSceneImpl scene, String threadName, IAnimationListener listener) {
+    public AnimationThread(RenderSessionImpl scene, String threadName,
+            IAnimationListener listener) {
         super(threadName);
-        mScene = scene;
+        mSession = scene;
         mListener = listener;
     }
 
-    public abstract SceneResult preAnimation();
+    public abstract Result preAnimation();
     public abstract void postAnimation();
 
     @Override
@@ -87,13 +88,13 @@
             });
 
             // call out to the pre-animation work, which should start an animation or more.
-            SceneResult result = preAnimation();
+            Result result = preAnimation();
             if (result.isSuccess() == false) {
                 mListener.done(result);
             }
 
             // loop the animation
-            LayoutScene scene = mScene.getScene();
+            RenderSession session = mSession.getSession();
             do {
                 // check early.
                 if (mListener.isCanceled()) {
@@ -123,7 +124,7 @@
                 }
 
                 // ready to do the work, acquire the scene.
-                result = mScene.acquire(250);
+                result = mSession.acquire(250);
                 if (result.isSuccess() == false) {
                     mListener.done(result);
                     return;
@@ -138,15 +139,15 @@
                     }
 
                     bundle.mTarget.handleMessage(bundle.mMessage);
-                    if (mScene.render().isSuccess()) {
-                        mListener.onNewFrame(scene);
+                    if (mSession.render().isSuccess()) {
+                        mListener.onNewFrame(session);
                     }
                 } finally {
-                    mScene.release();
+                    mSession.release();
                 }
             } while (mListener.isCanceled() == false && mQueue.size() > 0);
 
-            mListener.done(SceneStatus.SUCCESS.createResult());
+            mListener.done(Status.SUCCESS.createResult());
         } finally {
             postAnimation();
             Handler_Delegate.setCallback(null);
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java
index b272963..05a258d 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java
@@ -55,11 +55,21 @@
 
     /**
      * Returns the delegate from the given native int.
+     * <p>
+     * If the int is zero, then this will always return null.
+     * <p>
+     * If the int is non zero and the delegate is not found, this will throw an assert.
+     *
      * @param native_object the native int.
      * @return the delegate or null if not found.
      */
     public T getDelegate(int native_object) {
-        return mDelegates.get(native_object);
+        if (native_object > 0) {
+            T delegate =  mDelegates.get(native_object);
+            assert delegate != null;
+            return delegate;
+        }
+        return null;
     }
 
     /**
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java
index 8c6b1be..a2fcb3b 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java
@@ -16,59 +16,315 @@
 
 package com.android.layoutlib.bridge.impl;
 
-import android.graphics.Canvas;
-import android.graphics.Region;
+import com.android.layoutlib.bridge.Bridge;
 
+import android.graphics.Bitmap_Delegate;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint_Delegate;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Region;
+import android.graphics.Region_Delegate;
+import android.graphics.Shader_Delegate;
+import android.graphics.Xfermode_Delegate;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
 import java.awt.Graphics2D;
+import java.awt.RenderingHints;
 import java.awt.Shape;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Area;
 import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
 
 /**
  * Class representing a graphics context snapshot, as well as a context stack as a linked list.
  * <p>
  * This is based on top of {@link Graphics2D} but can operate independently if none are available
  * yet when setting transforms and clip information.
+ * <p>
+ * This allows for drawing through {@link #draw(Drawable, Paint_Delegate)} and
+ * {@link #draw(Drawable, Paint_Delegate)}
  *
+ * Handling of layers (created with {@link Canvas#saveLayer(RectF, Paint, int)}) is handled through
+ * a list of Graphics2D for each layers. The class actually maintains a list of {@link Layer}
+ * for each layer. Doing a save() will duplicate this list so that each graphics2D object
+ * ({@link Layer#getGraphics()}) is configured only for the new snapshot.
  */
 public class GcSnapshot {
 
     private final GcSnapshot mPrevious;
     private final int mFlags;
 
-    private Graphics2D mGraphics2D = null;
+    /** list of layers. The first item in the list is always the  */
+    private final ArrayList<Layer> mLayers = new ArrayList<Layer>();
+
     /** temp transform in case transformation are set before a Graphics2D exists */
     private AffineTransform mTransform = null;
     /** temp clip in case clipping is set before a Graphics2D exists */
     private Area mClip = null;
 
-    /**
-     * Creates a new {@link GcSnapshot} on top of another one.
-     * <p/>
-     * This is basically the equivalent of {@link Canvas#save(int)}
-     * @param previous the previous snapshot head.
-     * @param flags the flags regarding what should be saved.
+    // local layer data
+    /** a local layer created with {@link Canvas#saveLayer(RectF, Paint, int)}.
+     * If this is null, this does not mean there's no layer, just that the snapshot is not the
+     * one that created the layer.
+     * @see #getLayerSnapshot()
      */
-    public GcSnapshot(GcSnapshot previous, int flags) {
-        assert previous != null;
-        mPrevious = previous;
-        mFlags = flags;
-        mGraphics2D = (Graphics2D) previous.mGraphics2D.create();
+    private final Layer mLocalLayer;
+    private final Paint_Delegate mLocalLayerPaint;
+    private final Rect mLayerBounds;
+
+    public interface Drawable {
+        void draw(Graphics2D graphics, Paint_Delegate paint);
+    }
+
+    /**
+     * Class containing information about a layer.
+     *
+     * This contains graphics, bitmap and layer information.
+     */
+    private static class Layer {
+        private final Graphics2D mGraphics;
+        private final Bitmap_Delegate mBitmap;
+        private final BufferedImage mImage;
+        /** the flags that were used to configure the layer. This is never changed, and passed
+         * as is when {@link #makeCopy()} is called */
+        private final int mFlags;
+        /** the original content of the layer when the next object was created. This is not
+         * passed in {@link #makeCopy()} and instead is recreated when a new layer is added
+         * (depending on its flags) */
+        private BufferedImage mOriginalCopy;
+
+        /**
+         * Creates a layer with a graphics and a bitmap. This is only used to create
+         * the base layer.
+         *
+         * @param graphics the graphics
+         * @param bitmap the bitmap
+         */
+        Layer(Graphics2D graphics, Bitmap_Delegate bitmap) {
+            mGraphics = graphics;
+            mBitmap = bitmap;
+            mImage = mBitmap.getImage();
+            mFlags = 0;
+        }
+
+        /**
+         * Creates a layer with a graphics and an image. If the image belongs to a
+         * {@link Bitmap_Delegate} (case of the base layer), then
+         * {@link Layer#Layer(Graphics2D, Bitmap_Delegate)} should be used.
+         *
+         * @param graphics the graphics the new graphics for this layer
+         * @param image the image the image from which the graphics came
+         * @param flags the flags that were used to save this layer
+         */
+        Layer(Graphics2D graphics, BufferedImage image, int flags) {
+            mGraphics = graphics;
+            mBitmap = null;
+            mImage = image;
+            mFlags = flags;
+        }
+
+        /** The Graphics2D, guaranteed to be non null */
+        Graphics2D getGraphics() {
+            return mGraphics;
+        }
+
+        /** The BufferedImage, guaranteed to be non null */
+        BufferedImage getImage() {
+            return mImage;
+        }
+
+        /** Returns the layer save flags. This is only valid for additional layers.
+         * For the base layer this will always return 0;
+         * For a given layer, all further copies of this {@link Layer} object in new snapshots
+         * will always return the same value.
+         */
+        int getFlags() {
+            return mFlags;
+        }
+
+        Layer makeCopy() {
+            if (mBitmap != null) {
+                return new Layer((Graphics2D) mGraphics.create(), mBitmap);
+            }
+
+            return new Layer((Graphics2D) mGraphics.create(), mImage, mFlags);
+        }
+
+        /** sets an optional copy of the original content to be used during restore */
+        void setOriginalCopy(BufferedImage image) {
+            mOriginalCopy = image;
+        }
+
+        BufferedImage getOriginalCopy() {
+            return mOriginalCopy;
+        }
+
+        void change() {
+            if (mBitmap != null) {
+                mBitmap.change();
+            }
+        }
+    }
+
+    /**
+     * Creates the root snapshot associating it with a given bitmap.
+     * <p>
+     * If <var>bitmap</var> is null, then {@link GcSnapshot#setBitmap(Bitmap_Delegate)} must be
+     * called before the snapshot can be used to draw. Transform and clip operations are permitted
+     * before.
+     *
+     * @param image the image to associate to the snapshot or null.
+     * @return the root snapshot
+     */
+    public static GcSnapshot createDefaultSnapshot(Bitmap_Delegate bitmap) {
+        GcSnapshot snapshot = new GcSnapshot();
+        if (bitmap != null) {
+            snapshot.setBitmap(bitmap);
+        }
+
+        return snapshot;
+    }
+
+    /**
+     * Saves the current state according to the given flags and returns the new current snapshot.
+     * <p/>
+     * This is the equivalent of {@link Canvas#save(int)}
+     *
+     * @param flags the save flags.
+     * @return the new snapshot
+     *
+     * @see Canvas#save(int)
+     */
+    public GcSnapshot save(int flags) {
+        return new GcSnapshot(this, null /*layerbounds*/, null /*paint*/, flags);
+    }
+
+    /**
+     * Saves the current state and creates a new layer, and returns the new current snapshot.
+     * <p/>
+     * This is the equivalent of {@link Canvas#saveLayer(RectF, Paint, int)}
+     *
+     * @param layerBounds the layer bounds
+     * @param paint the Paint information used to blit the layer back into the layers underneath
+     *          upon restore
+     * @param flags the save flags.
+     * @return the new snapshot
+     *
+     * @see Canvas#saveLayer(RectF, Paint, int)
+     */
+    public GcSnapshot saveLayer(RectF layerBounds, Paint_Delegate paint, int flags) {
+        return new GcSnapshot(this, layerBounds, paint, flags);
     }
 
     /**
      * Creates the root snapshot.
      * {@link #setGraphics2D(Graphics2D)} will have to be called on it when possible.
      */
-    public GcSnapshot() {
+    private GcSnapshot() {
         mPrevious = null;
         mFlags = 0;
+        mLocalLayer = null;
+        mLocalLayerPaint = null;
+        mLayerBounds = null;
+    }
+
+    /**
+     * Creates a new {@link GcSnapshot} on top of another one, with a layer data to be restored
+     * into the main graphics when {@link #restore()} is called.
+     *
+     * @param previous the previous snapshot head.
+     * @param layerBounds the region of the layer. Optional, if null, this is a normal save()
+     * @param paint the Paint information used to blit the layer back into the layers underneath
+     *          upon restore
+     * @param flags the flags regarding what should be saved.
+     */
+    private GcSnapshot(GcSnapshot previous, RectF layerBounds, Paint_Delegate paint, int flags) {
+        assert previous != null;
+        mPrevious = previous;
+        mFlags = flags;
+
+        // make a copy of the current layers before adding the new one.
+        // This keeps the same BufferedImage reference but creates new Graphics2D for this
+        // snapshot.
+        // It does not copy whatever original copy the layers have, as they will be done
+        // only if the new layer doesn't clip drawing to itself.
+        for (Layer layer : mPrevious.mLayers) {
+            mLayers.add(layer.makeCopy());
+        }
+
+        if (layerBounds != null) {
+            // get the current transform
+            AffineTransform matrix = mLayers.get(0).getGraphics().getTransform();
+
+            // transform the layerBounds with the current transform and stores it into a int rect
+            RectF rect2 = new RectF();
+            mapRect(matrix, rect2, layerBounds);
+            mLayerBounds = new Rect();
+            rect2.round(mLayerBounds);
+
+            // get the base layer (always at index 0)
+            Layer baseLayer = mLayers.get(0);
+
+            // create the image for the layer
+            BufferedImage layerImage = new BufferedImage(
+                    baseLayer.getImage().getWidth(),
+                    baseLayer.getImage().getHeight(),
+                    (mFlags & Canvas.HAS_ALPHA_LAYER_SAVE_FLAG) != 0 ?
+                            BufferedImage.TYPE_INT_ARGB :
+                                BufferedImage.TYPE_INT_RGB);
+
+            // create a graphics for it so that drawing can be done.
+            Graphics2D layerGraphics = layerImage.createGraphics();
+
+            // because this layer inherits the current context for transform and clip,
+            // set them to one from the base layer.
+            AffineTransform currentMtx = baseLayer.getGraphics().getTransform();
+            layerGraphics.setTransform(currentMtx);
+
+            Shape currentClip = baseLayer.getGraphics().getClip();
+            layerGraphics.setClip(currentClip);
+
+            // create a new layer for this new layer and add it to the list at the end.
+            mLayers.add(mLocalLayer = new Layer(layerGraphics, layerImage, flags));
+
+            // if the drawing is not clipped to the local layer only, we save the current content
+            // of all other layers. We are only interested in the part that will actually
+            // be drawn, so we create as small bitmaps as we can.
+            // This is so that we can erase the drawing that goes in the layers below that will
+            // be coming from the layer itself.
+            if ((mFlags & Canvas.CLIP_TO_LAYER_SAVE_FLAG) == 0) {
+                int w = mLayerBounds.width();
+                int h = mLayerBounds.height();
+                for (int i = 0 ; i < mLayers.size() - 1 ; i++) {
+                    Layer layer = mLayers.get(i);
+                    BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+                    Graphics2D graphics = image.createGraphics();
+                    graphics.drawImage(layer.getImage(),
+                            0, 0, w, h,
+                            mLayerBounds.left, mLayerBounds.top,
+                                    mLayerBounds.right, mLayerBounds.bottom,
+                            null);
+                    graphics.dispose();
+                    layer.setOriginalCopy(image);
+                }
+            }
+        } else {
+            mLocalLayer = null;
+            mLayerBounds = null;
+        }
+
+        mLocalLayerPaint  = paint;
     }
 
     public void dispose() {
-        if (mGraphics2D != null) {
-            mGraphics2D.dispose();
+        for (Layer layer : mLayers) {
+            layer.getGraphics().dispose();
         }
 
         if (mPrevious != null) {
@@ -102,35 +358,35 @@
     }
 
     /**
-     * Sets the Graphics2D object for this snapshot if it was created through {@link #GcSnapshot()}.
+     * Link the snapshot to a Bitmap_Delegate.
+     * <p/>
+     * This is only for the case where the snapshot was created with a null image when calling
+     * {@link #createDefaultSnapshot(Bitmap_Delegate)}, and is therefore not yet linked to
+     * a previous snapshot.
+     * <p/>
      * If any transform or clip information was set before, they are put into the Graphics object.
-     * @param graphics2D the graphics object to set.
+     * @param bitmap the bitmap to link to.
      */
-    public void setGraphics2D(Graphics2D graphics2D) {
-        mGraphics2D = graphics2D;
+    public void setBitmap(Bitmap_Delegate bitmap) {
+        assert mLayers.size() == 0;
+        Graphics2D graphics2D = bitmap.getImage().createGraphics();
+        mLayers.add(new Layer(graphics2D, bitmap));
         if (mTransform != null) {
-            mGraphics2D.setTransform(mTransform);
+            graphics2D.setTransform(mTransform);
             mTransform = null;
         }
 
         if (mClip != null) {
-            mGraphics2D.setClip(mClip);
+            graphics2D.setClip(mClip);
             mClip = null;
         }
     }
 
-    /**
-     * Creates and return a copy of the current {@link Graphics2D}.
-     * @return a new {@link Graphics2D}.
-     */
-    public Graphics2D create() {
-        assert mGraphics2D != null;
-        return (Graphics2D) mGraphics2D.create();
-    }
-
     public void translate(float dx, float dy) {
-        if (mGraphics2D != null) {
-            mGraphics2D.translate(dx, dy);
+        if (mLayers.size() > 0) {
+            for (Layer layer : mLayers) {
+                layer.getGraphics().translate(dx, dy);
+            }
         } else {
             if (mTransform == null) {
                 mTransform = new AffineTransform();
@@ -140,8 +396,10 @@
     }
 
     public void rotate(double radians) {
-        if (mGraphics2D != null) {
-            mGraphics2D.rotate(radians);
+        if (mLayers.size() > 0) {
+            for (Layer layer : mLayers) {
+                layer.getGraphics().rotate(radians);
+            }
         } else {
             if (mTransform == null) {
                 mTransform = new AffineTransform();
@@ -151,8 +409,10 @@
     }
 
     public void scale(float sx, float sy) {
-        if (mGraphics2D != null) {
-            mGraphics2D.scale(sx, sy);
+        if (mLayers.size() > 0) {
+            for (Layer layer : mLayers) {
+                layer.getGraphics().scale(sx, sy);
+            }
         } else {
             if (mTransform == null) {
                 mTransform = new AffineTransform();
@@ -162,8 +422,9 @@
     }
 
     public AffineTransform getTransform() {
-        if (mGraphics2D != null) {
-            return mGraphics2D.getTransform();
+        if (mLayers.size() > 0) {
+            // all graphics2D in the list have the same transform
+            return mLayers.get(0).getGraphics().getTransform();
         } else {
             if (mTransform == null) {
                 mTransform = new AffineTransform();
@@ -173,8 +434,10 @@
     }
 
     public void setTransform(AffineTransform transform) {
-        if (mGraphics2D != null) {
-            mGraphics2D.setTransform(transform);
+        if (mLayers.size() > 0) {
+            for (Layer layer : mLayers) {
+                layer.getGraphics().setTransform(transform);
+            }
         } else {
             if (mTransform == null) {
                 mTransform = new AffineTransform();
@@ -183,63 +446,43 @@
         }
     }
 
-    public boolean clipRect(float left, float top, float right, float bottom, int regionOp) {
-        if (mGraphics2D != null) {
-            if (regionOp == Region.Op.DIFFERENCE.nativeInt) {
-                Area newClip = new Area(mGraphics2D.getClip());
-                newClip.subtract(new Area(
-                        new Rectangle2D.Float(left, top, right - left, bottom - top)));
-                mGraphics2D.setClip(newClip);
-
-            } else if (regionOp == Region.Op.INTERSECT.nativeInt) {
-                mGraphics2D.clipRect((int) left, (int) top,
-                        (int) (right - left), (int) (bottom - top));
-
-            } else if (regionOp == Region.Op.UNION.nativeInt) {
-                Area newClip = new Area(mGraphics2D.getClip());
-                newClip.add(new Area(
-                        new Rectangle2D.Float(left, top, right - left, bottom - top)));
-                mGraphics2D.setClip(newClip);
-
-            } else if (regionOp == Region.Op.XOR.nativeInt) {
-                Area newClip = new Area(mGraphics2D.getClip());
-                newClip.exclusiveOr(new Area(
-                        new Rectangle2D.Float(left, top, right - left, bottom - top)));
-                mGraphics2D.setClip(newClip);
-
-            } else if (regionOp == Region.Op.REVERSE_DIFFERENCE.nativeInt) {
-                Area newClip = new Area(
-                        new Rectangle2D.Float(left, top, right - left, bottom - top));
-                newClip.subtract(new Area(mGraphics2D.getClip()));
-                mGraphics2D.setClip(newClip);
-            } else if (regionOp == Region.Op.REPLACE.nativeInt) {
-                mGraphics2D.setClip((int) left, (int) top,
-                        (int) (right - left), (int) (bottom - top));
-            }
-
-            return mGraphics2D.getClip().getBounds().isEmpty() == false;
+    public boolean clip(Shape shape, int regionOp) {
+        Area area = null;
+        if (regionOp == Region.Op.REPLACE.nativeInt) {
+            area = new Area(shape);
         } else {
-            if (mClip == null) {
-                mClip = new Area();
+            area = Region_Delegate.combineShapes(getClip(), shape, regionOp);
+        }
+
+        assert area != null;
+
+        if (mLayers.size() > 0) {
+            if (area != null) {
+                for (Layer layer : mLayers) {
+                    layer.getGraphics().setClip(area);
+                }
             }
 
-            if (regionOp == Region.Op.DIFFERENCE.nativeInt) {
-                //FIXME
-            } else if (regionOp == Region.Op.DIFFERENCE.nativeInt) {
-            } else if (regionOp == Region.Op.INTERSECT.nativeInt) {
-            } else if (regionOp == Region.Op.UNION.nativeInt) {
-            } else if (regionOp == Region.Op.XOR.nativeInt) {
-            } else if (regionOp == Region.Op.REVERSE_DIFFERENCE.nativeInt) {
-            } else if (regionOp == Region.Op.REPLACE.nativeInt) {
+            return getClip().getBounds().isEmpty() == false;
+        } else {
+            if (area != null) {
+                mClip = area;
+            } else {
+                mClip = new Area();
             }
 
             return mClip.getBounds().isEmpty() == false;
         }
     }
 
+    public boolean clipRect(float left, float top, float right, float bottom, int regionOp) {
+        return clip(new Rectangle2D.Float(left, top, right - left, bottom - top), regionOp);
+    }
+
     public Shape getClip() {
-        if (mGraphics2D != null) {
-            return mGraphics2D.getClip();
+        if (mLayers.size() > 0) {
+            // they all have the same clip
+            return mLayers.get(0).getGraphics().getClip();
         } else {
             if (mClip == null) {
                 mClip = new Area();
@@ -263,26 +506,251 @@
         }
     }
 
+    /**
+     * Executes the Drawable's draw method, with a null paint delegate.
+     * <p/>
+     * Note that the method can be called several times if there are more than one active layer.
+     * @param drawable
+     */
+    public void draw(Drawable drawable) {
+        draw(drawable, null, false /*compositeOnly*/, false /*forceSrcMode*/);
+    }
+
+    /**
+     * Executes the Drawable's draw method.
+     * <p/>
+     * Note that the method can be called several times if there are more than one active layer.
+     * @param drawable
+     * @param paint
+     * @param compositeOnly whether the paint is used for composite only. This is typically
+     *          the case for bitmaps.
+     * @param forceSrcMode if true, this overrides the composite to be SRC
+     */
+    public void draw(Drawable drawable, Paint_Delegate paint, boolean compositeOnly,
+            boolean forceSrcMode) {
+        // the current snapshot may not have a mLocalLayer (ie it was created on save() instead
+        // of saveLayer(), but that doesn't mean there's no layer.
+        // mLayers however saves all the information we need (flags).
+        if (mLayers.size() == 1) {
+            // no layer, only base layer. easy case.
+            drawInLayer(mLayers.get(0), drawable, paint, compositeOnly, forceSrcMode);
+        } else {
+            // draw in all the layers until the layer save flags tells us to stop (ie drawing
+            // in that layer is limited to the layer itself.
+            int flags;
+            int i = mLayers.size() - 1;
+
+            do {
+                Layer layer = mLayers.get(i);
+
+                drawInLayer(layer, drawable, paint, compositeOnly, forceSrcMode);
+
+                // then go to previous layer, only if there are any left, and its flags
+                // doesn't restrict drawing to the layer itself.
+                i--;
+                flags = layer.getFlags();
+            } while (i >= 0 && (flags & Canvas.CLIP_TO_LAYER_SAVE_FLAG) == 0);
+        }
+    }
+
+    private void drawInLayer(Layer layer, Drawable drawable, Paint_Delegate paint,
+            boolean compositeOnly, boolean forceSrcMode) {
+        Graphics2D originalGraphics = layer.getGraphics();
+        // get a Graphics2D object configured with the drawing parameters.
+        Graphics2D configuredGraphics2D =
+            paint != null ?
+                    createCustomGraphics(originalGraphics, paint, compositeOnly, forceSrcMode) :
+                        (Graphics2D) originalGraphics.create();
+
+        try {
+            drawable.draw(configuredGraphics2D, paint);
+            layer.change();
+        } finally {
+            // dispose Graphics2D object
+            configuredGraphics2D.dispose();
+        }
+    }
+
     private GcSnapshot doRestore() {
-        // if this snapshot does not save everything, then set the previous snapshot
-        // to this snapshot content
         if (mPrevious != null) {
+            if (mLocalLayer != null) {
+                // prepare to blit the layers in which we have draw, in the layer beneath
+                // them, starting with the top one (which is the current local layer).
+                int i = mLayers.size() - 1;
+                int flags;
+                do {
+                    Layer dstLayer = mLayers.get(i - 1);
+
+                    restoreLayer(dstLayer);
+
+                    flags = dstLayer.getFlags();
+                    i--;
+                } while (i > 0 && (flags & Canvas.CLIP_TO_LAYER_SAVE_FLAG) == 0);
+            }
+
+            // if this snapshot does not save everything, then set the previous snapshot
+            // to this snapshot content
+
             // didn't save the matrix? set the current matrix on the previous snapshot
             if ((mFlags & Canvas.MATRIX_SAVE_FLAG) == 0) {
-                mPrevious.mGraphics2D.setTransform(getTransform());
+                AffineTransform mtx = getTransform();
+                for (Layer layer : mPrevious.mLayers) {
+                    layer.getGraphics().setTransform(mtx);
+                }
             }
 
             // didn't save the clip? set the current clip on the previous snapshot
             if ((mFlags & Canvas.CLIP_SAVE_FLAG) == 0) {
-                mPrevious.mGraphics2D.setClip(mGraphics2D.getClip());
+                Shape clip = getClip();
+                for (Layer layer : mPrevious.mLayers) {
+                    layer.getGraphics().setClip(clip);
+                }
             }
         }
 
-        if (mGraphics2D != null) {
-            mGraphics2D.dispose();
+        for (Layer layer : mLayers) {
+            layer.getGraphics().dispose();
         }
 
         return mPrevious;
     }
 
+    private void restoreLayer(Layer dstLayer) {
+
+        Graphics2D baseGfx = dstLayer.getImage().createGraphics();
+
+        // if the layer contains an original copy this means the flags
+        // didn't restrict drawing to the local layer and we need to make sure the
+        // layer bounds in the layer beneath didn't receive any drawing.
+        // so we use the originalCopy to erase the new drawings in there.
+        BufferedImage originalCopy = dstLayer.getOriginalCopy();
+        if (originalCopy != null) {
+            Graphics2D g = (Graphics2D) baseGfx.create();
+            g.setComposite(AlphaComposite.Src);
+
+            g.drawImage(originalCopy,
+                    mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
+                    0, 0, mLayerBounds.width(), mLayerBounds.height(),
+                    null);
+            g.dispose();
+        }
+
+        // now draw put the content of the local layer onto the layer,
+        // using the paint information
+        Graphics2D g = createCustomGraphics(baseGfx, mLocalLayerPaint,
+                true /*alphaOnly*/, false /*forceSrcMode*/);
+
+        g.drawImage(mLocalLayer.getImage(),
+                mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
+                mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
+                null);
+        g.dispose();
+
+        baseGfx.dispose();
+    }
+
+    /**
+     * Creates a new {@link Graphics2D} based on the {@link Paint} parameters.
+     * <p/>The object must be disposed ({@link Graphics2D#dispose()}) after being used.
+     */
+    private Graphics2D createCustomGraphics(Graphics2D original, Paint_Delegate paint,
+            boolean compositeOnly, boolean forceSrcMode) {
+        // make new one graphics
+        Graphics2D g = (Graphics2D) original.create();
+
+        // configure it
+
+        if (paint.isAntiAliased()) {
+            g.setRenderingHint(
+                    RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            g.setRenderingHint(
+                    RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+        }
+
+        boolean customShader = false;
+
+        // get the shader first, as it'll replace the color if it can be used it.
+        if (compositeOnly == false) {
+            Shader_Delegate shaderDelegate = paint.getShader();
+            if (shaderDelegate != null) {
+                if (shaderDelegate.isSupported()) {
+                    java.awt.Paint shaderPaint = shaderDelegate.getJavaPaint();
+                    assert shaderPaint != null;
+                    if (shaderPaint != null) {
+                        g.setPaint(shaderPaint);
+                        customShader = true;
+                    }
+                } else {
+                    Bridge.getLog().fidelityWarning(null,
+                            shaderDelegate.getSupportMessage(),
+                            null);
+                }
+            }
+
+            // if no shader, use the paint color
+            if (customShader == false) {
+                g.setColor(new Color(paint.getColor(), true /*hasAlpha*/));
+            }
+
+            // set the stroke
+            g.setStroke(paint.getJavaStroke());
+        }
+
+        // the alpha for the composite. Always opaque if the normal paint color is used since
+        // it contains the alpha
+        int alpha = (compositeOnly || customShader) ? paint.getAlpha() : 0xFF;
+
+        if (forceSrcMode) {
+            g.setComposite(AlphaComposite.getInstance(
+                    AlphaComposite.SRC, (float) alpha / 255.f));
+        } else {
+            boolean customXfermode = false;
+            Xfermode_Delegate xfermodeDelegate = paint.getXfermode();
+            if (xfermodeDelegate != null) {
+                if (xfermodeDelegate.isSupported()) {
+                    Composite composite = xfermodeDelegate.getComposite(alpha);
+                    assert composite != null;
+                    if (composite != null) {
+                        g.setComposite(composite);
+                        customXfermode = true;
+                    }
+                } else {
+                    Bridge.getLog().fidelityWarning(null,
+                            xfermodeDelegate.getSupportMessage(),
+                            null);
+                }
+            }
+
+            // if there was no custom xfermode, but we have alpha (due to a shader and a non
+            // opaque alpha channel in the paint color), then we create an AlphaComposite anyway
+            // that will handle the alpha.
+            if (customXfermode == false && alpha != 0xFF) {
+                g.setComposite(AlphaComposite.getInstance(
+                        AlphaComposite.SRC_OVER, (float) alpha / 255.f));
+            }
+        }
+
+        return g;
+    }
+
+    private void mapRect(AffineTransform matrix, RectF dst, RectF src) {
+        // array with 4 corners
+        float[] corners = new float[] {
+                src.left, src.top,
+                src.right, src.top,
+                src.right, src.bottom,
+                src.left, src.bottom,
+        };
+
+        // apply the transform to them.
+        matrix.transform(corners, 0, corners, 0, 4);
+
+        // now put the result in the rect. We take the min/max of Xs and min/max of Ys
+        dst.left = Math.min(Math.min(corners[0], corners[2]), Math.min(corners[4], corners[6]));
+        dst.right = Math.max(Math.max(corners[0], corners[2]), Math.max(corners[4], corners[6]));
+
+        dst.top = Math.min(Math.min(corners[1], corners[3]), Math.min(corners[5], corners[7]));
+        dst.bottom = Math.max(Math.max(corners[1], corners[3]), Math.max(corners[5], corners[7]));
+    }
+
 }
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java
index 2e2c5f4..35e5987 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/PlayAnimationThread.java
@@ -16,9 +16,9 @@
 
 package com.android.layoutlib.bridge.impl;
 
-import com.android.layoutlib.api.SceneResult;
-import com.android.layoutlib.api.LayoutScene.IAnimationListener;
-import com.android.layoutlib.api.SceneResult.SceneStatus;
+import com.android.ide.common.rendering.api.IAnimationListener;
+import com.android.ide.common.rendering.api.Result;
+import com.android.ide.common.rendering.api.Result.Status;
 
 import android.animation.Animator;
 
@@ -26,19 +26,19 @@
 
     private final Animator mAnimator;
 
-    public PlayAnimationThread(Animator animator, LayoutSceneImpl scene, String animName,
+    public PlayAnimationThread(Animator animator, RenderSessionImpl scene, String animName,
             IAnimationListener listener) {
         super(scene, animName, listener);
         mAnimator = animator;
     }
 
     @Override
-    public SceneResult preAnimation() {
+    public Result preAnimation() {
         // start the animation. This will send a message to the handler right away, so
         // the queue is filled when this method returns.
         mAnimator.start();
 
-        return SceneStatus.SUCCESS.createResult();
+        return Status.SUCCESS.createResult();
     }
 
     @Override
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/LayoutSceneImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
similarity index 87%
rename from tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/LayoutSceneImpl.java
rename to tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
index 24cf380..5f86c92d 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/LayoutSceneImpl.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
@@ -16,24 +16,28 @@
 
 package com.android.layoutlib.bridge.impl;
 
-import static com.android.layoutlib.api.SceneResult.SceneStatus.ERROR_LOCK_INTERRUPTED;
-import static com.android.layoutlib.api.SceneResult.SceneStatus.ERROR_TIMEOUT;
-import static com.android.layoutlib.api.SceneResult.SceneStatus.SUCCESS;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_ANIM_NOT_FOUND;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_INFLATION;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_LOCK_INTERRUPTED;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_NOT_INFLATED;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_TIMEOUT;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN;
+import static com.android.ide.common.rendering.api.Result.Status.ERROR_VIEWGROUP_NO_CHILDREN;
+import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
 
+import com.android.ide.common.rendering.api.IAnimationListener;
+import com.android.ide.common.rendering.api.ILayoutPullParser;
+import com.android.ide.common.rendering.api.IProjectCallback;
+import com.android.ide.common.rendering.api.Params;
+import com.android.ide.common.rendering.api.RenderSession;
+import com.android.ide.common.rendering.api.ResourceDensity;
+import com.android.ide.common.rendering.api.ResourceValue;
+import com.android.ide.common.rendering.api.Result;
+import com.android.ide.common.rendering.api.StyleResourceValue;
+import com.android.ide.common.rendering.api.ViewInfo;
+import com.android.ide.common.rendering.api.Params.RenderingMode;
+import com.android.ide.common.rendering.api.Result.Status;
 import com.android.internal.util.XmlUtils;
-import com.android.layoutlib.api.IProjectCallback;
-import com.android.layoutlib.api.IXmlPullParser;
-import com.android.layoutlib.api.LayoutBridge;
-import com.android.layoutlib.api.LayoutScene;
-import com.android.layoutlib.api.ResourceDensity;
-import com.android.layoutlib.api.ResourceValue;
-import com.android.layoutlib.api.SceneParams;
-import com.android.layoutlib.api.SceneResult;
-import com.android.layoutlib.api.StyleResourceValue;
-import com.android.layoutlib.api.ViewInfo;
-import com.android.layoutlib.api.LayoutScene.IAnimationListener;
-import com.android.layoutlib.api.SceneParams.RenderingMode;
-import com.android.layoutlib.api.SceneResult.SceneStatus;
 import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.BridgeConstants;
 import com.android.layoutlib.bridge.android.BridgeContext;
@@ -75,14 +79,14 @@
 import java.util.concurrent.locks.ReentrantLock;
 
 /**
- * Class managing a layout "scene".
+ * Class implementing the render session.
  *
- * A scene is a stateful representation of a layout file. It is initialized with data coming through
- * the {@link LayoutBridge} API to inflate the layout. Further actions and rendering can then
+ * A session is a stateful representation of a layout file. It is initialized with data coming
+ * through the {@link Bridge} API to inflate the layout. Further actions and rendering can then
  * be done on the layout.
  *
  */
-public class LayoutSceneImpl {
+public class RenderSessionImpl {
 
     private static final int DEFAULT_TITLE_BAR_HEIGHT = 25;
     private static final int DEFAULT_STATUS_BAR_HEIGHT = 25;
@@ -93,10 +97,10 @@
      */
     private static BridgeContext sCurrentContext = null;
 
-    private final SceneParams mParams;
+    private final Params mParams;
 
     // scene state
-    private LayoutScene mScene;
+    private RenderSession mScene;
     private BridgeContext mContext;
     private BridgeXmlBlockParser mBlockParser;
     private BridgeInflater mInflater;
@@ -123,14 +127,14 @@
     /**
      * Creates a layout scene with all the information coming from the layout bridge API.
      * <p>
-     * This <b>must</b> be followed by a call to {@link LayoutSceneImpl#init()}, which act as a
-     * call to {@link LayoutSceneImpl#acquire(long)}
+     * This <b>must</b> be followed by a call to {@link RenderSessionImpl#init()}, which act as a
+     * call to {@link RenderSessionImpl#acquire(long)}
      *
      * @see LayoutBridge#createScene(com.android.layoutlib.api.SceneParams)
      */
-    public LayoutSceneImpl(SceneParams params) {
+    public RenderSessionImpl(Params params) {
         // copy the params.
-        mParams = new SceneParams(params);
+        mParams = new Params(params);
     }
 
     /**
@@ -144,10 +148,10 @@
      * @see #acquire(long)
      * @see #release()
      */
-    public SceneResult init(long timeout) {
+    public Result init(long timeout) {
         // acquire the lock. if the result is null, lock was just acquired, otherwise, return
         // the result.
-        SceneResult result = acquireLock(timeout);
+        Result result = acquireLock(timeout);
         if (result != null) {
             return result;
         }
@@ -168,7 +172,7 @@
         Map<StyleResourceValue, StyleResourceValue> styleParentMap =
             new HashMap<StyleResourceValue, StyleResourceValue>();
 
-        mCurrentTheme = computeStyleMaps(mParams.getThemeName(), mParams.getIsProjectTheme(),
+        mCurrentTheme = computeStyleMaps(mParams.getThemeName(), mParams.isProjectTheme(),
                 mParams.getProjectResources().get(BridgeConstants.RES_STYLE),
                 mParams.getFrameworkResources().get(BridgeConstants.RES_STYLE), styleParentMap);
 
@@ -187,7 +191,7 @@
         // get the screen offset and window-background resource
         mWindowBackground = null;
         mScreenOffset = 0;
-        if (mCurrentTheme != null && mParams.isCustomBackgroundEnabled() == false) {
+        if (mCurrentTheme != null && mParams.isBgColorOverridden() == false) {
             mWindowBackground = mContext.findItemInStyle(mCurrentTheme, "windowBackground");
             mWindowBackground = mContext.resolveResValue(mWindowBackground);
 
@@ -203,7 +207,7 @@
         mBlockParser = new BridgeXmlBlockParser(mParams.getLayoutDescription(),
                 mContext, false /* platformResourceFlag */);
 
-        return SceneStatus.SUCCESS.createResult();
+        return SUCCESS.createResult();
     }
 
     /**
@@ -215,7 +219,7 @@
      * The preparation can fail if another rendering took too long and the timeout was elapsed.
      *
      * More than one call to this from the same thread will have no effect and will return
-     * {@link SceneResult#SUCCESS}.
+     * {@link Result#SUCCESS}.
      *
      * After scene actions have taken place, only one call to {@link #release()} must be
      * done.
@@ -228,14 +232,14 @@
      *
      * @throws IllegalStateException if {@link #init(long)} was never called.
      */
-    public SceneResult acquire(long timeout) {
+    public Result acquire(long timeout) {
         if (mContext == null) {
             throw new IllegalStateException("After scene creation, #init() must be called");
         }
 
         // acquire the lock. if the result is null, lock was just acquired, otherwise, return
         // the result.
-        SceneResult result = acquireLock(timeout);
+        Result result = acquireLock(timeout);
         if (result != null) {
             return result;
         }
@@ -253,8 +257,8 @@
      * Acquire the lock so that the scene can be acted upon.
      * <p>
      * This returns null if the lock was just acquired, otherwise it returns
-     * {@link SceneResult#SUCCESS} if the lock already belonged to that thread, or another
-     * instance (see {@link SceneResult#getStatus()}) if an error occurred.
+     * {@link Result#SUCCESS} if the lock already belonged to that thread, or another
+     * instance (see {@link Result#getStatus()}) if an error occurred.
      *
      * @param timeout the time to wait if another rendering is happening.
      * @return null if the lock was just acquire or another result depending on the state.
@@ -262,7 +266,7 @@
      * @throws IllegalStateException if the current context is different than the one owned by
      *      the scene.
      */
-    private SceneResult acquireLock(long timeout) {
+    private Result acquireLock(long timeout) {
         ReentrantLock lock = Bridge.getLock();
         if (lock.isHeldByCurrentThread() == false) {
             try {
@@ -314,7 +318,7 @@
      * @throws IllegalStateException if the current context is different than the one owned by
      *      the scene, or if {@link #init(long)} was not called.
      */
-    public SceneResult inflate() {
+    public Result inflate() {
         checkLock();
 
         try {
@@ -347,9 +351,9 @@
                 mViewRoot.setBackgroundDrawable(d);
             }
 
-            return SceneStatus.SUCCESS.createResult();
+            return SUCCESS.createResult();
         } catch (PostInflateException e) {
-            return SceneStatus.ERROR_INFLATION.createResult(e.getMessage(), e);
+            return ERROR_INFLATION.createResult(e.getMessage(), e);
         } catch (Throwable e) {
             // get the real cause of the exception.
             Throwable t = e;
@@ -360,7 +364,7 @@
             // log it
             mParams.getLog().error("Scene inflate failed", t);
 
-            return SceneStatus.ERROR_INFLATION.createResult(t.getMessage(), t);
+            return ERROR_INFLATION.createResult(t.getMessage(), t);
         }
     }
 
@@ -375,12 +379,12 @@
      * @see SceneParams#getRenderingMode()
      * @see LayoutScene#render(long)
      */
-    public SceneResult render() {
+    public Result render() {
         checkLock();
 
         try {
             if (mViewRoot == null) {
-                return SceneStatus.ERROR_NOT_INFLATED.createResult();
+                return ERROR_NOT_INFLATED.createResult();
             }
             // measure the views
             int w_spec, h_spec;
@@ -443,9 +447,9 @@
                             mMeasuredScreenHeight - mScreenOffset, BufferedImage.TYPE_INT_ARGB);
                 }
 
-                if (mParams.isCustomBackgroundEnabled()) {
+                if (mParams.isBgColorOverridden()) {
                     Graphics2D gc = mImage.createGraphics();
-                    gc.setColor(new Color(mParams.getCustomBackgroundColor(), true));
+                    gc.setColor(new Color(mParams.getOverrideBgColor(), true));
                     gc.fillRect(0, 0, mMeasuredScreenWidth, mMeasuredScreenHeight - mScreenOffset);
                     gc.dispose();
                 }
@@ -465,7 +469,7 @@
             mViewInfo = visit(((ViewGroup)mViewRoot).getChildAt(0), mContext);
 
             // success!
-            return SceneStatus.SUCCESS.createResult();
+            return SUCCESS.createResult();
         } catch (Throwable e) {
             // get the real cause of the exception.
             Throwable t = e;
@@ -476,7 +480,7 @@
             // log it
             mParams.getLog().error("Scene Render failed", t);
 
-            return SceneStatus.ERROR_UNKNOWN.createResult(t.getMessage(), t);
+            return ERROR_UNKNOWN.createResult(t.getMessage(), t);
         }
     }
 
@@ -490,7 +494,7 @@
      *
      * @see LayoutScene#animate(Object, String, boolean, IAnimationListener)
      */
-    public SceneResult animate(Object targetObject, String animationName,
+    public Result animate(Object targetObject, String animationName,
             boolean isFrameworkAnimation, IAnimationListener listener) {
         checkLock();
 
@@ -517,7 +521,7 @@
 
                     new PlayAnimationThread(anim, this, animationName, listener).start();
 
-                    return SceneStatus.SUCCESS.createResult();
+                    return SUCCESS.createResult();
                 }
             } catch (Exception e) {
                 // get the real cause of the exception.
@@ -526,11 +530,11 @@
                     t = t.getCause();
                 }
 
-                return SceneStatus.ERROR_UNKNOWN.createResult(t.getMessage(), t);
+                return ERROR_UNKNOWN.createResult(t.getMessage(), t);
             }
         }
 
-        return SceneStatus.ERROR_ANIM_NOT_FOUND.createResult();
+        return ERROR_ANIM_NOT_FOUND.createResult();
     }
 
     /**
@@ -541,9 +545,9 @@
      * @throws IllegalStateException if the current context is different than the one owned by
      *      the scene, or if {@link #acquire(long)} was not called.
      *
-     * @see LayoutScene#insertChild(Object, IXmlPullParser, int, IAnimationListener)
+     * @see LayoutScene#insertChild(Object, ILayoutPullParser, int, IAnimationListener)
      */
-    public SceneResult insertChild(final ViewGroup parentView, IXmlPullParser childXml,
+    public Result insertChild(final ViewGroup parentView, ILayoutPullParser childXml,
             final int index, IAnimationListener listener) {
         checkLock();
 
@@ -562,7 +566,7 @@
             new AnimationThread(this, "insertChild", listener) {
 
                 @Override
-                public SceneResult preAnimation() {
+                public Result preAnimation() {
                     parentView.setLayoutTransition(new LayoutTransition());
                     return addView(parentView, child, index);
                 }
@@ -574,11 +578,11 @@
             }.start();
 
             // always return success since the real status will come through the listener.
-            return SceneStatus.SUCCESS.createResult(child);
+            return SUCCESS.createResult(child);
         }
 
         // add it to the parentView in the correct location
-        SceneResult result = addView(parentView, child, index);
+        Result result = addView(parentView, child, index);
         if (result.isSuccess() == false) {
             return result;
         }
@@ -598,17 +602,17 @@
      * @param view the view to add to the parent
      * @param index the index where to do the add.
      *
-     * @return a SceneResult with {@link SceneStatus#SUCCESS} or
-     *     {@link SceneStatus#ERROR_VIEWGROUP_NO_CHILDREN} if the given parent doesn't support
+     * @return a Result with {@link Status#SUCCESS} or
+     *     {@link Status#ERROR_VIEWGROUP_NO_CHILDREN} if the given parent doesn't support
      *     adding views.
      */
-    private SceneResult addView(ViewGroup parent, View view, int index) {
+    private Result addView(ViewGroup parent, View view, int index) {
         try {
             parent.addView(view, index);
-            return SceneStatus.SUCCESS.createResult();
+            return SUCCESS.createResult();
         } catch (UnsupportedOperationException e) {
             // looks like this is a view class that doesn't support children manipulation!
-            return SceneStatus.ERROR_VIEWGROUP_NO_CHILDREN.createResult();
+            return ERROR_VIEWGROUP_NO_CHILDREN.createResult();
         }
     }
 
@@ -622,7 +626,7 @@
      *
      * @see LayoutScene#moveChild(Object, Object, int, Map, IAnimationListener)
      */
-    public SceneResult moveChild(final ViewGroup parentView, final View childView, final int index,
+    public Result moveChild(final ViewGroup parentView, final View childView, final int index,
             Map<String, String> layoutParamsMap, IAnimationListener listener) {
         checkLock();
 
@@ -640,7 +644,7 @@
             new AnimationThread(this, "moveChild", listener) {
 
                 @Override
-                public SceneResult preAnimation() {
+                public Result preAnimation() {
                     parentView.setLayoutTransition(new LayoutTransition());
                     return moveView(parentView, childView, index, params);
                 }
@@ -652,10 +656,10 @@
             }.start();
 
             // always return success since the real status will come through the listener.
-            return SceneStatus.SUCCESS.createResult(layoutParams);
+            return SUCCESS.createResult(layoutParams);
         }
 
-        SceneResult result = moveView(parentView, childView, index, layoutParams);
+        Result result = moveView(parentView, childView, index, layoutParams);
         if (result.isSuccess() == false) {
             return result;
         }
@@ -677,11 +681,11 @@
      * @param index the new location in the new parent
      * @param params an option (can be null) {@link LayoutParams} instance.
      *
-     * @return a SceneResult with {@link SceneStatus#SUCCESS} or
-     *     {@link SceneStatus#ERROR_VIEWGROUP_NO_CHILDREN} if the given parent doesn't support
+     * @return a Result with {@link Status#SUCCESS} or
+     *     {@link Status#ERROR_VIEWGROUP_NO_CHILDREN} if the given parent doesn't support
      *     adding views.
      */
-    private SceneResult moveView(ViewGroup parent, View view, int index, LayoutParams params) {
+    private Result moveView(ViewGroup parent, View view, int index, LayoutParams params) {
         try {
             ViewGroup previousParent = (ViewGroup) view.getParent();
             previousParent.removeView(view);
@@ -694,10 +698,10 @@
                 parent.addView(view, index);
             }
 
-            return SceneStatus.SUCCESS.createResult();
+            return SUCCESS.createResult();
         } catch (UnsupportedOperationException e) {
             // looks like this is a view class that doesn't support children manipulation!
-            return SceneStatus.ERROR_VIEWGROUP_NO_CHILDREN.createResult();
+            return ERROR_VIEWGROUP_NO_CHILDREN.createResult();
         }
     }
 
@@ -711,7 +715,7 @@
      *
      * @see LayoutScene#removeChild(Object, IAnimationListener)
      */
-    public SceneResult removeChild(final View childView, IAnimationListener listener) {
+    public Result removeChild(final View childView, IAnimationListener listener) {
         checkLock();
 
         invalidateRenderingSize();
@@ -722,7 +726,7 @@
             new AnimationThread(this, "moveChild", listener) {
 
                 @Override
-                public SceneResult preAnimation() {
+                public Result preAnimation() {
                     parent.setLayoutTransition(new LayoutTransition());
                     return removeView(parent, childView);
                 }
@@ -734,10 +738,10 @@
             }.start();
 
             // always return success since the real status will come through the listener.
-            return SceneStatus.SUCCESS.createResult();
+            return SUCCESS.createResult();
         }
 
-        SceneResult result = removeView(parent, childView);
+        Result result = removeView(parent, childView);
         if (result.isSuccess() == false) {
             return result;
         }
@@ -750,17 +754,17 @@
      *
      * @param view the view to remove from its parent
      *
-     * @return a SceneResult with {@link SceneStatus#SUCCESS} or
-     *     {@link SceneStatus#ERROR_VIEWGROUP_NO_CHILDREN} if the given parent doesn't support
+     * @return a Result with {@link Status#SUCCESS} or
+     *     {@link Status#ERROR_VIEWGROUP_NO_CHILDREN} if the given parent doesn't support
      *     adding views.
      */
-    private SceneResult removeView(ViewGroup parent, View view) {
+    private Result removeView(ViewGroup parent, View view) {
         try {
             parent.removeView(view);
-            return SceneStatus.SUCCESS.createResult();
+            return SUCCESS.createResult();
         } catch (UnsupportedOperationException e) {
             // looks like this is a view class that doesn't support children manipulation!
-            return SceneStatus.ERROR_VIEWGROUP_NO_CHILDREN.createResult();
+            return ERROR_VIEWGROUP_NO_CHILDREN.createResult();
         }
     }
 
@@ -791,7 +795,7 @@
      * @param inProjectStyleMap the project style map
      * @param inFrameworkStyleMap the framework style map
      * @param outInheritanceMap the map of style inheritance. This is filled by the method
-     * @return the {@link IStyleResourceValue} matching <var>themeName</var>
+     * @return the {@link StyleResourceValue} matching <var>themeName</var>
      */
     private StyleResourceValue computeStyleMaps(
             String themeName, boolean isProjectTheme, Map<String,
@@ -865,7 +869,7 @@
     }
 
     /**
-     * Searches for and returns the {@link IStyleResourceValue} from a given name.
+     * Searches for and returns the {@link StyleResourceValue} from a given name.
      * <p/>The format of the name can be:
      * <ul>
      * <li>[android:]&lt;name&gt;</li>
@@ -875,7 +879,7 @@
      * @param parentName the name of the style.
      * @param inProjectStyleMap the project style map. Can be <code>null</code>
      * @param inFrameworkStyleMap the framework style map.
-     * @return The matching {@link IStyleResourceValue} object or <code>null</code> if not found.
+     * @return The matching {@link StyleResourceValue} object or <code>null</code> if not found.
      */
     private StyleResourceValue getStyle(String parentName,
             Map<String, ResourceValue> inProjectStyleMap,
@@ -1143,15 +1147,15 @@
         return mViewInfo;
     }
 
-    public Map<String, String> getDefaultViewPropertyValues(Object viewObject) {
+    public Map<String, String> getDefaultProperties(Object viewObject) {
         return mContext.getDefaultPropMap(viewObject);
     }
 
-    public void setScene(LayoutScene scene) {
-        mScene = scene;
+    public void setScene(RenderSession session) {
+        mScene = session;
     }
 
-    public LayoutScene getScene() {
+    public RenderSession getSession() {
         return mScene;
     }
 }
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
index f03931f..5427f142 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
@@ -16,9 +16,9 @@
 
 package com.android.layoutlib.bridge.impl;
 
-import com.android.layoutlib.api.DensityBasedResourceValue;
-import com.android.layoutlib.api.ResourceDensity;
-import com.android.layoutlib.api.ResourceValue;
+import com.android.ide.common.rendering.api.DensityBasedResourceValue;
+import com.android.ide.common.rendering.api.ResourceDensity;
+import com.android.ide.common.rendering.api.ResourceValue;
 import com.android.layoutlib.bridge.Bridge;
 import com.android.layoutlib.bridge.android.BridgeContext;
 import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
index 1d40d33..6b589d7 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
@@ -106,17 +106,39 @@
      */
     private final static String[] DELEGATE_CLASS_NATIVES = new String[] {
         "android.animation.PropertyValuesHolder",
+        "android.graphics.AvoidXfermode",
         "android.graphics.Bitmap",
+        "android.graphics.BitmapShader",
+        "android.graphics.BlurMaskFilter",
         "android.graphics.Canvas",
+        "android.graphics.ColorFilter",
+        "android.graphics.ColorMatrixColorFilter",
+        "android.graphics.ComposePathEffect",
+        "android.graphics.ComposeShader",
+        "android.graphics.CornerPathEffect",
         "android.graphics.DashPathEffect",
+        "android.graphics.DiscretePathEffect",
+        "android.graphics.DrawFilter",
+        "android.graphics.EmbossMaskFilter",
+        "android.graphics.LayerRasterizer",
+        "android.graphics.LightingColorFilter",
         "android.graphics.LinearGradient",
+        "android.graphics.MaskFilter",
         "android.graphics.Matrix",
         "android.graphics.NinePatch",
         "android.graphics.Paint",
+        "android.graphics.PaintFlagsDrawFilter",
+        "android.graphics.Path",
+        "android.graphics.PathDashPathEffect",
         "android.graphics.PathEffect",
+        "android.graphics.PixelXorXfermode",
+        "android.graphics.PorterDuffColorFilter",
         "android.graphics.PorterDuffXfermode",
         "android.graphics.RadialGradient",
+        "android.graphics.Rasterizer",
+        "android.graphics.Region",
         "android.graphics.Shader",
+        "android.graphics.SumPathEffect",
         "android.graphics.SweepGradient",
         "android.graphics.Typeface",
         "android.graphics.Xfermode",
@@ -140,7 +162,6 @@
     private final static String[] RENAMED_CLASSES =
         new String[] {
             "android.graphics.BitmapFactory",       "android.graphics._Original_BitmapFactory",
-            "android.graphics.Path",                "android.graphics._Original_Path",
             "android.os.ServiceManager",            "android.os._Original_ServiceManager",
             "android.view.SurfaceView",             "android.view._Original_SurfaceView",
             "android.view.accessibility.AccessibilityManager", "android.view.accessibility._Original_AccessibilityManager",
diff --git a/voip/java/android/net/sip/SipAudioCall.java b/voip/java/android/net/sip/SipAudioCall.java
index 51236fe9..ce18ec5 100644
--- a/voip/java/android/net/sip/SipAudioCall.java
+++ b/voip/java/android/net/sip/SipAudioCall.java
@@ -519,10 +519,15 @@
      * @param session the session that receives the incoming call
      * @param sessionDescription the session description of the incoming call
      * @throws SipException if the SIP service fails to attach this object to
-     *        the session
+     *        the session or VOIP API is not supported by the device
+     * @see SipManager#isVoipSupported
      */
     public void attachCall(SipSession session, String sessionDescription)
             throws SipException {
+        if (!SipManager.isVoipSupported(mContext)) {
+            throw new SipException("VOIP API is not supported");
+        }
+
         synchronized (this) {
             mSipSession = session;
             mPeerSd = sessionDescription;
@@ -548,10 +553,15 @@
      *        SIP protocol) is used if {@code timeout} is zero or negative.
      * @see Listener#onError
      * @throws SipException if the SIP service fails to create a session for the
-     *        call
+     *        call or VOIP API is not supported by the device
+     * @see SipManager#isVoipSupported
      */
     public void makeCall(SipProfile peerProfile, SipSession sipSession,
             int timeout) throws SipException {
+        if (!SipManager.isVoipSupported(mContext)) {
+            throw new SipException("VOIP API is not supported");
+        }
+
         synchronized (this) {
             mSipSession = sipSession;
             try {
@@ -595,6 +605,9 @@
     public void holdCall(int timeout) throws SipException {
         synchronized (this) {
             if (mHold) return;
+            if (mSipSession == null) {
+                throw new SipException("Not in a call to hold call");
+            }
             mSipSession.changeCall(createHoldOffer().encode(), timeout);
             mHold = true;
             setAudioGroupMode();
@@ -614,6 +627,9 @@
      */
     public void answerCall(int timeout) throws SipException {
         synchronized (this) {
+            if (mSipSession == null) {
+                throw new SipException("No call to answer");
+            }
             try {
                 mAudioStream = new AudioStream(InetAddress.getByName(
                         getLocalIp()));
diff --git a/voip/java/android/net/sip/SipManager.java b/voip/java/android/net/sip/SipManager.java
index 2e386620..dce46fe 100644
--- a/voip/java/android/net/sip/SipManager.java
+++ b/voip/java/android/net/sip/SipManager.java
@@ -133,7 +133,7 @@
     }
 
     /**
-     * Returns true if the system supports SIP-based VoIP.
+     * Returns true if the system supports SIP-based VOIP API.
      */
     public static boolean isVoipSupported(Context context) {
         return context.getPackageManager().hasSystemFeature(
@@ -305,12 +305,17 @@
      * @param timeout the timeout value in seconds. Default value (defined by
      *        SIP protocol) is used if {@code timeout} is zero or negative.
      * @return a {@link SipAudioCall} object
-     * @throws SipException if calling the SIP service results in an error
+     * @throws SipException if calling the SIP service results in an error or
+     *      VOIP API is not supported by the device
      * @see SipAudioCall.Listener#onError
+     * @see #isVoipSupported
      */
     public SipAudioCall makeAudioCall(SipProfile localProfile,
             SipProfile peerProfile, SipAudioCall.Listener listener, int timeout)
             throws SipException {
+        if (!isVoipSupported(mContext)) {
+            throw new SipException("VOIP API is not supported");
+        }
         SipAudioCall call = new SipAudioCall(mContext, localProfile);
         call.setListener(listener);
         SipSession s = createSipSession(localProfile, null);
@@ -332,12 +337,17 @@
      * @param timeout the timeout value in seconds. Default value (defined by
      *        SIP protocol) is used if {@code timeout} is zero or negative.
      * @return a {@link SipAudioCall} object
-     * @throws SipException if calling the SIP service results in an error
+     * @throws SipException if calling the SIP service results in an error or
+     *      VOIP API is not supported by the device
      * @see SipAudioCall.Listener#onError
+     * @see #isVoipSupported
      */
     public SipAudioCall makeAudioCall(String localProfileUri,
             String peerProfileUri, SipAudioCall.Listener listener, int timeout)
             throws SipException {
+        if (!isVoipSupported(mContext)) {
+            throw new SipException("VOIP API is not supported");
+        }
         try {
             return makeAudioCall(
                     new SipProfile.Builder(localProfileUri).build(),
diff --git a/voip/java/com/android/server/sip/SipSessionGroup.java b/voip/java/com/android/server/sip/SipSessionGroup.java
index edf8b52..3275317 100644
--- a/voip/java/com/android/server/sip/SipSessionGroup.java
+++ b/voip/java/com/android/server/sip/SipSessionGroup.java
@@ -872,8 +872,13 @@
                 }
                 return true;
             } else {
-                onError(SipErrorCode.INVALID_CREDENTIALS,
-                        "incorrect username or password");
+                if (crossDomainAuthenticationRequired(response)) {
+                    onError(SipErrorCode.CROSS_DOMAIN_AUTHENTICATION,
+                            getRealmFromResponse(response));
+                } else {
+                    onError(SipErrorCode.INVALID_CREDENTIALS,
+                            "incorrect username or password");
+                }
                 return false;
             }
         }
@@ -1025,10 +1030,7 @@
                     return true;
                 case Response.UNAUTHORIZED:
                 case Response.PROXY_AUTHENTICATION_REQUIRED:
-                    if (crossDomainAuthenticationRequired(response)) {
-                        onError(SipErrorCode.CROSS_DOMAIN_AUTHENTICATION,
-                                getRealmFromResponse(response));
-                    } else if (handleAuthentication(event)) {
+                    if (handleAuthentication(event)) {
                         addSipSession(this);
                     }
                     return true;
diff --git a/wifi/java/android/net/wifi/SupplicantStateTracker.java b/wifi/java/android/net/wifi/SupplicantStateTracker.java
index f823314..1a00507 100644
--- a/wifi/java/android/net/wifi/SupplicantStateTracker.java
+++ b/wifi/java/android/net/wifi/SupplicantStateTracker.java
@@ -48,6 +48,9 @@
     /* Maximum retries on a password failure notification */
     private static final int MAX_RETRIES_ON_PASSWORD_FAILURE = 2;
 
+    /* Tracks if networks have been disabled during a connection */
+    private boolean mNetworksDisabledDuringConnect = false;
+
     private Context mContext;
 
     private HierarchicalState mUninitializedState = new UninitializedState();
@@ -79,11 +82,16 @@
         start();
     }
 
-    public void resetSupplicantState() {
-        transitionTo(mUninitializedState);
+    private void handleNetworkConnectionFailure(int netId) {
+        /* If other networks disabled during connection, enable them */
+        if (mNetworksDisabledDuringConnect) {
+            WifiConfigStore.enableAllNetworks();
+            mNetworksDisabledDuringConnect = false;
+        }
+        /* Disable failed network */
+        WifiConfigStore.disableNetwork(netId);
     }
 
-
     private void transitionOnSupplicantStateChange(StateChangeResult stateChangeResult) {
         SupplicantState supState = (SupplicantState) stateChangeResult.state;
 
@@ -121,11 +129,11 @@
         }
     }
 
-    private void sendSupplicantStateChangedBroadcast(StateChangeResult sc, boolean failedAuth) {
+    private void sendSupplicantStateChangedBroadcast(SupplicantState state, boolean failedAuth) {
         Intent intent = new Intent(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
         intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
                 | Intent.FLAG_RECEIVER_REPLACE_PENDING);
-        intent.putExtra(WifiManager.EXTRA_NEW_STATE, (Parcelable)sc.state);
+        intent.putExtra(WifiManager.EXTRA_NEW_STATE, (Parcelable) state);
         if (failedAuth) {
             intent.putExtra(
                 WifiManager.EXTRA_SUPPLICANT_ERROR,
@@ -153,11 +161,17 @@
                     break;
                 case WifiStateMachine.SUPPLICANT_STATE_CHANGE_EVENT:
                     StateChangeResult stateChangeResult = (StateChangeResult) message.obj;
-                    sendSupplicantStateChangedBroadcast(stateChangeResult,
-                            mAuthFailureInSupplicantBroadcast);
+                    SupplicantState state = stateChangeResult.state;
+                    sendSupplicantStateChangedBroadcast(state, mAuthFailureInSupplicantBroadcast);
                     mAuthFailureInSupplicantBroadcast = false;
                     transitionOnSupplicantStateChange(stateChangeResult);
                     break;
+                case WifiStateMachine.CMD_RESET_SUPPLICANT_STATE:
+                    transitionTo(mUninitializedState);
+                    break;
+                case WifiStateMachine.CMD_CONNECT_NETWORK:
+                    mNetworksDisabledDuringConnect = true;
+                    break;
                 default:
                     Log.e(TAG, "Ignoring " + message);
                     break;
@@ -166,6 +180,14 @@
         }
     }
 
+    /*
+     * This indicates that the supplicant state as seen
+     * by the framework is not initialized yet. We are
+     * in this state right after establishing a control
+     * channel connection before any supplicant events
+     * or after we have lost the control channel
+     * connection to the supplicant
+     */
     class UninitializedState extends HierarchicalState {
         @Override
          public void enter() {
@@ -205,7 +227,7 @@
              if (mPasswordFailuresCount >= MAX_RETRIES_ON_PASSWORD_FAILURE) {
                  Log.d(TAG, "Failed to authenticate, disabling network " +
                          stateChangeResult.networkId);
-                 WifiConfigStore.disableNetwork(stateChangeResult.networkId);
+                 handleNetworkConnectionFailure(stateChangeResult.networkId);
                  mPasswordFailuresCount = 0;
              }
          }
@@ -239,7 +261,7 @@
             switch (message.what) {
                 case WifiStateMachine.SUPPLICANT_STATE_CHANGE_EVENT:
                     StateChangeResult stateChangeResult = (StateChangeResult) message.obj;
-                    SupplicantState state = (SupplicantState) stateChangeResult.state;
+                    SupplicantState state = stateChangeResult.state;
                     if (state == SupplicantState.ASSOCIATING ||
                             state == SupplicantState.ASSOCIATED ||
                             state == SupplicantState.FOUR_WAY_HANDSHAKE ||
@@ -250,10 +272,10 @@
                         if (mLoopDetectCount > MAX_SUPPLICANT_LOOP_ITERATIONS) {
                             Log.d(TAG, "Supplicant loop detected, disabling network " +
                                     stateChangeResult.networkId);
-                            WifiConfigStore.disableNetwork(stateChangeResult.networkId);
+                            handleNetworkConnectionFailure(stateChangeResult.networkId);
                         }
                         mLoopDetectIndex = state.ordinal();
-                        sendSupplicantStateChangedBroadcast(stateChangeResult,
+                        sendSupplicantStateChangedBroadcast(state,
                                 mAuthFailureInSupplicantBroadcast);
                     } else {
                         //Have the DefaultState handle the transition
@@ -273,16 +295,19 @@
              if (DBG) Log.d(TAG, getName() + "\n");
              /* Reset password failure count */
              mPasswordFailuresCount = 0;
-         }
+             if (mNetworksDisabledDuringConnect) {
+                 WifiConfigStore.enableAllNetworks();
+                 mNetworksDisabledDuringConnect = false;
+             }
+        }
         @Override
         public boolean processMessage(Message message) {
             if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
             switch(message.what) {
                 case WifiStateMachine.SUPPLICANT_STATE_CHANGE_EVENT:
                     StateChangeResult stateChangeResult = (StateChangeResult) message.obj;
-                    SupplicantState state = (SupplicantState) stateChangeResult.state;
-                    sendSupplicantStateChangedBroadcast(stateChangeResult,
-                            mAuthFailureInSupplicantBroadcast);
+                    SupplicantState state = stateChangeResult.state;
+                    sendSupplicantStateChangedBroadcast(state, mAuthFailureInSupplicantBroadcast);
                     /* Ignore a re-auth in completed state */
                     if (state == SupplicantState.ASSOCIATING ||
                             state == SupplicantState.ASSOCIATED ||
@@ -293,6 +318,10 @@
                     }
                     transitionOnSupplicantStateChange(stateChangeResult);
                     break;
+                case WifiStateMachine.CMD_RESET_SUPPLICANT_STATE:
+                    sendSupplicantStateChangedBroadcast(SupplicantState.DISCONNECTED, false);
+                    transitionTo(mUninitializedState);
+                    break;
                 default:
                     return NOT_HANDLED;
             }
diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java
index e650b87..56bc5d7 100644
--- a/wifi/java/android/net/wifi/WifiConfigStore.java
+++ b/wifi/java/android/net/wifi/WifiConfigStore.java
@@ -164,10 +164,12 @@
      * of configured networks indicates all networks as being enabled
      */
     static void enableAllNetworks() {
+        boolean networkEnabledStateChanged = false;
         synchronized (sConfiguredNetworks) {
             for(WifiConfiguration config : sConfiguredNetworks.values()) {
                 if(config != null && config.status == Status.DISABLED) {
                     if(WifiNative.enableNetworkCommand(config.networkId, false)) {
+                        networkEnabledStateChanged = true;
                         config.status = Status.ENABLED;
                     } else {
                         Log.e(TAG, "Enable network failed on " + config.networkId);
@@ -176,8 +178,10 @@
             }
         }
 
-        WifiNative.saveConfigCommand();
-        sendConfiguredNetworksChangedBroadcast();
+        if (networkEnabledStateChanged) {
+            WifiNative.saveConfigCommand();
+            sendConfiguredNetworksChangedBroadcast();
+        }
     }
 
     /**
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 17a35c4..f03a9e5 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -161,10 +161,6 @@
     private SupplicantStateTracker mSupplicantStateTracker;
     private WpsStateMachine mWpsStateMachine;
 
-    /* Connection to a specific network involves disabling all networks,
-     * this flag tracks if networks need to be re-enabled */
-    private boolean mEnableAllNetworks = false;
-
     private AlarmManager mAlarmManager;
     private PendingIntent mScanIntent;
     /* Tracks current frequency mode */
@@ -243,14 +239,16 @@
     static final int CMD_REMOVE_NETWORK                   = 53;
     /* Enable a network. The device will attempt a connection to the given network. */
     static final int CMD_ENABLE_NETWORK                   = 54;
+    /* Enable all networks */
+    static final int CMD_ENABLE_ALL_NETWORKS              = 55;
     /* Disable a network. The device does not attempt a connection to the given network. */
-    static final int CMD_DISABLE_NETWORK                  = 55;
+    static final int CMD_DISABLE_NETWORK                  = 56;
     /* Blacklist network. De-prioritizes the given BSSID for connection. */
-    static final int CMD_BLACKLIST_NETWORK                = 56;
+    static final int CMD_BLACKLIST_NETWORK                = 57;
     /* Clear the blacklist network list */
-    static final int CMD_CLEAR_BLACKLIST                  = 57;
+    static final int CMD_CLEAR_BLACKLIST                  = 58;
     /* Save configuration */
-    static final int CMD_SAVE_CONFIG                      = 58;
+    static final int CMD_SAVE_CONFIG                      = 59;
 
     /* Supplicant commands after driver start*/
     /* Initiate a scan */
@@ -326,13 +324,16 @@
     /* Set the frequency band */
     static final int CMD_SET_FREQUENCY_BAND               = 90;
 
-    /* Commands from the SupplicantStateTracker */
+    /* Commands from/to the SupplicantStateTracker */
     /* Indicates whether a wifi network is available for connection */
-    static final int CMD_SET_NETWORK_AVAILABLE             = 111;
+    static final int CMD_SET_NETWORK_AVAILABLE            = 111;
+    /* Reset the supplicant state tracker */
+    static final int CMD_RESET_SUPPLICANT_STATE           = 112;
+
 
     /* Commands/events reported by WpsStateMachine */
     /* Indicates the completion of WPS activity */
-    static final int WPS_COMPLETED_EVENT                   = 121;
+    static final int WPS_COMPLETED_EVENT                  = 121;
 
     private static final int CONNECT_MODE   = 1;
     private static final int SCAN_ONLY_MODE = 2;
@@ -849,6 +850,10 @@
        sendMessage(obtainMessage(CMD_ENABLE_RSSI_POLL, enabled ? 1 : 0, 0));
     }
 
+    public void enableAllNetworks() {
+        sendMessage(CMD_ENABLE_ALL_NETWORKS);
+    }
+
     /**
      * Start packet filtering
      */
@@ -1001,7 +1006,6 @@
         sb.append("mLastSignalLevel ").append(mLastSignalLevel).append(LS);
         sb.append("mLastBssid ").append(mLastBssid).append(LS);
         sb.append("mLastNetworkId ").append(mLastNetworkId).append(LS);
-        sb.append("mEnableAllNetworks ").append(mEnableAllNetworks).append(LS);
         sb.append("mReconnectCount ").append(mReconnectCount).append(LS);
         sb.append("mIsScanMode ").append(mIsScanMode).append(LS);
         sb.append("Supplicant status").append(LS)
@@ -1453,20 +1457,17 @@
      ********************************************************/
 
     /**
-     * A structure for supplying information about a supplicant state
-     * change in the STATE_CHANGE event message that comes from the
-     * WifiMonitor
-     * thread.
+     * Stores supplicant state change information passed from WifiMonitor
      */
     static class StateChangeResult {
-        StateChangeResult(int networkId, String BSSID, Object state) {
+        StateChangeResult(int networkId, String BSSID, SupplicantState state) {
             this.state = state;
             this.BSSID = BSSID;
             this.networkId = networkId;
         }
         int networkId;
         String BSSID;
-        Object state;
+        SupplicantState state;
     }
 
     /**
@@ -1505,11 +1506,9 @@
      */
     void notifyNetworkStateChange(DetailedState newState, String BSSID, int networkId) {
         if (newState == NetworkInfo.DetailedState.CONNECTED) {
-            sendMessage(obtainMessage(NETWORK_CONNECTION_EVENT,
-                    new StateChangeResult(networkId, BSSID, newState)));
+            sendMessage(obtainMessage(NETWORK_CONNECTION_EVENT, networkId, 0, BSSID));
         } else {
-            sendMessage(obtainMessage(NETWORK_DISCONNECTION_EVENT,
-                    new StateChangeResult(networkId, BSSID, newState)));
+            sendMessage(obtainMessage(NETWORK_DISCONNECTION_EVENT, networkId, 0, BSSID));
         }
     }
 
@@ -1620,6 +1619,7 @@
                 case CMD_SAVE_NETWORK:
                 case CMD_FORGET_NETWORK:
                 case CMD_RSSI_POLL:
+                case CMD_ENABLE_ALL_NETWORKS:
                     break;
                 case CMD_START_WPS:
                     WpsConfiguration config = (WpsConfiguration) message.obj;
@@ -1755,7 +1755,6 @@
                     if(WifiNative.startSupplicant()) {
                         Log.d(TAG, "Supplicant start successful");
                         mWifiMonitor.startMonitoring();
-                        setWifiState(WIFI_STATE_ENABLED);
                         transitionTo(mSupplicantStartingState);
                     } else {
                         Log.e(TAG, "Failed to start supplicant!");
@@ -1914,8 +1913,11 @@
             switch(message.what) {
                 case SUP_CONNECTION_EVENT:
                     Log.d(TAG, "Supplicant connection established");
+                    setWifiState(WIFI_STATE_ENABLED);
                     mSupplicantRestartCount = 0;
-                    mSupplicantStateTracker.resetSupplicantState();
+                    /* Reset the supplicant state to indicate the supplicant
+                     * state is not known at this time */
+                    mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE);
                     /* Initialize data structures */
                     mLastBssid = null;
                     mLastNetworkId = -1;
@@ -1944,7 +1946,7 @@
                         Log.e(TAG, "Failed " + mSupplicantRestartCount +
                                 " times to start supplicant, unload driver");
                         transitionTo(mDriverLoadedState);
-                        sendMessage(CMD_UNLOAD_DRIVER);
+                        sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_STATE_UNKNOWN, 0));
                     }
                     break;
                 case CMD_LOAD_DRIVER:
@@ -1986,31 +1988,32 @@
         public boolean processMessage(Message message) {
             if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
             WifiConfiguration config;
+            boolean eventLoggingEnabled = true;
             switch(message.what) {
                 case CMD_STOP_SUPPLICANT:   /* Supplicant stopped by user */
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     Log.d(TAG, "stopping supplicant");
                     if (!WifiNative.stopSupplicant()) {
                         Log.e(TAG, "Failed to stop supplicant, issue kill");
                         WifiNative.killSupplicant();
                     }
                     handleNetworkDisconnect();
+                    setWifiState(WIFI_STATE_DISABLING);
                     sendSupplicantConnectionChangedBroadcast(false);
-                    mSupplicantStateTracker.resetSupplicantState();
+                    mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE);
                     transitionTo(mSupplicantStoppingState);
                     break;
                 case SUP_DISCONNECTION_EVENT:  /* Supplicant connection lost */
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     Log.e(TAG, "Connection lost, restart supplicant");
                     WifiNative.killSupplicant();
                     WifiNative.closeSupplicantConnection();
                     handleNetworkDisconnect();
                     sendSupplicantConnectionChangedBroadcast(false);
-                    mSupplicantStateTracker.resetSupplicantState();
+                    mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE);
                     transitionTo(mDriverLoadedState);
                     sendMessageDelayed(CMD_START_SUPPLICANT, SUPPLICANT_RESTART_INTERVAL_MSECS);
                     break;
                 case SCAN_RESULTS_EVENT:
+                    eventLoggingEnabled = false;
                     setScanResults(WifiNative.scanResultsCommand());
                     sendScanResultsAvailableBroadcast();
                     break;
@@ -2019,28 +2022,26 @@
                     mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
                     break;
                 case CMD_ADD_OR_UPDATE_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     config = (WifiConfiguration) message.obj;
                     mReplyChannel.replyToMessage(message, CMD_ADD_OR_UPDATE_NETWORK,
                             WifiConfigStore.addOrUpdateNetwork(config));
                     break;
                 case CMD_REMOVE_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     ok = WifiConfigStore.removeNetwork(message.arg1);
                     mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
                     break;
                 case CMD_ENABLE_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     ok = WifiConfigStore.enableNetwork(message.arg1, message.arg2 == 1);
                     mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
                     break;
+                case CMD_ENABLE_ALL_NETWORKS:
+                    WifiConfigStore.enableAllNetworks();
+                    break;
                 case CMD_DISABLE_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     ok = WifiConfigStore.disableNetwork(message.arg1);
                     mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
                     break;
                 case CMD_BLACKLIST_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     WifiNative.addToBlacklistCommand((String)message.obj);
                     break;
                 case CMD_CLEAR_BLACKLIST:
@@ -2064,7 +2065,6 @@
                     /* Cannot start soft AP while in client mode */
                 case CMD_START_AP:
                     Log.d(TAG, "Failed to start soft AP with a running supplicant");
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     setWifiApState(WIFI_AP_STATE_FAILED);
                     break;
                 case CMD_SET_SCAN_MODE:
@@ -2080,6 +2080,9 @@
                 default:
                     return NOT_HANDLED;
             }
+            if (eventLoggingEnabled) {
+                EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            }
             return HANDLED;
         }
     }
@@ -2200,6 +2203,7 @@
         @Override
         public boolean processMessage(Message message) {
             if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
+            boolean eventLoggingEnabled = true;
             switch(message.what) {
                 case CMD_SET_SCAN_TYPE:
                     if (message.arg1 == SCAN_ACTIVE) {
@@ -2209,6 +2213,7 @@
                     }
                     break;
                 case CMD_START_SCAN:
+                    eventLoggingEnabled = false;
                     WifiNative.scanCommand(message.arg1 == SCAN_ACTIVE);
                     break;
                 case CMD_SET_HIGH_PERF_MODE:
@@ -2253,7 +2258,9 @@
                 default:
                     return NOT_HANDLED;
             }
-            EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            if (eventLoggingEnabled) {
+                EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            }
             return HANDLED;
         }
         @Override
@@ -2380,7 +2387,7 @@
                     break;
                 case SUPPLICANT_STATE_CHANGE_EVENT:
                     stateChangeResult = (StateChangeResult) message.obj;
-                    SupplicantState state = (SupplicantState) stateChangeResult.state;
+                    SupplicantState state = stateChangeResult.state;
                     // Supplicant state change
                     // [31-13] Reserved for future use
                     // [8 - 0] Supplicant state (as defined in SupplicantState.java)
@@ -2423,11 +2430,8 @@
                         WifiConfigStore.selectNetwork(netId);
                     }
 
-                    /* Save a flag to indicate that we need to enable all
-                     * networks after supplicant indicates a network
-                     * state change event
-                     */
-                    mEnableAllNetworks = true;
+                    /* The state tracker handles enabling networks upon completion/failure */
+                    mSupplicantStateTracker.sendMessage(CMD_CONNECT_NETWORK);
 
                     WifiNative.reconnectCommand();
 
@@ -2445,13 +2449,13 @@
                     return NOT_HANDLED;
                 case NETWORK_CONNECTION_EVENT:
                     Log.d(TAG,"Network connection established");
-                    stateChangeResult = (StateChangeResult) message.obj;
+                    mLastNetworkId = message.arg1;
+                    mLastBssid = (String) message.obj;
 
                     //TODO: make supplicant modification to push this in events
                     mWifiInfo.setSSID(fetchSSID());
-                    mWifiInfo.setBSSID(mLastBssid = stateChangeResult.BSSID);
-                    mWifiInfo.setNetworkId(stateChangeResult.networkId);
-                    mLastNetworkId = stateChangeResult.networkId;
+                    mWifiInfo.setBSSID(mLastBssid);
+                    mWifiInfo.setNetworkId(mLastNetworkId);
                     /* send event to CM & network change broadcast */
                     setNetworkDetailedState(DetailedState.OBTAINING_IPADDR);
                     sendNetworkStateChangeBroadcast(mLastBssid);
@@ -2668,6 +2672,7 @@
         @Override
         public boolean processMessage(Message message) {
             if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
+            boolean eventLoggingEnabled = true;
             switch (message.what) {
                 case CMD_DISCONNECT:
                     WifiNative.disconnectCommand();
@@ -2691,6 +2696,7 @@
                     }
                     break;
                 case CMD_START_SCAN:
+                    eventLoggingEnabled = false;
                     /* When the network is connected, re-scanning can trigger
                      * a reconnection. Put it in scan-only mode during scan.
                      * When scan results are received, the mode is switched
@@ -2726,6 +2732,7 @@
                 case NETWORK_CONNECTION_EVENT:
                     break;
                 case CMD_RSSI_POLL:
+                    eventLoggingEnabled = false;
                     if (message.arg1 == mRssiPollToken) {
                         // Get Info and continue polling
                         fetchRssiAndLinkSpeedNative();
@@ -2748,7 +2755,9 @@
                 default:
                     return NOT_HANDLED;
             }
-            EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            if (eventLoggingEnabled) {
+                EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            }
             return HANDLED;
         }
     }
@@ -2781,13 +2790,6 @@
             EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
             return HANDLED;
         }
-        @Override
-        public void exit() {
-            if (mEnableAllNetworks) {
-                mEnableAllNetworks = false;
-                WifiConfigStore.enableAllNetworks();
-            }
-        }
     }
 
     class DisconnectedState extends HierarchicalState {
@@ -2825,8 +2827,7 @@
                     break;
                 case SUPPLICANT_STATE_CHANGE_EVENT:
                     StateChangeResult stateChangeResult = (StateChangeResult) message.obj;
-                    SupplicantState state = (SupplicantState) stateChangeResult.state;
-                    setNetworkDetailedState(WifiInfo.getDetailedStateOf(state));
+                    setNetworkDetailedState(WifiInfo.getDetailedStateOf(stateChangeResult.state));
                     /* DriverStartedState does the rest of the handling */
                     return NOT_HANDLED;
                 default: